diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml deleted file mode 100644 index 846b08f8f1..0000000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,115 +0,0 @@ -name: Continuous Integration - -on: - push: - branches: - - "master" - tags: - - "v*" - pull_request: - -jobs: - lint-frontend: - name: Lint Frontend - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - uses: pnpm/action-setup@v4 - with: - package_json_file: "frontend/package.json" - - uses: actions/setup-node@v6 - with: - node-version: "24.x" - cache: "pnpm" - cache-dependency-path: "frontend/pnpm-lock.yaml" - - working-directory: frontend - run: | - pnpm install --frozen-lockfile - pnpm run lint - - lint-backend: - name: Lint Backend - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-go@v6 - with: - go-version: "1.25.x" - - uses: golangci/golangci-lint-action@v9 - with: - version: "latest" - - test: - name: Test - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - uses: actions/setup-go@v6 - with: - go-version: "1.25.x" - - run: go test --race ./... - - build: - name: Build - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - uses: actions/setup-go@v6 - with: - go-version: '1.25' - - uses: pnpm/action-setup@v4 - with: - package_json_file: "frontend/package.json" - - uses: actions/setup-node@v6 - with: - node-version: "24.x" - cache: "pnpm" - cache-dependency-path: "frontend/pnpm-lock.yaml" - - name: Install Task - uses: go-task/setup-task@v1 - - run: task build - - release: - name: Release - needs: ["lint-frontend", "lint-backend", "test", "build"] - if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - uses: actions/setup-go@v6 - with: - go-version: '1.25' - - uses: pnpm/action-setup@v4 - with: - package_json_file: "frontend/package.json" - - uses: actions/setup-node@v6 - with: - node-version: "24.x" - cache: "pnpm" - cache-dependency-path: "frontend/pnpm-lock.yaml" - - name: Set up QEMU - uses: docker/setup-qemu-action@v3 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Install Task - uses: go-task/setup-task@v1 - - run: task build:frontend - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v6 - with: - version: latest - args: release --clean - env: - GITHUB_TOKEN: ${{ secrets.GH_PAT }} - - - diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index 5b21ccba79..0000000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Docs - -on: - pull_request: - paths: - - 'www' - - '*.md' - push: - branches: - - master - -jobs: - build: - name: Build Docs - if: github.event_name == 'pull_request' - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v6 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Install Task - uses: go-task/setup-task@v1 - - name: Build site - run: task docs - - build-and-release: - if: github.event_name == 'push' && github.ref == 'refs/heads/master' - name: Build and Release Docs - permissions: - pages: write - id-token: write - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Checkout - uses: actions/checkout@v6 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - name: Install Task - uses: go-task/setup-task@v1 - - name: Build site - run: task docs - - name: Upload static files as artifact - uses: actions/upload-pages-artifact@v4 - with: - path: www/public - - name: Deploy to GitHub Pages - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml new file mode 100644 index 0000000000..671e152c80 --- /dev/null +++ b/.github/workflows/main.yaml @@ -0,0 +1,66 @@ +name: main + +on: + push: + branches: + - "master" + tags: + - "v*" + pull_request: + +jobs: + # linters + lint-frontend: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + package_json_file: "frontend/package.json" + - uses: actions/setup-node@v4 + with: + node-version: "22.x" + cache: "pnpm" + cache-dependency-path: "frontend/pnpm-lock.yaml" + - run: make lint-frontend + lint-backend: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: '1.24' + - run: make lint-backend + lint: + runs-on: ubuntu-latest + needs: [lint-frontend, lint-backend] + steps: + - run: echo "done" + + # tests + test-frontend: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + package_json_file: "frontend/package.json" + - uses: actions/setup-node@v4 + with: + node-version: "22.x" + cache: "pnpm" + cache-dependency-path: "frontend/pnpm-lock.yaml" + - run: make test-frontend + test-backend: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: '1.24' + - run: make test-backend + test: + runs-on: ubuntu-latest + needs: [test-frontend, test-backend] + steps: + - run: echo "done" diff --git a/.gitignore b/.gitignore index 179f21998f..7d85e0ddb8 100644 --- a/.gitignore +++ b/.gitignore @@ -40,5 +40,10 @@ build/ /frontend/dist/* !/frontend/dist/.gitkeep +# Playwright files +/frontend/test-results/ +/frontend/playwright-report/ +/frontend/playwright/.cache/ + default.nix Dockerfile.dev diff --git a/.golangci.yml b/.golangci.yml index 8819f48b1c..1127ec0bdd 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,14 +1,132 @@ version: "2" linters: - default: standard + # inverted configuration with `default: all` and `disable` is not scalable during updates of golangci-lint + default: none enable: + - bodyclose + - dogsled + - dupl + - errcheck + - errorlint + - exhaustive + - funlen + - gocheckcompilerdirectives + - gochecknoinits - gocritic + - gocyclo + - godox + - goprintffuncname + - gosec - govet + - ineffassign + - lll + - misspell + - mnd + - nakedret + - nolintlint + - prealloc - revive + - rowserrcheck + - staticcheck + - testifylint + - unconvert + - unparam + - unused + - whitespace + settings: + dupl: + threshold: 100 + exhaustive: + default-signifies-exhaustive: true + funlen: + lines: 100 + statements: 50 + gocritic: + disabled-checks: + - dupImport # https://github.com/go-critic/go-critic/issues/845 + - ifElseChain + - octalLiteral + - whyNoLint + - wrapperFunc + enabled-tags: + - diagnostic + - experimental + - opinionated + - performance + - style + gocyclo: + min-complexity: 15 + govet: + enable: + - nilness + - shadow + lll: + line-length: 140 + misspell: + locale: US + mnd: + # don't include the "operation" and "assign" + checks: + - argument + - case + - condition + - return + ignored-numbers: + - "0" + - "1" + - "2" + - "3" + - "0666" + - "0700" + - "0700" + ignored-functions: + - strings.SplitN + - make + nolintlint: + allow-unused: false # report any unused nolint directives + require-explanation: false # require an explanation for nolint directives + require-specific: true # require nolint directives to be specific about which linter is being skipped + staticcheck: + checks: + - "all" + - "-QF*" exclusions: + generated: lax presets: - - std-error-handling - comments + - common-false-positives + - legacy + - std-error-handling + rules: + - linters: + - gochecknoinits + path: cmd/.*.go + - linters: + - dupl + - funlen + - gochecknoinits + - gocyclo + - lll + - scopelint + path: .*_test.go + - linters: + - misspell + text: "[aA]uther" + - linters: + - mnd + text: strconv.Parse + paths: + - frontend/ + +formatters: + enable: + - goimports + settings: + goimports: + local-prefixes: + - github.com/filebrowser/filebrowser + exclusions: + generated: lax paths: - frontend/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 13ee556f12..fc661cfd8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,326 +1,6 @@ # Changelog -All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines. - -## [2.54.0](https://github.com/filebrowser/filebrowser/compare/v2.53.1...v2.54.0) (2026-01-10) - - -### Features - -* add "redirect after copy/move" user setting ([#5662](https://github.com/filebrowser/filebrowser/issues/5662)) ([fda8a99](https://github.com/filebrowser/filebrowser/commit/fda8a992929b1466e75fb2813f2c4e293c12d244)) -* force file sync while uploading file ([#5668](https://github.com/filebrowser/filebrowser/issues/5668)) ([4fd18a3](https://github.com/filebrowser/filebrowser/commit/4fd18a382c31bbe7059d6733ffa371e70051865b)) -* update translations ([#5659](https://github.com/filebrowser/filebrowser/issues/5659)) ([464b581](https://github.com/filebrowser/filebrowser/commit/464b581953139c17e3276b774e381e4052827125)) - - -### Bug Fixes - -* clear selection by clicking on empty area ([#5663](https://github.com/filebrowser/filebrowser/issues/5663)) ([208535a](https://github.com/filebrowser/filebrowser/commit/208535a8cc23254de0013dfab9008486707ee6c2)) -* hide "change password form" in noauth setting ([#5652](https://github.com/filebrowser/filebrowser/issues/5652)) ([219582c](https://github.com/filebrowser/filebrowser/commit/219582c0b03fd90979b1d1398dba7919d086a23f)) - -## [2.53.1](https://github.com/filebrowser/filebrowser/compare/v2.53.0...v2.53.1) (2026-01-03) - - -### Bug Fixes - -* download path encoding file paths ([#5655](https://github.com/filebrowser/filebrowser/issues/5655)) ([ffa893e](https://github.com/filebrowser/filebrowser/commit/ffa893e9ac387a49dba5917a41df7c3b7ce120fc)) -* request a password to change sensitive user data ([#5629](https://github.com/filebrowser/filebrowser/issues/5629)) ([b8151a0](https://github.com/filebrowser/filebrowser/commit/b8151a038a1ea55afae8073b439b74e364cac12f)) - -## [2.53.0](https://github.com/filebrowser/filebrowser/compare/v2.52.0...v2.53.0) (2025-12-29) - - -### Features - -* add "disable image resolution calculation" flag ([#5638](https://github.com/filebrowser/filebrowser/issues/5638)) ([a2d80c6](https://github.com/filebrowser/filebrowser/commit/a2d80c62c1c17962e566f68fb7cac6960ed3e4cb)) -* support streaming response for search results ([#5630](https://github.com/filebrowser/filebrowser/issues/5630)) ([20bfd13](https://github.com/filebrowser/filebrowser/commit/20bfd131c6a4fca48a645b52171c2d1cc3ce92b7)) -* update translations ([a12a612](https://github.com/filebrowser/filebrowser/commit/a12a612970d6cc3dfbca1b35ef3a60a887a4effb)) -* update translations ([#5626](https://github.com/filebrowser/filebrowser/issues/5626)) ([f899756](https://github.com/filebrowser/filebrowser/commit/f89975603e29b9f1fc05aec58afb42bbd56ed696)) -* update translations ([#5631](https://github.com/filebrowser/filebrowser/issues/5631)) ([032d6c7](https://github.com/filebrowser/filebrowser/commit/032d6c7520a64686c9d9b1218562256f629b4703)) - - -### Bug Fixes - -* conversion of backslashes in file paths for archive creation ([#5637](https://github.com/filebrowser/filebrowser/issues/5637)) ([9595f39](https://github.com/filebrowser/filebrowser/commit/9595f3939c1c129ed875a47adcc4fbcfad9a0e65)) -* Don't crash on invalid config import ([#5640](https://github.com/filebrowser/filebrowser/issues/5640)) ([79d1aa9](https://github.com/filebrowser/filebrowser/commit/79d1aa9229b076ee8e3b71d6cf061fc90738f4da)) -* fix nil deref in config set command ([#5641](https://github.com/filebrowser/filebrowser/issues/5641)) ([60b1ee8](https://github.com/filebrowser/filebrowser/commit/60b1ee8bb9e18b21d7f2c04cb1cc90046cecd3e1)) - -## [2.52.0](https://github.com/filebrowser/filebrowser/compare/v2.51.2...v2.52.0) (2025-12-13) - - -### Features - -* sync translations with Transifex ([7fa3432](https://github.com/filebrowser/filebrowser/commit/7fa3432f25610bbb55a718bc709b9a7bf41d92f0)) -* update translations ([#5615](https://github.com/filebrowser/filebrowser/issues/5615)) ([3fdca6d](https://github.com/filebrowser/filebrowser/commit/3fdca6dfd9a18c3f4895b4ef3cbd216824dbb57a)) - - -### Bug Fixes - -* display the directory name in the shared folder view ([#5617](https://github.com/filebrowser/filebrowser/issues/5617)) ([6d4c867](https://github.com/filebrowser/filebrowser/commit/6d4c86767239dad4f09f30f48678f2f3a716eb12)) -* hide the context menu when changing the route ([#5613](https://github.com/filebrowser/filebrowser/issues/5613)) ([cf96657](https://github.com/filebrowser/filebrowser/commit/cf966578d8c6beab111b74f495bac6bdec173f41)) - -## [2.51.2](https://github.com/filebrowser/filebrowser/compare/v2.51.1...v2.51.2) (2025-12-07) - - -### Bug Fixes - -* **frontend:** add missing i18n strings ([c171599](https://github.com/filebrowser/filebrowser/commit/c1715992bda46517f801c1aa496df8a3b42a4e4d)) - -## [2.51.1](https://github.com/filebrowser/filebrowser/compare/v2.51.0...v2.51.1) (2025-12-07) - - -### Bug Fixes - -* **frontend:** csv viewer i18n strings ([4cbb4b7](https://github.com/filebrowser/filebrowser/commit/4cbb4b73af816104475f15c1d996640b56203602)) -* prevent the right-click from selecting multiple items when the "single-click" option is active ([#5608](https://github.com/filebrowser/filebrowser/issues/5608)) ([152f830](https://github.com/filebrowser/filebrowser/commit/152f8302f7cda21bde37692b175c22c124233f45)) - -## [2.51.0](https://github.com/filebrowser/filebrowser/compare/v2.50.0...v2.51.0) (2025-12-06) - - -### Features - -* update translations ([2d88c06](https://github.com/filebrowser/filebrowser/commit/2d88c067611e936056dbbf04247f1c1c709b2a09)) - - -### Bug Fixes - -* added column separator select (comma, semicolon and both) in CSV viewer ([#5604](https://github.com/filebrowser/filebrowser/issues/5604)) ([204a3f0](https://github.com/filebrowser/filebrowser/commit/204a3f0eeaa0c68781b60651bf27c4b27eac44e6)) - - -### Refactorings - -* cleanup package names ([#5605](https://github.com/filebrowser/filebrowser/issues/5605)) ([f029c30](https://github.com/filebrowser/filebrowser/commit/f029c3005e450cfbebb074c42dbdf65db9c8d56a)) - -## [2.50.0](https://github.com/filebrowser/filebrowser/compare/v2.49.0...v2.50.0) (2025-11-30) - - -### Features - -* configurable logout page URL for proxy/hook auth ([#3884](https://github.com/filebrowser/filebrowser/issues/3884)) ([b9ac45d](https://github.com/filebrowser/filebrowser/commit/b9ac45d5dac4b4eb2ba364629090fbf306cffd2b)) -* render CSVs as table ([#5569](https://github.com/filebrowser/filebrowser/issues/5569)) ([982405e](https://github.com/filebrowser/filebrowser/commit/982405ec944f94baf43594b0ed2f06329ff4e9ed)) -* update frontend/src/i18n/hr.json ([279a5cc](https://github.com/filebrowser/filebrowser/commit/279a5ccd1e8d7bde4568b63cb3c506af48b6c618)) -* update translations ([78e0395](https://github.com/filebrowser/filebrowser/commit/78e039596070a3a9e643a693cc99960c69dcfe92)) - - -### Bug Fixes - -* do not close editor if save failed ([701522a](https://github.com/filebrowser/filebrowser/commit/701522a0600cfa542469540ed764630c0ba1a732)), closes [#5591](https://github.com/filebrowser/filebrowser/issues/5591) - -## [2.49.0](https://github.com/filebrowser/filebrowser/compare/v2.48.2...v2.49.0) (2025-11-22) - - -### Features - -* add "copy download link to clipboard" button to Share prompt ([#5173](https://github.com/filebrowser/filebrowser/issues/5173)) ([d48f566](https://github.com/filebrowser/filebrowser/commit/d48f5665d6975c4cbbdf9be20dc2e0106db02f01)) -* add Bulgarian language ([8db2411](https://github.com/filebrowser/filebrowser/commit/8db2411cd43a23ae3292a817e3524cfdb5ae9b86)) -* Updates for project File Browser ([#5566](https://github.com/filebrowser/filebrowser/issues/5566)) ([54306bd](https://github.com/filebrowser/filebrowser/commit/54306bdc8700fac489326ae81e28ac5db0580d13)) - - -### Bug Fixes - -* display friendly error message for password validation on signup ([#5563](https://github.com/filebrowser/filebrowser/issues/5563)) ([6d5aa35](https://github.com/filebrowser/filebrowser/commit/6d5aa355e433d613e5a3ae137f410c63baeddf0f)) - -## [2.48.2](https://github.com/filebrowser/filebrowser/compare/v2.48.1...v2.48.2) (2025-11-18) - - -### Bug Fixes - -* add transitionary support for FB_BASEURL ([984ea7b](https://github.com/filebrowser/filebrowser/commit/984ea7b569e3bd33b6f91ebdf63684a618d51e94)) - - -### Refactorings - -* rename python for clarification ([fd7b70c](https://github.com/filebrowser/filebrowser/commit/fd7b70cf38ac67c8c9ff79f2e7fde5e2ec45a1de)) - -## [2.48.1](https://github.com/filebrowser/filebrowser/compare/v2.48.0...v2.48.1) (2025-11-17) - - -### Bug Fixes - -* options should only override if set ([420adea](https://github.com/filebrowser/filebrowser/commit/420adea7e61a1c182cddd6fb2544a0752e5709f7)) - -## [2.48.0](https://github.com/filebrowser/filebrowser/compare/v2.47.0...v2.48.0) (2025-11-17) - - -### Features - -* consistent flags and environment variables ([#5549](https://github.com/filebrowser/filebrowser/issues/5549)) ([0a0cb80](https://github.com/filebrowser/filebrowser/commit/0a0cb8046fce52f1ff926171b34bcdb7cd39aab3)) - - -### Bug Fixes - -* add tokenExpirationTime to `config init` and troubleshoot docs ([#5546](https://github.com/filebrowser/filebrowser/issues/5546)) ([8c5dc76](https://github.com/filebrowser/filebrowser/commit/8c5dc7641e6f8aadd9e5d5d3b25a2ad9f1ec9a1e)) -* use all available flags in quick setup ([f41585f](https://github.com/filebrowser/filebrowser/commit/f41585f0392d65c08c01ab65b62d3eeb04c03b7d)) - - -### Refactorings - -* reuse logic for config init and set ([89be0b1](https://github.com/filebrowser/filebrowser/commit/89be0b1873527987dd2dddac746e93b8bc684d46)) - -## [2.47.0](https://github.com/filebrowser/filebrowser/compare/v2.46.1...v2.47.0) (2025-11-16) - - -### Features - -* add TUS settings to the command line ([#5556](https://github.com/filebrowser/filebrowser/issues/5556)) ([e24e1f1](https://github.com/filebrowser/filebrowser/commit/e24e1f1abae9e80add620c4ad65660ca1b575a49)) -* remove importer of v1 config ([#5550](https://github.com/filebrowser/filebrowser/issues/5550)) ([ceb5e72](https://github.com/filebrowser/filebrowser/commit/ceb5e723f3ee2c966bb561a804015246450280ca)) - - -### Bug Fixes - -* exit 0 when gracefully shutting down ([#5555](https://github.com/filebrowser/filebrowser/issues/5555)) ([5de4099](https://github.com/filebrowser/filebrowser/commit/5de4099cba2cf012d4a213c8eb29c412fc72c151)) - -## [2.46.1](https://github.com/filebrowser/filebrowser/compare/v2.46.0...v2.46.1) (2025-11-15) - - -### Bug Fixes - -* env key replacer and remove unused function ([#5547](https://github.com/filebrowser/filebrowser/issues/5547)) ([13814e1](https://github.com/filebrowser/filebrowser/commit/13814e11197ebd9101940883e3ca85998f86d442)) -* remove duplicated 'hide-defaults' flag (is 'hideDefaults') ([#5548](https://github.com/filebrowser/filebrowser/issues/5548)) ([ffc8504](https://github.com/filebrowser/filebrowser/commit/ffc850454e4cb8f10b970511681d6c627340afc7)) - -## [2.46.0](https://github.com/filebrowser/filebrowser/compare/v2.45.3...v2.46.0) (2025-11-14) - - -### Features - -* add 'hide-dotfiles' as command line parameter ([#3802](https://github.com/filebrowser/filebrowser/issues/3802)) ([0d973d3](https://github.com/filebrowser/filebrowser/commit/0d973d3aad70ceb88950f2cd9c297fc76e7955b1)) -* add context menu ([#3343](https://github.com/filebrowser/filebrowser/issues/3343)) ([1ace579](https://github.com/filebrowser/filebrowser/commit/1ace579a553486bb15af2d11f537414156606434)) -* add option to hide the login button from public-facing pages ([#3922](https://github.com/filebrowser/filebrowser/issues/3922)) ([ac7b49c](https://github.com/filebrowser/filebrowser/commit/ac7b49c1484b4e27a1149310542ccd1e90659ee2)) -* Updates for project File Browser ([#5544](https://github.com/filebrowser/filebrowser/issues/5544)) ([fb5d099](https://github.com/filebrowser/filebrowser/commit/fb5d099f8514516216f407be012d2e3f25de2441)) - -## [2.45.3](https://github.com/filebrowser/filebrowser/compare/v2.45.2...v2.45.3) (2025-11-13) - -This is a test release to ensure the updated workflow works. - -## [2.45.2](https://github.com/filebrowser/filebrowser/compare/v2.45.1...v2.45.2) (2025-11-13) - - -### Bug Fixes - -* **deps:** update module github.com/shirou/gopsutil/v3 to v4 ([#5536](https://github.com/filebrowser/filebrowser/issues/5536)) ([fdff7a3](https://github.com/filebrowser/filebrowser/commit/fdff7a38f4711f2b58dfdd60bebbb057bd3a478d)) -* **deps:** update module gopkg.in/yaml.v2 to v3 ([#5537](https://github.com/filebrowser/filebrowser/issues/5537)) ([f26a685](https://github.com/filebrowser/filebrowser/commit/f26a68587d8432b536453093f42dc255d19d10fa)) - -### [2.45.1](https://github.com/filebrowser/filebrowser/compare/v2.45.0...v2.45.1) (2025-11-11) - - -### Bug Fixes - -* share page preview items to contain baseUrl ([#5510](https://github.com/filebrowser/filebrowser/issues/5510)) ([6950c2e](https://github.com/filebrowser/filebrowser/commit/6950c2e4d2868f06235f93c0a18b303b4095ca0a)) - -## [2.45.0](https://github.com/filebrowser/filebrowser/compare/v2.44.2...v2.45.0) (2025-11-01) - - -### Features - -* update translations ([#5458](https://github.com/filebrowser/filebrowser/issues/5458)) ([b9a03fa](https://github.com/filebrowser/filebrowser/commit/b9a03fabd98119d6588882f5ba2a7d29b012d729)) - - -### Bug Fixes - -* support croatian ([#5502](https://github.com/filebrowser/filebrowser/issues/5502)) ([93fe31c](https://github.com/filebrowser/filebrowser/commit/93fe31cc55c9d9d27c634993619a768fa700da1d)) - -### [2.44.2](https://github.com/filebrowser/filebrowser/compare/v2.44.1...v2.44.2) (2025-10-22) - - -### Bug Fixes - -* **http:** remove auth query parameter ([57db25d](https://github.com/filebrowser/filebrowser/commit/57db25d08a1ef2cd0b41f34e312b7b7c35c7ed38)) - - -### Build - -* **deps-dev:** bump vite from 6.3.6 to 6.4.1 in /frontend ([b8f64a1](https://github.com/filebrowser/filebrowser/commit/b8f64a1c1bc235df784d7f52abd3a9e84c6db6ce)) - -### [2.44.1](https://github.com/filebrowser/filebrowser/compare/v2.44.0...v2.44.1) (2025-10-17) - - -### Bug Fixes - -* **auth:** prevent integer overflow in logout timer using safeTimeout ([#5470](https://github.com/filebrowser/filebrowser/issues/5470)) ([dd88398](https://github.com/filebrowser/filebrowser/commit/dd883985bb484af9dfea2677a40d56999fdc72f3)) -* editor discard prompt doesn't save nor discard ([a397e73](https://github.com/filebrowser/filebrowser/commit/a397e7305d1572baf67823413f97a29eea38f0cc)) -* wrong url on settings branding link ([d0039af](https://github.com/filebrowser/filebrowser/commit/d0039afbb76a9364c1e6ac9715ccc3c239dc8cb6)) - - -### Refactorings - -* use slices.Contains to simplify code ([#5483](https://github.com/filebrowser/filebrowser/issues/5483)) ([97b8911](https://github.com/filebrowser/filebrowser/commit/97b8911ba8a65456091cbec0202f6b5209fcf363)) - -## [2.44.0](https://github.com/filebrowser/filebrowser/compare/v2.43.0...v2.44.0) (2025-09-25) - - -### Features - -* allow setting ace editor theme ([#3826](https://github.com/filebrowser/filebrowser/issues/3826)) ([b9787c7](https://github.com/filebrowser/filebrowser/commit/b9787c78f3889171f94db19e7655dce68c64b6fb)) -* Improved path display in the new file and directory modal ([#5451](https://github.com/filebrowser/filebrowser/issues/5451)) ([d29ad35](https://github.com/filebrowser/filebrowser/commit/d29ad356d1067c87b2821debab91286549f512a0)) -* Translate frontend/src/i18n/en.json in no ([dec7a02](https://github.com/filebrowser/filebrowser/commit/dec7a027378fbc6948d203199c44a640a141bcad)) -* Updates for project File Browser ([#5446](https://github.com/filebrowser/filebrowser/issues/5446)) ([4ff247e](https://github.com/filebrowser/filebrowser/commit/4ff247e134e4d61668ee656a258ed67f71414e18)) -* Updates for project File Browser ([#5450](https://github.com/filebrowser/filebrowser/issues/5450)) ([0eade71](https://github.com/filebrowser/filebrowser/commit/0eade717ce9d04bf48051922f11d983edbc7c2d0)) -* Updates for project File Browser ([#5457](https://github.com/filebrowser/filebrowser/issues/5457)) ([1165f00](https://github.com/filebrowser/filebrowser/commit/1165f00bd4dcb0dcfbc084f54f51902ba4b4a714)) - - -### Bug Fixes - -* computation of file path ([c472542](https://github.com/filebrowser/filebrowser/commit/c4725428e07da72b855009e2c13c6ed91d32e0b7)) -* show login when session token expires ([e6c674b](https://github.com/filebrowser/filebrowser/commit/e6c674b3c616831942c4d4aacab0907d58003e23)) -* some formatting issues with i18n files ([949ddff](https://github.com/filebrowser/filebrowser/commit/949ddffef20e38169902c5fd74dca4815dcecf11)) -* **upload:** throttle upload speed calculation to 100ms to avoid Infinity MB/s ([#5456](https://github.com/filebrowser/filebrowser/issues/5456)) ([692ca5e](https://github.com/filebrowser/filebrowser/commit/692ca5eaf01e4dcf346ba03f82c5dbd50cce246b)) - -## [2.43.0](https://github.com/filebrowser/filebrowser/compare/v2.42.5...v2.43.0) (2025-09-13) - - -### Features - -* "save changes" button to discard changes dialog ([84e8632](https://github.com/filebrowser/filebrowser/commit/84e8632b98e315bfef2da77dd7d1049daec99241)) -* Translate frontend/src/i18n/en.json in es ([571ce6c](https://github.com/filebrowser/filebrowser/commit/571ce6cb0d7c8725d1cc1a3238ea506ddc72b060)) -* Translate frontend/src/i18n/en.json in fr ([6b1fa87](https://github.com/filebrowser/filebrowser/commit/6b1fa87ad38ebbb1a9c5d0e5fc88ba796c148bcf)) -* Updates for project File Browser ([#5427](https://github.com/filebrowser/filebrowser/issues/5427)) ([8950585](https://github.com/filebrowser/filebrowser/commit/89505851414bfcee6b9ff02087eb4cec51c330f6)) - - -### Bug Fixes - -* optimize markdown preview height ([783503a](https://github.com/filebrowser/filebrowser/commit/783503aece7fca9e26f7e849b0e7478aba976acb)) - - -### Reverts - -* build(deps): bump github.com/ulikunitz/xz from 0.5.12 to 0.5.14 ([0769265](https://github.com/filebrowser/filebrowser/commit/07692653ffe0ea5e517e6dc1fd3961172e931843)) - - -### Build - -* **deps-dev:** bump vite from 6.1.6 to 6.3.6 in /frontend ([36c6cc2](https://github.com/filebrowser/filebrowser/commit/36c6cc203e10947439519a0413d5817921a1690d)) -* **deps:** bump github.com/go-viper/mapstructure/v2 in /tools ([280fa56](https://github.com/filebrowser/filebrowser/commit/280fa562a67824887ae6e2530a3b73739d6e1bb4)) -* **deps:** bump github.com/ulikunitz/xz from 0.5.12 to 0.5.14 ([950028a](https://github.com/filebrowser/filebrowser/commit/950028abebe2898bac4ecfd8715c0967246310cb)) - - -### Refactorings - -* to use strings.Lines ([b482a9b](https://github.com/filebrowser/filebrowser/commit/b482a9bf0d292ec6542d2145a4408971e4c985f1)) - -## [2.43.0](https://github.com/filebrowser/filebrowser/compare/v2.42.5...v2.43.0) (2025-09-13) - - -### Features - -* "save changes" button to discard changes dialog ([84e8632](https://github.com/filebrowser/filebrowser/commit/84e8632b98e315bfef2da77dd7d1049daec99241)) -* Translate frontend/src/i18n/en.json in es ([571ce6c](https://github.com/filebrowser/filebrowser/commit/571ce6cb0d7c8725d1cc1a3238ea506ddc72b060)) -* Translate frontend/src/i18n/en.json in fr ([6b1fa87](https://github.com/filebrowser/filebrowser/commit/6b1fa87ad38ebbb1a9c5d0e5fc88ba796c148bcf)) -* Updates for project File Browser ([#5427](https://github.com/filebrowser/filebrowser/issues/5427)) ([8950585](https://github.com/filebrowser/filebrowser/commit/89505851414bfcee6b9ff02087eb4cec51c330f6)) - - -### Bug Fixes - -* optimize markdown preview height ([783503a](https://github.com/filebrowser/filebrowser/commit/783503aece7fca9e26f7e849b0e7478aba976acb)) - - -### Build - -* **deps-dev:** bump vite from 6.1.6 to 6.3.6 in /frontend ([36c6cc2](https://github.com/filebrowser/filebrowser/commit/36c6cc203e10947439519a0413d5817921a1690d)) -* **deps:** bump github.com/go-viper/mapstructure/v2 in /tools ([280fa56](https://github.com/filebrowser/filebrowser/commit/280fa562a67824887ae6e2530a3b73739d6e1bb4)) -* **deps:** bump github.com/ulikunitz/xz from 0.5.12 to 0.5.14 ([950028a](https://github.com/filebrowser/filebrowser/commit/950028abebe2898bac4ecfd8715c0967246310cb)) - - -### Refactorings - -* to use strings.Lines ([b482a9b](https://github.com/filebrowser/filebrowser/commit/b482a9bf0d292ec6542d2145a4408971e4c985f1)) +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.42.5](https://github.com/filebrowser/filebrowser/compare/v2.42.4...v2.42.5) (2025-08-16) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 311a2fd708..1cfc8a9277 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,23 +15,11 @@ We encourage you to use git to manage your fork. To clone the main repository, j git clone https://github.com/filebrowser/filebrowser ``` -We use [Taskfile](https://taskfile.dev/) to manage the different processes (building, releasing, etc) automatically. - ## Build -You can fully build the project in order to produce a binary by running: - -```bash -task build -``` - -## Development - -For development, there are a few things to have in mind. - ### Frontend -We use [Node.js](https://nodejs.org/en/) on the frontend to manage the build process. Prepare the frontend environment: +We are using [Node.js](https://nodejs.org/en/) on the frontend to manage the build process. The steps to build it are: ```bash # From the root of the repo, go to frontend/ @@ -39,62 +27,37 @@ cd frontend # Install the dependencies pnpm install -``` - -If you just want to develop the backend, you can create a static build of the frontend: -```bash +# Build the frontend pnpm run build ``` -If you want to develop the frontend, start a development server which watches for changes: +This will install the dependencies and build the frontend so you can then embed it into the Go app. Although, if you want to play with it, you'll get bored of building it after every change you do. So, you can run the command below to watch for changes: ```bash pnpm run dev ``` -Please note that you need to access File Browser's interface through the development server of the frontend. - ### Backend -First prepare the backend environment by downloading all required dependencies: +First of all, you need to download the required dependencies. We are using the built-in `go mod` tool for dependency management. To get the modules, run: ```bash go mod download ``` -You can now build or run File Browser as any other Go project: - -```bash -# Build -go build - -# Run -go run . -``` - -## Documentation - -We rely on Docker to abstract all the dependencies required for building the documentation. +The magic of File Browser is that the static assets are bundled into the final binary. For that, we use [Go embed.FS](https://golang.org/pkg/embed/). The files from `frontend/dist` will be embedded during the build process. -To build the documentation to `www/public`: +To build File Browser is just like any other Go program: ```bash -task docs -``` - -To start a local server on port `8000` to view the built documentation: - -```bash -task docs:serve +go build ``` -## Release - -To make a release, just run: +To create a development build use the "dev" tag, this way the content inside the frontend folder will not be embedded in the binary but will be reloaded at every change: ```bash -task release +go build -tags dev ``` ## Translations diff --git a/Dockerfile b/Dockerfile index 92bbe1d464..8bd825da85 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## Multistage build: First stage fetches dependencies -FROM alpine:3.23 AS fetcher +FROM alpine:3.22 AS fetcher # install and copy ca-certificates, mailcap, and tini-static; download JSON.sh RUN apk update && \ diff --git a/Dockerfile.s6 b/Dockerfile.s6 index af84491ae7..ca39cadea8 100644 --- a/Dockerfile.s6 +++ b/Dockerfile.s6 @@ -1,4 +1,4 @@ -FROM ghcr.io/linuxserver/baseimage-alpine:3.23 +FROM ghcr.io/linuxserver/baseimage-alpine:3.22 RUN apk update && \ apk --no-cache add ca-certificates mailcap jq libcap diff --git a/Makefile b/Makefile index 041caa4f4c..46e27e46ab 100644 --- a/Makefile +++ b/Makefile @@ -1,18 +1,15 @@ -LDFLAGS += -X "$(MODULE)/version.Version=$(VERSION)" -X "$(MODULE)/version.CommitSHA=$(VERSION_HASH)" - -go = GOGC=off go +include common.mk +include tools.mk -goimports=goimports -$(goimports): - @if ! command -v goimports >/dev/null 2>&1; then \ - $(go) install golang.org/x/tools/cmd/goimports@latest; \ - fi +LDFLAGS += -X "$(MODULE)/version.Version=$(VERSION)" -X "$(MODULE)/version.CommitSHA=$(VERSION_HASH)" -golangci-lint=golangci-lint -$(golangci-lint): - @if ! command -v golangci-lint >/dev/null 2>&1; then \ - $(go) install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest; \ - fi +SITE_DOCKER_FLAGS = \ + -v $(CURDIR)/www:/docs \ + -v $(CURDIR)/LICENSE:/docs/docs/LICENSE \ + -v $(CURDIR)/SECURITY.md:/docs/docs/security.md \ + -v $(CURDIR)/CHANGELOG.md:/docs/docs/changelog.md \ + -v $(CURDIR)/CODE-OF-CONDUCT.md:/docs/docs/code-of-conduct.md \ + -v $(CURDIR)/CONTRIBUTING.md:/docs/docs/contributing.md ## Build: @@ -21,40 +18,42 @@ build: | build-frontend build-backend ## Build binary .PHONY: build-frontend build-frontend: ## Build frontend - cd frontend && pnpm install --frozen-lockfile && pnpm run build + $Q cd frontend && pnpm install --frozen-lockfile && pnpm run build .PHONY: build-backend build-backend: ## Build backend - $(go) build -ldflags '$(LDFLAGS)' -o . + $Q $(go) build -ldflags '$(LDFLAGS)' -o . .PHONY: test test: | test-frontend test-backend ## Run all tests .PHONY: test-frontend test-frontend: ## Run frontend tests - cd frontend && pnpm install --frozen-lockfile && pnpm run typecheck + $Q cd frontend && pnpm install --frozen-lockfile && pnpm run typecheck .PHONY: test-backend test-backend: ## Run backend tests - $(go) test -v ./... + $Q $(go) test -v ./... .PHONY: lint lint: lint-frontend lint-backend ## Run all linters .PHONY: lint-frontend lint-frontend: ## Run frontend linters - cd frontend && pnpm install --frozen-lockfile && pnpm run lint + $Q cd frontend && pnpm install --frozen-lockfile && pnpm run lint .PHONY: lint-backend lint-backend: | $(golangci-lint) ## Run backend linters - $(golangci-lint) run -v + $Q $(golangci-lint) run -v .PHONY: lint-commits lint-commits: $(commitlint) ## Run commit linters - ./scripts/commitlint.sh + $Q ./scripts/commitlint.sh fmt: $(goimports) ## Format source files - $(goimports) -local $(MODULE) -w $$(find . -type f -name '*.go' -not -path "./vendor/*") + $Q $(goimports) -local $(MODULE) -w $$(find . -type f -name '*.go' -not -path "./vendor/*") + +clean: clean-tools ## Clean ## Release: @@ -62,3 +61,33 @@ fmt: $(goimports) ## Format source files build-release-bin: build-frontend GO111MODULE=on GOOS=linux GOARCH=amd64 $(go) build -trimpath -ldflags '$(LDFLAGS)' -o bin/filebrowser-$(VERSION) tar -C bin -czf "dist/filebrowser-$(VERSION).tar.gz" "filebrowser-$(VERSION)" + +.PHONY: bump-version +bump-version: $(standard-version) ## Bump app version + $Q ./scripts/bump_version.sh + +.PHONY: site +site: ## Build site + @rm -rf www/public + docker build -f www/Dockerfile --progress=plain -t filebrowser.site www + docker run --rm $(SITE_DOCKER_FLAGS) filebrowser.site build -d "public" + +.PHONY: site-serve +site-serve: ## Serve site for development + docker build -f www/Dockerfile --progress=plain -t filebrowser.site www + docker run --rm -it -p 8000:8000 $(SITE_DOCKER_FLAGS) filebrowser.site + +## Help: +help: ## Show this help + @echo '' + @echo 'Usage:' + @echo ' ${YELLOW}make${RESET} ${GREEN} [options]${RESET}' + @echo '' + @echo 'Options:' + @$(call global_option, "V [0|1]", "enable verbose mode (default:0)") + @echo '' + @echo 'Targets:' + @awk 'BEGIN {FS = ":.*?## "} { \ + if (/^[a-zA-Z_-]+:.*?##.*$$/) {printf " ${YELLOW}%-20s${GREEN}%s${RESET}\n", $$1, $$2} \ + else if (/^## .*$$/) {printf " ${CYAN}%s${RESET}\n", substr($$1,4)} \ + }' $(MAKEFILE_LIST) diff --git a/README.md b/README.md index 1e15d59275..94ec1cefa9 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@

- +

-[![Build](https://github.com/filebrowser/filebrowser/actions/workflows/ci.yaml/badge.svg)](https://github.com/filebrowser/filebrowser/actions/workflows/ci.yaml) -[![Go Report Card](https://goreportcard.com/badge/github.com/filebrowser/filebrowser/v2)](https://goreportcard.com/report/github.com/filebrowser/filebrowser/v2) +[![Build](https://github.com/filebrowser/filebrowser/actions/workflows/main.yaml/badge.svg)](https://github.com/filebrowser/filebrowser/actions/workflows/main.yaml) +[![Go Report Card](https://goreportcard.com/badge/github.com/filebrowser/filebrowser)](https://goreportcard.com/report/github.com/filebrowser/filebrowser) +[![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg)](http://godoc.org/github.com/filebrowser/filebrowser) [![Version](https://img.shields.io/github/release/filebrowser/filebrowser.svg)](https://github.com/filebrowser/filebrowser/releases/latest) +[![Chat IRC](https://img.shields.io/badge/freenode-%23filebrowser-blue.svg)](http://webchat.freenode.net/?channels=%23filebrowser) File Browser provides a file managing interface within a specified directory and it can be used to upload, delete, preview and edit your files. It is a **create-your-own-cloud**-kind of software where you can just install it on your server, direct it to a path and access your files through a nice web interface. @@ -14,12 +16,18 @@ Documentation on how to install, configure, and contribute to this project is ho ## Project Status -This project is a finished product which fulfills its goal: be a single binary web File Browser which can be run by anyone anywhere. That means that File Browser is currently on **maintenance-only** mode. Therefore, please note the following: - -- It can take a while until someone gets back to you. Please be patient. -- [Issues](https://github.com/filebrowser/filebrowser/issues) are meant to track bugs. Unrelated issues will be converted into [discussions](https://github.com/filebrowser/filebrowser/discussions). -- No new features will be implemented by maintainers. Pull requests for new features will be reviewed on a case by case basis. -- The priority is triaging issues, addressing security issues and reviewing pull requests meant to solve bugs. +> [!WARNING] +> +> This project is currently on **maintenance-only** mode, and is looking for new maintainers. For more information, please read the [discussion #4906](https://github.com/filebrowser/filebrowser/discussions/4906). Therefore, please note the following: +> +> - It can take a while until someone gets back to you. Please be patient. +> - [Issues][issues] are only being used to track bugs. Any unrelated issues will be converted into a [discussion][discussions]. +> - No new features will be implemented until further notice. The priority is on triaging issues and merge bug fixes. +> +> If you're interested in maintaining this project, please reach out via the discussion above. + +[issues]: https://github.com/filebrowser/filebrowser/issues +[discussions]: https://github.com/filebrowser/filebrowser/discussions ## Contributing diff --git a/Taskfile.yml b/Taskfile.yml deleted file mode 100644 index 378e340987..0000000000 --- a/Taskfile.yml +++ /dev/null @@ -1,83 +0,0 @@ -version: '3' - -vars: - SITE_DOCKER_FLAGS: >- - -v ./www:/docs - -v ./LICENSE:/docs/docs/LICENSE - -v ./SECURITY.md:/docs/docs/security.md - -v ./CHANGELOG.md:/docs/docs/changelog.md - -v ./CODE-OF-CONDUCT.md:/docs/docs/code-of-conduct.md - -v ./CONTRIBUTING.md:/docs/docs/contributing.md - -tasks: - build:frontend: - desc: Build frontend assets - dir: frontend - cmds: - - pnpm install --frozen-lockfile - - pnpm run build - - build:backend: - desc: Build backend binary - cmds: - - go build -ldflags='-s -w -X "github.com/filebrowser/filebrowser/v2/version.Version={{.VERSION}}" -X "github.com/filebrowser/filebrowser/v2/version.CommitSHA={{.GIT_COMMIT}}"' -o filebrowser . - vars: - GIT_COMMIT: - sh: git log -n 1 --format=%h - VERSION: - sh: git describe --tags --abbrev=0 --match=v* | cut -c 2- - - build: - desc: Build both frontend and backend - cmds: - - task: build:frontend - - task: build:backend - - release:make: - internal: true - prompt: Do you wish to proceed? - cmds: - - pnpm dlx commit-and-tag-version -s - - release:dry-run: - internal: true - cmds: - - pnpm dlx commit-and-tag-version --dry-run --skip - - release: - desc: Create a new release - cmds: - - task: docs:cli:generate - - git add www/docs/cli - - | - if [[ `git status www/docs/cli --porcelain` ]]; then - git commit -m 'chore(docs): update CLI documentation' - fi - - task: release:dry-run - - task: release:make - - docs:cli:generate: - cmds: - - rm -rf www/docs/cli - - mkdir -p www/docs/cli - - go run . docs - generates: - - www/docs/cli - - docs:docker:generate: - internal: true - cmds: - - docker build -f www/Dockerfile --progress=plain -t filebrowser.site www - - docs: - desc: Generate documentation - cmds: - - rm -rf www/public - - task: docs:docker:generate - - docker run --rm {{.SITE_DOCKER_FLAGS}} filebrowser.site build -d "public" - - docs:serve: - desc: Serve documentation - cmds: - - task: docs:docker:generate - - docker run --rm -it -p 8000:8000 {{.SITE_DOCKER_FLAGS}} filebrowser.site diff --git a/auth/hook.go b/auth/hook.go index 0c5efac5c7..849a923d1a 100644 --- a/auth/hook.go +++ b/auth/hook.go @@ -8,10 +8,9 @@ import ( "net/http" "os" "os/exec" - "slices" "strings" - fberrors "github.com/filebrowser/filebrowser/v2/errors" + fbErrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/files" "github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/users" @@ -103,7 +102,7 @@ func (a *HookAuth) RunCommand() (string, error) { command[i] = os.Expand(arg, envMapping) } - cmd := exec.Command(command[0], command[1:]...) + cmd := exec.Command(command[0], command[1:]...) //nolint:gosec cmd.Env = append(os.Environ(), fmt.Sprintf("USERNAME=%s", a.Cred.Username)) cmd.Env = append(cmd.Env, fmt.Sprintf("PASSWORD=%s", a.Cred.Password)) out, err := cmd.Output() @@ -124,7 +123,7 @@ func (a *HookAuth) GetValues(s string) { s = strings.ReplaceAll(s, "\r\n", "\n") // iterate input lines - for val := range strings.Lines(s) { + for _, val := range strings.Split(s, "\n") { v := strings.SplitN(val, "=", 2) // skips non key and value format @@ -146,7 +145,7 @@ func (a *HookAuth) GetValues(s string) { // SaveUser updates the existing user or creates a new one when not found func (a *HookAuth) SaveUser() (*users.User, error) { u, err := a.Users.Get(a.Server.Root, a.Cred.Username) - if err != nil && !errors.Is(err, fberrors.ErrNotExist) { + if err != nil && !errors.Is(err, fbErrors.ErrNotExist) { return nil, err } @@ -158,17 +157,16 @@ func (a *HookAuth) SaveUser() (*users.User, error) { // create user with the provided credentials d := &users.User{ - Username: a.Cred.Username, - Password: pass, - Scope: a.Settings.Defaults.Scope, - Locale: a.Settings.Defaults.Locale, - ViewMode: a.Settings.Defaults.ViewMode, - SingleClick: a.Settings.Defaults.SingleClick, - RedirectAfterCopyMove: a.Settings.Defaults.RedirectAfterCopyMove, - Sorting: a.Settings.Defaults.Sorting, - Perm: a.Settings.Defaults.Perm, - Commands: a.Settings.Defaults.Commands, - HideDotfiles: a.Settings.Defaults.HideDotfiles, + Username: a.Cred.Username, + Password: pass, + Scope: a.Settings.Defaults.Scope, + Locale: a.Settings.Defaults.Locale, + ViewMode: a.Settings.Defaults.ViewMode, + SingleClick: a.Settings.Defaults.SingleClick, + Sorting: a.Settings.Defaults.Sorting, + Perm: a.Settings.Defaults.Perm, + Commands: a.Settings.Defaults.Commands, + HideDotfiles: a.Settings.Defaults.HideDotfiles, } u = a.GetUser(d) @@ -220,14 +218,13 @@ func (a *HookAuth) GetUser(d *users.User) *users.User { Download: isAdmin || a.Fields.GetBoolean("user.perm.download", d.Perm.Download), } user := users.User{ - ID: d.ID, - Username: d.Username, - Password: d.Password, - Scope: a.Fields.GetString("user.scope", d.Scope), - Locale: a.Fields.GetString("user.locale", d.Locale), - ViewMode: users.ViewMode(a.Fields.GetString("user.viewMode", string(d.ViewMode))), - SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick), - RedirectAfterCopyMove: a.Fields.GetBoolean("user.redirectAfterCopyMove", d.RedirectAfterCopyMove), + ID: d.ID, + Username: d.Username, + Password: d.Password, + Scope: a.Fields.GetString("user.scope", d.Scope), + Locale: a.Fields.GetString("user.locale", d.Locale), + ViewMode: users.ViewMode(a.Fields.GetString("user.viewMode", string(d.ViewMode))), + SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick), Sorting: files.Sorting{ Asc: a.Fields.GetBoolean("user.sorting.asc", d.Sorting.Asc), By: a.Fields.GetString("user.sorting.by", d.Sorting.By), @@ -253,7 +250,6 @@ var validHookFields = []string{ "user.locale", "user.viewMode", "user.singleClick", - "user.redirectAfterCopyMove", "user.sorting.by", "user.sorting.asc", "user.commands", @@ -270,7 +266,13 @@ var validHookFields = []string{ // IsValid checks if the provided field is on the valid fields list func (hf *hookFields) IsValid(field string) bool { - return slices.Contains(validHookFields, field) + for _, val := range validHookFields { + if field == val { + return true + } + } + + return false } // GetString returns the string value or provided default diff --git a/auth/json.go b/auth/json.go index f779c476d0..81f430b36f 100644 --- a/auth/json.go +++ b/auth/json.go @@ -40,7 +40,7 @@ func (a JSONAuth) Auth(r *http.Request, usr users.Store, _ *settings.Settings, s // If ReCaptcha is enabled, check the code. if a.ReCaptcha != nil && a.ReCaptcha.Secret != "" { - ok, err := a.ReCaptcha.Ok(cred.ReCaptcha) + ok, err := a.ReCaptcha.Ok(cred.ReCaptcha) //nolint:govet if err != nil { return nil, err diff --git a/auth/proxy.go b/auth/proxy.go index 3f4a627ca1..301aa292f8 100644 --- a/auth/proxy.go +++ b/auth/proxy.go @@ -4,7 +4,7 @@ import ( "errors" "net/http" - fberrors "github.com/filebrowser/filebrowser/v2/errors" + fbErrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/users" ) @@ -21,7 +21,7 @@ type ProxyAuth struct { func (a ProxyAuth) Auth(r *http.Request, usr users.Store, setting *settings.Settings, srv *settings.Server) (*users.User, error) { username := r.Header.Get(a.Header) user, err := usr.Get(srv.Root, username) - if errors.Is(err, fberrors.ErrNotExist) { + if errors.Is(err, fbErrors.ErrNotExist) { return a.createUser(usr, setting, srv, username) } return user, err diff --git a/branding/banner.png b/branding/banner.png deleted file mode 100644 index 9a533bfc85..0000000000 Binary files a/branding/banner.png and /dev/null differ diff --git a/branding/banner.svg b/branding/banner.svg deleted file mode 100644 index 85de752598..0000000000 --- a/branding/banner.svg +++ /dev/null @@ -1 +0,0 @@ -File Browser diff --git a/branding/icon.png b/branding/icon.png deleted file mode 100644 index ba267bc0fb..0000000000 Binary files a/branding/icon.png and /dev/null differ diff --git a/branding/icon.svg b/branding/icon.svg deleted file mode 100644 index df65444a82..0000000000 --- a/branding/icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/branding/logo.png b/branding/logo.png deleted file mode 100644 index 22225604cd..0000000000 Binary files a/branding/logo.png and /dev/null differ diff --git a/branding/logo.svg b/branding/logo.svg deleted file mode 100644 index dac88ae274..0000000000 --- a/branding/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/cmd/cmd_test.go b/cmd/cmd_test.go deleted file mode 100644 index e4b45c4784..0000000000 --- a/cmd/cmd_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package cmd - -import ( - "testing" - - "github.com/samber/lo" - "github.com/spf13/cobra" -) - -// TestEnvCollisions ensures that there are no collisions in the produced environment -// variable names for all commands and their flags. -func TestEnvCollisions(t *testing.T) { - testEnvCollisions(t, rootCmd) -} - -func testEnvCollisions(t *testing.T, cmd *cobra.Command) { - for _, cmd := range cmd.Commands() { - testEnvCollisions(t, cmd) - } - - replacements := generateEnvKeyReplacements(cmd) - envVariables := []string{} - - for i := range replacements { - if i%2 != 0 { - envVariables = append(envVariables, replacements[i]) - } - } - - duplicates := lo.FindDuplicates(envVariables) - - if len(duplicates) > 0 { - t.Errorf("Found duplicate environment variable keys for command %q: %v", cmd.Name(), duplicates) - } -} diff --git a/cmd/cmds_add.go b/cmd/cmds_add.go index a209b83fd1..a4d17061ff 100644 --- a/cmd/cmds_add.go +++ b/cmd/cmds_add.go @@ -15,18 +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), - RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { - s, err := st.Settings.Get() + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { + s, err := d.store.Settings.Get() if err != nil { return err } command := strings.Join(args[1:], " ") s.Commands[args[0]] = append(s.Commands[args[0]], command) - err = st.Settings.Save(s) + err = d.store.Settings.Save(s) if err != nil { return err } printEvents(s.Commands) return nil - }, storeOptions{}), + }, pythonConfig{}), } diff --git a/cmd/cmds_ls.go b/cmd/cmds_ls.go index 694be1788d..fa901a56c5 100644 --- a/cmd/cmds_ls.go +++ b/cmd/cmds_ls.go @@ -14,13 +14,12 @@ var cmdsLsCmd = &cobra.Command{ Short: "List all commands for each event", Long: `List all commands for each event.`, Args: cobra.NoArgs, - RunE: withStore(func(cmd *cobra.Command, _ []string, st *store) error { - s, err := st.Settings.Get() + RunE: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { + s, err := d.store.Settings.Get() if err != nil { return err } - - evt, err := cmd.Flags().GetString("event") + evt, err := getString(cmd.Flags(), "event") if err != nil { return err } @@ -33,7 +32,6 @@ var cmdsLsCmd = &cobra.Command{ show["after_"+evt] = s.Commands["after_"+evt] printEvents(show) } - return nil - }, storeOptions{}), + }, pythonConfig{}), } diff --git a/cmd/cmds_rm.go b/cmd/cmds_rm.go index 861f495fb9..3408938827 100644 --- a/cmd/cmds_rm.go +++ b/cmd/cmds_rm.go @@ -35,8 +35,8 @@ including 'index_end'.`, return nil }, - RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { - s, err := st.Settings.Get() + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { + s, err := d.store.Settings.Get() if err != nil { return err } @@ -55,11 +55,11 @@ including 'index_end'.`, } s.Commands[evt] = append(s.Commands[evt][:i], s.Commands[evt][f+1:]...) - err = st.Settings.Save(s) + err = d.store.Settings.Save(s) if err != nil { return err } printEvents(s.Commands) return nil - }, storeOptions{}), + }, pythonConfig{}), } diff --git a/cmd/config.go b/cmd/config.go index e2cf95f542..708d51ed92 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -2,7 +2,7 @@ package cmd import ( "encoding/json" - "errors" + nerrors "errors" "fmt" "os" "strings" @@ -12,7 +12,7 @@ import ( "github.com/spf13/pflag" "github.com/filebrowser/filebrowser/v2/auth" - fberrors "github.com/filebrowser/filebrowser/v2/errors" + "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/settings" ) @@ -30,23 +30,15 @@ var configCmd = &cobra.Command{ func addConfigFlags(flags *pflag.FlagSet) { addServerFlags(flags) addUserFlags(flags) - flags.BoolP("signup", "s", false, "allow users to signup") - flags.Bool("hideLoginButton", false, "hide login button from public pages") - flags.Bool("createUserDir", false, "generate user's home directory automatically") - flags.Uint("minimumPasswordLength", settings.DefaultMinimumPasswordLength, "minimum password length for new users") + flags.Bool("create-user-dir", false, "generate user's home directory automatically") + flags.Uint("minimum-password-length", settings.DefaultMinimumPasswordLength, "minimum password length for new users") flags.String("shell", "", "shell command to which other commands should be appended") - // 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("fileMode", fmt.Sprintf("%O", settings.DefaultFileMode), "mode bits that new files are created with") - flags.String("dirMode", fmt.Sprintf("%O", settings.DefaultDirMode), "mode bits that new directories are created with") - flags.String("auth.method", string(auth.MethodJSONAuth), "authentication type") flags.String("auth.header", "", "HTTP header for auth.method=proxy") flags.String("auth.logoutUrl", "", "Logout URL that should be called when auth.method=proxy") flags.String("auth.command", "", "command for auth.method=hook") - flags.String("auth.logoutPage", "", "url of custom logout page") flags.String("recaptcha.host", "https://www.google.com", "use another host for ReCAPTCHA. recaptcha.net might be useful in China") flags.String("recaptcha.key", "", "ReCaptcha site key") @@ -58,13 +50,14 @@ 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") - - flags.Uint64("tus.chunkSize", settings.DefaultTusChunkSize, "the tus chunk size") - flags.Uint16("tus.retryCount", settings.DefaultTusRetryCount, "the tus retry count") + // 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") } func getAuthMethod(flags *pflag.FlagSet, defaults ...interface{}) (settings.AuthMethod, map[string]interface{}, error) { - methodStr, err := flags.GetString("auth.method") + methodStr, err := getString(flags, "auth.method") if err != nil { return "", nil, err } @@ -95,17 +88,17 @@ func getAuthMethod(flags *pflag.FlagSet, defaults ...interface{}) (settings.Auth } func getProxyAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) { - header, err := flags.GetString("auth.header") + header, err := getString(flags, "auth.header") if err != nil { return nil, err } - if header == "" && defaultAuther != nil { + if header == "" { header = defaultAuther["header"].(string) } if header == "" { - return nil, errors.New("you must set the flag 'auth.header' for method 'proxy'") + return nil, nerrors.New("you must set the flag 'auth.header' for method 'proxy'") } return &auth.ProxyAuth{Header: header}, nil @@ -117,17 +110,15 @@ func getNoAuth() auth.Auther { func getJSONAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) { jsonAuth := &auth.JSONAuth{} - host, err := flags.GetString("recaptcha.host") + host, err := getString(flags, "recaptcha.host") if err != nil { return nil, err } - - key, err := flags.GetString("recaptcha.key") + key, err := getString(flags, "recaptcha.key") if err != nil { return nil, err } - - secret, err := flags.GetString("recaptcha.secret") + secret, err := getString(flags, "recaptcha.secret") if err != nil { return nil, err } @@ -155,16 +146,17 @@ func getJSONAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (au } func getHookAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) { - command, err := flags.GetString("auth.command") + command, err := getString(flags, "auth.command") if err != nil { return nil, err } + if command == "" { command = defaultAuther["command"].(string) } if command == "" { - return nil, errors.New("you must set the flag 'auth.command' for method 'hook'") + return nil, nerrors.New("you must set the flag 'auth.command' for method 'hook'") } return &auth.HookAuth{Command: command}, nil @@ -187,7 +179,7 @@ func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (settings. case auth.MethodHookAuth: auther, err = getHookAuth(flags, defaultAuther) default: - return "", nil, fberrors.ErrInvalidAuthMethod + return "", nil, errors.ErrInvalidAuthMethod } if err != nil { @@ -201,13 +193,10 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) fmt.Fprintf(w, "Sign up:\t%t\n", set.Signup) - fmt.Fprintf(w, "Hide Login Button:\t%t\n", set.HideLoginButton) fmt.Fprintf(w, "Create User Dir:\t%t\n", set.CreateUserDir) - fmt.Fprintf(w, "Logout Page:\t%s\n", set.LogoutPage) fmt.Fprintf(w, "Minimum Password Length:\t%d\n", set.MinimumPasswordLength) - fmt.Fprintf(w, "Auth Method:\t%s\n", set.AuthMethod) + fmt.Fprintf(w, "Auth method:\t%s\n", set.AuthMethod) fmt.Fprintf(w, "Shell:\t%s\t\n", strings.Join(set.Shell, " ")) - fmt.Fprintln(w, "\nBranding:") fmt.Fprintf(w, "\tName:\t%s\n", set.Branding.Name) fmt.Fprintf(w, "\tFiles override:\t%s\n", set.Branding.Files) @@ -215,7 +204,6 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut fmt.Fprintf(w, "\tDisable used disk percentage graph:\t%t\n", set.Branding.DisableUsedPercentage) fmt.Fprintf(w, "\tColor:\t%s\n", set.Branding.Color) fmt.Fprintf(w, "\tTheme:\t%s\n", set.Branding.Theme) - fmt.Fprintln(w, "\nServer:") fmt.Fprintf(w, "\tLog:\t%s\n", ser.Log) fmt.Fprintf(w, "\tPort:\t%s\n", ser.Port) @@ -225,32 +213,18 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut fmt.Fprintf(w, "\tAddress:\t%s\n", ser.Address) fmt.Fprintf(w, "\tTLS Cert:\t%s\n", ser.TLSCert) fmt.Fprintf(w, "\tTLS Key:\t%s\n", ser.TLSKey) - fmt.Fprintf(w, "\tToken Expiration Time:\t%s\n", ser.TokenExpirationTime) fmt.Fprintf(w, "\tExec Enabled:\t%t\n", ser.EnableExec) - fmt.Fprintf(w, "\tThumbnails Enabled:\t%t\n", ser.EnableThumbnails) - fmt.Fprintf(w, "\tResize Preview:\t%t\n", ser.ResizePreview) - fmt.Fprintf(w, "\tType Detection by Header:\t%t\n", ser.TypeDetectionByHeader) - - fmt.Fprintln(w, "\nTUS:") - fmt.Fprintf(w, "\tChunk size:\t%d\n", set.Tus.ChunkSize) - fmt.Fprintf(w, "\tRetry count:\t%d\n", set.Tus.RetryCount) - fmt.Fprintln(w, "\nDefaults:") fmt.Fprintf(w, "\tScope:\t%s\n", set.Defaults.Scope) - fmt.Fprintf(w, "\tHideDotfiles:\t%t\n", set.Defaults.HideDotfiles) 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, "\tRedirect after Copy/Move:\t%t\n", set.Defaults.RedirectAfterCopyMove) 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, "\tAce editor syntax highlighting theme:\t%s\n", set.Defaults.AceEditorTheme) - fmt.Fprintf(w, "\tSorting:\n") fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By) fmt.Fprintf(w, "\t\tAsc:\t%t\n", set.Defaults.Sorting.Asc) - fmt.Fprintf(w, "\tPermissions:\n") fmt.Fprintf(w, "\t\tAdmin:\t%t\n", set.Defaults.Perm.Admin) fmt.Fprintf(w, "\t\tExecute:\t%t\n", set.Defaults.Perm.Execute) @@ -260,7 +234,6 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut fmt.Fprintf(w, "\t\tDelete:\t%t\n", set.Defaults.Perm.Delete) fmt.Fprintf(w, "\t\tShare:\t%t\n", set.Defaults.Perm.Share) fmt.Fprintf(w, "\t\tDownload:\t%t\n", set.Defaults.Perm.Download) - w.Flush() b, err := json.MarshalIndent(auther, "", " ") @@ -270,129 +243,3 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut fmt.Printf("\nAuther configuration (raw):\n\n%s\n\n", string(b)) return nil } - -func getSettings(flags *pflag.FlagSet, set *settings.Settings, ser *settings.Server, auther auth.Auther, all bool) (auth.Auther, error) { - errs := []error{} - hasAuth := false - - visit := func(flag *pflag.Flag) { - var err error - - switch flag.Name { - // Server flags from [addServerFlags] - case "address": - ser.Address, err = flags.GetString(flag.Name) - case "log": - ser.Log, err = flags.GetString(flag.Name) - case "port": - ser.Port, err = flags.GetString(flag.Name) - case "cert": - ser.TLSCert, err = flags.GetString(flag.Name) - case "key": - ser.TLSKey, err = flags.GetString(flag.Name) - case "root": - ser.Root, err = flags.GetString(flag.Name) - case "socket": - ser.Socket, err = flags.GetString(flag.Name) - case "baseURL": - ser.BaseURL, err = flags.GetString(flag.Name) - case "tokenExpirationTime": - ser.TokenExpirationTime, err = flags.GetString(flag.Name) - case "disableThumbnails": - ser.EnableThumbnails, err = flags.GetBool(flag.Name) - ser.EnableThumbnails = !ser.EnableThumbnails - case "disablePreviewResize": - ser.ResizePreview, err = flags.GetBool(flag.Name) - ser.ResizePreview = !ser.ResizePreview - case "disableExec": - ser.EnableExec, err = flags.GetBool(flag.Name) - ser.EnableExec = !ser.EnableExec - case "disableTypeDetectionByHeader": - ser.TypeDetectionByHeader, err = flags.GetBool(flag.Name) - ser.TypeDetectionByHeader = !ser.TypeDetectionByHeader - case "disableImageResolutionCalc": - ser.ImageResolutionCal, err = flags.GetBool(flag.Name) - ser.ImageResolutionCal = !ser.ImageResolutionCal - case "hidden-files": - if hiddenFileString, err := flags.GetString(flag.Name); err == nil { - ser.HiddenFiles = convertFileStrToFileMap(hiddenFileString) - } - - // Settings flags from [addConfigFlags] - case "signup": - set.Signup, err = flags.GetBool(flag.Name) - case "hideLoginButton": - set.HideLoginButton, err = flags.GetBool(flag.Name) - case "createUserDir": - set.CreateUserDir, err = flags.GetBool(flag.Name) - case "minimumPasswordLength": - set.MinimumPasswordLength, err = flags.GetUint(flag.Name) - case "shell": - var shell string - shell, err = flags.GetString(flag.Name) - if err == nil { - set.Shell = convertCmdStrToCmdArray(shell) - } - case "fileMode": - set.FileMode, err = getAndParseFileMode(flags, flag.Name) - case "dirMode": - set.DirMode, err = getAndParseFileMode(flags, flag.Name) - case "auth.method": - hasAuth = true - case "auth.logoutPage": - set.LogoutPage, err = flags.GetString(flag.Name) - case "branding.name": - set.Branding.Name, err = flags.GetString(flag.Name) - case "branding.theme": - set.Branding.Theme, err = flags.GetString(flag.Name) - case "branding.color": - set.Branding.Color, err = flags.GetString(flag.Name) - case "branding.files": - set.Branding.Files, err = flags.GetString(flag.Name) - case "branding.disableExternal": - set.Branding.DisableExternal, err = flags.GetBool(flag.Name) - case "branding.disableUsedPercentage": - set.Branding.DisableUsedPercentage, err = flags.GetBool(flag.Name) - case "tus.chunkSize": - set.Tus.ChunkSize, err = flags.GetUint64(flag.Name) - case "tus.retryCount": - set.Tus.RetryCount, err = flags.GetUint16(flag.Name) - case "auth.logoutUrl": - set.AuthLogoutURL, err = flags.GetString(flag.Name) - } - - if err != nil { - errs = append(errs, err) - } - } - - if all { - flags.VisitAll(visit) - } else { - flags.Visit(visit) - } - - err := errors.Join(errs...) - if err != nil { - return nil, err - } - - err = getUserDefaults(flags, &set.Defaults, all) - if err != nil { - return nil, err - } - - if all { - set.AuthMethod, auther, err = getAuthentication(flags) - if err != nil { - return nil, err - } - } else { - set.AuthMethod, auther, err = getAuthentication(flags, hasAuth, set, auther) - if err != nil { - return nil, err - } - } - - return auther, nil -} diff --git a/cmd/config_cat.go b/cmd/config_cat.go index b8d2f48f1c..39b1f66482 100644 --- a/cmd/config_cat.go +++ b/cmd/config_cat.go @@ -13,19 +13,19 @@ var configCatCmd = &cobra.Command{ Short: "Prints the configuration", Long: `Prints the configuration.`, Args: cobra.NoArgs, - RunE: withStore(func(_ *cobra.Command, _ []string, st *store) error { - set, err := st.Settings.Get() + RunE: python(func(_ *cobra.Command, _ []string, d *pythonData) error { + set, err := d.store.Settings.Get() if err != nil { return err } - ser, err := st.Settings.GetServer() + ser, err := d.store.Settings.GetServer() if err != nil { return err } - auther, err := st.Auth.Get(set.AuthMethod) + auther, err := d.store.Auth.Get(set.AuthMethod) if err != nil { return err } return printSettings(ser, set, auther) - }, storeOptions{}), + }, pythonConfig{}), } diff --git a/cmd/config_export.go b/cmd/config_export.go index b19c10b6e0..9877fb637d 100644 --- a/cmd/config_export.go +++ b/cmd/config_export.go @@ -15,18 +15,18 @@ var configExportCmd = &cobra.Command{ json or yaml file. This exported configuration can be changed, and imported again with 'config import' command.`, Args: jsonYamlArg, - RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { - settings, err := st.Settings.Get() + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { + settings, err := d.store.Settings.Get() if err != nil { return err } - server, err := st.Settings.GetServer() + server, err := d.store.Settings.GetServer() if err != nil { return err } - auther, err := st.Auth.Get(settings.AuthMethod) + auther, err := d.store.Auth.Get(settings.AuthMethod) if err != nil { return err } @@ -42,5 +42,5 @@ and imported again with 'config import' command.`, return err } return nil - }, storeOptions{}), + }, pythonConfig{}), } diff --git a/cmd/config_import.go b/cmd/config_import.go index 9a8387219e..7763517d1c 100644 --- a/cmd/config_import.go +++ b/cmd/config_import.go @@ -34,11 +34,11 @@ database. The path must be for a json or yaml file.`, Args: jsonYamlArg, - RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { var key []byte var err error - if st.databaseExisted { - settings, settingErr := st.Settings.Get() + if d.hadDB { + settings, settingErr := d.store.Settings.Get() if settingErr != nil { return settingErr } @@ -53,17 +53,13 @@ The path must be for a json or yaml file.`, return err } - if file.Settings == nil || file.Server == nil { - return errors.New("invalid configuration file: 'settings' or 'server' fields are missing. Please ensure you are importing a file generated by the 'config export' command") - } - file.Settings.Key = key - err = st.Settings.Save(file.Settings) + err = d.store.Settings.Save(file.Settings) if err != nil { return err } - err = st.Settings.SaveServer(file.Server) + err = d.store.Settings.SaveServer(file.Server) if err != nil { return err } @@ -102,13 +98,13 @@ The path must be for a json or yaml file.`, return autherErr } - err = st.Auth.Save(auther) + err = d.store.Auth.Save(auther) if err != nil { return err } return printSettings(file.Server, file.Settings, auther) - }, storeOptions{allowsNoDatabase: true}), + }, pythonConfig{allowNoDB: true}), } func getAuther(sample auth.Auther, data interface{}) (interface{}, error) { diff --git a/cmd/config_init.go b/cmd/config_init.go index 359d02a343..c1b4438735 100644 --- a/cmd/config_init.go +++ b/cmd/config_init.go @@ -22,31 +22,158 @@ 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, - RunE: withStore(func(cmd *cobra.Command, _ []string, st *store) error { + RunE: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { + defaults := settings.UserDefaults{} flags := cmd.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 + } + + authLogoutURL, err := getString(flags, "auth.logoutUrl") + if err != nil { + return err + } + + s := &settings.Settings{ + Key: key, + Signup: signup, + CreateUserDir: createUserDir, + MinimumPasswordLength: minLength, + Shell: convertCmdStrToCmdArray(shell), + AuthMethod: authMethod, + AuthLogoutURL: authLogoutURL, + Defaults: defaults, + Branding: settings.Branding{ + Name: brandingName, + DisableExternal: brandingDisableExternal, + DisableUsedPercentage: brandingDisableUsedPercentage, + Theme: brandingTheme, + Files: brandingFiles, + }, + } + + s.FileMode, err = getMode(flags, "file-mode") + if err != nil { + return err + } + + s.DirMode, err = getMode(flags, "dir-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 + } - // Initialize config - s := &settings.Settings{Key: generateKey()} - ser := &settings.Server{} + root, err := getString(flags, "root") + if err != nil { + return err + } - // Fill config with options - auther, err := getSettings(flags, s, ser, nil, true) + baseURL, err := getString(flags, "baseurl") if err != nil { return err } - // Save updated config - err = st.Settings.Save(s) + tlsKey, err := getString(flags, "key") if err != nil { return err } - err = st.Settings.SaveServer(ser) + cert, err := getString(flags, "cert") if err != nil { return err } - err = st.Auth.Save(auther) + port, err := getString(flags, "port") + if err != nil { + return err + } + + log, err := getString(flags, "log") + if err != nil { + return err + } + + ser := &settings.Server{ + Address: address, + Socket: socket, + Root: root, + BaseURL: baseURL, + TLSKey: tlsKey, + TLSCert: cert, + Port: port, + Log: log, + } + + err = d.store.Settings.Save(s) + if err != nil { + return err + } + err = d.store.Settings.SaveServer(ser) + if err != nil { + return err + } + err = d.store.Auth.Save(auther) if err != nil { return err } @@ -57,5 +184,5 @@ Now add your first user via 'filebrowser users add' and then you just need to call the main command to boot up the server. `) return printSettings(ser, s, auther) - }, storeOptions{expectsNoDatabase: true}), + }, pythonConfig{noDB: true}), } diff --git a/cmd/config_set.go b/cmd/config_set.go index df357a0265..f03b5a848f 100644 --- a/cmd/config_set.go +++ b/cmd/config_set.go @@ -2,6 +2,7 @@ package cmd import ( "github.com/spf13/cobra" + "github.com/spf13/pflag" ) func init() { @@ -15,47 +16,111 @@ 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, - RunE: withStore(func(cmd *cobra.Command, _ []string, st *store) error { + RunE: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { flags := cmd.Flags() - - // Read existing config - set, err := st.Settings.Get() + set, err := d.store.Settings.Get() if err != nil { return err } - ser, err := st.Settings.GetServer() + ser, err := d.store.Settings.GetServer() if err != nil { return err } - auther, err := st.Auth.Get(set.AuthMethod) + hasAuth := false + flags.Visit(func(flag *pflag.Flag) { + if err != nil { + return + } + switch flag.Name { + case "baseurl": + ser.BaseURL, err = getString(flags, flag.Name) + case "root": + ser.Root, err = getString(flags, flag.Name) + case "socket": + ser.Socket, err = getString(flags, flag.Name) + case "cert": + ser.TLSCert, err = getString(flags, flag.Name) + case "key": + ser.TLSKey, err = getString(flags, flag.Name) + case "address": + ser.Address, err = getString(flags, flag.Name) + case "port": + ser.Port, err = getString(flags, flag.Name) + case "log": + ser.Log, err = getString(flags, flag.Name) + case "signup": + set.Signup, err = getBool(flags, flag.Name) + case "auth.method": + hasAuth = true + case "hidden-files": + var hiddenFiles string + hiddenFiles, err = getString(flags, flag.Name) + ser.HiddenFiles = convertFileStrToFileMap(hiddenFiles) + case "auth.logoutUrl": + set.AuthLogoutURL, err = getString(flags, flag.Name) + case "shell": + var shell string + shell, err = getString(flags, flag.Name) + set.Shell = convertCmdStrToCmdArray(shell) + case "create-user-dir": + set.CreateUserDir, err = getBool(flags, flag.Name) + case "minimum-password-length": + set.MinimumPasswordLength, err = getUint(flags, flag.Name) + case "branding.name": + set.Branding.Name, err = getString(flags, flag.Name) + case "branding.color": + set.Branding.Color, err = getString(flags, flag.Name) + case "branding.theme": + set.Branding.Theme, err = getString(flags, flag.Name) + case "branding.disableExternal": + set.Branding.DisableExternal, err = getBool(flags, flag.Name) + case "branding.disableUsedPercentage": + set.Branding.DisableUsedPercentage, err = getBool(flags, flag.Name) + case "branding.files": + set.Branding.Files, err = getString(flags, flag.Name) + case "file-mode": + set.FileMode, err = getMode(flags, flag.Name) + case "dir-mode": + set.DirMode, err = getMode(flags, flag.Name) + } + }) + if err != nil { return err } - // Get updated config - auther, err = getSettings(flags, set, ser, auther, false) + err = getUserDefaults(flags, &set.Defaults, false) if err != nil { return err } - // Save updated config - err = st.Auth.Save(auther) + // read the defaults + auther, err := d.store.Auth.Get(set.AuthMethod) if err != nil { return err } - err = st.Settings.Save(set) + // check if there are new flags for existing auth method + set.AuthMethod, auther, err = getAuthentication(flags, hasAuth, set, auther) if err != nil { return err } - err = st.Settings.SaveServer(ser) + err = d.store.Auth.Save(auther) + if err != nil { + return err + } + err = d.store.Settings.Save(set) + if err != nil { + return err + } + err = d.store.Settings.SaveServer(ser) if err != nil { return err } return printSettings(ser, set, auther) - }, storeOptions{}), + }, pythonConfig{}), } diff --git a/cmd/docs.go b/cmd/docs.go index d65a29beca..5f26daf9fd 100644 --- a/cmd/docs.go +++ b/cmd/docs.go @@ -3,18 +3,36 @@ package cmd import ( "bytes" "fmt" + "io" "os" - "path" - "regexp" + "path/filepath" + "sort" "strings" "github.com/spf13/cobra" - "github.com/spf13/cobra/doc" + "github.com/spf13/pflag" ) func init() { rootCmd.AddCommand(docsCmd) - docsCmd.Flags().String("out", "www/docs/cli", "directory to write the docs to") + docsCmd.Flags().StringP("path", "p", "./docs", "path to save the docs") +} + +func printToc(names []string) { + for i, name := range names { + name = strings.TrimSuffix(name, filepath.Ext(name)) + name = strings.Replace(name, "-", " ", -1) + names[i] = name + } + + sort.Strings(names) + + toc := "" + for _, name := range names { + toc += "* [" + name + "](cli/" + strings.Replace(name, " ", "-", -1) + ".md)\n" + } + + fmt.Println(toc) } var docsCmd = &cobra.Command{ @@ -22,61 +40,115 @@ var docsCmd = &cobra.Command{ Hidden: true, Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { - outputDir, err := cmd.Flags().GetString("out") + dir, err := getString(cmd.Flags(), "path") if err != nil { return err } - tempDir, err := os.MkdirTemp(os.TempDir(), "filebrowser-docs-") + err = generateDocs(rootCmd, dir) if err != nil { return err } - defer os.RemoveAll(tempDir) + names := []string{} + + err = filepath.Walk(dir, func(_ string, info os.FileInfo, err error) error { + if err != nil || info.IsDir() { + return err + } - rootCmd.Root().DisableAutoGenTag = true + if !strings.HasPrefix(info.Name(), "filebrowser") { + return nil + } - err = doc.GenMarkdownTreeCustom(cmd.Root(), tempDir, func(_ string) string { - return "" - }, func(s string) string { - return s + names = append(names, info.Name()) + return nil }) if err != nil { return err } - entries, err := os.ReadDir(tempDir) + printToc(names) + return nil + }, +} + +func generateDocs(cmd *cobra.Command, dir string) error { + for _, c := range cmd.Commands() { + if !c.IsAvailableCommand() || c.IsAdditionalHelpTopicCommand() { + continue + } + + 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) + if err != nil { + return err + } + defer f.Close() + return generateMarkdown(cmd, f) +} - headerRegex := regexp.MustCompile(`(?m)^(##)(.*)$`) - linkRegex := regexp.MustCompile(`\(filebrowser(.*)\.md\)`) +func generateMarkdown(cmd *cobra.Command, w io.Writer) error { + cmd.InitDefaultHelpCmd() + cmd.InitDefaultHelpFlag() - fmt.Println("Generated Documents:") + buf := new(bytes.Buffer) + name := cmd.CommandPath() - for _, entry := range entries { - srcPath := path.Join(tempDir, entry.Name()) - dstPath := path.Join(outputDir, strings.ReplaceAll(entry.Name(), "_", "-")) + short := cmd.Short + long := cmd.Long + if long == "" { + long = short + } - data, err := os.ReadFile(srcPath) - if err != nil { - return err - } + buf.WriteString("---\ndescription: " + short + "\n---\n\n") + buf.WriteString("# " + name + "\n\n") + buf.WriteString("## Synopsis\n\n") + buf.WriteString(long + "\n\n") - data = headerRegex.ReplaceAll(data, []byte("#$2")) - data = linkRegex.ReplaceAllFunc(data, func(b []byte) []byte { - return bytes.ReplaceAll(b, []byte("_"), []byte("-")) - }) - data = bytes.ReplaceAll(data, []byte("## SEE ALSO"), []byte("## See Also")) + if cmd.Runnable() { + _, _ = fmt.Fprintf(buf, "```\n%s\n```\n\n", cmd.UseLine()) + } - err = os.WriteFile(dstPath, data, 0666) - if err != nil { - return err - } + if cmd.Example != "" { + buf.WriteString("## Examples\n\n") + _, _ = fmt.Fprintf(buf, "```\n%s\n```\n\n", cmd.Example) + } - fmt.Println("- " + dstPath) - } + printOptions(buf, cmd) + _, err := buf.WriteTo(w) + return err +} - return nil - }, +func generateFlagsTable(fs *pflag.FlagSet, buf io.StringWriter) { + _, _ = buf.WriteString("| Name | Shorthand | Usage |\n") + _, _ = buf.WriteString("|------|-----------|-------|\n") + + fs.VisitAll(func(f *pflag.Flag) { + _, _ = buf.WriteString("|" + f.Name + "|" + f.Shorthand + "|" + f.Usage + "|\n") + }) +} + +func printOptions(buf *bytes.Buffer, cmd *cobra.Command) { + flags := cmd.NonInheritedFlags() + flags.SetOutput(buf) + if flags.HasAvailableFlags() { + buf.WriteString("## Options\n\n") + generateFlagsTable(flags, buf) + buf.WriteString("\n") + } + + parentFlags := cmd.InheritedFlags() + parentFlags.SetOutput(buf) + if parentFlags.HasAvailableFlags() { + buf.WriteString("### Inherited\n\n") + generateFlagsTable(parentFlags, buf) + buf.WriteString("\n") + } } diff --git a/cmd/root.go b/cmd/root.go index afb92856bc..197c1dfcfe 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -13,17 +13,20 @@ import ( "os" "os/signal" "path/filepath" + "strings" "syscall" "time" + homedir "github.com/mitchellh/go-homedir" "github.com/spf13/afero" "github.com/spf13/cobra" "github.com/spf13/pflag" - "github.com/spf13/viper" + v "github.com/spf13/viper" lumberjack "gopkg.in/natefinch/lumberjack.v2" "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" @@ -33,67 +36,28 @@ import ( ) var ( - flagNamesMigrations = map[string]string{ - "file-mode": "fileMode", - "dir-mode": "dirMode", - "hide-login-button": "hideLoginButton", - "create-user-dir": "createUserDir", - "minimum-password-length": "minimumPasswordLength", - "socket-perm": "socketPerm", - "disable-thumbnails": "disableThumbnails", - "disable-preview-resize": "disablePreviewResize", - "disable-exec": "disableExec", - "disable-type-detection-by-header": "disableTypeDetectionByHeader", - "img-processors": "imageProcessors", - "cache-dir": "cacheDir", - "token-expiration-time": "tokenExpirationTime", - "baseurl": "baseURL", - } - - warnedFlags = map[string]bool{} + cfgFile string ) -// TODO(remove): remove after July 2026. -func migrateFlagNames(_ *pflag.FlagSet, name string) pflag.NormalizedName { - if newName, ok := flagNamesMigrations[name]; ok { - - if !warnedFlags[name] { - warnedFlags[name] = true - log.Printf("DEPRECATION NOTICE: Flag --%s has been deprecated, use --%s instead\n", name, newName) - } - - name = newName - } - - return pflag.NormalizedName(name) -} - func init() { + cobra.OnInitialize(initConfig) rootCmd.SilenceUsage = true - rootCmd.SetGlobalNormalizationFunc(migrateFlagNames) - cobra.MousetrapHelpText = "" rootCmd.SetVersionTemplate("File Browser version {{printf \"%s\" .Version}}\n") - // Flags available across the whole program + flags := rootCmd.Flags() persistent := rootCmd.PersistentFlags() - persistent.StringP("config", "c", "", "config file path") - persistent.StringP("database", "d", "./filebrowser.db", "database path") - // Runtime flags for the root command - flags := rootCmd.Flags() + persistent.StringVarP(&cfgFile, "config", "c", "", "config file path") + persistent.StringP("database", "d", "./filebrowser.db", "database path") flags.Bool("noauth", false, "use the noauth auther when using quick setup") - flags.String("username", "admin", "username for the first user when using quick setup") - flags.String("password", "", "hashed password for the first user when using quick setup") - flags.Uint32("socketPerm", 0666, "unix socket file permissions") - flags.String("cacheDir", "", "file cache directory (disabled if empty)") - flags.Int("imageProcessors", 4, "image processors count") + flags.String("username", "admin", "username for the first user when using quick config") + flags.String("password", "", "hashed password for the first user when using quick config") + addServerFlags(flags) } -// addServerFlags adds server related flags to the given FlagSet. These flags are available -// in both the root command, config set and config init commands. func addServerFlags(flags *pflag.FlagSet) { flags.StringP("address", "a", "127.0.0.1", "address to listen on") flags.StringP("log", "l", "stdout", "log output") @@ -102,14 +66,15 @@ func addServerFlags(flags *pflag.FlagSet) { flags.StringP("key", "k", "", "tls key") flags.StringP("root", "r", ".", "root to prepend to relative paths") flags.String("socket", "", "socket to listen to (cannot be used with address, port, cert nor key flags)") - flags.StringP("baseURL", "b", "", "base url") - flags.String("tokenExpirationTime", "2h", "user session timeout") - flags.Bool("disableThumbnails", false, "disable image thumbnails") - flags.Bool("disablePreviewResize", false, "disable resize of image previews") - flags.Bool("disableExec", true, "disables Command Runner feature") - flags.Bool("disableTypeDetectionByHeader", false, "disables type detection by reading file headers") - flags.Bool("disableImageResolutionCalc", false, "disables image resolution calculation by reading image files") - + flags.Uint32("socket-perm", 0666, "unix socket file permissions") + flags.StringP("baseurl", "b", "", "base url") + flags.String("cache-dir", "", "file cache directory (disabled if empty)") + flags.String("token-expiration-time", "2h", "user session timeout") + flags.Int("img-processors", 4, "image processors count") //nolint:mnd + flags.Bool("disable-thumbnails", false, "disable image thumbnails") + flags.Bool("disable-preview-resize", false, "disable resize of image previews") + flags.Bool("disable-exec", true, "disables Command Runner feature") + flags.Bool("disable-type-detection-by-header", false, "disables type detection by reading file headers") flags.String("hidden-files", "", "comma separated list of files that should be hidden") } @@ -125,60 +90,65 @@ it. Don't worry: you don't need to setup a separate database server. We're using Bolt DB which is a single file database and all managed by ourselves. -For this command, all flags are available as environmental variables, -except for "--config", which specifies the configuration file to use. -The environment variables are prefixed by "FB_" followed by the flag name in -UPPER_SNAKE_CASE. For example, the flag "--disablePreviewResize" is available -as FB_DISABLE_PREVIEW_RESIZE. +For this specific command, all the flags you have available (except +"config" for the configuration file), can be given either through +environment variables or configuration files. -If "--config" is not specified, File Browser will look for a configuration -file named .filebrowser.{json, toml, yaml, yml} in the following directories: +If you don't set "config", it will look for a configuration file called +.filebrowser.{json, toml, yaml, yml} in the following directories: - ./ - $HOME/ - /etc/filebrowser/ -**Note:** Only the options listed below can be set via the config file or -environment variables. Other configuration options live exclusively in the -database and so they must be set by the "config set" or "config -import" commands. - The precedence of the configuration values are as follows: -- Flags -- Environment variables -- Configuration file -- Database values -- Defaults +- flags +- environment variables +- configuration file +- database values +- defaults + +The environment variables are prefixed by "FB_" followed by the option +name in caps. So to set "database" via an env variable, you should +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".`, - RunE: withViperAndStore(func(_ *cobra.Command, _ []string, v *viper.Viper, st *store) error { - if !st.databaseExisted { - err := quickSetup(v, st.Storage) + RunE: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { + log.Println(cfgFile) + + if !d.hadDB { + err := quickSetup(cmd.Flags(), *d) if err != nil { return err } } // build img service - imgWorkersCount := v.GetInt("imageProcessors") - if imgWorkersCount < 1 { + workersCount, err := cmd.Flags().GetInt("img-processors") + if err != nil { + return err + } + if workersCount < 1 { return errors.New("image resize workers count could not be < 1") } - imageService := img.New(imgWorkersCount) + imgSvc := img.New(workersCount) var fileCache diskcache.Interface = diskcache.NewNoOp() - cacheDir := v.GetString("cacheDir") + cacheDir, err := cmd.Flags().GetString("cache-dir") + if err != nil { + return err + } if cacheDir != "" { - if err := os.MkdirAll(cacheDir, 0700); err != nil { + if err := os.MkdirAll(cacheDir, 0700); err != nil { //nolint:govet return fmt.Errorf("can't make directory %s: %w", cacheDir, err) } fileCache = diskcache.New(afero.NewOsFs(), cacheDir) } - server, err := getServerSettings(v, st.Storage) + server, err := getRunParams(cmd.Flags(), d.store) if err != nil { return err } @@ -200,13 +170,16 @@ user created with the credentials from options "username" and "password".`, if err != nil { return err } - socketPerm := v.GetUint32("socketPerm") + socketPerm, err := cmd.Flags().GetUint32("socket-perm") //nolint:govet + if err != nil { + return err + } err = os.Chmod(server.Socket, os.FileMode(socketPerm)) if err != nil { return err } case server.TLSKey != "" && server.TLSCert != "": - cer, err := tls.LoadX509KeyPair(server.TLSCert, server.TLSKey) + cer, err := tls.LoadX509KeyPair(server.TLSCert, server.TLSKey) //nolint:govet if err != nil { return err } @@ -229,7 +202,7 @@ user created with the credentials from options "username" and "password".`, panic(err) } - handler, err := fbhttp.NewHandler(imageService, fileCache, st.Storage, server, assetsFs) + handler, err := fbhttp.NewHandler(imgSvc, fileCache, d.store, server, assetsFs) if err != nil { return err } @@ -261,7 +234,7 @@ user created with the credentials from options "username" and "password".`, sig := <-sigc log.Println("Got signal:", sig) - shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 10*time.Second) + shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 10*time.Second) //nolint:mnd defer shutdownRelease() if err := srv.Shutdown(shutdownCtx); err != nil { @@ -269,82 +242,66 @@ user created with the credentials from options "username" and "password".`, } log.Println("Graceful shutdown complete.") - return nil - }, storeOptions{allowsNoDatabase: true}), + 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}), } -func getServerSettings(v *viper.Viper, st *storage.Storage) (*settings.Server, error) { +//nolint:gocyclo +func getRunParams(flags *pflag.FlagSet, st *storage.Storage) (*settings.Server, error) { server, err := st.Settings.GetServer() if err != nil { return nil, err } - isSocketSet := false - isAddrSet := false - - if v.IsSet("address") { - server.Address = v.GetString("address") - isAddrSet = true - } - - if v.IsSet("log") { - server.Log = v.GetString("log") - } - - if v.IsSet("port") { - server.Port = v.GetString("port") - isAddrSet = true - } - - if v.IsSet("cert") { - server.TLSCert = v.GetString("cert") - isAddrSet = true - } - - if v.IsSet("key") { - server.TLSKey = v.GetString("key") - isAddrSet = true + if val, set := getStringParamB(flags, "root"); set { + server.Root = val } - if v.IsSet("root") { - server.Root = v.GetString("root") + if val, set := getStringParamB(flags, "baseurl"); set { + server.BaseURL = val } - if v.IsSet("socket") { - server.Socket = v.GetString("socket") - isSocketSet = true + if val, set := getStringParamB(flags, "log"); set { + server.Log = val } - if v.IsSet("baseURL") { - server.BaseURL = v.GetString("baseURL") - // TODO(remove): remove after July 2026. - } else if v := os.Getenv("FB_BASEURL"); v != "" { - log.Println("DEPRECATION NOTICE: Environment variable FB_BASEURL has been deprecated, use FB_BASE_URL instead") - server.BaseURL = v - } - - if v.IsSet("tokenExpirationTime") { - server.TokenExpirationTime = v.GetString("tokenExpirationTime") - } + isSocketSet := false + isAddrSet := false - if v.IsSet("disableThumbnails") { - server.EnableThumbnails = !v.GetBool("disableThumbnails") + if val, set := getStringParamB(flags, "address"); set { + server.Address = val + isAddrSet = isAddrSet || set } - if v.IsSet("disablePreviewResize") { - server.ResizePreview = !v.GetBool("disablePreviewResize") + if val, set := getStringParamB(flags, "port"); set { + server.Port = val + isAddrSet = isAddrSet || set } - if v.IsSet("disableTypeDetectionByHeader") { - server.TypeDetectionByHeader = !v.GetBool("disableTypeDetectionByHeader") + if val, set := getStringParamB(flags, "key"); set { + server.TLSKey = val + isAddrSet = isAddrSet || set } - if v.IsSet("disableImageResolutionCalc") { - server.ImageResolutionCal = !v.GetBool("disableImageResolutionCalc") + if val, set := getStringParamB(flags, "cert"); set { + server.TLSCert = val + isAddrSet = isAddrSet || set } - if v.IsSet("disableExec") { - server.EnableExec = !v.GetBool("disableExec") + if val, set := getStringParamB(flags, "socket"); set { + server.Socket = val + isSocketSet = isSocketSet || set } if isAddrSet && isSocketSet { @@ -356,6 +313,18 @@ func getServerSettings(v *viper.Viper, st *storage.Storage) (*settings.Server, e server.Socket = "" } + disableThumbnails := getBoolParam(flags, "disable-thumbnails") + server.EnableThumbnails = !disableThumbnails + + disablePreviewResize := getBoolParam(flags, "disable-preview-resize") + server.ResizePreview = !disablePreviewResize + + disableTypeDetectionByHeader := getBoolParam(flags, "disable-type-detection-by-header") + server.TypeDetectionByHeader = !disableTypeDetectionByHeader + + disableExec := getBoolParam(flags, "disable-exec") + server.EnableExec = !disableExec + if server.EnableExec { log.Println("WARNING: Command Runner feature enabled!") log.Println("WARNING: This feature has known security vulnerabilities and should not") @@ -363,13 +332,75 @@ func getServerSettings(v *viper.Viper, st *storage.Storage) (*settings.Server, e log.Println("WARNING: read https://github.com/filebrowser/filebrowser/issues/5199") } - if v.IsSet("hidden-files") { - server.HiddenFiles = convertFileStrToFileMap(v.GetString("hidden-files")) + if val, set := getStringParamB(flags, "token-expiration-time"); set { + server.TokenExpirationTime = val + } + + if val, set := getStringParamB(flags, "hidden-files"); set { + server.HiddenFiles = convertFileStrToFileMap(val) } return server, nil } +// getBoolParamB returns a parameter as a string and a boolean to tell if it is different from the default +// +// NOTE: we could simply bind the flags to viper and use IsSet. +// Although there is a bug on Viper that always returns true on IsSet +// if a flag is binded. Our alternative way is to manually check +// the flag and then the value from env/config/gotten by viper. +// https://github.com/spf13/viper/pull/331 +func getBoolParamB(flags *pflag.FlagSet, key string) (value, ok bool) { + value, _ = flags.GetBool(key) + + // If set on Flags, use it. + if flags.Changed(key) { + return value, true + } + + // If set through viper (env, config), return it. + if v.IsSet(key) { + return v.GetBool(key), true + } + + // Otherwise use default value on flags. + return value, false +} + +func getBoolParam(flags *pflag.FlagSet, key string) bool { + val, _ := getBoolParamB(flags, key) + return val +} + +// getStringParamB returns a parameter as a string and a boolean to tell if it is different from the default +// +// NOTE: we could simply bind the flags to viper and use IsSet. +// Although there is a bug on Viper that always returns true on IsSet +// if a flag is binded. Our alternative way is to manually check +// the flag and then the value from env/config/gotten by viper. +// https://github.com/spf13/viper/pull/331 +func getStringParamB(flags *pflag.FlagSet, key string) (string, bool) { + value, _ := flags.GetString(key) + + // If set on Flags, use it. + if flags.Changed(key) { + return value, true + } + + // If set through viper (env, config), return it. + if v.IsSet(key) { + return v.GetString(key), true + } + + // Otherwise use default value on flags. + return value, false +} + +func getStringParam(flags *pflag.FlagSet, key string) string { + val, _ := getStringParamB(flags, key) + return val +} + func setupLog(logMethod string) { switch logMethod { case "stdout": @@ -388,22 +419,19 @@ func setupLog(logMethod string) { } } -func quickSetup(v *viper.Viper, s *storage.Storage) error { +func quickSetup(flags *pflag.FlagSet, d pythonData) error { log.Println("Performing quick setup") set := &settings.Settings{ Key: generateKey(), Signup: false, - HideLoginButton: true, CreateUserDir: false, MinimumPasswordLength: settings.DefaultMinimumPasswordLength, UserHomeBasePath: settings.DefaultUsersHomeBasePath, Defaults: settings.UserDefaults{ - Scope: ".", - Locale: "en_GB", - SingleClick: false, - RedirectAfterCopyMove: true, - AceEditorTheme: v.GetString("defaults.aceEditorTheme"), + Scope: ".", + Locale: "en_GB", + SingleClick: false, Perm: users.Permissions{ Admin: false, Execute: true, @@ -427,45 +455,39 @@ func quickSetup(v *viper.Viper, s *storage.Storage) error { } var err error - if v.GetBool("noauth") { + if _, noauth := getStringParamB(flags, "noauth"); noauth { set.AuthMethod = auth.MethodNoAuth - err = s.Auth.Save(&auth.NoAuth{}) + err = d.store.Auth.Save(&auth.NoAuth{}) } else { set.AuthMethod = auth.MethodJSONAuth - err = s.Auth.Save(&auth.JSONAuth{}) + err = d.store.Auth.Save(&auth.JSONAuth{}) } if err != nil { return err } - err = s.Settings.Save(set) + err = d.store.Settings.Save(set) if err != nil { return err } ser := &settings.Server{ - BaseURL: v.GetString("baseURL"), - Port: v.GetString("port"), - Log: v.GetString("log"), - TLSKey: v.GetString("key"), - TLSCert: v.GetString("cert"), - Address: v.GetString("address"), - Root: v.GetString("root"), - TokenExpirationTime: v.GetString("tokenExpirationTime"), - EnableThumbnails: !v.GetBool("disableThumbnails"), - ResizePreview: !v.GetBool("disablePreviewResize"), - EnableExec: !v.GetBool("disableExec"), - TypeDetectionByHeader: !v.GetBool("disableTypeDetectionByHeader"), - ImageResolutionCal: !v.GetBool("disableImageResolutionCalc"), + BaseURL: getStringParam(flags, "baseurl"), + Port: getStringParam(flags, "port"), + Log: getStringParam(flags, "log"), + TLSKey: getStringParam(flags, "key"), + TLSCert: getStringParam(flags, "cert"), + Address: getStringParam(flags, "address"), + Root: getStringParam(flags, "root"), } - err = s.Settings.SaveServer(ser) + err = d.store.Settings.SaveServer(ser) if err != nil { return err } - username := v.GetString("username") - password := v.GetString("password") + username := getStringParam(flags, "username") + password := getStringParam(flags, "password") if password == "" { var pwd string @@ -496,5 +518,35 @@ func quickSetup(v *viper.Viper, s *storage.Storage) error { set.Defaults.Apply(user) user.Perm.Admin = true - return s.Users.Save(user) + return d.store.Users.Save(user) +} + +func initConfig() { + if cfgFile == "" { + home, err := homedir.Dir() + if err != nil { + panic(err) + } + v.AddConfigPath(".") + v.AddConfigPath(home) + v.AddConfigPath("/etc/filebrowser/") + v.SetConfigName(".filebrowser") + } else { + v.SetConfigFile(cfgFile) + } + + v.SetEnvPrefix("FB") + v.AutomaticEnv() + v.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) + v.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) + + if err := v.ReadInConfig(); err != nil { + var configParseError v.ConfigParseError + if errors.As(err, &configParseError) { + panic(err) + } + cfgFile = "No config file used" + } else { + cfgFile = "Using config file: " + v.ConfigFileUsed() + } } diff --git a/cmd/rule_rm.go b/cmd/rule_rm.go index 8ed8f151dc..26e801ae3a 100644 --- a/cmd/rule_rm.go +++ b/cmd/rule_rm.go @@ -40,7 +40,7 @@ including 'index_end'.`, return nil }, - RunE: withStore(func(cmd *cobra.Command, args []string, st *store) error { + RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { i, err := strconv.Atoi(args[0]) if err != nil { return err @@ -55,14 +55,14 @@ including 'index_end'.`, user := func(u *users.User) error { u.Rules = append(u.Rules[:i], u.Rules[f+1:]...) - return st.Users.Save(u) + return d.store.Users.Save(u) } global := func(s *settings.Settings) error { s.Rules = append(s.Rules[:i], s.Rules[f+1:]...) - return st.Settings.Save(s) + return d.store.Settings.Save(s) } - return runRules(st.Storage, cmd, user, global) - }, storeOptions{}), + return runRules(d.store, cmd, user, global) + }, pythonConfig{}), } diff --git a/cmd/rules.go b/cmd/rules.go index bdb1d1cf63..ffa5b1aefb 100644 --- a/cmd/rules.go +++ b/cmd/rules.go @@ -69,12 +69,11 @@ func runRules(st *storage.Storage, cmd *cobra.Command, usersFn func(*users.User) } func getUserIdentifier(flags *pflag.FlagSet) (interface{}, error) { - id, err := flags.GetUint("id") + id, err := getUint(flags, "id") if err != nil { return nil, err } - - username, err := flags.GetString("username") + username, err := getString(flags, "username") if err != nil { return nil, err } diff --git a/cmd/rules_add.go b/cmd/rules_add.go index 3b34d940ab..9d1f0cf962 100644 --- a/cmd/rules_add.go +++ b/cmd/rules_add.go @@ -21,19 +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), - RunE: withStore(func(cmd *cobra.Command, args []string, st *store) error { - flags := cmd.Flags() - - allow, err := flags.GetBool("allow") + RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { + allow, err := getBool(cmd.Flags(), "allow") if err != nil { return err } - - regex, err := flags.GetBool("regex") + regex, err := getBool(cmd.Flags(), "regex") if err != nil { return err } - exp := args[0] if regex { @@ -53,14 +49,14 @@ var rulesAddCmd = &cobra.Command{ user := func(u *users.User) error { u.Rules = append(u.Rules, rule) - return st.Users.Save(u) + return d.store.Users.Save(u) } global := func(s *settings.Settings) error { s.Rules = append(s.Rules, rule) - return st.Settings.Save(s) + return d.store.Settings.Save(s) } - return runRules(st.Storage, cmd, user, global) - }, storeOptions{}), + return runRules(d.store, cmd, user, global) + }, pythonConfig{}), } diff --git a/cmd/rules_ls.go b/cmd/rules_ls.go index 9aa073d0aa..67a279dce9 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, - RunE: withStore(func(cmd *cobra.Command, _ []string, st *store) error { - return runRules(st.Storage, cmd, nil, nil) - }, storeOptions{}), + 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 new file mode 100644 index 0000000000..7142b1512c --- /dev/null +++ b/cmd/upgrade.go @@ -0,0 +1,40 @@ +package cmd + +import ( + "github.com/spf13/cobra" + + "github.com/filebrowser/filebrowser/v2/storage/bolt/importer" +) + +func init() { + rootCmd.AddCommand(upgradeCmd) + + upgradeCmd.Flags().String("old.database", "", "") + upgradeCmd.Flags().String("old.config", "", "") + _ = upgradeCmd.MarkFlagRequired("old.database") +} + +var upgradeCmd = &cobra.Command{ + Use: "upgrade", + Short: "Upgrades an old configuration", + Long: `Upgrades an old configuration. This command DOES NOT +import share links because they are incompatible with +this version.`, + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, _ []string) error { + flags := cmd.Flags() + 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 aa821c5521..eaf1517fb4 100644 --- a/cmd/users.go +++ b/cmd/users.go @@ -30,14 +30,13 @@ func printUsers(usrs []*users.User) { fmt.Fprintln(w, "ID\tUsername\tScope\tLocale\tV. Mode\tS.Click\tAdmin\tExecute\tCreate\tRename\tModify\tDelete\tShare\tDownload\tPwd Lock") for _, u := range usrs { - fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%s\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t\n", + fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%s\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t\n", u.ID, u.Username, u.Scope, u.Locale, u.ViewMode, u.SingleClick, - u.RedirectAfterCopyMove, u.Perm.Admin, u.Perm.Execute, u.Perm.Create, @@ -81,78 +80,70 @@ func addUserFlags(flags *pflag.FlagSet) { flags.String("locale", "en_GB", "locale for users") flags.String("viewMode", string(users.ListViewMode), "view mode for users") flags.Bool("singleClick", false, "use single clicks only") - flags.Bool("redirectAfterCopyMove", false, "redirect to destination after copy/move") flags.Bool("dateFormat", false, "use date format (true for absolute time, false for relative)") flags.Bool("hideDotfiles", false, "hide dotfiles") - flags.String("aceEditorTheme", "", "ace editor's syntax highlighting theme for users") } -func getAndParseViewMode(flags *pflag.FlagSet) (users.ViewMode, error) { - viewModeStr, err := flags.GetString("viewMode") +func getViewMode(flags *pflag.FlagSet) (users.ViewMode, error) { + viewModeStr, err := getString(flags, "viewMode") if err != nil { return "", err } - 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) error { - errs := []error{} - + var visitErr error visit := func(flag *pflag.Flag) { + if visitErr != nil { + return + } var err error switch flag.Name { case "scope": - defaults.Scope, err = flags.GetString(flag.Name) + defaults.Scope, err = getString(flags, flag.Name) case "tmpDir": - defaults.TmpDir, err = flags.GetString(flag.Name) + defaults.TmpDir, err = getString(flags, flag.Name) case "trashDir": - defaults.TrashDir, err = flags.GetString(flag.Name) + defaults.TrashDir, err = getString(flags, flag.Name) case "quotaFile": - defaults.QuotaFile, err = flags.GetString(flag.Name) + defaults.QuotaFile, err = getString(flags, flag.Name) case "locale": - defaults.Locale, err = flags.GetString(flag.Name) + defaults.Locale, err = getString(flags, flag.Name) case "viewMode": - defaults.ViewMode, err = getAndParseViewMode(flags) + defaults.ViewMode, err = getViewMode(flags) case "singleClick": - defaults.SingleClick, err = flags.GetBool(flag.Name) - case "redirectAfterCopyMove": - defaults.RedirectAfterCopyMove, err = flags.GetBool(flag.Name) - case "aceEditorTheme": - defaults.AceEditorTheme, err = flags.GetString(flag.Name) + defaults.SingleClick, err = getBool(flags, flag.Name) case "perm.admin": - defaults.Perm.Admin, err = flags.GetBool(flag.Name) + defaults.Perm.Admin, err = getBool(flags, flag.Name) case "perm.execute": - defaults.Perm.Execute, err = flags.GetBool(flag.Name) + defaults.Perm.Execute, err = getBool(flags, flag.Name) case "perm.create": - defaults.Perm.Create, err = flags.GetBool(flag.Name) + defaults.Perm.Create, err = getBool(flags, flag.Name) case "perm.rename": - defaults.Perm.Rename, err = flags.GetBool(flag.Name) + defaults.Perm.Rename, err = getBool(flags, flag.Name) case "perm.modify": - defaults.Perm.Modify, err = flags.GetBool(flag.Name) + defaults.Perm.Modify, err = getBool(flags, flag.Name) case "perm.delete": - defaults.Perm.Delete, err = flags.GetBool(flag.Name) + defaults.Perm.Delete, err = getBool(flags, flag.Name) case "perm.share": - defaults.Perm.Share, err = flags.GetBool(flag.Name) + defaults.Perm.Share, err = getBool(flags, flag.Name) case "perm.download": - defaults.Perm.Download, err = flags.GetBool(flag.Name) + defaults.Perm.Download, err = getBool(flags, flag.Name) case "commands": defaults.Commands, err = flags.GetStringSlice(flag.Name) case "sorting.by": - defaults.Sorting.By, err = flags.GetString(flag.Name) + defaults.Sorting.By, err = getString(flags, flag.Name) case "sorting.asc": - defaults.Sorting.Asc, err = flags.GetBool(flag.Name) - case "hideDotfiles": - defaults.HideDotfiles, err = flags.GetBool(flag.Name) + defaults.Sorting.Asc, err = getBool(flags, flag.Name) } - if err != nil { - errs = append(errs, err) + visitErr = err } } @@ -161,6 +152,5 @@ func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all } else { flags.Visit(visit) } - - return errors.Join(errs...) + return visitErr } diff --git a/cmd/users_add.go b/cmd/users_add.go index daf59aa395..dce7ff98db 100644 --- a/cmd/users_add.go +++ b/cmd/users_add.go @@ -16,13 +16,12 @@ var usersAddCmd = &cobra.Command{ Short: "Create a new user", Long: `Create a new user and add it to the database.`, Args: cobra.ExactArgs(2), - RunE: withStore(func(cmd *cobra.Command, args []string, st *store) error { - flags := cmd.Flags() - s, err := st.Settings.Get() + RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { + s, err := d.store.Settings.Get() if err != nil { return err } - err = getUserDefaults(flags, &s.Defaults, false) + err = getUserDefaults(cmd.Flags(), &s.Defaults, false) if err != nil { return err } @@ -32,36 +31,39 @@ var usersAddCmd = &cobra.Command{ return err } - user := &users.User{ - Username: args[0], - Password: password, - } - - user.LockPassword, err = flags.GetBool("lockPassword") + lockPassword, err := getBool(cmd.Flags(), "lockPassword") if err != nil { return err } - user.DateFormat, err = flags.GetBool("dateFormat") + dateFormat, err := getBool(cmd.Flags(), "dateFormat") if err != nil { return err } - user.HideDotfiles, err = flags.GetBool("hideDotfiles") + hideDotfiles, err := getBool(cmd.Flags(), "hideDotfiles") if err != nil { return err } + user := &users.User{ + Username: args[0], + Password: password, + LockPassword: lockPassword, + DateFormat: dateFormat, + HideDotfiles: hideDotfiles, + } + s.Defaults.Apply(user) - servSettings, err := st.Settings.GetServer() + servSettings, err := d.store.Settings.GetServer() 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 := st.Settings.Get() + s2, err := d.store.Settings.Get() if err != nil { return err } @@ -72,11 +74,11 @@ var usersAddCmd = &cobra.Command{ } user.Scope = userHome - err = st.Users.Save(user) + err = d.store.Users.Save(user) if err != nil { return err } printUsers([]*users.User{user}) return nil - }, storeOptions{}), + }, pythonConfig{}), } diff --git a/cmd/users_export.go b/cmd/users_export.go index 9bbec6d8b4..d6009a3700 100644 --- a/cmd/users_export.go +++ b/cmd/users_export.go @@ -14,8 +14,8 @@ 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, - RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { - list, err := st.Users.Gets("") + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { + list, err := d.store.Users.Gets("") if err != nil { return err } @@ -25,5 +25,5 @@ path to the file where you want to write the users.`, return err } return nil - }, storeOptions{}), + }, pythonConfig{}), } diff --git a/cmd/users_find.go b/cmd/users_find.go index 09bc8d4718..0dea071a3b 100644 --- a/cmd/users_find.go +++ b/cmd/users_find.go @@ -26,7 +26,7 @@ var usersLsCmd = &cobra.Command{ RunE: findUsers, } -var findUsers = withStore(func(_ *cobra.Command, args []string, st *store) error { +var findUsers = python(func(_ *cobra.Command, args []string, d *pythonData) error { var ( list []*users.User user *users.User @@ -36,14 +36,14 @@ var findUsers = withStore(func(_ *cobra.Command, args []string, st *store) error if len(args) == 1 { username, id := parseUsernameOrID(args[0]) if username != "" { - user, err = st.Users.Get("", username) + user, err = d.store.Users.Get("", username) } else { - user, err = st.Users.Get("", id) + user, err = d.store.Users.Get("", id) } list = []*users.User{user} } else { - list, err = st.Users.Gets("") + list, err = d.store.Users.Gets("") } if err != nil { @@ -51,4 +51,4 @@ var findUsers = withStore(func(_ *cobra.Command, args []string, st *store) error } printUsers(list) return nil -}, storeOptions{}) +}, pythonConfig{}) diff --git a/cmd/users_import.go b/cmd/users_import.go index 73effca6df..d20dca682d 100644 --- a/cmd/users_import.go +++ b/cmd/users_import.go @@ -25,8 +25,7 @@ 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, - RunE: withStore(func(cmd *cobra.Command, args []string, st *store) error { - flags := cmd.Flags() + RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { fd, err := os.Open(args[0]) if err != nil { return err @@ -46,13 +45,13 @@ list or set it to 0.`, } } - replace, err := flags.GetBool("replace") + replace, err := getBool(cmd.Flags(), "replace") if err != nil { return err } if replace { - oldUsers, userImportErr := st.Users.Gets("") + oldUsers, userImportErr := d.store.Users.Gets("") if userImportErr != nil { return userImportErr } @@ -63,20 +62,20 @@ list or set it to 0.`, } for _, user := range oldUsers { - err = st.Users.Delete(user.ID) + err = d.store.Users.Delete(user.ID) if err != nil { return err } } } - overwrite, err := flags.GetBool("overwrite") + overwrite, err := getBool(cmd.Flags(), "overwrite") if err != nil { return err } for _, user := range list { - onDB, err := st.Users.Get("", user.ID) + onDB, err := d.store.Users.Get("", user.ID) // User exists in DB. if err == nil { @@ -88,7 +87,7 @@ list or set it to 0.`, // with the new username. If there is, print an error and cancel the // operation if user.Username != onDB.Username { - if conflictuous, err := st.Users.Get("", user.Username); err == nil { + if conflictuous, err := d.store.Users.Get("", user.Username); err == nil { //nolint:govet return usernameConflictError(user.Username, conflictuous.ID, user.ID) } } @@ -98,13 +97,13 @@ list or set it to 0.`, user.ID = 0 } - err = st.Users.Save(user) + err = d.store.Users.Save(user) if err != nil { return err } } return nil - }, storeOptions{}), + }, pythonConfig{}), } func usernameConflictError(username string, originalID, newID uint) error { diff --git a/cmd/users_rm.go b/cmd/users_rm.go index 492a55c326..55b973f470 100644 --- a/cmd/users_rm.go +++ b/cmd/users_rm.go @@ -15,14 +15,14 @@ var usersRmCmd = &cobra.Command{ Short: "Delete a user by username or id", Long: `Delete a user by username or id`, Args: cobra.ExactArgs(1), - RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { + RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { username, id := parseUsernameOrID(args[0]) var err error if username != "" { - err = st.Users.Delete(username) + err = d.store.Users.Delete(username) } else { - err = st.Users.Delete(id) + err = d.store.Users.Delete(id) } if err != nil { @@ -30,5 +30,5 @@ var usersRmCmd = &cobra.Command{ } fmt.Println("user deleted successfully") return nil - }, storeOptions{}), + }, pythonConfig{}), } diff --git a/cmd/users_update.go b/cmd/users_update.go index a05d02fa7f..aa0a232aa0 100644 --- a/cmd/users_update.go +++ b/cmd/users_update.go @@ -21,20 +21,19 @@ var usersUpdateCmd = &cobra.Command{ Long: `Updates an existing user. Set the flags for the options you want to change.`, Args: cobra.ExactArgs(1), - RunE: withStore(func(cmd *cobra.Command, args []string, st *store) error { - flags := cmd.Flags() + RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { username, id := parseUsernameOrID(args[0]) - password, err := flags.GetString("password") + flags := cmd.Flags() + password, err := getString(flags, "password") if err != nil { return err } - - newUsername, err := flags.GetString("username") + newUsername, err := getString(flags, "username") if err != nil { return err } - s, err := st.Settings.Get() + s, err := d.store.Settings.Get() if err != nil { return err } @@ -42,54 +41,50 @@ options you want to change.`, var ( user *users.User ) + if id != 0 { - user, err = st.Users.Get("", id) + user, err = d.store.Users.Get("", id) } else { - user, err = st.Users.Get("", username) + user, err = d.store.Users.Get("", username) } + if err != nil { return err } defaults := settings.UserDefaults{ - Scope: user.Scope, - TmpDir: user.TmpDir, - TrashDir: user.TrashDir, - Locale: user.Locale, - ViewMode: user.ViewMode, - SingleClick: user.SingleClick, - RedirectAfterCopyMove: user.RedirectAfterCopyMove, - Perm: user.Perm, - Sorting: user.Sorting, - Commands: user.Commands, + Scope: user.Scope, + TmpDir: user.TmpDir, + TrashDir: user.TrashDir, + Locale: user.Locale, + ViewMode: user.ViewMode, + SingleClick: user.SingleClick, + Perm: user.Perm, + Sorting: user.Sorting, + Commands: user.Commands, } - err = getUserDefaults(flags, &defaults, false) if err != nil { return err } - user.Scope = defaults.Scope user.TmpDir = defaults.TmpDir user.TrashDir = defaults.TrashDir user.Locale = defaults.Locale user.ViewMode = defaults.ViewMode user.SingleClick = defaults.SingleClick - user.RedirectAfterCopyMove = defaults.RedirectAfterCopyMove user.Perm = defaults.Perm user.Commands = defaults.Commands user.Sorting = defaults.Sorting - user.LockPassword, err = flags.GetBool("lockPassword") + user.LockPassword, err = getBool(flags, "lockPassword") if err != nil { return err } - - user.DateFormat, err = flags.GetBool("dateFormat") + user.DateFormat, err = getBool(flags, "dateFormat") if err != nil { return err } - - user.HideDotfiles, err = flags.GetBool("hideDotfiles") + user.HideDotfiles, err = getBool(flags, "hideDotfiles") if err != nil { return err } @@ -105,11 +100,11 @@ options you want to change.`, } } - err = st.Users.Update(user) + err = d.store.Users.Update(user) if err != nil { return err } printUsers([]*users.User{user}) return nil - }, storeOptions{}), + }, pythonConfig{}), } diff --git a/cmd/utils.go b/cmd/utils.go index dac7be953d..71c03d2da2 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -12,34 +12,51 @@ import ( "strings" "github.com/asdine/storm/v3" - homedir "github.com/mitchellh/go-homedir" - "github.com/samber/lo" "github.com/spf13/cobra" "github.com/spf13/pflag" - "github.com/spf13/viper" - yaml "gopkg.in/yaml.v3" + yaml "gopkg.in/yaml.v2" "github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/storage" "github.com/filebrowser/filebrowser/v2/storage/bolt" ) -const databasePermissions = 0640 +const dbPerms = 0640 -func getAndParseFileMode(flags *pflag.FlagSet, name string) (fs.FileMode, error) { - mode, err := flags.GetString(name) +func returnErr(err error) error { if err != nil { - return 0, err + return err } + return nil +} + +func getString(flags *pflag.FlagSet, flag string) (string, error) { + s, err := flags.GetString(flag) + return s, returnErr(err) +} - b, err := strconv.ParseUint(mode, 0, 32) +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) if err != nil { return 0, err } - return fs.FileMode(b), nil } +func getBool(flags *pflag.FlagSet, flag string) (bool, error) { + b, err := flags.GetBool(flag) + return b, returnErr(err) +} + +func getUint(flags *pflag.FlagSet, flag string) (uint, error) { + b, err := flags.GetUint(flag) + return b, returnErr(err) +} + func generateKey() []byte { k, err := settings.GenerateKey() if err != nil { @@ -48,6 +65,20 @@ func generateKey() []byte { return k } +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 + allowNoDB bool +} + +type pythonData struct { + hadDB bool + store *storage.Storage + err error +} + func dbExists(path string) (bool, error) { stat, err := os.Stat(path) if err == nil { @@ -58,7 +89,7 @@ func dbExists(path string) (bool, error) { d := filepath.Dir(path) _, err = os.Stat(d) if os.IsNotExist(err) { - if err := os.MkdirAll(d, 0700); err != nil { + if err := os.MkdirAll(d, 0700); err != nil { //nolint:govet return false, err } return false, nil @@ -68,137 +99,42 @@ func dbExists(path string) (bool, error) { return false, err } -// Generate the replacements for all environment variables. This allows to -// use FB_BRANDING_DISABLE_EXTERNAL environment variables, even when the -// option name is branding.disableExternal. -func generateEnvKeyReplacements(cmd *cobra.Command) []string { - replacements := []string{} - - cmd.Flags().VisitAll(func(f *pflag.Flag) { - oldName := strings.ToUpper(f.Name) - newName := strings.ToUpper(lo.SnakeCase(f.Name)) - replacements = append(replacements, oldName, newName) - }) - - return replacements -} - -func initViper(cmd *cobra.Command) (*viper.Viper, error) { - v := viper.New() - - // Get config file from flag - cfgFile, err := cmd.Flags().GetString("config") - if err != nil { - return nil, err - } - - // Configuration file - if cfgFile == "" { - home, err := homedir.Dir() - if err != nil { - return nil, err - } - v.AddConfigPath(".") - v.AddConfigPath(home) - v.AddConfigPath("/etc/filebrowser/") - v.SetConfigName(".filebrowser") - } else { - v.SetConfigFile(cfgFile) - } - - // Environment variables - v.SetEnvPrefix("FB") - v.AutomaticEnv() - v.SetEnvKeyReplacer(strings.NewReplacer(generateEnvKeyReplacements(cmd)...)) - - // Bind the flags - err = v.BindPFlags(cmd.Flags()) - if err != nil { - return nil, err - } - - // Read in configuration - if err := v.ReadInConfig(); err != nil { - if errors.Is(err, viper.ConfigParseError{}) { - return nil, err - } - - log.Println("No config file used") - } else { - log.Printf("Using config file: %s", v.ConfigFileUsed()) - } - - // Return Viper - return v, nil -} - -type store struct { - *storage.Storage - databaseExisted bool -} - -type storeOptions struct { - expectsNoDatabase bool - allowsNoDatabase bool -} - -type cobraFunc func(cmd *cobra.Command, args []string) error - -// withViperAndStore initializes Viper and the storage.Store and passes them to the callback function. -// This function should only be used by [withStore] and the root command. No other command should call -// this function directly. -func withViperAndStore(fn func(cmd *cobra.Command, args []string, v *viper.Viper, store *store) error, options storeOptions) cobraFunc { +func python(fn pythonFunc, cfg pythonConfig) cobraFunc { return func(cmd *cobra.Command, args []string) error { - v, err := initViper(cmd) - if err != nil { - return err - } + data := &pythonData{hadDB: true} - path, err := filepath.Abs(v.GetString("database")) + path := getStringParam(cmd.Flags(), "database") + absPath, err := filepath.Abs(path) if err != nil { - return err + panic(err) } - exists, err := dbExists(path) - switch { - case err != nil: - return err - case exists && options.expectsNoDatabase: - log.Fatal(path + " already exists") - case !exists && !options.expectsNoDatabase && !options.allowsNoDatabase: - log.Fatal(path + " does not exist. Please run 'filebrowser config init' first.") - case !exists && !options.expectsNoDatabase: - log.Println("WARNING: filebrowser.db can't be found. Initialing in " + strings.TrimSuffix(path, "filebrowser.db")) - } - log.Println("Using database: " + path) + if err != nil { + panic(err) + } else if exists && cfg.noDB { + log.Fatal(absPath + " already exists") + } else if !exists && !cfg.noDB && !cfg.allowNoDB { + log.Fatal(absPath + " does not exist. Please run 'filebrowser config init' first.") + } else if !exists && !cfg.noDB { + log.Println("Warning: filebrowser.db can't be found. Initialing in " + strings.TrimSuffix(absPath, "filebrowser.db")) + } - db, err := storm.Open(path, storm.BoltOptions(databasePermissions, nil)) + log.Println("Using database: " + absPath) + data.hadDB = exists + db, err := storm.Open(path, storm.BoltOptions(dbPerms, nil)) if err != nil { return err } defer db.Close() - - storage, err := bolt.NewStorage(db) + data.store, err = bolt.NewStorage(db) if err != nil { return err } - - store := &store{ - Storage: storage, - databaseExisted: exists, - } - - return fn(cmd, args, v, store) + return fn(cmd, args, data) } } -func withStore(fn func(cmd *cobra.Command, args []string, store *store) error, options storeOptions) cobraFunc { - return withViperAndStore(func(cmd *cobra.Command, args []string, _ *viper.Viper, store *store) error { - return fn(cmd, args, store) - }, options) -} - func marshal(filename string, data interface{}) error { fd, err := os.Create(filename) if err != nil { diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000000..23d0036766 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,34 @@ +module.exports = { + rules: { + 'body-leading-blank': [1, 'always'], + 'body-max-line-length': [2, 'always', 100], + 'footer-leading-blank': [1, 'always'], + 'footer-max-line-length': [2, 'always', 100], + 'header-max-length': [2, 'always', 100], + 'scope-case': [2, 'always', 'lower-case'], + 'subject-case': [ + 2, + 'never', + ['sentence-case', 'start-case', 'pascal-case', 'upper-case'], + ], + 'subject-full-stop': [2, 'never', '.'], + 'type-case': [2, 'always', 'lower-case'], + 'type-empty': [2, 'never'], + 'type-enum': [ + 2, + 'always', + [ + 'feat', + 'fix', + 'perf', + 'revert', + 'refactor', + 'build', + 'ci', + 'test', + 'chore', + 'docs', + ], + ], + }, +}; diff --git a/common.mk b/common.mk new file mode 100644 index 0000000000..206fc7502e --- /dev/null +++ b/common.mk @@ -0,0 +1,28 @@ +SHELL := /usr/bin/env bash +DATE ?= $(shell date +%FT%T%z) +BASE_PATH := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) +VERSION ?= $(shell git describe --tags --always --match=v* 2> /dev/null || \ + cat $(CURDIR)/.version 2> /dev/null || echo v0) +VERSION_HASH = $(shell git rev-parse HEAD) +BRANCH = $(shell git rev-parse --abbrev-ref HEAD) + +go = GOGC=off go +MODULE = $(shell env GO111MODULE=on go list -m) + +# printing +# $Q (quiet) is used in the targets as a replacer for @. +# This macro helps to print the command for debugging by setting V to 1. Example `make test-unit V=1` +V = 0 +Q = $(if $(filter 1,$V),,@) +# $M is a macro to print a colored ▶ character. Example `$(info $(M) running coverage tests…)` will print "▶ running coverage tests…" +M = $(shell printf "\033[34;1m▶\033[0m") + +GREEN := $(shell tput -Txterm setaf 2) +YELLOW := $(shell tput -Txterm setaf 3) +WHITE := $(shell tput -Txterm setaf 7) +CYAN := $(shell tput -Txterm setaf 6) +RESET := $(shell tput -Txterm sgr0) + +define global_option + printf " ${YELLOW}%-20s${GREEN}%s${RESET}\n" $(1) $(2) +endef diff --git a/diskcache/file_cache.go b/diskcache/file_cache.go index b2979e4bc3..cd5e27c767 100644 --- a/diskcache/file_cache.go +++ b/diskcache/file_cache.go @@ -2,7 +2,7 @@ package diskcache import ( "context" - "crypto/sha1" + "crypto/sha1" //nolint:gosec "encoding/hex" "errors" "fmt" @@ -103,7 +103,7 @@ func (f *FileCache) getScopedLocks(key string) (lock sync.Locker) { } func (f *FileCache) getFileName(key string) string { - hasher := sha1.New() + hasher := sha1.New() //nolint:gosec _, _ = hasher.Write([]byte(key)) hash := hex.EncodeToString(hasher.Sum(nil)) return fmt.Sprintf("%s/%s/%s", hash[:1], hash[1:3], hash) diff --git a/diskcache/file_cache_test.go b/diskcache/file_cache_test.go index c6c750c0ad..31d58c8eb7 100644 --- a/diskcache/file_cache_test.go +++ b/diskcache/file_cache_test.go @@ -25,12 +25,12 @@ func TestFileCache(t *testing.T) { // store new key err := cache.Store(ctx, key, []byte(value)) require.NoError(t, err) - checkValue(ctx, t, fs, filepath.Join(cacheRoot, cachedFilePath), cache, key, value) + checkValue(t, ctx, fs, filepath.Join(cacheRoot, cachedFilePath), cache, key, value) // update existing key err = cache.Store(ctx, key, []byte(newValue)) require.NoError(t, err) - checkValue(ctx, t, fs, filepath.Join(cacheRoot, cachedFilePath), cache, key, newValue) + checkValue(t, ctx, fs, filepath.Join(cacheRoot, cachedFilePath), cache, key, newValue) // delete key err = cache.Delete(ctx, key) @@ -40,7 +40,7 @@ func TestFileCache(t *testing.T) { require.False(t, exists) } -func checkValue(ctx context.Context, t *testing.T, fs afero.Fs, fileFullPath string, cache *FileCache, key, wantValue string) { +func checkValue(t *testing.T, ctx context.Context, fs afero.Fs, fileFullPath string, cache *FileCache, key, wantValue string) { //nolint:revive t.Helper() // check actual file content b, err := afero.ReadFile(fs, fileFullPath) diff --git a/docker/common/defaults/settings.json b/docker/common/defaults/settings.json index cf7fb4eea2..e787ef875d 100644 --- a/docker/common/defaults/settings.json +++ b/docker/common/defaults/settings.json @@ -5,4 +5,4 @@ "log": "stdout", "database": "/database/filebrowser.db", "root": "/srv" -} +} \ No newline at end of file diff --git a/errors/errors.go b/errors/errors.go index 748354a8a0..f8abee59d6 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -1,28 +1,40 @@ -package fberrors +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 ( - ErrEmptyKey = errors.New("empty key") - ErrExist = errors.New("the resource already exists") - ErrNotExist = errors.New("the resource does not exist") - ErrEmptyPassword = errors.New("password is empty") - ErrEasyPassword = errors.New("password is too easy") - ErrEmptyUsername = errors.New("username is empty") - ErrEmptyRequest = errors.New("empty request") - ErrScopeIsRelative = errors.New("scope is a relative path") - ErrInvalidDataType = errors.New("invalid data type") - ErrIsDirectory = errors.New("file is directory") - ErrInvalidOption = errors.New("invalid option") - ErrInvalidAuthMethod = errors.New("invalid auth method") - ErrPermissionDenied = errors.New("permission denied") - ErrInvalidRequestParams = errors.New("invalid request params") - ErrSourceIsParent = errors.New("source is parent") - ErrRootUserDeletion = errors.New("user with id 1 can't be deleted") - ErrCurrentPasswordIncorrect = errors.New("the current password is incorrect") + ErrEmptyKey = errors.New("empty key") + ErrExist = errors.New("the resource already exists") + ErrNotExist = errors.New("the resource does not exist") + ErrEmptyPassword = errors.New("password is empty") + ErrEasyPassword = errors.New("password is too easy") + ErrEmptyUsername = errors.New("username is empty") + ErrEmptyRequest = errors.New("empty request") + ErrScopeIsRelative = errors.New("scope is a relative path") + ErrInvalidDataType = errors.New("invalid data type") + ErrIsDirectory = errors.New("file is directory") + ErrInvalidOption = errors.New("invalid option") + ErrInvalidAuthMethod = errors.New("invalid auth method") + ErrPermissionDenied = errors.New("permission denied") + 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 { @@ -32,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/files/file.go b/files/file.go index f13f940347..cd9e734c31 100644 --- a/files/file.go +++ b/files/file.go @@ -1,8 +1,8 @@ package files import ( - "crypto/md5" - "crypto/sha1" + "crypto/md5" //nolint:gosec + "crypto/sha1" //nolint:gosec "crypto/sha256" "crypto/sha512" "encoding/hex" @@ -23,7 +23,7 @@ import ( "github.com/spf13/afero" - fberrors "github.com/filebrowser/filebrowser/v2/errors" + fbErrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/rules" ) @@ -63,7 +63,6 @@ type FileOptions struct { Modify bool Expand bool ReadHeader bool - CalcImgRes bool Token string Checker rules.Checker Content bool @@ -94,13 +93,13 @@ func NewFileInfo(opts *FileOptions) (*FileInfo, error) { if opts.Expand { if file.IsDir { - if err := file.readListing(opts.Checker, opts.ReadHeader, opts.CalcImgRes); err != nil { + if err := file.readListing(opts.Checker, opts.ReadHeader); err != nil { //nolint:govet return nil, err } return file, nil } - err = file.detectType(opts.Modify, opts.Content, true, opts.CalcImgRes) + err = file.detectType(opts.Modify, opts.Content, true) if err != nil { return nil, err } @@ -172,7 +171,7 @@ func stat(opts *FileOptions) (*FileInfo, error) { // algorithm. The checksums data is saved on File object. func (i *FileInfo) Checksum(algo string) error { if i.IsDir { - return fberrors.ErrIsDirectory + return fbErrors.ErrIsDirectory } if i.Checksums == nil { @@ -187,6 +186,7 @@ func (i *FileInfo) Checksum(algo string) error { var h hash.Hash + //nolint:gosec switch algo { case "md5": h = md5.New() @@ -197,7 +197,7 @@ func (i *FileInfo) Checksum(algo string) error { case "sha512": h = sha512.New() default: - return fberrors.ErrInvalidOption + return fbErrors.ErrInvalidOption } _, err = io.Copy(h, reader) @@ -222,7 +222,7 @@ func (i *FileInfo) RealPath() string { return i.Path } -func (i *FileInfo) detectType(modify, saveContent, readHeader bool, calcImgRes bool) error { +func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error { if IsNamedPipe(i.Mode) { i.Type = "blob" return nil @@ -253,13 +253,11 @@ func (i *FileInfo) detectType(modify, saveContent, readHeader bool, calcImgRes b return nil case strings.HasPrefix(mimetype, "image"): i.Type = "image" - if calcImgRes { - resolution, err := calculateImageResolution(i.Fs, i.Path) - if err != nil { - log.Printf("Error calculating image resolution: %v", err) - } else { - i.Resolution = resolution - } + resolution, err := calculateImageResolution(i.Fs, i.Path) + if err != nil { + log.Printf("Error calculating image resolution: %v", err) + } else { + i.Resolution = resolution } return nil case strings.HasSuffix(mimetype, "pdf"): @@ -393,7 +391,7 @@ func (i *FileInfo) addSubtitle(fPath string) { i.Subtitles = append(i.Subtitles, fPath) } -func (i *FileInfo) readListing(checker rules.Checker, readHeader bool, calcImgRes bool) error { +func (i *FileInfo) readListing(checker rules.Checker, readHeader bool) error { afs := &afero.Afero{Fs: i.Fs} dir, err := afs.ReadDir(i.Path) if err != nil { @@ -447,7 +445,7 @@ func (i *FileInfo) readListing(checker rules.Checker, readHeader bool, calcImgRe currentDir: dir, } - if !file.IsDir && strings.HasPrefix(mime.TypeByExtension(file.Extension), "image/") && calcImgRes { + if !file.IsDir && strings.HasPrefix(mime.TypeByExtension(file.Extension), "image/") { resolution, err := calculateImageResolution(file.Fs, file.Path) if err != nil { log.Printf("Error calculating resolution for image %s: %v", file.Path, err) @@ -464,7 +462,7 @@ func (i *FileInfo) readListing(checker rules.Checker, readHeader bool, calcImgRe if isInvalidLink { file.Type = "invalid_link" } else { - err := file.detectType(true, false, readHeader, calcImgRes) + err := file.detectType(true, false, readHeader) if err != nil { return err } diff --git a/files/mime.go b/files/mime.go index baa4d6d56c..33fd93bd49 100644 --- a/files/mime.go +++ b/files/mime.go @@ -600,6 +600,7 @@ var types = map[string]string{ ".epub": "application/epub+zip", } +//nolint:gochecknoinits func init() { for ext, typ := range types { // skip errors diff --git a/frontend/assets.go b/frontend/assets.go index 7955822f2a..01c523f0d4 100644 --- a/frontend/assets.go +++ b/frontend/assets.go @@ -1,4 +1,5 @@ //go:build !dev +// +build !dev package frontend diff --git a/frontend/assets_dev.go b/frontend/assets_dev.go new file mode 100644 index 0000000000..292cd1d0ca --- /dev/null +++ b/frontend/assets_dev.go @@ -0,0 +1,15 @@ +//go:build dev +// +build dev + +package frontend + +import ( + "io/fs" + "os" +) + +var assets fs.FS = os.DirFS("frontend") + +func Assets() fs.FS { + return assets +} diff --git a/frontend/index.html b/frontend/index.html index 19308a9543..3b54dcdf02 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -12,11 +12,7 @@ - + @@ -39,7 +35,6 @@ DisableUsedPercentage: false, EnableExec: true, EnableThumbs: true, - LogoutPage: "", LoginPage: true, Name: "", NoAuth: false, diff --git a/frontend/package.json b/frontend/package.json index 44144b3a91..290b6cf18a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -4,35 +4,37 @@ "private": true, "type": "module", "engines": { - "node": ">=24.0.0", - "pnpm": ">=10.0.0" + "node": ">=22.0.0", + "pnpm": ">=9.0.0" }, "scripts": { "dev": "vite dev", "build": "pnpm run typecheck && vite build", "clean": "find ./dist -maxdepth 1 -mindepth 1 ! -name '.gitkeep' -exec rm -r {} +", - "typecheck": "vue-tsc -p ./tsconfig.app.json --noEmit", + "typecheck": "vue-tsc -p ./tsconfig.tsc.json --noEmit", "lint": "eslint src/", "lint:fix": "eslint --fix src/", - "format": "prettier --write ." + "format": "prettier --write .", + "test": "playwright test" }, "dependencies": { "@chenfengyuan/vue-number-input": "^2.0.1", - "@vueuse/core": "^14.0.0", - "@vueuse/integrations": "^14.0.0", + "@vueuse/core": "^12.5.0", + "@vueuse/integrations": "^12.5.0", "ace-builds": "^1.43.2", + "core-js": "^3.44.0", "dayjs": "^1.11.13", "dompurify": "^3.2.6", "epubjs": "^0.3.93", - "filesize": "^11.0.13", + "filesize": "^10.1.1", "js-base64": "^3.7.7", "jwt-decode": "^4.0.0", "lodash-es": "^4.17.21", - "marked": "^17.0.0", + "marked": "^15.0.6", "material-icons": "^1.13.14", "normalize.css": "^8.0.1", - "pinia": "^3.0.4", - "pretty-bytes": "^7.1.0", + "pinia": "^2.3.1", + "pretty-bytes": "^6.1.1", "qrcode.vue": "^3.6.0", "tus-js-client": "^4.3.1", "utif": "^3.1.0", @@ -48,28 +50,30 @@ "vue-toastification": "^2.0.0-rc.5" }, "devDependencies": { - "@intlify/unplugin-vue-i18n": "^11.0.1", - "@tsconfig/node24": "^24.0.2", + "@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": "^24.10.1", + "@types/node": "^22.10.10", "@typescript-eslint/eslint-plugin": "^8.37.0", - "@vitejs/plugin-legacy": "^7.2.1", - "@vitejs/plugin-vue": "^6.0.1", + "@vitejs/plugin-legacy": "^6.0.0", + "@vitejs/plugin-vue": "^5.0.4", "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.6.0", - "@vue/tsconfig": "^0.8.1", + "@vue/tsconfig": "^0.7.0", "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": "^10.5.1", + "eslint-plugin-vue": "^9.24.0", + "jsdom": "^26.1.0", "postcss": "^8.5.6", "prettier": "^3.6.2", "terser": "^5.43.1", - "typescript": "^5.9.3", - "vite": "^7.2.2", - "vite-plugin-compression2": "^2.3.1", - "vue-tsc": "^3.1.3" + "vite": "^6.3.6", + "vite-plugin-compression2": "^1.0.0", + "vue-tsc": "^2.2.0" }, - "packageManager": "pnpm@10.28.0+sha512.05df71d1421f21399e053fde567cea34d446fa02c76571441bfc1c7956e98e363088982d940465fd34480d4d90a0668bc12362f8aa88000a64e83d0b0e47be48" + "packageManager": "pnpm@9.15.4+sha512.b2dc20e2fc72b3e18848459b37359a32064663e5627a51e4c74b2c29dd8e8e0491483c3abb40789cfd578bf362fb6ba8261b05f0387d76792ed6e23ea3b1b6a0" } diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts new file mode 100644 index 0000000000..af335a17f8 --- /dev/null +++ b/frontend/playwright.config.ts @@ -0,0 +1,80 @@ +import { defineConfig, devices } from "@playwright/test"; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: "./tests", + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: "html", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: "http://127.0.0.1:5173", + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "on-first-retry", + + /* Set default locale to English (US) */ + locale: "en-US", + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + + { + name: "firefox", + use: { ...devices["Desktop Firefox"] }, + }, + + // { + // name: "webkit", + // use: { ...devices["Desktop Safari"] }, + // }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: "npm run dev", + url: "http://127.0.0.1:5173", + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 37dab7ae6c..989f0442ec 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -10,40 +10,43 @@ importers: dependencies: '@chenfengyuan/vue-number-input': specifier: ^2.0.1 - version: 2.0.1(vue@3.5.26(typescript@5.9.3)) + version: 2.0.1(vue@3.5.17(typescript@5.6.3)) '@vueuse/core': - specifier: ^14.0.0 - version: 14.1.0(vue@3.5.26(typescript@5.9.3)) + specifier: ^12.5.0 + version: 12.5.0(typescript@5.6.3) '@vueuse/integrations': - specifier: ^14.0.0 - version: 14.1.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(vue@3.5.26(typescript@5.9.3)) + 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.43.2 - version: 1.43.5 + version: 1.43.2 + core-js: + specifier: ^3.44.0 + version: 3.44.0 dayjs: specifier: ^1.11.13 - version: 1.11.19 + version: 1.11.13 dompurify: specifier: ^3.2.6 - version: 3.3.1 + version: 3.2.6 epubjs: specifier: ^0.3.93 version: 0.3.93 filesize: - specifier: ^11.0.13 - version: 11.0.13 + specifier: ^10.1.1 + version: 10.1.6 js-base64: specifier: ^3.7.7 - version: 3.7.8 + version: 3.7.7 jwt-decode: specifier: ^4.0.0 version: 4.0.0 lodash-es: specifier: ^4.17.21 - version: 4.17.22 + version: 4.17.21 marked: - specifier: ^17.0.0 - version: 17.0.1 + specifier: ^15.0.6 + version: 15.0.6 material-icons: specifier: ^1.13.14 version: 1.13.14 @@ -51,14 +54,14 @@ importers: specifier: ^8.0.1 version: 8.0.1 pinia: - specifier: ^3.0.4 - version: 3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + specifier: ^2.3.1 + version: 2.3.1(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3)) pretty-bytes: - specifier: ^7.1.0 - version: 7.1.0 + specifier: ^6.1.1 + version: 6.1.1 qrcode.vue: specifier: ^3.6.0 - version: 3.6.0(vue@3.5.26(typescript@5.9.3)) + version: 3.6.0(vue@3.5.17(typescript@5.6.3)) tus-js-client: specifier: ^4.3.1 version: 4.3.1 @@ -67,238 +70,273 @@ importers: version: 3.1.0 video.js: specifier: ^8.23.3 - version: 8.23.4 + version: 8.23.3 videojs-hotkeys: specifier: ^0.2.28 version: 0.2.30 videojs-mobile-ui: specifier: ^1.1.1 - version: 1.1.3(video.js@8.23.4) + version: 1.1.1(video.js@8.23.3) vue: specifier: ^3.5.17 - version: 3.5.26(typescript@5.9.3) + version: 3.5.17(typescript@5.6.3) vue-final-modal: specifier: ^4.5.5 - version: 4.5.5(@vueuse/core@14.1.0(vue@3.5.26(typescript@5.9.3)))(@vueuse/integrations@14.1.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(vue@3.5.26(typescript@5.9.3)))(focus-trap@7.6.2)(vue@3.5.26(typescript@5.9.3)) + 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.10 - version: 11.2.8(vue@3.5.26(typescript@5.9.3)) + version: 11.1.10(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.3.4 + version: 1.2.17(vue@3.5.17(typescript@5.6.3)) vue-router: specifier: ^4.5.1 - version: 4.6.4(vue@3.5.26(typescript@5.9.3)) + 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.26(typescript@5.9.3)) + version: 2.0.0-rc.5(vue@3.5.17(typescript@5.6.3)) devDependencies: '@intlify/unplugin-vue-i18n': - specifier: ^11.0.1 - version: 11.0.3(@vue/compiler-dom@3.5.26)(eslint@9.39.2)(rollup@4.55.1)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3)) - '@tsconfig/node24': - specifier: ^24.0.2 - version: 24.0.3 + specifier: ^6.0.8 + version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.50.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 + '@tsconfig/node22': + specifier: ^22.0.2 + version: 22.0.2 '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 '@types/node': - specifier: ^24.10.1 - version: 24.10.6 + specifier: ^22.10.10 + version: 22.10.10 '@typescript-eslint/eslint-plugin': specifier: ^8.37.0 - version: 8.52.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) + 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: ^7.2.1 - version: 7.2.1(terser@5.44.1)(vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2)) + specifier: ^6.0.0 + version: 6.0.0(terser@5.43.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)) '@vitejs/plugin-vue': - specifier: ^6.0.1 - version: 6.0.3(vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) + specifier: ^5.0.4 + version: 5.2.1(vite@6.3.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.39.2)(prettier@3.7.4) + version: 10.2.0(eslint@9.31.0)(prettier@3.6.2) '@vue/eslint-config-typescript': specifier: ^14.6.0 - version: 14.6.0(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)))(eslint@9.39.2)(typescript@5.9.3) + 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.8.1 - version: 0.8.1(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) + specifier: ^0.7.0 + version: 0.7.0(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3)) autoprefixer: specifier: ^10.4.21 - version: 10.4.23(postcss@8.5.6) + version: 10.4.21(postcss@8.5.6) + concurrently: + specifier: ^9.2.0 + version: 9.2.0 eslint: specifier: ^9.31.0 - version: 9.39.2 + version: 9.31.0 eslint-config-prettier: specifier: ^10.1.5 - version: 10.1.8(eslint@9.39.2) + version: 10.1.5(eslint@9.31.0) eslint-plugin-prettier: specifier: ^5.5.1 - version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.7.4) + 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: ^10.5.1 - version: 10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)) + specifier: ^9.24.0 + version: 9.32.0(eslint@9.31.0) + jsdom: + specifier: ^26.1.0 + version: 26.1.0 postcss: specifier: ^8.5.6 version: 8.5.6 prettier: specifier: ^3.6.2 - version: 3.7.4 + version: 3.6.2 terser: specifier: ^5.43.1 - version: 5.44.1 - typescript: - specifier: ^5.9.3 - version: 5.9.3 + version: 5.43.1 vite: - specifier: ^7.2.2 - version: 7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2) + specifier: ^6.3.6 + version: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) vite-plugin-compression2: - specifier: ^2.3.1 - version: 2.4.0(rollup@4.55.1) + specifier: ^1.0.0 + version: 1.3.3(rollup@4.50.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)) vue-tsc: - specifier: ^3.1.3 - version: 3.2.2(typescript@5.9.3) + specifier: ^2.2.0 + version: 2.2.0(typescript@5.6.3) packages: - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@asamuzakjp/css-color@2.8.3': + resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.5': - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.5': - resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.28.5': - resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} + '@babel/helper-create-class-features-plugin@7.25.9': + resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} + '@babel/helper-create-regexp-features-plugin@7.25.9': + resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + '@babel/helper-define-polyfill-provider@0.6.3': + resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + '@babel/helper-member-expression-to-functions@7.25.9': + resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} + '@babel/helper-optimise-call-expression@7.25.9': + resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + '@babel/helper-remap-async-to-generator@7.25.9': + resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + '@babel/helper-replace-supers@7.25.9': + resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} + '@babel/helper-simple-access@7.25.9': + resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + 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.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.28.3': - resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + '@babel/helper-wrap-function@7.25.9': + resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/parser@7.26.7': + resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==} + 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.28.5': - resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': + resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': + resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': + resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': + resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': - resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': + resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -309,14 +347,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + '@babel/plugin-syntax-import-assertions@7.26.0': + resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -327,314 +365,308 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} + '@babel/plugin-transform-arrow-functions@7.25.9': + resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.28.0': - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + '@babel/plugin-transform-async-generator-functions@7.25.9': + resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + '@babel/plugin-transform-async-to-generator@7.25.9': + resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} + '@babel/plugin-transform-block-scoped-functions@7.25.9': + resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.5': - resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} + '@babel/plugin-transform-block-scoping@7.25.9': + resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + '@babel/plugin-transform-class-properties@7.25.9': + resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.28.3': - resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} + '@babel/plugin-transform-class-static-block@7.26.0': + resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.4': - resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} + '@babel/plugin-transform-classes@7.25.9': + resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + '@babel/plugin-transform-computed-properties@7.25.9': + resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.28.5': - resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} + '@babel/plugin-transform-destructuring@7.25.9': + resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + '@babel/plugin-transform-dotall-regex@7.25.9': + resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} + '@babel/plugin-transform-duplicate-keys@7.25.9': + resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} + '@babel/plugin-transform-dynamic-import@7.25.9': + resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-explicit-resource-management@7.28.0': - resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} + '@babel/plugin-transform-exponentiation-operator@7.25.9': + resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.28.5': - resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} + '@babel/plugin-transform-export-namespace-from@7.25.9': + resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} + '@babel/plugin-transform-for-of@7.25.9': + resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + '@babel/plugin-transform-function-name@7.25.9': + resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + '@babel/plugin-transform-json-strings@7.25.9': + resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + '@babel/plugin-transform-literals@7.25.9': + resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + '@babel/plugin-transform-logical-assignment-operators@7.25.9': + resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.28.5': - resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} + '@babel/plugin-transform-member-expression-literals@7.25.9': + resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + '@babel/plugin-transform-modules-amd@7.25.9': + resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + '@babel/plugin-transform-modules-commonjs@7.25.9': + resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + '@babel/plugin-transform-modules-systemjs@7.25.9': + resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.28.5': - resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} + '@babel/plugin-transform-modules-umd@7.25.9': + resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': + resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + '@babel/plugin-transform-new-target@7.25.9': + resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': + resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + '@babel/plugin-transform-numeric-separator@7.25.9': + resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.4': - resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} + '@babel/plugin-transform-object-rest-spread@7.25.9': + resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + '@babel/plugin-transform-object-super@7.25.9': + resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + '@babel/plugin-transform-optional-catch-binding@7.25.9': + resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.28.5': - resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} + '@babel/plugin-transform-optional-chaining@7.25.9': + resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + '@babel/plugin-transform-parameters@7.25.9': + resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + '@babel/plugin-transform-private-methods@7.25.9': + resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + '@babel/plugin-transform-private-property-in-object@7.25.9': + resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + '@babel/plugin-transform-property-literals@7.25.9': + resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.4': - resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} + '@babel/plugin-transform-regenerator@7.25.9': + resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + '@babel/plugin-transform-regexp-modifiers@7.26.0': + resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + '@babel/plugin-transform-reserved-words@7.25.9': + resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + '@babel/plugin-transform-shorthand-properties@7.25.9': + resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + '@babel/plugin-transform-spread@7.25.9': + resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + '@babel/plugin-transform-sticky-regex@7.25.9': + resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + '@babel/plugin-transform-template-literals@7.25.9': + resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + '@babel/plugin-transform-typeof-symbol@7.25.9': + resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + '@babel/plugin-transform-unicode-escapes@7.25.9': + resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + '@babel/plugin-transform-unicode-property-regex@7.25.9': + resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + '@babel/plugin-transform-unicode-regex@7.25.9': + resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + '@babel/plugin-transform-unicode-sets-regex@7.25.9': + resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.28.5': - resolution: {integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==} + '@babel/preset-env@7.26.0': + resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -644,20 +676,32 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.26.7': + resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.5': - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + '@babel/types@7.26.7': + resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/types@7.28.1': + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} engines: {node: '>=6.9.0'} '@chenfengyuan/vue-number-input@2.0.1': @@ -665,381 +709,257 @@ packages: peerDependencies: vue: ^3.0.0 - '@esbuild/aix-ppc64@0.25.12': - resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + '@csstools/color-helpers@5.0.1': + resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==} engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + '@csstools/css-calc@2.1.1': + resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==} engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 - '@esbuild/android-arm64@0.25.12': - resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + '@csstools/css-color-parser@3.0.7': + resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==} engines: {node: '>=18'} - cpu: [arm64] - os: [android] + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + '@csstools/css-parser-algorithms@3.0.4': + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} engines: {node: '>=18'} - cpu: [arm64] - os: [android] + peerDependencies: + '@csstools/css-tokenizer': ^3.0.3 - '@esbuild/android-arm@0.25.12': - resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + '@csstools/css-tokenizer@3.0.3': + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + '@esbuild/aix-ppc64@0.25.9': + resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} engines: {node: '>=18'} - cpu: [arm] - os: [android] + cpu: [ppc64] + os: [aix] - '@esbuild/android-x64@0.25.12': - resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + '@esbuild/android-arm64@0.25.9': + resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm64] os: [android] - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + '@esbuild/android-arm@0.25.9': + resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} engines: {node: '>=18'} - cpu: [x64] + cpu: [arm] os: [android] - '@esbuild/darwin-arm64@0.25.12': - resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + '@esbuild/android-x64@0.25.9': + resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] + cpu: [x64] + os: [android] - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + '@esbuild/darwin-arm64@0.25.9': + resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.12': - resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + '@esbuild/darwin-x64@0.25.9': + resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.12': - resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + '@esbuild/freebsd-arm64@0.25.9': + resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.12': - resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + '@esbuild/freebsd-x64@0.25.9': + resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.12': - resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + '@esbuild/linux-arm64@0.25.9': + resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.12': - resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + '@esbuild/linux-arm@0.25.9': + resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.12': - resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + '@esbuild/linux-ia32@0.25.9': + resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.12': - resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + '@esbuild/linux-loong64@0.25.9': + resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.12': - resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + '@esbuild/linux-mips64el@0.25.9': + resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.12': - resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + '@esbuild/linux-ppc64@0.25.9': + resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.12': - resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + '@esbuild/linux-riscv64@0.25.9': + resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.12': - resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + '@esbuild/linux-s390x@0.25.9': + resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.12': - resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + '@esbuild/linux-x64@0.25.9': + resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.25.12': - resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + '@esbuild/netbsd-arm64@0.25.9': + resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.12': - resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + '@esbuild/netbsd-x64@0.25.9': + resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.12': - resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + '@esbuild/openbsd-arm64@0.25.9': + resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.12': - resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + '@esbuild/openbsd-x64@0.25.9': + resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.12': - resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + '@esbuild/openharmony-arm64@0.25.9': + resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - - '@esbuild/sunos-x64@0.25.12': - resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + '@esbuild/sunos-x64@0.25.9': + resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/win32-arm64@0.25.12': - resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + '@esbuild/win32-arm64@0.25.9': + resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-ia32@0.25.12': - resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + '@esbuild/win32-ia32@0.25.9': + resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.12': - resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + '@esbuild/win32-x64@0.25.9': + resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.9.1': - resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + '@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.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + '@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.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + '@eslint/config-array@0.21.0': + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.4.2': - resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} + '@eslint/config-helpers@0.3.0': + resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.17.0': - resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + '@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/eslintrc@3.3.3': - resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.2': - resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + '@eslint/js@9.31.0': + resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.7': - resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} + '@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.4.1': - resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} + '@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': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@intlify/bundle-utils@11.0.3': - resolution: {integrity: sha512-dURCDz1rQXwAb1+Hv4NDit6aZSRaAt4zUYBPEeaDCe3FSs8dMtdF6kEvgd9JwsYFSTAHcvbTs2CqwBjjt9Ltsw==} - engines: {node: '>= 20'} + '@intlify/bundle-utils@10.0.1': + resolution: {integrity: sha512-WkaXfSevtpgtUR4t8K2M6lbR7g03mtOxFeh+vXp5KExvPqS12ppaRj1QxzwRuRI5VUto54A22BjKoBMLyHILWQ==} + engines: {node: '>= 18'} peerDependencies: petite-vue-i18n: '*' vue-i18n: '*' @@ -1049,25 +969,33 @@ packages: vue-i18n: optional: true - '@intlify/core-base@11.2.8': - resolution: {integrity: sha512-nBq6Y1tVkjIUsLsdOjDSJj4AsjvD0UG3zsg9Fyc+OivwlA/oMHSKooUy9tpKj0HqZ+NWFifweHavdljlBLTwdA==} + '@intlify/core-base@11.1.10': + resolution: {integrity: sha512-JhRb40hD93Vk0BgMgDc/xMIFtdXPHoytzeK6VafBNOj6bb6oUZrGamXkBKecMsmGvDQQaPRGG2zpa25VCw8pyw==} engines: {node: '>= 16'} - '@intlify/message-compiler@11.2.8': - resolution: {integrity: sha512-A5n33doOjmHsBtCN421386cG1tWp5rpOjOYPNsnpjIJbQ4POF0QY2ezhZR9kr0boKwaHjbOifvyQvHj2UTrDFQ==} + '@intlify/message-compiler@11.1.10': + resolution: {integrity: sha512-TABl3c8tSLWbcD+jkQTyBhrnW251dzqW39MPgEUCsd69Ua3ceoimsbIzvkcPzzZvt1QDxNkenMht+5//V3JvLQ==} engines: {node: '>= 16'} - '@intlify/shared@11.2.2': - resolution: {integrity: sha512-OtCmyFpSXxNu/oET/aN6HtPCbZ01btXVd0f3w00YsHOb13Kverk1jzA2k47pAekM55qbUw421fvPF1yxZ+gicw==} + '@intlify/message-compiler@11.1.2': + resolution: {integrity: sha512-T/xbNDzi+Yv0Qn2Dfz2CWCAJiwNgU5d95EhhAEf4YmOgjCKktpfpiUSmLcBvK1CtLpPQ85AMMQk/2NCcXnNj1g==} engines: {node: '>= 16'} - '@intlify/shared@11.2.8': - resolution: {integrity: sha512-l6e4NZyUgv8VyXXH4DbuucFOBmxLF56C/mqh2tvApbzl2Hrhi1aTDcuv5TKdxzfHYmpO3UB0Cz04fgDT9vszfw==} + '@intlify/shared@11.1.10': + resolution: {integrity: sha512-6ZW/f3Zzjxfa1Wh0tYQI5pLKUtU+SY7l70pEG+0yd0zjcsYcK0EBt6Fz30Dy0tZhEqemziQQy2aNU3GJzyrMUA==} engines: {node: '>= 16'} - '@intlify/unplugin-vue-i18n@11.0.3': - resolution: {integrity: sha512-iQuik0nXfdVZ5ab+IEyBFEuvMQ213zfbUpBXaEdHPk8DV+qB2CT/SdFuDhfUDRRBZc/e0qoLlfmc9urhnRYVWw==} - engines: {node: '>= 20'} + '@intlify/shared@11.1.2': + resolution: {integrity: sha512-dF2iMMy8P9uKVHV/20LA1ulFLL+MKSbfMiixSmn6fpwqzvix38OIc7ebgnFbBqElvghZCW9ACtzKTGKsTGTWGA==} + engines: {node: '>= 16'} + + '@intlify/shared@11.1.7': + resolution: {integrity: sha512-4yZeMt2Aa/7n5Ehy4KalUlvt3iRLcg1tq9IBVfOgkyWFArN4oygn6WxgGIFibP3svpaH8DarbNaottq+p0gUZQ==} + engines: {node: '>= 16'} + + '@intlify/unplugin-vue-i18n@6.0.8': + resolution: {integrity: sha512-Vvm3KhjE6TIBVUQAk37rBiaYy2M5OcWH0ZcI1XKEsOTeN1o0bErk+zeuXmcrcMc/73YggfI8RoxOUz9EB/69JQ==} + engines: {node: '>= 18'} peerDependencies: petite-vue-i18n: '*' vue: ^3.2.25 @@ -1096,24 +1024,30 @@ packages: vue-i18n: optional: true - '@jridgewell/gen-mapping@0.3.13': - resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/trace-mapping@0.3.31': - resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1127,15 +1061,17 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgr/core@0.2.9': - resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} + '@pkgr/core@0.2.7': + resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rolldown/pluginutils@1.0.0-beta.53': - resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + '@playwright/test@1.54.1': + resolution: {integrity: sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==} + engines: {node: '>=18'} + hasBin: true - '@rollup/pluginutils@5.3.0': - resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1143,133 +1079,128 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.55.1': - resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} + '@rollup/pluginutils@5.1.4': + resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.50.1': + resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.55.1': - resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} + '@rollup/rollup-android-arm64@4.50.1': + resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.55.1': - resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} + '@rollup/rollup-darwin-arm64@4.50.1': + resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.55.1': - resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} + '@rollup/rollup-darwin-x64@4.50.1': + resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.55.1': - resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} + '@rollup/rollup-freebsd-arm64@4.50.1': + resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.55.1': - resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} + '@rollup/rollup-freebsd-x64@4.50.1': + resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': - resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.50.1': + resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.55.1': - resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} + '@rollup/rollup-linux-arm-musleabihf@4.50.1': + resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.55.1': - resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} + '@rollup/rollup-linux-arm64-gnu@4.50.1': + resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.55.1': - resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} + '@rollup/rollup-linux-arm64-musl@4.50.1': + resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.55.1': - resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} + '@rollup/rollup-linux-loongarch64-gnu@4.50.1': + resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-loong64-musl@4.55.1': - resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.55.1': - resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-ppc64-musl@4.55.1': - resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + '@rollup/rollup-linux-ppc64-gnu@4.50.1': + resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.55.1': - resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} + '@rollup/rollup-linux-riscv64-gnu@4.50.1': + resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.55.1': - resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} + '@rollup/rollup-linux-riscv64-musl@4.50.1': + resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.55.1': - resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} + '@rollup/rollup-linux-s390x-gnu@4.50.1': + resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.55.1': - resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} + '@rollup/rollup-linux-x64-gnu@4.50.1': + resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.55.1': - resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} + '@rollup/rollup-linux-x64-musl@4.50.1': + resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} cpu: [x64] os: [linux] - '@rollup/rollup-openbsd-x64@4.55.1': - resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.55.1': - resolution: {integrity: sha512-xzm44KgEP11te3S2HCSyYf5zIzWmx3n8HDCc7EE59+lTcswEWNpvMLfd9uJvVX8LCg9QWG67Xt75AuHn4vgsXw==} + '@rollup/rollup-openharmony-arm64@4.50.1': + resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.55.1': - resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} + '@rollup/rollup-win32-arm64-msvc@4.50.1': + resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.55.1': - resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} + '@rollup/rollup-win32-ia32-msvc@4.50.1': + resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.55.1': - resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} + '@rollup/rollup-win32-x64-msvc@4.50.1': + resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.55.1': - resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} - cpu: [x64] - os: [win32] + '@tsconfig/node22@22.0.2': + resolution: {integrity: sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==} - '@tsconfig/node24@24.0.3': - resolution: {integrity: sha512-vcERKtKQKHgzt/vfS3Gjasd8SUI2a0WZXpgJURdJsMySpS5+ctgbPfuLj2z/W+w4lAfTWxoN4upKfu2WzIRYnw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1287,14 +1218,14 @@ packages: '@types/lodash@4.17.13': resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} - '@types/node@24.10.6': - resolution: {integrity: sha512-B8h60xgJMR/xmgyX9fncRzEW9gCxoJjdenUhke2v1JGOd/V66KopmWrLPXi5oUI4VuiGK+d+HlXJjDRZMj21EQ==} + '@types/node@22.10.10': + resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/web-bluetooth@0.0.21': - resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} '@typescript-eslint/eslint-plugin@8.37.0': resolution: {integrity: sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==} @@ -1304,14 +1235,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/eslint-plugin@8.52.0': - resolution: {integrity: sha512-okqtOgqu2qmZJ5iN4TWlgfF171dZmx2FzdOv2K/ixL2LZWDStL8+JgQerI2sa8eAEfoydG9+0V96m7V+P8yE1Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.52.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.37.0': resolution: {integrity: sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1325,48 +1248,20 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/project-service@8.49.0': - resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==} + '@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} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.52.0': - resolution: {integrity: sha512-xD0MfdSdEmeFa3OmVqonHi+Cciab96ls1UhIF/qX/O/gPu5KXD0bY9lu33jj04fjzrXHcuvjBcBC+D3SNSadaw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' '@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/scope-manager@8.49.0': - resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.52.0': - resolution: {integrity: sha512-ixxqmmCcc1Nf8S0mS0TkJ/3LKcC8mruYJPOU6Ia2F/zUUR4pApW7LzrpU3JmtePbRUTes9bEqRc1Gg4iyRnDzA==} - 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/tsconfig-utils@8.49.0': - resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/tsconfig-utils@8.52.0': - resolution: {integrity: sha512-jl+8fzr/SdzdxWJznq5nvoI7qn2tNYV/ZBAEcaFMVXf+K6jmXvAFrgo/+5rxgnL152f//pDEAYAhhBAZGrVfwg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.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} @@ -1374,24 +1269,19 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.52.0': - resolution: {integrity: sha512-JD3wKBRWglYRQkAtsyGz1AewDu3mTc7NtRjR/ceTyGoPqmdS5oCdx/oZMWD5Zuqmo6/MpsYs0wp6axNt88/2EQ==} + '@typescript-eslint/types@8.21.0': + resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/types@8.37.0': resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.49.0': - resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.52.0': - resolution: {integrity: sha512-LWQV1V4q9V4cT4H5JCIx3481iIFxH1UkVk+ZkGGAV1ZGcjGI9IoFOfg3O6ywz8QqCDEp7Inlg6kovMofsNRaGg==} + '@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/typescript-estree@8.37.0': resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} @@ -1399,18 +1289,6 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.49.0': - resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/typescript-estree@8.52.0': - resolution: {integrity: sha512-XP3LClsCc0FsTK5/frGjolyADTh3QmsLp6nKd476xNI9CsSsLnmn4f0jrzNoAulmxlmNIpeXuHYeEQv61Q6qeQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.37.0': resolution: {integrity: sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1418,27 +1296,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.52.0': - resolution: {integrity: sha512-wYndVMWkweqHpEpwPhwqE2lnD2DxC6WVLupU/DOt/0/v+/+iQbbzO3jOHjmBMnhu0DgLULvOaU4h4pwHYi2oRQ==} + '@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} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' '@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} - '@typescript-eslint/visitor-keys@8.49.0': - resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.52.0': - resolution: {integrity: sha512-ink3/Zofus34nmBsPjow63FP5M7IGff0RKAgqR6+CFpdk22M7aLwC9gOcLGYqr7MczLPzZVERW9hRog3O4n1sQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@videojs/http-streaming@3.17.2': - resolution: {integrity: sha512-VBQ3W4wnKnVKb/limLdtSD2rAd5cmHN70xoMf4OmuDd0t2kfJX04G+sfw6u2j8oOm2BXYM9E1f4acHruqKnM1g==} + '@videojs/http-streaming@3.17.0': + resolution: {integrity: sha512-Ch1P3tvvIEezeZXyK11UfWgp4cWKX4vIhZ30baN/lRinqdbakZ5hiAI3pGjRy3d+q/Epyc8Csz5xMdKNNGYpcw==} engines: {node: '>=8', npm: '>=5'} peerDependencies: video.js: ^8.19.0 @@ -1450,52 +1317,52 @@ packages: '@videojs/xhr@2.7.0': resolution: {integrity: sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==} - '@vitejs/plugin-legacy@7.2.1': - resolution: {integrity: sha512-CaXb/y0mlfu7jQRELEJJc2/5w2bX2m1JraARgFnvSB2yfvnCNJVWWlqAo6WjnKoepOwKx8gs0ugJThPLKCOXIg==} - engines: {node: ^20.19.0 || >=22.12.0} + '@vitejs/plugin-legacy@6.0.0': + resolution: {integrity: sha512-pWt9cWaGJAKYw+67VLpN8hSP+G+yAQnrf5Pqh/NzSDKFl/4KpxTtwb5OLQezHoZOxghahO/ha3IpvblBbX/t6A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: terser: ^5.16.0 - vite: ^7.0.0 + vite: ^6.0.0 - '@vitejs/plugin-vue@6.0.3': - resolution: {integrity: sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==} - engines: {node: ^20.19.0 || >=22.12.0} + '@vitejs/plugin-vue@5.2.1': + resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} + engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@volar/language-core@2.4.27': - resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} + '@volar/language-core@2.4.11': + resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} - '@volar/source-map@2.4.27': - resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} + '@volar/source-map@2.4.11': + resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} - '@volar/typescript@2.4.27': - resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} + '@volar/typescript@2.4.11': + resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} - '@vue/compiler-core@3.5.26': - resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==} + '@vue/compiler-core@3.5.13': + resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} - '@vue/compiler-dom@3.5.26': - resolution: {integrity: sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==} + '@vue/compiler-core@3.5.17': + resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} - '@vue/compiler-sfc@3.5.26': - resolution: {integrity: sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==} + '@vue/compiler-dom@3.5.13': + resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-ssr@3.5.26': - resolution: {integrity: sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==} + '@vue/compiler-dom@3.5.17': + resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} - '@vue/devtools-api@6.6.4': - resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + '@vue/compiler-sfc@3.5.17': + resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} - '@vue/devtools-api@7.7.8': - resolution: {integrity: sha512-BtFcAmDbtXGwurWUFf8ogIbgZyR+rcVES1TSNEI8Em80fD8Anu+qTRN1Fc3J6vdRHlVM3fzPV1qIo+B4AiqGzw==} + '@vue/compiler-ssr@3.5.17': + resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} - '@vue/devtools-kit@7.7.8': - resolution: {integrity: sha512-4Y8op+AoxOJhB9fpcEF6d5vcJXWKgHxC3B0ytUB8zz15KbP9g9WgVzral05xluxi2fOeAy6t140rdQ943GcLRQ==} + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - '@vue/devtools-shared@7.7.8': - resolution: {integrity: sha512-XHpO3jC5nOgYr40M9p8Z4mmKfTvUxKyRcUnpBAYg11pE78eaRFBKb0kG5yKLroMuJeeNH9LWmKp2zMU5LUc7CA==} + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} '@vue/eslint-config-prettier@10.2.0': resolution: {integrity: sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw==} @@ -1514,28 +1381,36 @@ packages: typescript: optional: true - '@vue/language-core@3.2.2': - resolution: {integrity: sha512-5DAuhxsxBN9kbriklh3Q5AMaJhyOCNiQJvCskN9/30XOpdLiqZU9Q+WvjArP17ubdGEyZtBzlIeG5nIjEbNOrQ==} + '@vue/language-core@2.2.0': + resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true - '@vue/reactivity@3.5.26': - resolution: {integrity: sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==} + '@vue/reactivity@3.5.17': + resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} - '@vue/runtime-core@3.5.26': - resolution: {integrity: sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==} + '@vue/runtime-core@3.5.17': + resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} - '@vue/runtime-dom@3.5.26': - resolution: {integrity: sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==} + '@vue/runtime-dom@3.5.17': + resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} - '@vue/server-renderer@3.5.26': - resolution: {integrity: sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==} + '@vue/server-renderer@3.5.17': + resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} peerDependencies: - vue: 3.5.26 + vue: 3.5.17 - '@vue/shared@3.5.26': - resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==} + '@vue/shared@3.5.13': + resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - '@vue/tsconfig@0.8.1': - resolution: {integrity: sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==} + '@vue/shared@3.5.17': + resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + + '@vue/tsconfig@0.7.0': + resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==} peerDependencies: typescript: 5.x vue: ^3.4.0 @@ -1545,13 +1420,11 @@ packages: vue: optional: true - '@vueuse/core@14.1.0': - resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} - peerDependencies: - vue: ^3.5.0 + '@vueuse/core@12.5.0': + resolution: {integrity: sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==} - '@vueuse/integrations@14.1.0': - resolution: {integrity: sha512-eNQPdisnO9SvdydTIXnTE7c29yOsJBD/xkwEyQLdhDC/LKbqrFpXHb3uS//7NcIrQO3fWVuvMGp8dbK6mNEMCA==} + '@vueuse/integrations@12.5.0': + resolution: {integrity: sha512-HYLt8M6mjUfcoUOzyBcX2RjpfapIwHPBmQJtTmXOQW845Y/Osu9VuTJ5kPvnmWJ6IUa05WpblfOwZ+P0G4iZsQ==} peerDependencies: async-validator: ^4 axios: ^1 @@ -1564,8 +1437,7 @@ packages: nprogress: ^0.2 qrcode: ^1.5 sortablejs: ^1 - universal-cookie: ^7 || ^8 - vue: ^3.5.0 + universal-cookie: ^7 peerDependenciesMeta: async-validator: optional: true @@ -1592,31 +1464,34 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@14.1.0': - resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} + '@vueuse/metadata@12.5.0': + resolution: {integrity: sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==} - '@vueuse/shared@14.1.0': - resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} - peerDependencies: - vue: ^3.5.0 + '@vueuse/shared@12.5.0': + resolution: {integrity: sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==} '@xmldom/xmldom@0.7.13': resolution: {integrity: sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g==} engines: {node: '>=10.0.0'} deprecated: this version is no longer supported, please update to at least 0.8.* - '@xmldom/xmldom@0.8.11': - resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + '@xmldom/xmldom@0.8.10': + resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} engines: {node: '>=10.0.0'} - ace-builds@1.43.5: - resolution: {integrity: sha512-iH5FLBKdB7SVn9GR37UgA/tpQS8OTWIxWAuq3Ofaw+Qbc69FfPXsXd9jeW7KRG2xKpKMqBDnu0tHBrCWY5QI7A==} + ace-builds@1.43.2: + resolution: {integrity: sha512-3wzJUJX0RpMc03jo0V8Q3bSb/cKPnS7Nqqw8fVHsCCHweKMiTIxT3fP46EhjmVy6MCuxwP801ere+RW245phGw==} acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.15.0: resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} @@ -1625,11 +1500,19 @@ packages: aes-decrypter@4.0.2: resolution: {integrity: sha512-lc+/9s6iJvuaRe5qDlMTpCFjnwpkeOXp8qP3oiZ5jsj1MRg+SBVUmmICrhxHvc8OELSmc+fEyyxAuppY6hrWzw==} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - alien-signals@3.1.2: - resolution: {integrity: sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==} + alien-signals@0.4.14: + resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -1638,50 +1521,39 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - autoprefixer@10.4.23: - resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + babel-plugin-polyfill-corejs2@0.4.12: + resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + babel-plugin-polyfill-regenerator@0.6.3: + resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.8.26: - resolution: {integrity: sha512-73lC1ugzwoaWCLJ1LvOgrR5xsMLTqSKIEoMHVtL9E/HNk0PXtTM76ZIm84856/SF7Nv8mPZxKoBsgpm0tR1u1Q==} - hasBin: true - - baseline-browser-mapping@2.9.7: - resolution: {integrity: sha512-k9xFKplee6KIio3IDbwj+uaCLpqzOwakOgmqzPezM0sFJlFKcg30vk2wOiAJtkTSfx0SSQDSe8q+mWA/fSH5Zg==} - hasBin: true - - birpc@2.8.0: - resolution: {integrity: sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==} - boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -1694,13 +1566,13 @@ packages: peerDependencies: browserslist: '*' - browserslist@4.28.0: - resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + browserslist@4.25.1: + resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1711,16 +1583,20 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001754: - resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} + caniuse-lite@1.0.30001685: + resolution: {integrity: sha512-e/kJN1EMyHQzgcMEEgoo+YTCO1NGCmIYHk5Qk8jT6AazWemS5QFKJ5ShCJlH3GZrNIdZofcNCEwZqbMjjKzmnA==} - caniuse-lite@1.0.30001760: - resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} + 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'} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1737,18 +1613,22 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concurrently@9.2.0: + resolution: {integrity: sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==} + engines: {node: '>=18'} + hasBin: true + + confbox@0.1.8: + resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - copy-anything@4.0.5: - resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} - engines: {node: '>=18'} - - core-js-compat@3.46.0: - resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} - core-js@3.46.0: - resolution: {integrity: sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==} + core-js@3.44.0: + resolution: {integrity: sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1762,8 +1642,12 @@ packages: engines: {node: '>=4'} hasBin: true - csstype@3.2.3: - resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + cssstyle@4.2.1: + resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} + engines: {node: '>=18'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} custom-error-instance@2.1.1: resolution: {integrity: sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==} @@ -1772,11 +1656,18 @@ packages: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} - dayjs@1.11.19: - resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1784,23 +1675,38 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decimal.js@10.5.0: + resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dom-walk@0.1.2: resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==} - dompurify@3.3.1: - resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} + 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.250: - resolution: {integrity: sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==} + electron-to-chromium@1.5.67: + resolution: {integrity: sha512-nz88NNBsD7kQSAGGJyp8hS6xSPtWwqNogA0mjtc2nUYeEf3nURK9qpV18TuBdDmEDgVWotS8Wkzf+V52dSQ/LQ==} - electron-to-chromium@1.5.267: - resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - entities@7.0.0: - resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==} + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} epubjs@0.3.93: @@ -1817,13 +1723,8 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} - esbuild@0.25.12: - resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + esbuild@0.25.9: + resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} engines: {node: '>=18'} hasBin: true @@ -1840,14 +1741,14 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@10.1.8: - resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} + eslint-config-prettier@10.1.5: + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.5.4: - resolution: {integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==} + 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' @@ -1860,19 +1761,19 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-vue@10.6.2: - resolution: {integrity: sha512-nA5yUs/B1KmKzvC42fyD0+l9Yd+LtEpVhWRbXuDj0e+ZURcTtyRbMDWUeJmTAh2wC6jC83raS63anNM2YT3NPw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-plugin-vue@9.32.0: + resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==} + engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: - '@stylistic/eslint-plugin': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 - eslint: ^8.57.0 || ^9.0.0 - vue-eslint-parser: ^10.0.0 - peerDependenciesMeta: - '@stylistic/eslint-plugin': - optional: true - '@typescript-eslint/parser': - optional: true + eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-scope@8.2.0: + 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==} @@ -1882,12 +1783,16 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + 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.39.2: - resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} + 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: @@ -1900,6 +1805,10 @@ packages: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} engines: {node: '>=0.10'} + espree@10.3.0: + 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} @@ -1954,8 +1863,8 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -1970,9 +1879,9 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - filesize@11.0.13: - resolution: {integrity: sha512-mYJ/qXKvREuO0uH8LTQJ6v7GsUvVOguqxg2VTwQUkyTPXXRRWPdjuUPVqdBrJQhvci48OHlNGRnux+Slr2Rnvw==} - engines: {node: '>= 10.8.0'} + filesize@10.1.6: + resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} + engines: {node: '>= 10.4.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -1986,14 +1895,19 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} focus-trap@7.6.2: resolution: {integrity: sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==} - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -2007,6 +1921,10 @@ packages: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2018,6 +1936,14 @@ packages: global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2036,8 +1962,25 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hookable@5.5.3: - resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} @@ -2050,8 +1993,8 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -2061,14 +2004,18 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + is-function@1.0.2: resolution: {integrity: sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==} @@ -2080,32 +2027,40 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-what@5.5.0: - resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} - engines: {node: '>=18'} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - js-base64@3.7.8: - resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + jsdom@26.1.0: + resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} hasBin: true @@ -2123,8 +2078,8 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-eslint-parser@2.4.2: - resolution: {integrity: sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==} + jsonc-eslint-parser@2.4.0: + resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} jszip@3.10.1: @@ -2154,8 +2109,8 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash-es@4.17.22: - resolution: {integrity: sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} lodash._baseiteratee@4.7.0: resolution: {integrity: sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==} @@ -2190,18 +2145,24 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} m3u8-parser@7.2.0: resolution: {integrity: sha512-CRatFqpjVtMiMaKXxNvuI3I++vUumIXVVT/JpCpdU/FynV/ceVw1qpPyyBNindL+JlPMSesx+WX1QJaZEJSaMQ==} - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - marked@17.0.1: - resolution: {integrity: sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==} - engines: {node: '>= 20'} + marked@15.0.6: + resolution: {integrity: sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==} + engines: {node: '>= 18'} hasBin: true marks-pane@1.0.9: @@ -2222,8 +2183,8 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - min-document@2.19.2: - resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==} + min-document@2.19.0: + resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2232,8 +2193,8 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} mpd-parser@1.3.1: resolution: {integrity: sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==} @@ -2261,8 +2222,15 @@ packages: next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + 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'} normalize.css@8.0.1: resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} @@ -2270,6 +2238,9 @@ packages: nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nwsapi@2.2.16: + resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -2289,6 +2260,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse5@7.2.1: + resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} @@ -2306,11 +2280,11 @@ packages: path-webpack@0.0.3: resolution: {integrity: sha512-AmeDxedoo5svf7aB3FYqSAKqMxys014lVKBzy1o/5vv9CtU7U4wgGWL1dA2o6MOzcD53ScN4Jmiq6VbtLz1vIQ==} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - perfect-debounce@1.0.0: - resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2323,11 +2297,11 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pinia@3.0.4: - resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==} + pinia@2.3.1: + resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} peerDependencies: - typescript: '>=4.5.0' - vue: ^3.5.11 + typescript: '>=4.4.4' + vue: ^2.7.0 || ^3.5.11 peerDependenciesMeta: typescript: optional: true @@ -2336,8 +2310,21 @@ packages: resolution: {integrity: sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==} hasBin: true - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + + playwright-core@1.54.1: + resolution: {integrity: sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==} + engines: {node: '>=18'} + hasBin: true + + playwright@1.54.1: + resolution: {integrity: sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==} + engines: {node: '>=18'} + hasBin: true + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: @@ -2355,14 +2342,14 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.7.4: - resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==} + prettier@3.6.2: + resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} engines: {node: '>=14'} hasBin: true - pretty-bytes@7.1.0: - resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} - engines: {node: '>=20'} + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -2392,8 +2379,8 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - regenerate-unicode-properties@10.2.2: - resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + regenerate-unicode-properties@10.2.0: + resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} engines: {node: '>=4'} regenerate@1.4.2: @@ -2402,17 +2389,24 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexpu-core@6.4.0: - resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexpu-core@6.2.0: + resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} engines: {node: '>=4'} regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.13.0: - resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} hasBin: true + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -2420,39 +2414,48 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} - engines: {node: '>= 0.4'} + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - - rollup@4.55.1: - resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} + rollup@4.50.1: + resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true @@ -2467,6 +2470,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -2481,44 +2488,51 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - speakingurl@14.0.1: - resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} - engines: {node: '>=0.10.0'} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - superjson@2.2.5: - resolution: {integrity: sha512-zWPTX96LVsA/eVYnqOM2+ofcdPqdS1dAF1LN4TS2/MWuUpfitd9ctTa87wt4xrYnZnkLtS69xpBdSxVBP5Rm6w==} - engines: {node: '>=16'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + synckit@0.11.8: + resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} systemjs@6.15.1: resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==} - tabbable@6.4.0: - resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} tar-mini@0.2.0: resolution: {integrity: sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==} - terser@5.44.1: - resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} + terser@5.43.1: + resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} engines: {node: '>=10'} hasBin: true @@ -2526,16 +2540,44 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tldts-core@6.1.74: + resolution: {integrity: sha512-gTwtY6L2GfuxiL4CWpLknv9JDYYqBvKCk/BT5uAaAvCA0s6pzX7lr2IrkQZSUlnSjRHIjTl8ZwKCVXJ7XNRWYw==} + + tldts@6.1.74: + resolution: {integrity: sha512-O5vTZ1UmmEmrLl/59U9igitnSMlprALLaLgbv//dEvjobPT9vyURhHXKMCDLEhn3qxZFIkb9PwAfNYV0Ol7RPQ==} + hasBin: true + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - ts-api-utils@2.4.0: - resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + tough-cookie@5.1.2: + resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} + engines: {node: '>=16'} + + tr46@5.1.1: + resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} + engines: {node: '>=18'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-api-utils@2.0.0: + resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} engines: {node: '>=18.12'} 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==} + tus-js-client@4.3.1: resolution: {integrity: sha512-ZLeYmjrkaU1fUsKbIi8JML52uAocjEZtBx4DKjRrqzrZa0O4MYwT6db+oqePlspV+FxXJAyFBc/L5gwUi2OFsg==} engines: {node: '>=18'} @@ -2544,6 +2586,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + type@2.7.3: resolution: {integrity: sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==} @@ -2554,13 +2600,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true - undici-types@7.16.0: - resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -2570,26 +2619,26 @@ packages: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.2.1: - resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + unicode-match-property-value-ecmascript@2.2.0: + resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} engines: {node: '>=4'} - unicode-property-aliases-ecmascript@2.2.0: - resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - unplugin@2.3.11: - resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} - engines: {node: '>=18.12.0'} + unplugin@1.16.1: + resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} + engines: {node: '>=14.0.0'} - update-browserslist-db@1.1.4: - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - update-browserslist-db@1.2.2: - resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} + update-browserslist-db@1.1.3: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2606,8 +2655,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - video.js@8.23.4: - resolution: {integrity: sha512-qI0VTlYmKzEqRsz1Nppdfcaww4RSxZAq77z2oNSl3cNg2h6do5C8Ffl0KqWQ1OpD8desWXsCrde7tKJ9gGTEyQ==} + 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==} @@ -2621,8 +2670,8 @@ packages: videojs-hotkeys@0.2.30: resolution: {integrity: sha512-G8kEQZPapoWDoEajh2Nroy4bCN1qVEul5AuzZqBS7ZCG45K7hqTYKgf1+fmYvG8m8u84sZmVMUvSWZBjaFW66Q==} - videojs-mobile-ui@1.1.3: - resolution: {integrity: sha512-LyWIRZBQWRouUQ9i9HBBvhwFL1uZkg3Adt52nT+e297dwpOgTaELO7gCXgvj5f6a2AfEb8a5AQMY4SLeIf8cqw==} + videojs-mobile-ui@1.1.1: + resolution: {integrity: sha512-q7vx74++bqu2763Tc/GG4qFcMt42emC8uXe/z+zFVpBIiysgAf89AgorE6m30YHWtVJWgbRIyzFVYNOxCk9qow==} engines: {node: '>=14', npm: '>=6'} peerDependencies: video.js: ^8 @@ -2630,22 +2679,24 @@ packages: videojs-vtt.js@0.15.5: resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==} - vite-plugin-compression2@2.4.0: - resolution: {integrity: sha512-8J4CBF1+dM1I06azba/eXJuJHinLF0Am7lUvRH8AZpu0otJoBaDEnxrIEr5iPZJSwH0AEglJGYCveh7pN52jCg==} + vite-plugin-compression2@1.3.3: + resolution: {integrity: sha512-Mb+xi/C5b68awtF4fNwRBPtoZiyUHU3I0SaBOAGlerlR31kusq1si6qG31lsjJH8T7QNg/p3IJY2HY9O9SvsfQ==} + peerDependencies: + vite: ^2.0.0||^3.0.0||^4.0.0||^5.0.0 ||^6.0.0 - vite@7.3.1: - resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} - engines: {node: ^20.19.0 || >=22.12.0} + vite@6.3.6: + resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 jiti: '>=1.21.0' - less: ^4.0.0 + less: '*' lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -2673,8 +2724,19 @@ packages: yaml: optional: true - vscode-uri@3.1.0: - resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true vue-eslint-parser@10.2.0: resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} @@ -2682,6 +2744,12 @@ packages: 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} + peerDependencies: + eslint: '>=6.0.0' + vue-final-modal@4.5.5: resolution: {integrity: sha512-A6xgsXqE6eLw9e6Tq/W6pxDBmimPuSuvq20WL9TOZpZy7itPdGeNn8e1P15PCGqP2yHM3q2gJIchPY9ZJd8YsA==} peerDependencies: @@ -2690,8 +2758,8 @@ packages: focus-trap: '>=7.2.0' vue: '>=3.2.0' - vue-i18n@11.2.8: - resolution: {integrity: sha512-vJ123v/PXCZntd6Qj5Jumy7UBmIuE92VrtdX+AXr+1WzdBHojiBxnAxdfctUFL+/JIN+VQH4BhsfTtiGsvVObg==} + vue-i18n@11.1.10: + resolution: {integrity: sha512-C+IwnSg8QDSOAox0gdFYP5tsKLx5jNWxiawNoiNB/Tw4CReXmM1VJMXbduhbrEzAFLhreqzfDocuSVjGbxQrag==} engines: {node: '>= 16'} peerDependencies: vue: ^3.0.0 @@ -2699,36 +2767,62 @@ packages: vue-lazyload@3.0.0: resolution: {integrity: sha512-h2keL/Rj550dLgesgOtXJS9qOiSMmuJNeVlfNAYV1/IYwOQYaWk5mFJlwRxmZDK9YC5gECcFLYYj7z1lKSf9ug==} - vue-reader@1.3.4: - resolution: {integrity: sha512-QYTX9hlrV71gL/1vMejcBLLS9Ool29XMZcLQwvL0Ep1F//o0ymzYbKX2Lre+4BUBkVq49/GmmGCmAJACsJL9tw==} + vue-reader@1.2.17: + resolution: {integrity: sha512-VeTLTiGTAywj6Ipyr8No9AR177qGYsyl5asEm0Fd7bFjL4GtGiq8PH3iH+eVJKEfw1c0+9cCyw4tyJ62qDYtqw==} + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^2.0.0 || >=3.0.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true - vue-router@4.6.4: - resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + vue-router@4.5.1: + resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} peerDependencies: - vue: ^3.5.0 + vue: ^3.2.0 vue-toastification@2.0.0-rc.5: resolution: {integrity: sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==} peerDependencies: vue: ^3.0.2 - vue-tsc@3.2.2: - resolution: {integrity: sha512-r9YSia/VgGwmbbfC06hDdAatH634XJ9nVl6Zrnz1iK4ucp8Wu78kawplXnIDa3MSu1XdQQePTHLXYwPDWn+nyQ==} + vue-tsc@2.2.0: + resolution: {integrity: sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==} hasBin: true peerDependencies: typescript: '>=5.0.0' - vue@3.5.26: - resolution: {integrity: sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==} + vue@3.5.17: + resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@14.2.0: + resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} + engines: {node: '>=18'} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -2738,949 +2832,978 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@4.0.0: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml-eslint-parser@1.3.2: - resolution: {integrity: sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==} + yaml-eslint-parser@1.2.3: + resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==} engines: {node: ^14.17.0 || >=16.0.0} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} - engines: {node: '>= 14.6'} + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} + engines: {node: '>= 14'} hasBin: true + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} snapshots: - '@babel/code-frame@7.27.1': + '@ampproject/remapping@2.3.0': dependencies: - '@babel/helper-validator-identifier': 7.28.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@asamuzakjp/css-color@2.8.3': + dependencies: + '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-color-parser': 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + lru-cache: 10.4.3 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.5': {} + '@babel/compat-data@7.26.2': {} - '@babel/core@7.28.5': + '@babel/core@7.26.0': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/remapping': 2.3.5 + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.4.3 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.28.5': + '@babel/generator@7.26.2': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 - '@babel/helper-annotate-as-pure@7.27.3': + '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.26.0 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color - '@babel/helper-compilation-targets@7.27.2': + '@babel/helper-compilation-targets@7.25.9': dependencies: - '@babel/compat-data': 7.28.5 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.0 + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': + '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/traverse': 7.25.9 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5)': + '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.4.0 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - debug: 4.4.3 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + debug: 4.3.7 lodash.debounce: 4.0.8 - resolve: 1.22.11 + resolve: 1.22.8 transitivePeerDependencies: - supports-color - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.28.5': + '@babel/helper-member-expression-to-functions@7.25.9': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.27.1': + '@babel/helper-module-imports@7.25.9': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.27.1': + '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.26.0 - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.25.9': {} - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': + '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-wrap-function': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-member-expression-to-functions': 7.25.9 + '@babel/helper-optimise-call-expression': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + '@babel/helper-simple-access@7.25.9': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color + '@babel/helper-skip-transparent-expression-wrappers@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.28.5': {} + '@babel/helper-validator-identifier@7.25.9': {} - '@babel/helper-validator-option@7.27.1': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/helper-wrap-function@7.28.3': + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helper-wrap-function@7.25.9': dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.4': + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/parser@7.26.7': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/types': 7.26.7 - '@babel/parser@7.28.5': + '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.5)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 + '@babel/core': 7.26.0 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': + '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5)': + '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5)': + '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/traverse': 7.25.9 + globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/template': 7.25.9 - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.5)': + '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) + '@babel/core': 7.26.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-simple-access': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)': + '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5)': + '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': + '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + regenerator-transform: 0.15.2 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)': + '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/preset-env@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/compat-data': 7.28.5 - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.5) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.5) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.46.0 + '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-create-regexp-features-plugin': 7.25.9(@babel/core@7.26.0) + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/preset-env@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) + '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoped-functions': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-commonjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-nullish-coalescing-operator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.5 + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/types': 7.26.0 esutils: 2.0.3 - '@babel/runtime@7.28.4': {} + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 - '@babel/template@7.27.2': + '@babel/runtime@7.26.7': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + regenerator-runtime: 0.14.1 - '@babel/traverse@7.28.5': + '@babel/template@7.25.9': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 - debug: 4.4.3 + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.28.5': + '@babel/types@7.26.0': dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - '@chenfengyuan/vue-number-input@2.0.1(vue@3.5.26(typescript@5.9.3))': + '@babel/types@7.26.7': dependencies: - vue: 3.5.26(typescript@5.9.3) - - '@esbuild/aix-ppc64@0.25.12': - optional: true - - '@esbuild/aix-ppc64@0.27.2': - optional: true - - '@esbuild/android-arm64@0.25.12': - optional: true - - '@esbuild/android-arm64@0.27.2': - optional: true - - '@esbuild/android-arm@0.25.12': - optional: true - - '@esbuild/android-arm@0.27.2': - optional: true + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 - '@esbuild/android-x64@0.25.12': - optional: true - - '@esbuild/android-x64@0.27.2': - optional: true - - '@esbuild/darwin-arm64@0.25.12': - optional: true - - '@esbuild/darwin-arm64@0.27.2': - optional: true - - '@esbuild/darwin-x64@0.25.12': - optional: true - - '@esbuild/darwin-x64@0.27.2': - optional: true - - '@esbuild/freebsd-arm64@0.25.12': - optional: true - - '@esbuild/freebsd-arm64@0.27.2': - optional: true - - '@esbuild/freebsd-x64@0.25.12': - optional: true - - '@esbuild/freebsd-x64@0.27.2': - optional: true - - '@esbuild/linux-arm64@0.25.12': - optional: true - - '@esbuild/linux-arm64@0.27.2': - optional: true - - '@esbuild/linux-arm@0.25.12': - optional: true - - '@esbuild/linux-arm@0.27.2': - optional: true + '@babel/types@7.28.1': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 - '@esbuild/linux-ia32@0.25.12': - optional: true + '@chenfengyuan/vue-number-input@2.0.1(vue@3.5.17(typescript@5.6.3))': + dependencies: + vue: 3.5.17(typescript@5.6.3) - '@esbuild/linux-ia32@0.27.2': - optional: true + '@csstools/color-helpers@5.0.1': {} - '@esbuild/linux-loong64@0.25.12': - optional: true + '@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 - '@esbuild/linux-loong64@0.27.2': - optional: true + '@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/color-helpers': 5.0.1 + '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 - '@esbuild/linux-mips64el@0.25.12': - optional: true + '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-tokenizer': 3.0.3 - '@esbuild/linux-mips64el@0.27.2': - optional: true + '@csstools/css-tokenizer@3.0.3': {} - '@esbuild/linux-ppc64@0.25.12': + '@esbuild/aix-ppc64@0.25.9': optional: true - '@esbuild/linux-ppc64@0.27.2': + '@esbuild/android-arm64@0.25.9': optional: true - '@esbuild/linux-riscv64@0.25.12': + '@esbuild/android-arm@0.25.9': optional: true - '@esbuild/linux-riscv64@0.27.2': + '@esbuild/android-x64@0.25.9': optional: true - '@esbuild/linux-s390x@0.25.12': + '@esbuild/darwin-arm64@0.25.9': optional: true - '@esbuild/linux-s390x@0.27.2': + '@esbuild/darwin-x64@0.25.9': optional: true - '@esbuild/linux-x64@0.25.12': + '@esbuild/freebsd-arm64@0.25.9': optional: true - '@esbuild/linux-x64@0.27.2': + '@esbuild/freebsd-x64@0.25.9': optional: true - '@esbuild/netbsd-arm64@0.25.12': + '@esbuild/linux-arm64@0.25.9': optional: true - '@esbuild/netbsd-arm64@0.27.2': + '@esbuild/linux-arm@0.25.9': optional: true - '@esbuild/netbsd-x64@0.25.12': + '@esbuild/linux-ia32@0.25.9': optional: true - '@esbuild/netbsd-x64@0.27.2': + '@esbuild/linux-loong64@0.25.9': optional: true - '@esbuild/openbsd-arm64@0.25.12': + '@esbuild/linux-mips64el@0.25.9': optional: true - '@esbuild/openbsd-arm64@0.27.2': + '@esbuild/linux-ppc64@0.25.9': optional: true - '@esbuild/openbsd-x64@0.25.12': + '@esbuild/linux-riscv64@0.25.9': optional: true - '@esbuild/openbsd-x64@0.27.2': + '@esbuild/linux-s390x@0.25.9': optional: true - '@esbuild/openharmony-arm64@0.25.12': + '@esbuild/linux-x64@0.25.9': optional: true - '@esbuild/openharmony-arm64@0.27.2': + '@esbuild/netbsd-arm64@0.25.9': optional: true - '@esbuild/sunos-x64@0.25.12': + '@esbuild/netbsd-x64@0.25.9': optional: true - '@esbuild/sunos-x64@0.27.2': + '@esbuild/openbsd-arm64@0.25.9': optional: true - '@esbuild/win32-arm64@0.25.12': + '@esbuild/openbsd-x64@0.25.9': optional: true - '@esbuild/win32-arm64@0.27.2': + '@esbuild/openharmony-arm64@0.25.9': optional: true - '@esbuild/win32-ia32@0.25.12': + '@esbuild/sunos-x64@0.25.9': optional: true - '@esbuild/win32-ia32@0.27.2': + '@esbuild/win32-arm64@0.25.9': optional: true - '@esbuild/win32-x64@0.25.12': + '@esbuild/win32-ia32@0.25.9': optional: true - '@esbuild/win32-x64@0.27.2': + '@esbuild/win32-x64@0.25.9': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.31.0)': dependencies: - eslint: 9.39.2 + eslint: 9.31.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0)': dependencies: - eslint: 9.39.2 + eslint: 9.31.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.2': {} + '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.21.0': dependencies: - '@eslint/object-schema': 2.1.7 - debug: 4.4.3 + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.2': - dependencies: - '@eslint/core': 0.17.0 + '@eslint/config-helpers@0.3.0': {} - '@eslint/core@0.17.0': + '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.3': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.3 + debug: 4.4.0 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.39.2': {} + '@eslint/js@9.31.0': {} - '@eslint/object-schema@2.1.7': {} + '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.4.1': + '@eslint/plugin-kit@0.3.3': dependencies: - '@eslint/core': 0.17.0 + '@eslint/core': 0.15.1 levn: 0.4.1 '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.6': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.4.3 + '@humanwhocodes/retry': 0.3.1 '@humanwhocodes/module-importer@1.0.1': {} + '@humanwhocodes/retry@0.3.1': {} + '@humanwhocodes/retry@0.4.3': {} - '@intlify/bundle-utils@11.0.3(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.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.2.8 - '@intlify/shared': 11.2.2 - acorn: 8.15.0 - esbuild: 0.25.12 + '@intlify/message-compiler': 11.1.2 + '@intlify/shared': 11.1.7 + acorn: 8.14.0 escodegen: 2.1.0 estree-walker: 2.0.2 - jsonc-eslint-parser: 2.4.2 + jsonc-eslint-parser: 2.4.0 + mlly: 1.7.4 source-map-js: 1.2.1 - yaml-eslint-parser: 1.3.2 + yaml-eslint-parser: 1.2.3 optionalDependencies: - vue-i18n: 11.2.8(vue@3.5.26(typescript@5.9.3)) + vue-i18n: 11.1.10(vue@3.5.17(typescript@5.6.3)) + + '@intlify/core-base@11.1.10': + dependencies: + '@intlify/message-compiler': 11.1.10 + '@intlify/shared': 11.1.10 - '@intlify/core-base@11.2.8': + '@intlify/message-compiler@11.1.10': dependencies: - '@intlify/message-compiler': 11.2.8 - '@intlify/shared': 11.2.8 + '@intlify/shared': 11.1.10 + source-map-js: 1.2.1 - '@intlify/message-compiler@11.2.8': + '@intlify/message-compiler@11.1.2': dependencies: - '@intlify/shared': 11.2.8 + '@intlify/shared': 11.1.2 source-map-js: 1.2.1 - '@intlify/shared@11.2.2': {} + '@intlify/shared@11.1.10': {} - '@intlify/shared@11.2.8': {} + '@intlify/shared@11.1.2': {} - '@intlify/unplugin-vue-i18n@11.0.3(@vue/compiler-dom@3.5.26)(eslint@9.39.2)(rollup@4.55.1)(typescript@5.9.3)(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3))': + '@intlify/shared@11.1.7': {} + + '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.50.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.9.0(eslint@9.39.2) - '@intlify/bundle-utils': 11.0.3(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3))) - '@intlify/shared': 11.2.2 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.2.2)(@vue/compiler-dom@3.5.26)(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.3)) - '@rollup/pluginutils': 5.3.0(rollup@4.55.1) - '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) - debug: 4.4.3 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0) + '@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.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3)) + '@rollup/pluginutils': 5.1.4(rollup@4.50.1) + '@typescript-eslint/scope-manager': 8.21.0 + '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3) + debug: 4.4.0 fast-glob: 3.3.3 - pathe: 2.0.3 + js-yaml: 4.1.0 + json5: 2.2.3 + pathe: 1.1.2 picocolors: 1.1.1 - unplugin: 2.3.11 - vue: 3.5.26(typescript@5.9.3) + source-map-js: 1.2.1 + unplugin: 1.16.1 + vue: 3.5.17(typescript@5.6.3) optionalDependencies: - vue-i18n: 11.2.8(vue@3.5.26(typescript@5.9.3)) + vue-i18n: 11.1.10(vue@3.5.17(typescript@5.6.3)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -3688,38 +3811,42 @@ snapshots: - supports-color - typescript - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.2.2)(@vue/compiler-dom@3.5.26)(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)))(vue@3.5.26(typescript@5.9.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.28.5 + '@babel/parser': 7.26.7 optionalDependencies: - '@intlify/shared': 11.2.2 - '@vue/compiler-dom': 3.5.26 - vue: 3.5.26(typescript@5.9.3) - vue-i18n: 11.2.8(vue@3.5.26(typescript@5.9.3)) + '@intlify/shared': 11.1.7 + '@vue/compiler-dom': 3.5.17 + 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.13': + '@jridgewell/gen-mapping@0.3.5': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/remapping@2.3.5': + '@jridgewell/gen-mapping@0.3.8': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/source-map@0.3.11': + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/sourcemap-codec@1.5.0': {} - '@jridgewell/trace-mapping@0.3.31': + '@jridgewell/trace-mapping@0.3.25': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.0 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -3731,96 +3858,98 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.18.0 - '@pkgr/core@0.2.9': {} + '@pkgr/core@0.2.7': {} - '@rolldown/pluginutils@1.0.0-beta.53': {} + '@playwright/test@1.54.1': + dependencies: + playwright: 1.54.1 - '@rollup/pluginutils@5.3.0(rollup@4.55.1)': + '@rollup/pluginutils@5.1.3(rollup@4.50.1)': dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.55.1 + rollup: 4.50.1 - '@rollup/rollup-android-arm-eabi@4.55.1': - optional: true - - '@rollup/rollup-android-arm64@4.55.1': - optional: true + '@rollup/pluginutils@5.1.4(rollup@4.50.1)': + dependencies: + '@types/estree': 1.0.7 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.50.1 - '@rollup/rollup-darwin-arm64@4.55.1': + '@rollup/rollup-android-arm-eabi@4.50.1': optional: true - '@rollup/rollup-darwin-x64@4.55.1': + '@rollup/rollup-android-arm64@4.50.1': optional: true - '@rollup/rollup-freebsd-arm64@4.55.1': + '@rollup/rollup-darwin-arm64@4.50.1': optional: true - '@rollup/rollup-freebsd-x64@4.55.1': + '@rollup/rollup-darwin-x64@4.50.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + '@rollup/rollup-freebsd-arm64@4.50.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.55.1': + '@rollup/rollup-freebsd-x64@4.50.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.55.1': + '@rollup/rollup-linux-arm-gnueabihf@4.50.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.55.1': + '@rollup/rollup-linux-arm-musleabihf@4.50.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.55.1': + '@rollup/rollup-linux-arm64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-loong64-musl@4.55.1': + '@rollup/rollup-linux-arm64-musl@4.50.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.55.1': + '@rollup/rollup-linux-loongarch64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-ppc64-musl@4.55.1': + '@rollup/rollup-linux-ppc64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.55.1': + '@rollup/rollup-linux-riscv64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.55.1': + '@rollup/rollup-linux-riscv64-musl@4.50.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.55.1': + '@rollup/rollup-linux-s390x-gnu@4.50.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.55.1': + '@rollup/rollup-linux-x64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-x64-musl@4.55.1': + '@rollup/rollup-linux-x64-musl@4.50.1': optional: true - '@rollup/rollup-openbsd-x64@4.55.1': + '@rollup/rollup-openharmony-arm64@4.50.1': optional: true - '@rollup/rollup-openharmony-arm64@4.55.1': + '@rollup/rollup-win32-arm64-msvc@4.50.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.55.1': + '@rollup/rollup-win32-ia32-msvc@4.50.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.55.1': + '@rollup/rollup-win32-x64-msvc@4.50.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.55.1': - optional: true + '@tsconfig/node22@22.0.2': {} - '@rollup/rollup-win32-x64-msvc@4.55.1': - optional: true + '@types/estree@1.0.6': {} - '@tsconfig/node24@24.0.3': {} + '@types/estree@1.0.7': {} '@types/estree@1.0.8': {} @@ -3836,438 +3965,359 @@ snapshots: '@types/lodash@4.17.13': {} - '@types/node@24.10.6': + '@types/node@22.10.10': dependencies: - undici-types: 7.16.0 + undici-types: 6.20.0 '@types/trusted-types@2.0.7': optional: true - '@types/web-bluetooth@0.0.21': {} + '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.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.2 - '@typescript-eslint/parser': 8.37.0(eslint@9.39.2)(typescript@5.9.3) + '@eslint-community/regexpp': 4.12.1 + '@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.39.2)(typescript@5.9.3) - '@typescript-eslint/utils': 8.37.0(eslint@9.39.2)(typescript@5.9.3) + '@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.39.2 + eslint: 9.31.0 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.52.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.37.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.52.0 - '@typescript-eslint/type-utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.52.0 - eslint: 9.39.2 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.1.0(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.37.0 - debug: 4.4.3 - eslint: 9.39.2 - typescript: 5.9.3 + debug: 4.4.0 + eslint: 9.31.0 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.37.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.37.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.6.3) '@typescript-eslint/types': 8.37.0 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) - '@typescript-eslint/types': 8.49.0 - debug: 4.4.3 - typescript: 5.9.3 + debug: 4.4.0 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.52.0(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.21.0': dependencies: - '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) - '@typescript-eslint/types': 8.52.0 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/visitor-keys': 8.21.0 '@typescript-eslint/scope-manager@8.37.0': dependencies: '@typescript-eslint/types': 8.37.0 '@typescript-eslint/visitor-keys': 8.37.0 - '@typescript-eslint/scope-manager@8.49.0': - dependencies: - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/visitor-keys': 8.49.0 - - '@typescript-eslint/scope-manager@8.52.0': - dependencies: - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/visitor-keys': 8.52.0 - - '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 - - '@typescript-eslint/tsconfig-utils@8.52.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.6.3)': dependencies: - typescript: 5.9.3 + typescript: 5.6.3 - '@typescript-eslint/type-utils@8.37.0(eslint@9.39.2)(typescript@5.9.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.9.3) - '@typescript-eslint/utils': 8.37.0(eslint@9.39.2)(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.2 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.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) + debug: 4.4.0 + eslint: 9.31.0 + ts-api-utils: 2.1.0(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.52.0(eslint@9.39.2)(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.52.0(eslint@9.39.2)(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.2 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.21.0': {} '@typescript-eslint/types@8.37.0': {} - '@typescript-eslint/types@8.49.0': {} - - '@typescript-eslint/types@8.52.0': {} - - '@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.21.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/project-service': 8.37.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.9.3) - '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/visitor-keys': 8.37.0 - debug: 4.4.3 + '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/visitor-keys': 8.21.0 + debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.49.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/visitor-keys': 8.49.0 - debug: 4.4.3 - minimatch: 9.0.5 - semver: 7.7.3 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + semver: 7.6.3 + ts-api-utils: 2.0.0(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.52.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.37.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/project-service': 8.52.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.52.0(typescript@5.9.3) - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/visitor-keys': 8.52.0 - debug: 4.4.3 + '@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.7.3 - tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + 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.39.2)(typescript@5.9.3)': + '@typescript-eslint/utils@8.37.0(eslint@9.31.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) + '@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.9.3) - eslint: 9.39.2 - typescript: 5.9.3 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.6.3) + eslint: 9.31.0 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.52.0(eslint@9.39.2)(typescript@5.9.3)': + '@typescript-eslint/visitor-keys@8.21.0': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) - '@typescript-eslint/scope-manager': 8.52.0 - '@typescript-eslint/types': 8.52.0 - '@typescript-eslint/typescript-estree': 8.52.0(typescript@5.9.3) - eslint: 9.39.2 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 8.21.0 + eslint-visitor-keys: 4.2.0 '@typescript-eslint/visitor-keys@8.37.0': dependencies: '@typescript-eslint/types': 8.37.0 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.49.0': - dependencies: - '@typescript-eslint/types': 8.49.0 - eslint-visitor-keys: 4.2.1 - - '@typescript-eslint/visitor-keys@8.52.0': + '@videojs/http-streaming@3.17.0(video.js@8.23.3)': dependencies: - '@typescript-eslint/types': 8.52.0 - eslint-visitor-keys: 4.2.1 - - '@videojs/http-streaming@3.17.2(video.js@8.23.4)': - dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.26.7 '@videojs/vhs-utils': 4.1.1 aes-decrypter: 4.0.2 global: 4.4.0 m3u8-parser: 7.2.0 mpd-parser: 1.3.1 mux.js: 7.1.0 - video.js: 8.23.4 + video.js: 8.23.3 '@videojs/vhs-utils@4.1.1': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.26.7 global: 4.4.0 '@videojs/xhr@2.7.0': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.26.7 global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-legacy@7.2.1(terser@5.44.1)(vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2))': - dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.5) - '@babel/preset-env': 7.28.5(@babel/core@7.28.5) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) - browserslist: 4.28.0 - browserslist-to-esbuild: 2.1.1(browserslist@4.28.0) - core-js: 3.46.0 - magic-string: 0.30.21 + '@vitejs/plugin-legacy@6.0.0(terser@5.43.1)(vite@6.3.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.44.0 + magic-string: 0.30.14 regenerator-runtime: 0.14.1 systemjs: 6.15.1 - terser: 5.44.1 - vite: 7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2) + terser: 5.43.1 + vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@6.0.3(vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': + '@vitejs/plugin-vue@5.2.1(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))': dependencies: - '@rolldown/pluginutils': 1.0.0-beta.53 - vite: 7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2) - vue: 3.5.26(typescript@5.9.3) + vite: 6.3.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.27': + '@volar/language-core@2.4.11': dependencies: - '@volar/source-map': 2.4.27 + '@volar/source-map': 2.4.11 - '@volar/source-map@2.4.27': {} + '@volar/source-map@2.4.11': {} - '@volar/typescript@2.4.27': + '@volar/typescript@2.4.11': dependencies: - '@volar/language-core': 2.4.27 + '@volar/language-core': 2.4.11 path-browserify: 1.0.1 - vscode-uri: 3.1.0 + vscode-uri: 3.0.8 - '@vue/compiler-core@3.5.26': + '@vue/compiler-core@3.5.13': dependencies: - '@babel/parser': 7.28.5 - '@vue/shared': 3.5.26 - entities: 7.0.0 + '@babel/parser': 7.26.2 + '@vue/shared': 3.5.13 + entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.26': + '@vue/compiler-core@3.5.17': dependencies: - '@vue/compiler-core': 3.5.26 - '@vue/shared': 3.5.26 - - '@vue/compiler-sfc@3.5.26': - dependencies: - '@babel/parser': 7.28.5 - '@vue/compiler-core': 3.5.26 - '@vue/compiler-dom': 3.5.26 - '@vue/compiler-ssr': 3.5.26 - '@vue/shared': 3.5.26 + '@babel/parser': 7.28.0 + '@vue/shared': 3.5.17 + entities: 4.5.0 estree-walker: 2.0.2 - magic-string: 0.30.21 - postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.26': + '@vue/compiler-dom@3.5.13': dependencies: - '@vue/compiler-dom': 3.5.26 - '@vue/shared': 3.5.26 + '@vue/compiler-core': 3.5.13 + '@vue/shared': 3.5.13 - '@vue/devtools-api@6.6.4': {} + '@vue/compiler-dom@3.5.17': + dependencies: + '@vue/compiler-core': 3.5.17 + '@vue/shared': 3.5.17 - '@vue/devtools-api@7.7.8': + '@vue/compiler-sfc@3.5.17': dependencies: - '@vue/devtools-kit': 7.7.8 + '@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.17 + postcss: 8.5.6 + source-map-js: 1.2.1 - '@vue/devtools-kit@7.7.8': + '@vue/compiler-ssr@3.5.17': dependencies: - '@vue/devtools-shared': 7.7.8 - birpc: 2.8.0 - hookable: 5.5.3 - mitt: 3.0.1 - perfect-debounce: 1.0.0 - speakingurl: 14.0.1 - superjson: 2.2.5 + '@vue/compiler-dom': 3.5.17 + '@vue/shared': 3.5.17 - '@vue/devtools-shared@7.7.8': + '@vue/compiler-vue2@2.7.16': dependencies: - rfdc: 1.4.1 + de-indent: 1.0.2 + he: 1.2.0 - '@vue/eslint-config-prettier@10.2.0(eslint@9.39.2)(prettier@3.7.4)': + '@vue/devtools-api@6.6.4': {} + + '@vue/eslint-config-prettier@10.2.0(eslint@9.31.0)(prettier@3.6.2)': dependencies: - eslint: 9.39.2 - eslint-config-prettier: 10.1.8(eslint@9.39.2) - eslint-plugin-prettier: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.7.4) - prettier: 3.7.4 + 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.6.0(eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)))(eslint@9.39.2)(typescript@5.9.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.37.0(eslint@9.39.2)(typescript@5.9.3) - eslint: 9.39.2 - eslint-plugin-vue: 10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)) + '@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.37.0(eslint@9.39.2)(typescript@5.9.3) - vue-eslint-parser: 10.2.0(eslint@9.39.2) + 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.9.3 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@vue/language-core@3.2.2': + '@vue/language-core@2.2.0(typescript@5.6.3)': dependencies: - '@volar/language-core': 2.4.27 - '@vue/compiler-dom': 3.5.26 - '@vue/shared': 3.5.26 - alien-signals: 3.1.2 + '@volar/language-core': 2.4.11 + '@vue/compiler-dom': 3.5.13 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.5.13 + alien-signals: 0.4.14 + minimatch: 9.0.5 muggle-string: 0.4.1 path-browserify: 1.0.1 - picomatch: 4.0.3 + optionalDependencies: + typescript: 5.6.3 - '@vue/reactivity@3.5.26': + '@vue/reactivity@3.5.17': dependencies: - '@vue/shared': 3.5.26 + '@vue/shared': 3.5.17 - '@vue/runtime-core@3.5.26': + '@vue/runtime-core@3.5.17': dependencies: - '@vue/reactivity': 3.5.26 - '@vue/shared': 3.5.26 + '@vue/reactivity': 3.5.17 + '@vue/shared': 3.5.17 - '@vue/runtime-dom@3.5.26': + '@vue/runtime-dom@3.5.17': dependencies: - '@vue/reactivity': 3.5.26 - '@vue/runtime-core': 3.5.26 - '@vue/shared': 3.5.26 - csstype: 3.2.3 + '@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.26(vue@3.5.26(typescript@5.9.3))': + '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.6.3))': dependencies: - '@vue/compiler-ssr': 3.5.26 - '@vue/shared': 3.5.26 - vue: 3.5.26(typescript@5.9.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/shared@3.5.26': {} + '@vue/shared@3.5.17': {} - '@vue/tsconfig@0.8.1(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))': + '@vue/tsconfig@0.7.0(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3))': optionalDependencies: - typescript: 5.9.3 - vue: 3.5.26(typescript@5.9.3) + typescript: 5.6.3 + vue: 3.5.17(typescript@5.6.3) - '@vueuse/core@14.1.0(vue@3.5.26(typescript@5.9.3))': + '@vueuse/core@12.5.0(typescript@5.6.3)': dependencies: - '@types/web-bluetooth': 0.0.21 - '@vueuse/metadata': 14.1.0 - '@vueuse/shared': 14.1.0(vue@3.5.26(typescript@5.9.3)) - vue: 3.5.26(typescript@5.9.3) + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 12.5.0 + '@vueuse/shared': 12.5.0(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) + transitivePeerDependencies: + - typescript - '@vueuse/integrations@14.1.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(vue@3.5.26(typescript@5.9.3))': + '@vueuse/integrations@12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3)': dependencies: - '@vueuse/core': 14.1.0(vue@3.5.26(typescript@5.9.3)) - '@vueuse/shared': 14.1.0(vue@3.5.26(typescript@5.9.3)) - vue: 3.5.26(typescript@5.9.3) + '@vueuse/core': 12.5.0(typescript@5.6.3) + '@vueuse/shared': 12.5.0(typescript@5.6.3) + vue: 3.5.17(typescript@5.6.3) optionalDependencies: focus-trap: 7.6.2 jwt-decode: 4.0.0 + transitivePeerDependencies: + - typescript - '@vueuse/metadata@14.1.0': {} + '@vueuse/metadata@12.5.0': {} - '@vueuse/shared@14.1.0(vue@3.5.26(typescript@5.9.3))': + '@vueuse/shared@12.5.0(typescript@5.6.3)': dependencies: - vue: 3.5.26(typescript@5.9.3) + vue: 3.5.17(typescript@5.6.3) + transitivePeerDependencies: + - typescript '@xmldom/xmldom@0.7.13': {} - '@xmldom/xmldom@0.8.11': {} + '@xmldom/xmldom@0.8.10': {} - ace-builds@1.43.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.28.4 + '@babel/runtime': 7.26.7 '@videojs/vhs-utils': 4.1.1 global: 4.4.0 pkcs7: 1.0.4 + agent-base@7.1.3: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -4275,7 +4325,9 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - alien-signals@3.1.2: {} + alien-signals@0.4.14: {} + + ansi-regex@5.0.1: {} ansi-styles@4.3.0: dependencies: @@ -4283,55 +4335,50 @@ snapshots: argparse@2.0.1: {} - autoprefixer@10.4.23(postcss@8.5.6): + autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001760 - fraction.js: 5.3.4 + 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.6 postcss-value-parser: 4.2.0 - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): dependencies: - '@babel/compat-data': 7.28.5 - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + '@babel/compat-data': 7.26.2 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.46.0 + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + core-js-compat: 3.39.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) transitivePeerDependencies: - supports-color balanced-match@1.0.2: {} - baseline-browser-mapping@2.8.26: {} - - baseline-browser-mapping@2.9.7: {} - - birpc@2.8.0: {} - boolbase@1.0.0: {} - brace-expansion@1.1.12: + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -4339,40 +4386,44 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist-to-esbuild@2.1.1(browserslist@4.28.0): + browserslist-to-esbuild@2.1.1(browserslist@4.24.2): dependencies: - browserslist: 4.28.0 + browserslist: 4.24.2 meow: 13.2.0 - browserslist@4.28.0: + browserslist@4.24.2: dependencies: - baseline-browser-mapping: 2.8.26 - caniuse-lite: 1.0.30001754 - electron-to-chromium: 1.5.250 - node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.28.0) + caniuse-lite: 1.0.30001685 + electron-to-chromium: 1.5.67 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) - browserslist@4.28.1: + browserslist@4.25.1: dependencies: - baseline-browser-mapping: 2.9.7 - caniuse-lite: 1.0.30001760 - electron-to-chromium: 1.5.267 - node-releases: 2.0.27 - update-browserslist-db: 1.2.2(browserslist@4.28.1) + 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.30001754: {} + caniuse-lite@1.0.30001685: {} - caniuse-lite@1.0.30001760: {} + caniuse-lite@1.0.30001727: {} chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -4388,17 +4439,25 @@ snapshots: concat-map@0.0.1: {} - convert-source-map@2.0.0: {} - - copy-anything@4.0.5: + concurrently@9.2.0: dependencies: - is-what: 5.5.0 + chalk: 4.1.2 + lodash: 4.17.21 + rxjs: 7.8.1 + shell-quote: 1.8.2 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + + confbox@0.1.8: {} + + convert-source-map@2.0.0: {} - core-js-compat@3.46.0: + core-js-compat@3.39.0: dependencies: - browserslist: 4.28.0 + browserslist: 4.24.2 - core-js@3.46.0: {} + core-js@3.44.0: {} core-util-is@1.0.3: {} @@ -4410,7 +4469,12 @@ snapshots: cssesc@3.0.0: {} - csstype@3.2.3: {} + cssstyle@4.2.1: + dependencies: + '@asamuzakjp/css-color': 2.8.3 + rrweb-cssom: 0.8.0 + + csstype@3.1.3: {} custom-error-instance@2.1.1: {} @@ -4419,31 +4483,46 @@ snapshots: es5-ext: 0.10.64 type: 2.7.3 - dayjs@1.11.19: {} + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.2.0 + + dayjs@1.11.13: {} + + de-indent@1.0.2: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 - debug@4.4.3: + debug@4.4.0: dependencies: ms: 2.1.3 + decimal.js@10.5.0: {} + deep-is@0.1.4: {} dom-walk@0.1.2: {} - dompurify@3.3.1: + dompurify@3.2.6: optionalDependencies: '@types/trusted-types': 2.0.7 - electron-to-chromium@1.5.250: {} + electron-to-chromium@1.5.183: {} - electron-to-chromium@1.5.267: {} + electron-to-chromium@1.5.67: {} - entities@7.0.0: {} + emoji-regex@8.0.0: {} + + entities@4.5.0: {} epubjs@0.3.93: dependencies: '@types/localforage': 0.0.34 '@xmldom/xmldom': 0.7.13 - core-js: 3.46.0 + core-js: 3.44.0 event-emitter: 0.3.5 jszip: 3.10.1 localforage: 1.10.0 @@ -4469,63 +4548,34 @@ snapshots: d: 1.0.2 ext: 1.7.0 - esbuild@0.25.12: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.12 - '@esbuild/android-arm': 0.25.12 - '@esbuild/android-arm64': 0.25.12 - '@esbuild/android-x64': 0.25.12 - '@esbuild/darwin-arm64': 0.25.12 - '@esbuild/darwin-x64': 0.25.12 - '@esbuild/freebsd-arm64': 0.25.12 - '@esbuild/freebsd-x64': 0.25.12 - '@esbuild/linux-arm': 0.25.12 - '@esbuild/linux-arm64': 0.25.12 - '@esbuild/linux-ia32': 0.25.12 - '@esbuild/linux-loong64': 0.25.12 - '@esbuild/linux-mips64el': 0.25.12 - '@esbuild/linux-ppc64': 0.25.12 - '@esbuild/linux-riscv64': 0.25.12 - '@esbuild/linux-s390x': 0.25.12 - '@esbuild/linux-x64': 0.25.12 - '@esbuild/netbsd-arm64': 0.25.12 - '@esbuild/netbsd-x64': 0.25.12 - '@esbuild/openbsd-arm64': 0.25.12 - '@esbuild/openbsd-x64': 0.25.12 - '@esbuild/openharmony-arm64': 0.25.12 - '@esbuild/sunos-x64': 0.25.12 - '@esbuild/win32-arm64': 0.25.12 - '@esbuild/win32-ia32': 0.25.12 - '@esbuild/win32-x64': 0.25.12 - - esbuild@0.27.2: + esbuild@0.25.9: optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 + '@esbuild/aix-ppc64': 0.25.9 + '@esbuild/android-arm': 0.25.9 + '@esbuild/android-arm64': 0.25.9 + '@esbuild/android-x64': 0.25.9 + '@esbuild/darwin-arm64': 0.25.9 + '@esbuild/darwin-x64': 0.25.9 + '@esbuild/freebsd-arm64': 0.25.9 + '@esbuild/freebsd-x64': 0.25.9 + '@esbuild/linux-arm': 0.25.9 + '@esbuild/linux-arm64': 0.25.9 + '@esbuild/linux-ia32': 0.25.9 + '@esbuild/linux-loong64': 0.25.9 + '@esbuild/linux-mips64el': 0.25.9 + '@esbuild/linux-ppc64': 0.25.9 + '@esbuild/linux-riscv64': 0.25.9 + '@esbuild/linux-s390x': 0.25.9 + '@esbuild/linux-x64': 0.25.9 + '@esbuild/netbsd-arm64': 0.25.9 + '@esbuild/netbsd-x64': 0.25.9 + '@esbuild/openbsd-arm64': 0.25.9 + '@esbuild/openbsd-x64': 0.25.9 + '@esbuild/openharmony-arm64': 0.25.9 + '@esbuild/sunos-x64': 0.25.9 + '@esbuild/win32-arm64': 0.25.9 + '@esbuild/win32-ia32': 0.25.9 + '@esbuild/win32-x64': 0.25.9 escalade@3.2.0: {} @@ -4539,31 +4589,42 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.8(eslint@9.39.2): + eslint-config-prettier@10.1.5(eslint@9.31.0): dependencies: - eslint: 9.39.2 + eslint: 9.31.0 - eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.7.4): + 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.39.2 - prettier: 3.7.4 + eslint: 9.31.0 + prettier: 3.6.2 prettier-linter-helpers: 1.0.0 - synckit: 0.11.11 + synckit: 0.11.8 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@9.39.2) + eslint-config-prettier: 10.1.5(eslint@9.31.0) - eslint-plugin-vue@10.6.2(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(vue-eslint-parser@10.2.0(eslint@9.39.2)): + eslint-plugin-vue@9.32.0(eslint@9.31.0): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) - eslint: 9.39.2 + '@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: 7.1.1 - semver: 7.7.3 - vue-eslint-parser: 10.2.0(eslint@9.39.2) + postcss-selector-parser: 6.1.2 + semver: 7.6.3 + vue-eslint-parser: 9.4.3(eslint@9.31.0) xml-name-validator: 4.0.0 - optionalDependencies: - '@typescript-eslint/parser': 8.37.0(eslint@9.39.2)(typescript@5.9.3) + transitivePeerDependencies: + - supports-color + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-scope@8.2.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 eslint-scope@8.4.0: dependencies: @@ -4572,26 +4633,29 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.0: {} + eslint-visitor-keys@4.2.1: {} - eslint@9.39.2: - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.2 - '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.39.2 - '@eslint/plugin-kit': 0.4.1 - '@humanfs/node': 0.16.7 + eslint@9.31.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0) + '@eslint-community/regexpp': 4.12.1 + '@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.3 - '@types/estree': 1.0.8 + '@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.3 + debug: 4.4.0 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -4620,6 +4684,12 @@ snapshots: event-emitter: 0.3.5 type: 2.7.3 + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + espree@10.4.0: dependencies: acorn: 8.15.0 @@ -4628,8 +4698,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -4673,9 +4743,9 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.19.1: + fastq@1.18.0: dependencies: - reusify: 1.1.0 + reusify: 1.0.4 fdir@6.5.0(picomatch@4.0.3): optionalDependencies: @@ -4685,7 +4755,7 @@ snapshots: dependencies: flat-cache: 4.0.1 - filesize@11.0.13: {} + filesize@10.1.6: {} fill-range@7.1.1: dependencies: @@ -4698,16 +4768,19 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.3.2 keyv: 4.5.4 - flatted@3.3.3: {} + flatted@3.3.2: {} focus-trap@7.6.2: dependencies: - tabbable: 6.4.0 + tabbable: 6.2.0 - fraction.js@5.3.4: {} + fraction.js@4.3.7: {} + + fsevents@2.3.2: + optional: true fsevents@2.3.3: optional: true @@ -4716,6 +4789,8 @@ snapshots: gensync@1.0.0-beta.2: {} + get-caller-file@2.0.5: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4726,9 +4801,15 @@ snapshots: global@4.4.0: dependencies: - min-document: 2.19.2 + min-document: 2.19.0 process: 0.11.10 + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + globals@14.0.0: {} graceful-fs@4.2.11: {} @@ -4741,7 +4822,29 @@ snapshots: dependencies: function-bind: 1.1.2 - hookable@5.5.3: {} + he@1.2.0: {} + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.6: + dependencies: + agent-base: 7.1.3 + debug: 4.4.0 + transitivePeerDependencies: + - supports-color + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 ignore@5.3.2: {} @@ -4749,7 +4852,7 @@ snapshots: immediate@3.0.6: {} - import-fresh@3.3.1: + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -4758,12 +4861,14 @@ snapshots: inherits@2.0.4: {} - is-core-module@2.16.1: + is-core-module@2.15.1: dependencies: hasown: 2.0.2 is-extglob@2.1.1: {} + is-fullwidth-code-point@3.0.0: {} + is-function@1.0.2: {} is-glob@4.0.3: @@ -4772,23 +4877,50 @@ snapshots: is-number@7.0.0: {} - is-stream@2.0.1: {} + is-potential-custom-element-name@1.0.1: {} - is-what@5.5.0: {} + is-stream@2.0.1: {} isarray@1.0.0: {} isexe@2.0.0: {} - js-base64@3.7.8: {} + js-base64@3.7.7: {} js-tokens@4.0.0: {} - js-yaml@4.1.1: + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsesc@3.1.0: {} + jsdom@26.1.0: + dependencies: + cssstyle: 4.2.1 + data-urls: 5.0.0 + decimal.js: 10.5.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.16 + parse5: 7.2.1 + rrweb-cssom: 0.8.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + 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.2.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@3.0.2: {} json-buffer@3.0.1: {} @@ -4798,12 +4930,12 @@ snapshots: json5@2.2.3: {} - jsonc-eslint-parser@2.4.2: + jsonc-eslint-parser@2.4.0: dependencies: - acorn: 8.15.0 + acorn: 8.14.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.7.3 + semver: 7.6.3 jszip@3.10.1: dependencies: @@ -4839,7 +4971,7 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash-es@4.17.22: {} + lodash-es@4.17.21: {} lodash._baseiteratee@4.7.0: dependencies: @@ -4873,21 +5005,27 @@ snapshots: lodash@4.17.21: {} + lru-cache@10.4.3: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 m3u8-parser@7.2.0: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.26.7 '@videojs/vhs-utils': 4.1.1 global: 4.4.0 - magic-string@0.30.21: + magic-string@0.30.14: dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/sourcemap-codec': 1.5.0 - marked@17.0.1: {} + magic-string@0.30.17: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + marked@15.0.6: {} marks-pane@1.0.9: {} @@ -4902,25 +5040,30 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - min-document@2.19.2: + min-document@2.19.0: dependencies: dom-walk: 0.1.2 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.11 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.1 - mitt@3.0.1: {} + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.2 + pkg-types: 1.3.1 + ufo: 1.5.4 mpd-parser@1.3.1: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.26.7 '@videojs/vhs-utils': 4.1.1 - '@xmldom/xmldom': 0.8.11 + '@xmldom/xmldom': 0.8.10 global: 4.4.0 ms@2.1.3: {} @@ -4929,7 +5072,7 @@ snapshots: mux.js@7.1.0: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.26.7 global: 4.4.0 nanoid@3.3.11: {} @@ -4938,7 +5081,11 @@ snapshots: next-tick@1.1.0: {} - node-releases@2.0.27: {} + node-releases@2.0.18: {} + + node-releases@2.0.19: {} + + normalize-range@0.1.2: {} normalize.css@8.0.1: {} @@ -4946,6 +5093,8 @@ snapshots: dependencies: boolbase: 1.0.0 + nwsapi@2.2.16: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -4969,6 +5118,10 @@ snapshots: dependencies: callsites: 3.1.0 + parse5@7.2.1: + dependencies: + entities: 4.5.0 + path-browserify@1.0.1: {} path-exists@4.0.0: {} @@ -4979,9 +5132,9 @@ snapshots: path-webpack@0.0.3: {} - pathe@2.0.3: {} + pathe@1.1.2: {} - perfect-debounce@1.0.0: {} + pathe@2.0.2: {} picocolors@1.1.1: {} @@ -4989,18 +5142,35 @@ snapshots: picomatch@4.0.3: {} - pinia@3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)): + pinia@2.3.1(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3)): dependencies: - '@vue/devtools-api': 7.7.8 - vue: 3.5.26(typescript@5.9.3) + '@vue/devtools-api': 6.6.4 + vue: 3.5.17(typescript@5.6.3) + vue-demi: 0.14.10(vue@3.5.17(typescript@5.6.3)) optionalDependencies: - typescript: 5.9.3 + typescript: 5.6.3 + transitivePeerDependencies: + - '@vue/composition-api' pkcs7@1.0.4: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.26.7 + + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.2 - postcss-selector-parser@7.1.1: + playwright-core@1.54.1: {} + + playwright@1.54.1: + dependencies: + playwright-core: 1.54.1 + optionalDependencies: + fsevents: 2.3.2 + + postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -5019,9 +5189,9 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.7.4: {} + prettier@3.6.2: {} - pretty-bytes@7.1.0: {} + pretty-bytes@6.1.1: {} process-nextick-args@2.0.1: {} @@ -5035,9 +5205,9 @@ snapshots: punycode@2.3.1: {} - qrcode.vue@3.6.0(vue@3.5.26(typescript@5.9.3)): + qrcode.vue@3.6.0(vue@3.5.17(typescript@5.6.3)): dependencies: - vue: 3.5.26(typescript@5.9.3) + vue: 3.5.17(typescript@5.6.3) querystringify@2.2.0: {} @@ -5053,7 +5223,7 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - regenerate-unicode-properties@10.2.2: + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 @@ -5061,77 +5231,89 @@ snapshots: regenerator-runtime@0.14.1: {} - regexpu-core@6.4.0: + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.26.0 + + regexpu-core@6.2.0: dependencies: regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.2 + regenerate-unicode-properties: 10.2.0 regjsgen: 0.8.0 - regjsparser: 0.13.0 + regjsparser: 0.12.0 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.1 + unicode-match-property-value-ecmascript: 2.2.0 regjsgen@0.8.0: {} - regjsparser@0.13.0: + regjsparser@0.12.0: dependencies: - jsesc: 3.1.0 + jsesc: 3.0.2 + + require-directory@2.1.1: {} requires-port@1.0.0: {} resolve-from@4.0.0: {} - resolve@1.22.11: + resolve@1.22.8: dependencies: - is-core-module: 2.16.1 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 retry@0.12.0: {} - reusify@1.1.0: {} - - rfdc@1.4.1: {} + reusify@1.0.4: {} - rollup@4.55.1: + rollup@4.50.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.55.1 - '@rollup/rollup-android-arm64': 4.55.1 - '@rollup/rollup-darwin-arm64': 4.55.1 - '@rollup/rollup-darwin-x64': 4.55.1 - '@rollup/rollup-freebsd-arm64': 4.55.1 - '@rollup/rollup-freebsd-x64': 4.55.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.55.1 - '@rollup/rollup-linux-arm-musleabihf': 4.55.1 - '@rollup/rollup-linux-arm64-gnu': 4.55.1 - '@rollup/rollup-linux-arm64-musl': 4.55.1 - '@rollup/rollup-linux-loong64-gnu': 4.55.1 - '@rollup/rollup-linux-loong64-musl': 4.55.1 - '@rollup/rollup-linux-ppc64-gnu': 4.55.1 - '@rollup/rollup-linux-ppc64-musl': 4.55.1 - '@rollup/rollup-linux-riscv64-gnu': 4.55.1 - '@rollup/rollup-linux-riscv64-musl': 4.55.1 - '@rollup/rollup-linux-s390x-gnu': 4.55.1 - '@rollup/rollup-linux-x64-gnu': 4.55.1 - '@rollup/rollup-linux-x64-musl': 4.55.1 - '@rollup/rollup-openbsd-x64': 4.55.1 - '@rollup/rollup-openharmony-arm64': 4.55.1 - '@rollup/rollup-win32-arm64-msvc': 4.55.1 - '@rollup/rollup-win32-ia32-msvc': 4.55.1 - '@rollup/rollup-win32-x64-gnu': 4.55.1 - '@rollup/rollup-win32-x64-msvc': 4.55.1 + '@rollup/rollup-android-arm-eabi': 4.50.1 + '@rollup/rollup-android-arm64': 4.50.1 + '@rollup/rollup-darwin-arm64': 4.50.1 + '@rollup/rollup-darwin-x64': 4.50.1 + '@rollup/rollup-freebsd-arm64': 4.50.1 + '@rollup/rollup-freebsd-x64': 4.50.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.50.1 + '@rollup/rollup-linux-arm-musleabihf': 4.50.1 + '@rollup/rollup-linux-arm64-gnu': 4.50.1 + '@rollup/rollup-linux-arm64-musl': 4.50.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.50.1 + '@rollup/rollup-linux-ppc64-gnu': 4.50.1 + '@rollup/rollup-linux-riscv64-gnu': 4.50.1 + '@rollup/rollup-linux-riscv64-musl': 4.50.1 + '@rollup/rollup-linux-s390x-gnu': 4.50.1 + '@rollup/rollup-linux-x64-gnu': 4.50.1 + '@rollup/rollup-linux-x64-musl': 4.50.1 + '@rollup/rollup-openharmony-arm64': 4.50.1 + '@rollup/rollup-win32-arm64-msvc': 4.50.1 + '@rollup/rollup-win32-ia32-msvc': 4.50.1 + '@rollup/rollup-win32-x64-msvc': 4.50.1 fsevents: 2.3.3 + rrweb-cssom@0.8.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + safe-buffer@5.1.2: {} + safer-buffer@2.1.2: {} + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + semver@6.3.1: {} - semver@7.7.3: {} + semver@7.6.3: {} setimmediate@1.0.5: {} @@ -5141,6 +5323,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.2: {} + signal-exit@3.0.7: {} source-map-js@1.2.1: {} @@ -5152,38 +5336,48 @@ snapshots: source-map@0.6.1: {} - speakingurl@14.0.1: {} + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + strip-json-comments@3.1.1: {} - superjson@2.2.5: + supports-color@7.2.0: dependencies: - copy-anything: 4.0.5 + has-flag: 4.0.0 - supports-color@7.2.0: + supports-color@8.1.1: dependencies: has-flag: 4.0.0 supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.11.11: + symbol-tree@3.2.4: {} + + synckit@0.11.8: dependencies: - '@pkgr/core': 0.2.9 + '@pkgr/core': 0.2.7 systemjs@6.15.1: {} - tabbable@6.4.0: {} + tabbable@6.2.0: {} tar-mini@0.2.0: {} - terser@5.44.1: + terser@5.43.1: dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -5192,20 +5386,42 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 + tldts-core@6.1.74: {} + + tldts@6.1.74: + dependencies: + tldts-core: 6.1.74 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - ts-api-utils@2.4.0(typescript@5.9.3): + tough-cookie@5.1.2: + dependencies: + tldts: 6.1.74 + + tr46@5.1.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-api-utils@2.0.0(typescript@5.6.3): dependencies: - typescript: 5.9.3 + 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: dependencies: buffer-from: 1.1.2 combine-errors: 3.0.3 is-stream: 2.0.1 - js-base64: 3.7.8 + js-base64: 3.7.7 lodash.throttle: 4.1.1 proper-lockfile: 4.1.2 url-parse: 1.5.10 @@ -5214,50 +5430,52 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@0.20.2: {} + type@2.7.3: {} - typescript-eslint@8.37.0(eslint@9.39.2)(typescript@5.9.3): + typescript-eslint@8.37.0(eslint@9.31.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/parser': 8.37.0(eslint@9.39.2)(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.37.0(eslint@9.39.2)(typescript@5.9.3) - eslint: 9.39.2 - typescript: 5.9.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) + '@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 - typescript@5.9.3: {} + typescript@5.6.3: {} - undici-types@7.16.0: {} + ufo@1.5.4: {} + + undici-types@6.20.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.2.0 + unicode-property-aliases-ecmascript: 2.1.0 - unicode-match-property-value-ecmascript@2.2.1: {} + unicode-match-property-value-ecmascript@2.2.0: {} - unicode-property-aliases-ecmascript@2.2.0: {} + unicode-property-aliases-ecmascript@2.1.0: {} - unplugin@2.3.11: + unplugin@1.16.1: dependencies: - '@jridgewell/remapping': 2.3.5 - acorn: 8.15.0 - picomatch: 4.0.3 + acorn: 8.14.0 webpack-virtual-modules: 0.6.2 - update-browserslist-db@1.1.4(browserslist@4.28.0): + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: - browserslist: 4.28.0 + browserslist: 4.24.2 escalade: 3.2.0 picocolors: 1.1.1 - update-browserslist-db@1.2.2(browserslist@4.28.1): + update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: - browserslist: 4.28.1 + browserslist: 4.25.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -5276,10 +5494,10 @@ snapshots: util-deprecate@1.0.2: {} - video.js@8.23.4: + video.js@8.23.3: dependencies: - '@babel/runtime': 7.28.4 - '@videojs/http-streaming': 3.17.2(video.js@8.23.4) + '@babel/runtime': 7.26.7 + '@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 @@ -5287,125 +5505,189 @@ 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.23.4) + 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.23.4): + videojs-contrib-quality-levels@4.1.0(video.js@8.23.3): dependencies: global: 4.4.0 - video.js: 8.23.4 + video.js: 8.23.3 videojs-font@4.2.0: {} videojs-hotkeys@0.2.30: {} - videojs-mobile-ui@1.1.3(video.js@8.23.4): + videojs-mobile-ui@1.1.1(video.js@8.23.3): dependencies: global: 4.4.0 - video.js: 8.23.4 + video.js: 8.23.3 videojs-vtt.js@0.15.5: dependencies: global: 4.4.0 - vite-plugin-compression2@2.4.0(rollup@4.55.1): + vite-plugin-compression2@1.3.3(rollup@4.50.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.55.1) + '@rollup/pluginutils': 5.1.3(rollup@4.50.1) tar-mini: 0.2.0 + vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) transitivePeerDependencies: - rollup - vite@7.3.1(@types/node@24.10.6)(terser@5.44.1)(yaml@2.8.2): + vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0): dependencies: - esbuild: 0.27.2 + esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.55.1 + rollup: 4.50.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.6 + '@types/node': 22.10.10 fsevents: 2.3.3 - terser: 5.44.1 - yaml: 2.8.2 + terser: 5.43.1 + yaml: 2.7.0 - vscode-uri@3.1.0: {} + vscode-uri@3.0.8: {} - vue-eslint-parser@10.2.0(eslint@9.39.2): + vue-demi@0.14.10(vue@3.5.17(typescript@5.6.3)): dependencies: - debug: 4.4.3 - eslint: 9.39.2 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + vue: 3.5.17(typescript@5.6.3) + + 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.31.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.6.0 - semver: 7.7.3 + lodash: 4.17.21 + semver: 7.6.3 transitivePeerDependencies: - supports-color - vue-final-modal@4.5.5(@vueuse/core@14.1.0(vue@3.5.26(typescript@5.9.3)))(@vueuse/integrations@14.1.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(vue@3.5.26(typescript@5.9.3)))(focus-trap@7.6.2)(vue@3.5.26(typescript@5.9.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': 14.1.0(vue@3.5.26(typescript@5.9.3)) - '@vueuse/integrations': 14.1.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(vue@3.5.26(typescript@5.9.3)) + '@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.26(typescript@5.9.3) + vue: 3.5.17(typescript@5.6.3) - vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)): + vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)): dependencies: - '@intlify/core-base': 11.2.8 - '@intlify/shared': 11.2.8 + '@intlify/core-base': 11.1.10 + '@intlify/shared': 11.1.10 '@vue/devtools-api': 6.6.4 - vue: 3.5.26(typescript@5.9.3) + vue: 3.5.17(typescript@5.6.3) vue-lazyload@3.0.0: {} - vue-reader@1.3.4: + vue-reader@1.2.17(vue@3.5.17(typescript@5.6.3)): dependencies: epubjs: 0.3.93 + vue: 3.5.17(typescript@5.6.3) + vue-demi: 0.14.10(vue@3.5.17(typescript@5.6.3)) - vue-router@4.6.4(vue@3.5.26(typescript@5.9.3)): + vue-router@4.5.1(vue@3.5.17(typescript@5.6.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.26(typescript@5.9.3) + vue: 3.5.17(typescript@5.6.3) - vue-toastification@2.0.0-rc.5(vue@3.5.26(typescript@5.9.3)): + vue-toastification@2.0.0-rc.5(vue@3.5.17(typescript@5.6.3)): dependencies: - vue: 3.5.26(typescript@5.9.3) + vue: 3.5.17(typescript@5.6.3) - vue-tsc@3.2.2(typescript@5.9.3): + vue-tsc@2.2.0(typescript@5.6.3): dependencies: - '@volar/typescript': 2.4.27 - '@vue/language-core': 3.2.2 - typescript: 5.9.3 + '@volar/typescript': 2.4.11 + '@vue/language-core': 2.2.0(typescript@5.6.3) + typescript: 5.6.3 - vue@3.5.26(typescript@5.9.3): + vue@3.5.17(typescript@5.6.3): dependencies: - '@vue/compiler-dom': 3.5.26 - '@vue/compiler-sfc': 3.5.26 - '@vue/runtime-dom': 3.5.26 - '@vue/server-renderer': 3.5.26(vue@3.5.26(typescript@5.9.3)) - '@vue/shared': 3.5.26 + '@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.9.3 + typescript: 5.6.3 + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + webidl-conversions@7.0.0: {} webpack-virtual-modules@0.6.2: {} + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@4.0.0: {} + + whatwg-url@14.2.0: + dependencies: + tr46: 5.1.1 + webidl-conversions: 7.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 word-wrap@1.2.5: {} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + ws@8.18.0: {} + xml-name-validator@4.0.0: {} + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + y18n@5.0.8: {} + yallist@3.1.1: {} - yaml-eslint-parser@1.3.2: + yaml-eslint-parser@1.2.3: dependencies: eslint-visitor-keys: 3.4.3 - yaml: 2.8.2 + lodash: 4.17.21 + yaml: 2.7.0 - yaml@2.8.2: {} + yaml@2.7.0: {} + + yargs-parser@21.1.1: {} + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 yocto-queue@0.1.0: {} diff --git a/frontend/public/img/logo.svg b/frontend/public/img/logo.svg index dac88ae274..5e78eccff1 100644 --- a/frontend/public/img/logo.svg +++ b/frontend/public/img/logo.svg @@ -1 +1,147 @@ - \ No newline at end of file + +image/svg+xml + + + + + \ No newline at end of file diff --git a/frontend/public/index.html b/frontend/public/index.html index 15ff375ec7..4675b268f9 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -18,17 +18,9 @@ - + - + diff --git a/frontend/src/api/pub.ts b/frontend/src/api/pub.ts index 5070cae37f..964cb030d8 100644 --- a/frontend/src/api/pub.ts +++ b/frontend/src/api/pub.ts @@ -41,12 +41,12 @@ export function download( let url = `${baseURL}/api/public/dl/${hash}`; if (files.length === 1) { - url += files[0] + "?"; + url += encodeURIComponent(files[0]) + "?"; } else { let arg = ""; for (const file of files) { - arg += file + ","; + arg += encodeURIComponent(file) + ","; } arg = arg.substring(0, arg.length - 1); diff --git a/frontend/src/api/search.ts b/frontend/src/api/search.ts index 63cbdaa133..6fa02d06d2 100644 --- a/frontend/src/api/search.ts +++ b/frontend/src/api/search.ts @@ -1,12 +1,7 @@ -import { fetchURL, removePrefix, StatusError } from "./utils"; +import { fetchURL, removePrefix } from "./utils"; import url from "../utils/url"; -export default async function search( - base: string, - query: string, - signal: AbortSignal, - callback: (item: ResourceItem) => void -) { +export default async function search(base: string, query: string) { base = removePrefix(base); query = encodeURIComponent(query); @@ -14,60 +9,19 @@ export default async function search( base += "/"; } - const res = await fetchURL(`/api/search${base}?query=${query}`, { signal }); - if (!res.body) { - throw new StatusError("000 No connection", 0); - } - try { - // Try streaming approach first (modern browsers) - if (res.body && typeof res.body.pipeThrough === "function") { - const reader = res.body.pipeThrough(new TextDecoderStream()).getReader(); - let buffer = ""; - while (true) { - const { done, value } = await reader.read(); - if (value) { - buffer += value; - } - const lines = buffer.split(/\n/); - let lastLine = lines.pop(); - // Save incomplete last line - if (!lastLine) { - lastLine = ""; - } - buffer = lastLine; + const res = await fetchURL(`/api/search${base}?query=${query}`, {}); - for (const line of lines) { - if (line) { - const item = JSON.parse(line) as ResourceItem; - item.url = `/files${base}` + url.encodePath(item.path); - if (item.isDir) { - item.url += "/"; - } - callback(item); - } - } - if (done) break; - } - } else { - // Fallback for browsers without streaming support (e.g., Safari) - const text = await res.text(); - const lines = text.split(/\n/); - for (const line of lines) { - if (line) { - const item = JSON.parse(line) as ResourceItem; - item.url = `/files${base}` + url.encodePath(item.path); - if (item.isDir) { - item.url += "/"; - } - callback(item); - } - } - } - } catch (e) { - // Check if the error is an intentional cancellation - if (e instanceof Error && e.name === "AbortError") { - throw new StatusError("000 No connection", 0, true); + let data = await res.json(); + + data = data.map((item: ResourceItem & { dir: boolean }) => { + item.url = `/files${base}` + url.encodePath(item.path); + + if (item.dir) { + item.url += "/"; } - throw e; - } + + return item; + }); + + return data; } diff --git a/frontend/src/api/users.ts b/frontend/src/api/users.ts index 56e1d0f323..78096b4999 100644 --- a/frontend/src/api/users.ts +++ b/frontend/src/api/users.ts @@ -8,13 +8,12 @@ export async function get(id: number) { return fetchJSON(`/api/users/${id}`, {}); } -export async function create(user: IUser, currentPassword: string) { +export async function create(user: IUser) { const res = await fetchURL(`/api/users`, { method: "POST", body: JSON.stringify({ what: "user", which: [], - current_password: currentPassword, data: user, }), }); @@ -26,17 +25,12 @@ export async function create(user: IUser, currentPassword: string) { throw new StatusError(await res.text(), res.status); } -export async function update( - user: Partial, - which = ["all"], - currentPassword: string | null = null -) { +export async function update(user: Partial, which = ["all"]) { await fetchURL(`/api/users/${user.id}`, { method: "PUT", body: JSON.stringify({ what: "user", which: which, - ...(currentPassword != null ? { current_password: currentPassword } : {}), data: user, }), }); diff --git a/frontend/src/api/utils.ts b/frontend/src/api/utils.ts index f21fbe38d7..ae509de28d 100644 --- a/frontend/src/api/utils.ts +++ b/frontend/src/api/utils.ts @@ -91,21 +91,3 @@ export function createURL(endpoint: string, searchParams = {}): string { return url.toString(); } - -export function setSafeTimeout(callback: () => void, delay: number): number { - const MAX_DELAY = 86_400_000; - let remaining = delay; - - function scheduleNext(): number { - if (remaining <= MAX_DELAY) { - return window.setTimeout(callback, remaining); - } else { - return window.setTimeout(() => { - remaining -= MAX_DELAY; - scheduleNext(); - }, MAX_DELAY); - } - } - - return scheduleNext(); -} diff --git a/frontend/src/components/ContextMenu.vue b/frontend/src/components/ContextMenu.vue deleted file mode 100644 index 14663fd9b5..0000000000 --- a/frontend/src/components/ContextMenu.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - diff --git a/frontend/src/components/Search.vue b/frontend/src/components/Search.vue index 57d5ba0d82..08b40e3e7f 100644 --- a/frontend/src/components/Search.vue +++ b/frontend/src/components/Search.vue @@ -5,11 +5,10 @@ v-if="active" class="action" @click="close" - :aria-label="closeButtonTitle" - :title="closeButtonTitle" + :aria-label="$t('buttons.close')" + :title="$t('buttons.close')" > - stop_circle - arrow_back + arrow_back search - autorenew - - - {{ results.length }} -
@@ -67,6 +57,9 @@
+

+ autorenew +

@@ -77,11 +70,10 @@ import { useLayoutStore } from "@/stores/layout"; import url from "@/utils/url"; import { search } from "@/api"; -import { computed, inject, onMounted, ref, watch, onUnmounted } from "vue"; +import { computed, inject, onMounted, ref, watch } from "vue"; import { useI18n } from "vue-i18n"; import { useRoute } from "vue-router"; import { storeToRefs } from "pinia"; -import { StatusError } from "@/api/utils"; const boxes = { image: { label: "images", icon: "insert_photo" }, @@ -92,7 +84,6 @@ const boxes = { const layoutStore = useLayoutStore(); const fileStore = useFileStore(); -let searchAbortController = new AbortController(); const { currentPromptName } = storeToRefs(layoutStore); @@ -133,7 +124,9 @@ watch(currentPromptName, (newVal, oldVal) => { }); watch(prompt, () => { - reset(); + if (results.value.length) { + reset(); + } }); // ...mapState(useFileStore, ["isListing"]), @@ -156,10 +149,6 @@ const filteredResults = computed(() => { return results.value.slice(0, resultsCount.value); }); -const closeButtonTitle = computed(() => { - return ongoing.value ? t("buttons.stopSearch") : t("buttons.close"); -}); - onMounted(() => { if (result.value === null) { return; @@ -175,23 +164,14 @@ onMounted(() => { }); }); -onUnmounted(() => { - abortLastSearch(); -}); - const open = () => { !active.value && layoutStore.showHover("search"); }; const close = (event: Event) => { - if (ongoing.value) { - abortLastSearch(); - ongoing.value = false; - } else { - event.stopPropagation(); - event.preventDefault(); - layoutStore.closeHovers(); - } + event.stopPropagation(); + event.preventDefault(); + layoutStore.closeHovers(); }; const keyup = (event: KeyboardEvent) => { @@ -208,16 +188,11 @@ const init = (string: string) => { }; const reset = () => { - abortLastSearch(); ongoing.value = false; resultsCount.value = 50; results.value = []; }; -const abortLastSearch = () => { - searchAbortController.abort(); -}; - const submit = async (event: Event) => { event.preventDefault(); @@ -233,16 +208,8 @@ const submit = async (event: Event) => { ongoing.value = true; try { - abortLastSearch(); - searchAbortController = new AbortController(); - results.value = []; - await search(path, prompt.value, searchAbortController.signal, (item) => - results.value.push(item) - ); + results.value = await search(path, prompt.value); } catch (error: any) { - if (error instanceof StatusError && error.is_canceled) { - return; - } $showError(error); } diff --git a/frontend/src/components/Sidebar.vue b/frontend/src/components/Sidebar.vue index 90c5001112..7d1a7847cf 100644 --- a/frontend/src/components/Sidebar.vue +++ b/frontend/src/components/Sidebar.vue @@ -89,7 +89,6 @@ diff --git a/frontend/src/components/settings/Languages.vue b/frontend/src/components/settings/Languages.vue index 729685116d..f17ab8e246 100644 --- a/frontend/src/components/settings/Languages.vue +++ b/frontend/src/components/settings/Languages.vue @@ -15,8 +15,9 @@ export default { data() { const dataObj = {}; const locales = { + he: "עברית", + hu: "Magyar", ar: "العربية", - bg: "български език", ca: "Català", cs: "Čeština", de: "Deutsch", @@ -24,18 +25,15 @@ export default { en: "English", es: "Español", fr: "Français", - he: "עברית", - hr: "Hrvatski", - hu: "Magyar", is: "Icelandic", it: "Italiano", ja: "日本語", ko: "한국어", - no: "Norsk", "nl-be": "Dutch (Belgium)", + no: "Norsk", pl: "Polski", - "pt-br": "Português (Brasil)", - pt: "Português (Portugal)", + "pt-br": "Português", + pt: "Português (Brasil)", ro: "Romanian", ru: "Русский", sk: "Slovenčina", diff --git a/frontend/src/css/context-menu.css b/frontend/src/css/context-menu.css deleted file mode 100644 index d0741d16ce..0000000000 --- a/frontend/src/css/context-menu.css +++ /dev/null @@ -1,21 +0,0 @@ -.context-menu { - position: absolute; - background: var(--surfacePrimary); - min-width: 180px; - max-width: 220px; - border: 1px solid var(--borderSecondary); - box-shadow: 0 2px 4px var(--borderPrimary); - z-index: 999; -} - -.context-menu .action { - display: block; - width: 100%; - border-radius: 0; - display: flex; - align-items: center; -} - -.context-menu .action .counter { - left: 1.75em; -} diff --git a/frontend/src/css/fonts.css b/frontend/src/css/fonts.css index fdad54b955..2e65cff6d9 100644 --- a/frontend/src/css/fonts.css +++ b/frontend/src/css/fonts.css @@ -63,8 +63,8 @@ local("Roboto"), local("Roboto-Regular"), url(../assets/fonts/roboto/normal-latin-ext.woff2) format("woff2"); - unicode-range: - U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, + U+2C60-2C7F, U+A720-A7FF; } @font-face { @@ -75,9 +75,8 @@ local("Roboto"), local("Roboto-Regular"), url(../assets/fonts/roboto/normal-latin.woff2) format("woff2"); - unicode-range: - U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, - U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, + U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; } @font-face { @@ -143,8 +142,8 @@ local("Roboto Medium"), local("Roboto-Medium"), url(../assets/fonts/roboto/medium-latin-ext.woff2) format("woff2"); - unicode-range: - U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, + U+2C60-2C7F, U+A720-A7FF; } @font-face { @@ -155,9 +154,8 @@ local("Roboto Medium"), local("Roboto-Medium"), url(../assets/fonts/roboto/medium-latin.woff2) format("woff2"); - unicode-range: - U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, - U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, + U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; } @font-face { @@ -223,8 +221,8 @@ local("Roboto Bold"), local("Roboto-Bold"), url(../assets/fonts/roboto/bold-latin-ext.woff2) format("woff2"); - unicode-range: - U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, + U+2C60-2C7F, U+A720-A7FF; } @font-face { @@ -235,9 +233,8 @@ local("Roboto Bold"), local("Roboto-Bold"), url(../assets/fonts/roboto/bold-latin.woff2) format("woff2"); - unicode-range: - U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, - U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, + U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; } .material-icons { diff --git a/frontend/src/css/listing.css b/frontend/src/css/listing.css index a6cd51aeb5..fa380c9588 100644 --- a/frontend/src/css/listing.css +++ b/frontend/src/css/listing.css @@ -336,3 +336,23 @@ html[dir="rtl"] #listing { left: .9em; bottom: .4em; } + +#context-menu { + position: absolute; + z-index: 10; +} + +#context-menu >p { + margin: 0; +} + +#context-menu .action { + border-radius: 0; + width: 100%; + min-width: max-content; + padding-right: .8em; +} + +#context-menu .action > * { + vertical-align: middle; +} diff --git a/frontend/src/css/login.css b/frontend/src/css/login.css index 62150ee6e8..14bfd1a53b 100644 --- a/frontend/src/css/login.css +++ b/frontend/src/css/login.css @@ -45,15 +45,6 @@ animation: 0.2s opac forwards; } -#login .logout-message { - background: var(--icon-orange); - color: #fff; - padding: 0.5em; - text-align: center; - animation: 0.2s opac forwards; - text-transform: none; -} - @keyframes opac { 0% { opacity: 0; diff --git a/frontend/src/css/mdPreview.css b/frontend/src/css/mdPreview.css index 7d6cab86ba..bf2863f68c 100644 --- a/frontend/src/css/mdPreview.css +++ b/frontend/src/css/mdPreview.css @@ -1,4 +1,6 @@ .md_preview { + overflow-y: auto; + max-height: 80vh; padding: 1rem; border: 1px solid #000; font-size: 20px; @@ -7,5 +9,5 @@ #preview-container { overflow: auto; - flex: 1; + max-height: 80vh; /* Match the max-height of md_preview for scrolling */ } diff --git a/frontend/src/css/styles.css b/frontend/src/css/styles.css index 5ac7d8d516..a793b0250b 100644 --- a/frontend/src/css/styles.css +++ b/frontend/src/css/styles.css @@ -17,7 +17,6 @@ @import "./mobile.css"; @import "./epubReader.css"; @import "./mdPreview.css"; -@import "./context-menu.css"; /* For testing only :focus { @@ -98,8 +97,7 @@ main .spinner .bounce2 { position: relative; } -.action.disabled, -.action[disabled] { +.action.disabled { opacity: 0.2; cursor: not-allowed; } diff --git a/frontend/src/i18n/bg.json b/frontend/src/i18n/bg.json deleted file mode 100644 index afbd8a9c55..0000000000 --- a/frontend/src/i18n/bg.json +++ /dev/null @@ -1,287 +0,0 @@ -{ - "buttons": { - "cancel": "Отмени", - "clear": "Изчисти", - "close": "Затвори", - "continue": "Продължи", - "copy": "Копирай", - "copyFile": "Копирай файл", - "copyToClipboard": "Копирай в клипборда", - "copyDownloadLinkToClipboard": "Копирай линк за сваляне в клипборда", - "create": "Създай", - "delete": "Изтрий", - "download": "Свали", - "file": "Файл", - "folder": "Папка", - "fullScreen": "Превключване на цял екран", - "hideDotfiles": "Скрий файлове започващи с точка", - "info": "Информация", - "more": "Повече", - "move": "Премести", - "moveFile": "Премести файл", - "new": "Нов", - "next": "Следващ", - "ok": "Потвърди", - "permalink": "Вземи постоянен линк", - "previous": "Предишен", - "preview": "Преглед", - "publish": "Публикуване", - "rename": "Преименуване", - "replace": "Замяна", - "reportIssue": "Докладвай проблем", - "save": "Запис", - "schedule": "График", - "search": "Търсене", - "select": "Избери", - "selectMultiple": "Избери няколко", - "share": "Сподели", - "shell": "Превключване на терминала", - "submit": "Изпрати", - "switchView": "Смени изгледа", - "toggleSidebar": "Превключване на страничен панел", - "update": "Обнови", - "upload": "Качи", - "openFile": "Отвори файл", - "discardChanges": "Изчисти", - "stopSearch": "Stop searching", - "saveChanges": "Запиши промените", - "editAsText": "Edit as Text", - "increaseFontSize": "Increase font size", - "decreaseFontSize": "Decrease font size" - }, - "download": { - "downloadFile": "Свали файл", - "downloadFolder": "Свали папка", - "downloadSelected": "Свали избраното" - }, - "upload": { - "abortUpload": "Сигурни ли сте, че искате да прекратите?" - }, - "errors": { - "forbidden": "Нямате право на достъп.", - "internal": "Взникна грешка.", - "notFound": "Локацията не може да бъде достигната.", - "connection": "Сървъра не може да бъде достигнат." - }, - "files": { - "body": "Тяло", - "closePreview": "Затвори прегледа", - "files": "Файлове", - "folders": "Папки", - "home": "Начало", - "lastModified": "Последна промяна", - "loading": "Зареждане ...", - "lonely": "Тук е самотно ...", - "metadata": "Метаданни", - "multipleSelectionEnabled": "Множествения избор е разрешен", - "name": "Име", - "size": "Размер", - "sortByLastModified": "Подредба по последна промяна", - "sortByName": "Подредба по име", - "sortBySize": "Подредба по размер", - "noPreview": "За този файл не е наличен преглед.", - "csvTooLarge": "CSV file is too large for preview (>5MB). Please download to view.", - "csvLoadFailed": "Failed to load CSV file.", - "showingRows": "Showing {count} row(s)", - "columnSeparator": "Column Separator", - "csvSeparators": { - "comma": "Comma (,)", - "semicolon": "Semicolon (;)", - "both": "Both (,) and (;)" - } - }, - "help": { - "click": "избери файл или директория", - "ctrl": { - "click": "избери файлове или директории", - "f": "отваря търсене", - "s": "запиши файл или свари директория тук" - }, - "del": "изтрий избраните", - "doubleClick": "отвори файл или директория", - "esc": "изтрий избраното и/или затвори", - "f1": "тази информация", - "f2": "преименувай файл", - "help": "Помощ" - }, - "login": { - "createAnAccount": "Създай акаунт", - "loginInstead": "Вече имаш акаунт", - "password": "Парола", - "passwordConfirm": "Парола Потвърждение", - "passwordsDontMatch": "Паролите не съвпадат", - "signup": "Абониране", - "submit": "Вход", - "username": "Потребителско име", - "usernameTaken": "Потребителското име вече се използва", - "wrongCredentials": "Грешни потребителско име и/или парола", - "passwordTooShort": "Password must be at least {min} characters", - "logout_reasons": { - "inactivity": "Бяхте разлогнати поради неактивност" - } - }, - "permanent": "Постоянен", - "prompts": { - "copy": "Копирай", - "copyMessage": "Избери къде да копираш файловете си:", - "currentlyNavigating": "В момента навигира към:", - "deleteMessageMultiple": "Сигурни ли сте, че искате да изтриете {count} файл(а)?", - "deleteMessageSingle": "Сигурни ли сте, че искате да изтриете този файл/папка?", - "deleteMessageShare": "Сигурни ли сте, че искате на изтриете това споделяне({path})?", - "deleteUser": "Сигурни ли сте, че искате да изтриете този потребител?", - "deleteTitle": "Изтрий файлове", - "displayName": "Име за показване:", - "download": "Свали файлове", - "downloadMessage": "Изберете формата, в който искате да свалите.", - "error": "Възникна грешка", - "fileInfo": "Информация за файла", - "filesSelected": "Избрани са {count} файла.", - "lastModified": "Последна промяна", - "move": "Премести", - "moveMessage": "Избери ново място за вашите файл(ове)/папк(а/и):", - "newArchetype": "Създай нова публикация базирана на шаблон. Вашия файл ще бъде създаден в папката за съдържание.", - "newDir": "Нова директория", - "newDirMessage": "Именувайте вашата нова директория.", - "newFile": "Нов файл", - "newFileMessage": "Именувайте вашия нов файл.", - "numberDirs": "Брой на директорийте", - "numberFiles": "Брой на файловете", - "rename": "Преименувай", - "renameMessage": "Вмъкни ново име за", - "replace": "Замени", - "replaceMessage": "Файл, които се опитвате да качите има конфликтно име. Искате ли да го пропуснете и да продължите качването или да замените съществуващия файл?\n", - "schedule": "График", - "scheduleMessage": "Изберете дата и час за публикуване на тази публикация.", - "show": "Покажи", - "size": "Размер", - "upload": "Качване", - "uploadFiles": "Качване на {files} файла...", - "uploadMessage": "Изберете опция за качване.", - "optionalPassword": "Опционална парола", - "resolution": "Резолюция", - "discardEditorChanges": "Сигурни ли сте, че искате да откажете направените промени?" - }, - "search": { - "images": "Изображения", - "music": "Музика", - "pdf": "PDF", - "pressToSearch": "За търсене, натиснете Enter ...", - "search": "Търсене ...", - "typeToSearch": "Пишете за търсене ...", - "types": "Типове", - "video": "Видео" - }, - "settings": { - "aceEditorTheme": "Тема на \"Ace редактор\"", - "admin": "Админ", - "administrator": "Администратор", - "allowCommands": "Изпълни команди", - "allowEdit": "Редактира, преименува и изтрива файлове и директории", - "allowNew": "Създава нови файлове и директорий", - "allowPublish": "Публикува нови публикации и страници", - "allowSignup": "Разреши потребителите да се абонират", - "hideLoginButton": "Скрий логин бутона от публичните страници", - "avoidChanges": "(остави празно за да избегнеш промени)", - "branding": "Брандиране", - "brandingDirectoryPath": "Брандиране - път до директория", - "brandingHelp": "Можете да настроите как изглежда вашия File Browser, като промените името и логото му, да добавите стилове и дори да забраните външни линкове към GitHub.\nЗа повече информация за бандиране се обърнете към {0}", - "changePassword": "Промени парола", - "commandRunner": "Изпълнение на команди", - "commandRunnerHelp": "Тук можете да зададете команди, които да се изпълнят при определени събития. Пишете по една команда на ред. Системните променливите {0} и {1} ще са на разположение, като {0} е релативна на {1}. За повече информация относно тази възможност и наличните системни променливи, моля прочетете {2}.", - "commandsUpdated": "Командите са запаметени!", - "createUserDir": "Създай автоматично собствена директория на потребителя, когато го добавяш.", - "minimumPasswordLength": "Минимална дължина на паролата", - "tusUploads": "Качване на части", - "tusUploadsHelp": "File Browser поддържа качване на части, което позволява съзадавнето на ефективно, надеждно, и възобновяемо качване на части дори и при ненадеждна мрежа.", - "tusUploadsChunkSize": "Максимален размер на заявката (за малки качвания ще бъдат използвано директо качване). Можете да въведете цяло число, което означава размера на данните в байтове, или пък текст от вида на 10MB, 1GB и т.н..", - "tusUploadsRetryCount": "Брой повторения, когато част от файл не се качи успешно.", - "userHomeBasePath": "Основен път до личните директории на потребителите", - "userScopeGenerationPlaceholder": "Обхватът ще бъде автоматично генериран", - "createUserHomeDirectory": "Създай лична директория на потребителя", - "customStylesheet": "Потребителски Стилове", - "defaultUserDescription": "Настройки по подразбиране за нови потребители.", - "disableExternalLinks": "Забрани външните връзки (с изключение на документацията)", - "disableUsedDiskPercentage": "Забрани графиката за използване на диска", - "documentation": "документация", - "examples": "Примери", - "executeOnShell": "Изпълни в шела", - "executeOnShellDescription": "По подразбиране, File Browser изпълнява командите директно. Ако искате да ги изпълните в сесия (като Bash или PowerShell), можете да я дефинирате тук заедно с необходимите аргументи и флагове. Ако това е зададено, командата която изпълните ще бъде добавена като аргумент. Това се отнася както за потребителски команди, така и за обработка на събития.", - "globalRules": "Това е общия списък от правила за разрешения или забрани. Те са приложими за всеки потребител. Можете да дефинирате специфични правила в настройките на всеки потребител, които ще имат приоритет над общите.", - "globalSettings": "Глобални Настройки", - "hideDotfiles": "Скрий фаловете започващи с точка", - "insertPath": "Вмъкни пътя", - "insertRegex": "Вмъкни регулярен израз", - "instanceName": "Име на инстанцията", - "language": "Език", - "lockPassword": "Забрани на потребителя да променя паролата", - "newPassword": "Вашата нова парола", - "newPasswordConfirm": "Потвърди вашата нова парола", - "newUser": "Нов потребител", - "password": "Парола", - "passwordUpdated": "Паролата е променена!", - "path": "Път", - "perm": { - "create": "Създаване на файлове и директорий", - "delete": "Изтриване на файлове и директорий", - "download": "Сваляне", - "execute": "Изпълни команди", - "modify": "Редактирай файлове", - "rename": "Преименувай или премести файлове и директорий", - "share": "Сподели файлове" - }, - "permissions": "Разрешения", - "permissionsHelp": "Можете да зададете потребител да бъде администратор или да изберете разрешения индивидуално. Ако изберете \"Администратор\" всички други опции ще бъдат автоматично отметнати. Управлението на потребителите е привилегия на администратор.\n", - "profileSettings": "Настройки на Профила", - "ruleExample1": "предотвратете достъпа до всеки файл започващ с точка (като .git, .gitignore) във всяка папка.\n", - "ruleExample2": "блокира достъпа до файл именуван Caddyfile поставен в началото за обхвата.", - "rules": "Правила", - "rulesHelp": "Тук можете да дефинирате списък от правила за разрешаване и забрана за точно този потребител. Блокираните файлове няма да се покажат в списъците и няма да са достъпни за потребителя. Поддържаме регулярни изрази и пътища релативни на обхвата.\n", - "scope": "Обхват", - "setDateFormat": "Задайте точен формат на дата", - "settingsUpdated": "Настройките са обновени!", - "shareDuration": "Продължителност на споделянето", - "shareManagement": "Управление на споделянето", - "shareDeleted": "Споделянето е премахнато!", - "singleClick": "Използвайте единичен клик за да отворите файлове или директорий", - "themes": { - "default": "Настройки по подразбиране", - "dark": "Тъмна", - "light": "Светла", - "title": "Тема" - }, - "user": "Потребител", - "userCommands": "Команди", - "userCommandsHelp": "Списък разделен с интервал от наличните команди за този потребител.\n", - "userCreated": "Потребителя е създаден!", - "userDefaults": "Настройки по подразбиране на потребителя", - "userDeleted": "Потребителя е изтрит!", - "userManagement": "Управление на потребители", - "userUpdated": "Потребителя е обновен!", - "username": "Потребителско име", - "users": "Потребители", - "currentPassword": "Your Current Password" - }, - "sidebar": { - "help": "Помощ", - "hugoNew": "Hugo New", - "login": "Вход", - "logout": "Изход", - "myFiles": "Моите файлове", - "newFile": "Нов файл", - "newFolder": "Нова папка", - "preview": "Преглед", - "settings": "Настройки", - "signup": "Абониране", - "siteSettings": "Настройки на сървъра" - }, - "success": { - "linkCopied": "Връзката е копирана!" - }, - "time": { - "days": "Дни", - "hours": "Часове", - "minutes": "Минути", - "seconds": "Секунди", - "unit": "Единица за време" - } -} diff --git a/frontend/src/i18n/en_GB.json b/frontend/src/i18n/en_GB.json index 76d9c2cf91..284e803985 100644 --- a/frontend/src/i18n/en_GB.json +++ b/frontend/src/i18n/en_GB.json @@ -47,12 +47,7 @@ "update": "Update", "upload": "Upload", "openFile": "Open file", - "discardChanges": "Discard", - "stopSearch": "Stop searching", - "saveChanges": "Save changes", - "editAsText": "Edit as Text", - "increaseFontSize": "Increase font size", - "decreaseFontSize": "Decrease font size" + "discardChanges": "Discard" }, "download": { "downloadFile": "Download File", @@ -87,20 +82,11 @@ "metadata": "Metadata", "multipleSelectionEnabled": "Multiple selection enabled", "name": "Name", + "noPreview": "Preview is not available for this file.", "size": "Size", "sortByLastModified": "Sort by last modified", "sortByName": "Sort by name", - "sortBySize": "Sort by size", - "noPreview": "Preview is not available for this file.", - "csvTooLarge": "CSV file is too large for preview (>5MB). Please download to view.", - "csvLoadFailed": "Failed to load CSV file.", - "showingRows": "Showing {count} row(s)", - "columnSeparator": "Column Separator", - "csvSeparators": { - "comma": "Comma (,)", - "semicolon": "Semicolon (;)", - "both": "Both (,) and (;)" - } + "sortBySize": "Sort by size" }, "help": { "click": "select file or directory", @@ -126,11 +112,7 @@ "submit": "Login", "username": "Username", "usernameTaken": "Username already taken", - "wrongCredentials": "Wrong credentials", - "passwordTooShort": "Password must be at least {min} characters", - "logout_reasons": { - "inactivity": "You have been logged out due to inactivity." - } + "wrongCredentials": "Wrong credentials" }, "permanent": "Permanent", "prompts": { @@ -207,7 +189,6 @@ "video": "Video" }, "settings": { - "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrator", "allowCommands": "Execute commands", @@ -215,7 +196,6 @@ "allowNew": "Create new files and directories", "allowPublish": "Publish new posts and pages", "allowSignup": "Allow users to signup", - "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(leave blank to avoid changes)", "branding": "Branding", "brandingDirectoryPath": "Branding directory path", @@ -267,7 +247,6 @@ "permissions": "Permissions", "permissionsHelp": "You can set the user to be an administrator or choose the permissions individually. If you select \"Administrator\", all of the other options will be automatically checked. The management of users remains a privilege of an administrator.\n", "profileSettings": "Profile Settings", - "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "prevents the access to any dotfile (such as .git, .gitignore) in every folder.\n", "ruleExample2": "blocks the access to the file named Caddyfile on the root of the scope.", "rules": "Rules", @@ -294,8 +273,7 @@ "userManagement": "User Management", "username": "Username", "users": "Users", - "userUpdated": "User updated!", - "currentPassword": "Your Current Password" + "userUpdated": "User updated!" }, "sidebar": { "help": "Help", diff --git a/frontend/src/i18n/es_CO.json b/frontend/src/i18n/es_CO.json index a71bf171b6..42238a6755 100644 --- a/frontend/src/i18n/es_CO.json +++ b/frontend/src/i18n/es_CO.json @@ -8,7 +8,7 @@ "copy": "Copiar", "copyFile": "Copiar archivo", "copyToClipboard": "Copiar al portapapeles", - "copyDownloadLinkToClipboard": "Copiar enlace de descarga al portapapeles", + "copyDownloadLinkToClipboard": "Copy download link to clipboard", "create": "Crear", "delete": "Borrar", "directorySizes": "Calcular los tamaños del directorio", @@ -47,12 +47,7 @@ "update": "Actualizar", "upload": "Subir", "openFile": "Abrir archivo", - "discardChanges": "Discard", - "stopSearch": "Stop searching", - "saveChanges": "Guardar cambios", - "editAsText": "Edit as Text", - "increaseFontSize": "Increase font size", - "decreaseFontSize": "Decrease font size" + "discardChanges": "Discard" }, "download": { "downloadFile": "Descargar fichero", @@ -87,20 +82,11 @@ "metadata": "Metadatos", "multipleSelectionEnabled": "Selección múltiple activada", "name": "Nombre", + "noPreview": "La vista previa no está disponible para este archivo.", "size": "Tamaño", "sortByLastModified": "Ordenar por última modificación", "sortByName": "Ordenar por nombre", - "sortBySize": "Ordenar por tamaño", - "noPreview": "La vista previa no está disponible para este archivo.", - "csvTooLarge": "CSV file is too large for preview (>5MB). Please download to view.", - "csvLoadFailed": "Failed to load CSV file.", - "showingRows": "Showing {count} row(s)", - "columnSeparator": "Column Separator", - "csvSeparators": { - "comma": "Comma (,)", - "semicolon": "Semicolon (;)", - "both": "Both (,) and (;)" - } + "sortBySize": "Ordenar por tamaño" }, "help": { "click": "seleccionar archivo o carpeta", @@ -126,11 +112,7 @@ "submit": "Iniciar sesión", "username": "Usuario", "usernameTaken": "Nombre usuario no disponible", - "wrongCredentials": "Usuario y/o contraseña incorrectos", - "passwordTooShort": "Password must be at least {min} characters", - "logout_reasons": { - "inactivity": "You have been logged out due to inactivity." - } + "wrongCredentials": "Usuario y/o contraseña incorrectos" }, "permanent": "Permanente", "prompts": { @@ -197,7 +179,6 @@ "video": "Vídeo" }, "settings": { - "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrador", "allowCommands": "Ejecutar comandos", @@ -205,7 +186,6 @@ "allowNew": "Crear nuevos archivos y carpetas", "allowPublish": "Publicar nuevos posts y páginas", "allowSignup": "Permitir registro de usuarios", - "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(dejar en blanco para evitar cambios)", "branding": "Marca", "brandingDirectoryPath": "Ruta de la carpeta de personalizacion de marca", @@ -283,8 +263,7 @@ "userManagement": "Administración de usuarios", "username": "Usuario", "users": "Usuarios", - "userUpdated": "¡Usuario actualizado!", - "currentPassword": "Your Current Password" + "userUpdated": "¡Usuario actualizado!" }, "sidebar": { "help": "Ayuda", diff --git a/frontend/src/i18n/hr.json b/frontend/src/i18n/hr.json deleted file mode 100644 index 1a467cc053..0000000000 --- a/frontend/src/i18n/hr.json +++ /dev/null @@ -1,287 +0,0 @@ -{ - "buttons": { - "cancel": "Otkaži", - "clear": "Očisti", - "close": "Zatvori", - "continue": "Nastavi", - "copy": "Kopiraj", - "copyFile": "Kopiraj datoteku", - "copyToClipboard": "Kopiraj u međuspremnik", - "copyDownloadLinkToClipboard": "Kopiraj poveznicu za preuzimanje u međuspremnik", - "create": "Stvori", - "delete": "Izbriši", - "download": "Preuzmi", - "file": "Datoteka", - "folder": "Mapa", - "fullScreen": "Prebaci na cijeli zaslon", - "hideDotfiles": "Sakrij datoteke koje započinju točkom", - "info": "Info", - "more": "Više", - "move": "Premjesti", - "moveFile": "Premjesti datoteku", - "new": "Novo", - "next": "Sljedeće", - "ok": "OK", - "permalink": "Dohvati trajnu poveznicu", - "previous": "Prethodno", - "preview": "Pregled", - "publish": "Objavi", - "rename": "Preimenuj", - "replace": "Zamijeni", - "reportIssue": "Prijavi grešku", - "save": "Spremi", - "schedule": "Zakaži", - "search": "Pretraži", - "select": "Označi", - "selectMultiple": "Označi više", - "share": "Podijeli", - "shell": "Promijeni ljusku", - "submit": "Predaj", - "switchView": "Promijeni prikaz", - "toggleSidebar": "Prebaci bočnu traku", - "update": "Ažuriraj", - "upload": "Prenesi", - "openFile": "Otvori datoteku", - "discardChanges": "Odbaci", - "stopSearch": "Stop searching", - "saveChanges": "Spremi promjene", - "editAsText": "Uredi kao tekst", - "increaseFontSize": "Povećaj veličinu fonta", - "decreaseFontSize": "Smanji veličinu fonta" - }, - "download": { - "downloadFile": "Preuzmi Datoteku", - "downloadFolder": "Preuzmi Mapu", - "downloadSelected": "Preuzmi Odabrano" - }, - "upload": { - "abortUpload": "Jeste li sigurni da hoćete otkazati?" - }, - "errors": { - "forbidden": "Nemate dopuštenje pristupiti ovome.", - "internal": "Nešto je stvarno pošlo po zlu.", - "notFound": "Lokacija ne može biti dohvaćena.", - "connection": "Poslužitelj ne može biti dohvaćen." - }, - "files": { - "body": "Tijelo", - "closePreview": "Zatvori pregled", - "files": "Datoteke", - "folders": "Mape", - "home": "Dom", - "lastModified": "Zadnje izmijenjeno", - "loading": "Učitavanje...", - "lonely": "Ovdje je tako prazno...", - "metadata": "Metapodaci", - "multipleSelectionEnabled": "Višestruk odabir", - "name": "Naziv", - "size": "Veličina", - "sortByLastModified": "Sortiraj po zadnjoj izmjeni", - "sortByName": "Sortiraj po nazivu", - "sortBySize": "Sortiraj po veličini", - "noPreview": "Pregled nije dostupan za ovu datoteku.", - "csvTooLarge": "CSV datoteka je prevelika za pregled (>5MB). Molimo preuzmite da bi ste ju pregledali.", - "csvLoadFailed": "Neuspješno učitavanje CSV datoteke.", - "showingRows": "Prikazuje se {count} red(ova)", - "columnSeparator": "Separator stupaca", - "csvSeparators": { - "comma": "Zarez (,)", - "semicolon": "Točka zarez (;)", - "both": "I (,) i (;)" - } - }, - "help": { - "click": "odaberi datoteku ili mapu", - "ctrl": { - "click": "odaberi više datoteka ili mapa", - "f": "tražilica", - "s": "spremi datoteku ili preuzmi trenutnu mapu" - }, - "del": "izbriši odabrane stavke", - "doubleClick": "otvori datoteku ili mapu", - "esc": "očisti odabir i/ili zatvori upit", - "f1": "ova informacija", - "f2": "preimenuj datoteku", - "help": "Pomoć" - }, - "login": { - "createAnAccount": "Stvori korisnički račun", - "loginInstead": "Imam korisnički račun", - "password": "Lozinka", - "passwordConfirm": "Potvrda lozinke", - "passwordsDontMatch": "Lozinke se ne podudaraju", - "signup": "Registracija", - "submit": "Prijava", - "username": "Korisničko ime", - "usernameTaken": "Korisničko ime zauzeto", - "wrongCredentials": "Neispravno korisničko ime/lozinka", - "passwordTooShort": "Lozinka mora sadržavati minimalno {min} znakova", - "logout_reasons": { - "inactivity": "Odjavljeni ste zbog neaktivnosti." - } - }, - "permanent": "Trajan", - "prompts": { - "copy": "Kopiraj", - "copyMessage": "Odaberite lokaciju za kopiranje datoteka:", - "currentlyNavigating": "Trenutno navigiranje na:", - "deleteMessageMultiple": "Jeste li sigurni da želite izbrisati datoteke: {count}?", - "deleteMessageSingle": "Jeste li sigurni da hoćete izbrisati ovu datoteku/mapu?", - "deleteMessageShare": "Jeste li sigurni da hoćete izbrisati ovo dijeljenje({path})?", - "deleteUser": "Jeste li sigurni da hoćete izbrisati ovaj korisnički račun?", - "deleteTitle": "Izbriši datoteke", - "displayName": "Prikazno Ime:", - "download": "Preuzmi datoteke", - "downloadMessage": "Odaberite format za preuzimanje.", - "error": "Nešto je pošlo po zlu", - "fileInfo": "Informacije o datoteci", - "filesSelected": "{count} datoteka odabrana.", - "lastModified": "Zadnje izmijenjeno", - "move": "Premjesti", - "moveMessage": "Odaberite novi dom za Vašu datoteku(e)/mapu(e):", - "newArchetype": "Stvorite novu objavu na temelju arhetipu. Vaša datoteka bit će stvorena u mapi sadržaja.", - "newDir": "Nova mapa", - "newDirMessage": "Imenujte Vašu novu mapu.", - "newFile": "Nova datoteka", - "newFileMessage": "Imenujte Vašu novu datoteku.", - "numberDirs": "Broj mapa", - "numberFiles": "Broj datoteka", - "rename": "Preimenuj", - "renameMessage": "Umetni novo ime za", - "replace": "Zamijeni", - "replaceMessage": "Jedna od datoteka koju pokušavate prenijeti ima sukobljavajući naziv. Želite li preskočiti ovu datoteku i nastaviti s prijenosom ili zamijeniti postojeću datoteku?\n", - "schedule": "Zakaži", - "scheduleMessage": "Odaberite datum i vrijeme za zakazivanje ove objave.", - "show": "Prikaži", - "size": "Veličina", - "upload": "Prenesi", - "uploadFiles": "Prenošenje {files} datoteka...", - "uploadMessage": "Odaberite opciju za prijenos.", - "optionalPassword": "Opcionalna lozinka", - "resolution": "Rezolucija", - "discardEditorChanges": "Jeste li sigurni da želite odbaciti promjene koje ste napravili?" - }, - "search": { - "images": "Slike", - "music": "Glazba", - "pdf": "PDF", - "pressToSearch": "Pritisnite enter za pretraživanje...", - "search": "Pretraživanje...", - "typeToSearch": "Tipkajte za pretraživanje...", - "types": "Tipovi", - "video": "Video" - }, - "settings": { - "aceEditorTheme": "Ace editor theme", - "admin": "Admin", - "administrator": "Administrator", - "allowCommands": "Izvrši naredbe", - "allowEdit": "Uredi, preimenuj i izbriši datoteke ili mape", - "allowNew": "Stvori nove datoteke i mape", - "allowPublish": "Objavi nove objave i stranice", - "allowSignup": "Dopusti registraciju korisnicima", - "hideLoginButton": "Sakrij tipku za prijavu s javnih stranica", - "avoidChanges": "(ostavite prazno kako biste izbjegli promjene)", - "branding": "Brendiranje", - "brandingDirectoryPath": "Put brendiranja", - "brandingHelp": "Možete prilagoditi izgled i funkcionalnost Vašeg File Browsera mijenjanjem njegovog naziva, zamjenom logotipa, dodavanjem prilagođenih stilova pa čak i onemogućavanjem vanjskih poveznica na GitHub.\nZa više informacija o prilagođenome brendiranju pogledajte {0}.", - "changePassword": "Promjena lozinke", - "commandRunner": "Izvršitelj naredbi", - "commandRunnerHelp": "Ovdje možete postaviti naredbe koje se izvršuju u imenovanim događajima. Morate napisati jednu po liniji. Varijable okruženja {0} i {1} bit će dostupne, tako da je {0} relativna {1}. Za više informacija o ovoj značajci pogledajte {2}.", - "commandsUpdated": "Naredbe ažurirane!", - "createUserDir": "Automatsko stvaranje kućne mape korisnika pri dodavanju novog korisnika", - "minimumPasswordLength": "Minimalna duljina lozinke", - "tusUploads": "Segmentirani prijenosi", - "tusUploadsHelp": "File Browser podržava segmentirane prijenose datoteka, omogućavajući stvaranje učinkovitih, pouzdanih, obnovljivih i segmentiranih prijenosa datoteka čak i na nepouzdanim mrežama.", - "tusUploadsChunkSize": "Naznačuje maksimalnu veličinu zahtjeva (direktni prijenosi bit će korišteni za manje prijenose). Možete unijeti cijeli broj koji označava veličinu bajta ili niz znakova poput 10MB, 1GB itd.", - "tusUploadsRetryCount": "Broj ponovnih pokušaja ako se dio ne uspije prenijeti.", - "userHomeBasePath": "Bazni put za kućne mape korisnika", - "userScopeGenerationPlaceholder": "Opseg će se automatski generirati", - "createUserHomeDirectory": "Stvori kućnu mapu korisnika", - "customStylesheet": "Prilagođeni Stylesheet", - "defaultUserDescription": "Zadane postavke za nove korisnike.", - "disableExternalLinks": "Onemogući vanjske poveznice (osim dokumentacije)", - "disableUsedDiskPercentage": "Onemogući graf iskorištenosti diska", - "documentation": "dokumentacija", - "examples": "Primjeri", - "executeOnShell": "Izvrši u ljusci", - "executeOnShellDescription": "Po zadanim postavkama, File Browser izvršava naredbe izravnim pozivanjem njihovih binarnih datoteka. Ako ih želite izvršiti u ljusci (kao što su Bash ili PowerShell), možete ih definirati ovdje s potrebnim argumentima i oznakama. Ako je postavljena, naredba koju izvršavate bit će dodana kao argument. To se odnosi i na korisničke naredbe i na događajne kuke.", - "globalRules": "Ovo je globalan skup pravila dopuštanja i zabrane. Primjenjuju se na svakog korisnika. Moguće je definirati specifična pravila u postavkama svakog korisnika da biste nadjačali ove postavke.", - "globalSettings": "Globalne postavke", - "hideDotfiles": "Sakrij datoteke koje započinju točkom", - "insertPath": "Umetni put", - "insertRegex": "Umetni regex izraz", - "instanceName": "Naziv instance", - "language": "Jezik", - "lockPassword": "Onemogući mijenjanje lozinke korisniku", - "newPassword": "Vaša nova lozinka", - "newPasswordConfirm": "Potvrdite Vašu novu lozinku", - "newUser": "Novi Korisnik", - "password": "Lozinka", - "passwordUpdated": "Lozinka ažurirana!", - "path": "Put", - "perm": { - "create": "Stvaranje datoteka i mapa", - "delete": "Brisanje datoteka i mapa", - "download": "Preuzimanje", - "execute": "Izvršavanje naredbi", - "modify": "Uređivanje datoteka", - "rename": "Preimenovanje ili premještanje datoteka i mapa", - "share": "Dijeljenje datoteka" - }, - "permissions": "Dopuštenja", - "permissionsHelp": "Korisnika možete postaviti administratorom ili odabrati dopuštenja individualno. Odabirom na \"Administrator\", sve druge opcije bit će automatski odabrane. Upravljanje korisnicima ostaje privilegija administratora.\n", - "profileSettings": "Postavke profila", - "ruleExample1": "onemogućava pristup svakoj datoteci koja započinje točkom (poput .git, .gitignore) u svakoj mapi.\n", - "ruleExample2": "blokira pristup datoteci naziva Caddyfile na korijenu opsega.", - "rules": "Pravila", - "rulesHelp": "Ovdje možete definirati skup pravila dopuštanja i zabrane za ovog specifičnog korisnika. Blokirane datoteke neće se prikazivati u popisima i neće biti dostupne korisniku. Podržavamo regex i puteve relativne opsegu korisnika.\n", - "scope": "Opseg", - "setDateFormat": "Odredi točan format datuma", - "settingsUpdated": "Postavke ažurirane!", - "shareDuration": "Podijeli Trajanje", - "shareManagement": "Upravljanje Dijeljenjem", - "shareDeleted": "Podjela izbrisana!", - "singleClick": "Koristi jednostruke klikove za otvaranje datoteka i mapa", - "themes": { - "default": "Zadano - Sustav", - "dark": "Tamno", - "light": "Svijetlo", - "title": "Tema" - }, - "user": "Korisnik", - "userCommands": "Naredbe", - "userCommandsHelp": "Popis dostupnih naredbi za ovog korisnika. Primjer:\n", - "userCreated": "Korisnik stvoren!", - "userDefaults": "Zadane postavke korisnika", - "userDeleted": "Korisnik izbrisan!", - "userManagement": "Upravljanje Korisnicima", - "userUpdated": "Korisnik ažuriran!", - "username": "Korisničko ime", - "users": "Korisnici", - "currentPassword": "Your Current Password" - }, - "sidebar": { - "help": "Pomoć", - "hugoNew": "Hugo New", - "login": "Prijava", - "logout": "Odjava", - "myFiles": "Moje datoteke", - "newFile": "Nova datoteka", - "newFolder": "Nova mapa", - "preview": "Pregled", - "settings": "Postavke", - "signup": "Registracija", - "siteSettings": "Postavke stranice" - }, - "success": { - "linkCopied": "Poveznica kopirana!" - }, - "time": { - "days": "Dani", - "hours": "Sati", - "minutes": "Minute", - "seconds": "Sekunde", - "unit": "Jedinica vremena" - } -} diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts index 18c925b8fd..b705ba7686 100644 --- a/frontend/src/i18n/index.ts +++ b/frontend/src/i18n/index.ts @@ -15,6 +15,8 @@ import("dayjs/locale/uk"); import("dayjs/locale/vi"); import("dayjs/locale/zh-cn"); import("dayjs/locale/zh-tw"); +import("dayjs/locale/cs"); +import("dayjs/locale/nb"); // All i18n resources specified in the plugin `include` option can be loaded // at once using the import syntax @@ -91,7 +93,6 @@ export function detectLocale() { case /^uk\b/.test(locale): locale = "uk"; break; - case /^vi\b/.test(locale): locale = "vi"; break; @@ -103,6 +104,10 @@ export function detectLocale() { locale = "nl-be"; break; case /^nb\b/.test(locale): + case /^no\b/.test(locale): + locale = "no"; + break; + case /^nb\b/.test(locale): case /^no\b/.test(locale): locale = "no"; break; diff --git a/frontend/src/i18n/lv.json b/frontend/src/i18n/lv.json deleted file mode 100644 index fabd4a86c9..0000000000 --- a/frontend/src/i18n/lv.json +++ /dev/null @@ -1,287 +0,0 @@ -{ - "buttons": { - "cancel": "Atcelt", - "clear": "Tīrs", - "close": "Aizvērt", - "continue": "Turpināt", - "copy": "Kopēt", - "copyFile": "Kopēt failu", - "copyToClipboard": "Kopēt starpliktuvē", - "copyDownloadLinkToClipboard": "Kopēt lejupielādes saiti starpliktuvē", - "create": "Izveidot", - "delete": "Dzēst", - "download": "Lejupielādēt", - "file": "Fails", - "folder": "Mape", - "fullScreen": "Pārslēgt pilnekrāna režīmu", - "hideDotfiles": "Slēpt punktfailus", - "info": "Informācija", - "more": "Vairāk", - "move": "Pārvietot", - "moveFile": "Pārvietot failu", - "new": "Jauns", - "next": "Nākamais", - "ok": "Labi", - "permalink": "Iegūt pastāvīgo saiti", - "previous": "Iepriekšējais", - "preview": "Priekšskatījums", - "publish": "Publicēt", - "rename": "Pārdēvēt", - "replace": "Aizstāt", - "reportIssue": "Ziņot par problēmu", - "save": "Saglabāt", - "schedule": "Grafiks", - "search": "Meklēt", - "select": "Izvēlieties", - "selectMultiple": "Izvēlieties vairākus", - "share": "Dalīties", - "shell": "Pārslēgt apvalku", - "submit": "Iesniegt", - "switchView": "Pārslēgt skatu", - "toggleSidebar": "Pārslēgt sānjoslu", - "update": "Atjaunināt", - "upload": "Augšupielādēt", - "openFile": "Atvērt failu", - "discardChanges": "Izmest", - "stopSearch": "Stop searching", - "saveChanges": "Saglabāt izmaiņas", - "editAsText": "Rediģēt kā tekstu", - "increaseFontSize": "Palieliniet fonta lielumu", - "decreaseFontSize": "Samaziniet fonta lielumu" - }, - "download": { - "downloadFile": "Lejupielādēt failu", - "downloadFolder": "Lejupielādēt mapi", - "downloadSelected": "Lejupielādēt atlasīto" - }, - "upload": { - "abortUpload": "Vai tiešām vēlaties pārtraukt?" - }, - "errors": { - "forbidden": "Jums nav atļaujas piekļūt šim.", - "internal": "Kaut kas tiešām nogāja greizi.", - "notFound": "Šo atrašanās vietu nevar sasniegt.", - "connection": "Ar serveri nevar sazināties." - }, - "files": { - "body": "Ķermenis", - "closePreview": "Aizvērt priekšskatījumu", - "files": "Faili", - "folders": "Mapes", - "home": "Sākums", - "lastModified": "Pēdējoreiz modificēts", - "loading": "Notiek ielāde...", - "lonely": "Šeit ir tukša vieta...", - "metadata": "Metadati", - "multipleSelectionEnabled": "Vairākas atlases ir iespējotas", - "name": "Vārds", - "size": "Izmērs", - "sortByLastModified": "Kārtot pēc pēdējās modifikācijas", - "sortByName": "Kārtot pēc nosaukuma", - "sortBySize": "Kārtot pēc izmēra", - "noPreview": "Šim failam nav pieejams priekšskatījums.", - "csvTooLarge": "CSV fails ir pārāk liels priekšskatīšanai (>5 MB). Lūdzu, lejupielādējiet to, lai skatītu", - "csvLoadFailed": "Neizdevās ielādēt CSV failu.", - "showingRows": "Rāda {count} rindu(as)", - "columnSeparator": "Kolonnu atdalītājs", - "csvSeparators": { - "comma": "Komats (,)", - "semicolon": "Semikols (;)", - "both": "Gan (,) gan (;)" - } - }, - "help": { - "click": "atlasiet failu vai direktoriju", - "ctrl": { - "click": "atlasīt vairākus failus vai direktorijus", - "f": "atver meklēšanu", - "s": "saglabājiet failu vai lejupielādējiet direktoriju, kurā atrodaties" - }, - "del": "dzēst atlasītos vienumus", - "doubleClick": "atvērt failu vai direktoriju", - "esc": "notīrīt atlasi un/vai aizvērt uzvedni", - "f1": "šo informāciju", - "f2": "pārdēvēt failu", - "help": "Palīdzība" - }, - "login": { - "createAnAccount": "Izveidot kontu", - "loginInstead": "Jau ir konts", - "password": "Parole", - "passwordConfirm": "Paroles apstiprināšana", - "passwordsDontMatch": "Paroles nesakrīt", - "signup": "Reģistrēšanās", - "submit": "Pieteikties", - "username": "Lietotājvārds", - "usernameTaken": "Lietotājvārds jau aizņemts", - "wrongCredentials": "Nepareizi akreditācijas dati", - "passwordTooShort": "Parolei jābūt vismaz {min} rakstzīmju garai", - "logout_reasons": { - "inactivity": "Jūs esat atteicies no sistēmas neaktivitātes dēļ." - } - }, - "permanent": "Pastāvīgs", - "prompts": { - "copy": "Kopēt", - "copyMessage": "Izvēlieties atrašanās vietu, uz kuru kopēt failus:", - "currentlyNavigating": "Pašlaik navigācija:", - "deleteMessageMultiple": "Vai tiešām vēlaties dzēst {count} failu(s)?", - "deleteMessageSingle": "Vai tiešām vēlaties dzēst šo failu/mapi?", - "deleteMessageShare": "Vai tiešām vēlaties dzēst šo koplietojumu({path})?", - "deleteUser": "Vai tiešām vēlaties dzēst šo lietotāju?", - "deleteTitle": "Dzēst failus", - "displayName": "Displeja nosaukums:", - "download": "Lejupielādēt failus", - "downloadMessage": "Izvēlieties formātu, kuru vēlaties lejupielādēt.", - "error": "Kaut kas nogāja greizi", - "fileInfo": "Informācija par failu", - "filesSelected": "{count} atlasīti faili", - "lastModified": "Pēdējās izmaiņas", - "move": "Pārvietot", - "moveMessage": "Izvēlieties jaunu mājvietu failam(iem)/mapei(ēm):", - "newArchetype": "Izveidojiet jaunu ierakstu, pamatojoties uz arhtipu. Jūsu fails tiks izveidots satura mapē.", - "newDir": "Jauna direktorija", - "newDirMessage": "Nosaukums savai jaunajai direktorijai.", - "newFile": "Jauns fails", - "newFileMessage": "Nosauciet savu jauno failu.", - "numberDirs": "Katalogu skaits", - "numberFiles": "Failu skaits", - "rename": "Pārdēvēt", - "renameMessage": "Ievietojiet jaunu nosaukumu", - "replace": "Aizstāt", - "replaceMessage": "Vienam no failiem, kurus mēģināt augšupielādēt, ir konfliktējošs nosaukums. Vai vēlaties izlaist šo failu un turpināt augšupielādi vai aizstāt esošo?\n", - "schedule": "Grafiks", - "scheduleMessage": "Izvēlieties datumu un laiku, lai ieplānotu šī ieraksta publicēšanu.", - "show": "Rādīt", - "size": "Izmērs", - "upload": "Augšupielādēt", - "uploadFiles": "Notiek {files} failu augšupielāde...", - "uploadMessage": "Atlasiet augšupielādes opciju.", - "optionalPassword": "Izvēles parole", - "resolution": "Izšķirtspēja", - "discardEditorChanges": "Vai tiešām vēlaties atmest veiktās izmaiņas?" - }, - "search": { - "images": "Attēli", - "music": "Mūzika", - "pdf": "PDF", - "pressToSearch": "Nospiediet taustiņu Enter, lai meklētu...", - "search": "Meklē...", - "typeToSearch": "Ierakstiet, lai meklētu...", - "types": "Veidi", - "video": "Video" - }, - "settings": { - "aceEditorTheme": "Ace redaktora tēma", - "admin": "Admin", - "administrator": "Administrator", - "allowCommands": "Izpildīt komandas", - "allowEdit": "Rediģēt, pārdēvēt un dzēst failus vai direktorijus", - "allowNew": "Izveidojiet jaunus failus un direktorijus", - "allowPublish": "Publicēt jaunus ierakstus un lapas", - "allowSignup": "Atļaut lietotājiem reģistrēties", - "hideLoginButton": "Paslēpt pieteikšanās pogu publiskajās lapās", - "avoidChanges": "(atstājiet tukšu, lai izvairītos no izmaiņām)", - "branding": "Zīmols", - "brandingDirectoryPath": "Zīmola direktorijas ceļš", - "brandingHelp": "Jūs varat pielāgot sava failu pārlūka instances izskatu un darbību, mainot tās nosaukumu, aizstājot logotipu, pievienojot pielāgotus stilus un pat atspējojot ārējās saites uz GitHub.\nLai iegūtu plašāku informāciju par pielāgotu zīmola veidošanu, lūdzu, skatiet {0}.", - "changePassword": "Mainīt paroli", - "commandRunner": "Komandu skrējējs", - "commandRunnerHelp": "Šeit varat iestatīt komandas, kas tiek izpildītas nosauktajos notikumos. Katrā rindā jāraksta pa vienai. Būs pieejami vides mainīgie {0} un {1}, kas ir {0} relatīvi pret {1}. Lai iegūtu plašāku informāciju par šo funkciju un pieejamajiem vides mainīgajiem, lūdzu, izlasiet {2}.", - "commandsUpdated": "Komandas atjauninātas!", - "createUserDir": "Automātiski izveidot lietotāja mājas direktoriju, pievienojot jaunu lietotāju", - "minimumPasswordLength": "Minimālais paroles garums", - "tusUploads": "Sadalītas augšupielādes", - "tusUploadsHelp": "Failu pārlūks atbalsta failu augšupielādi fragmentos, ļaujot izveidot efektīvu, uzticamu, atsākamu un fragmentos sadalītu failu augšupielādi pat neuzticamos tīklos.", - "tusUploadsChunkSize": "Norāda pieprasījuma maksimālo izmēru (mazākiem augšupielādes apjomiem tiks izmantota tieša augšupielāde). Varat ievadīt vienkāršu veselu skaitli, kas apzīmē baitu izmēru, vai virkni, piemēram, 10 MB, 1 GB utt.", - "tusUploadsRetryCount": "Atkārtotu mēģinājumu skaits, kas jāveic, ja fragmenta augšupielāde neizdodas.", - "userHomeBasePath": "Lietotāja mājas direktoriju bāzes ceļš", - "userScopeGenerationPlaceholder": "Darbības joma tiks ģenerēta automātiski", - "createUserHomeDirectory": "Izveidojiet lietotāja mājas direktoriju", - "customStylesheet": "Pielāgota stila lapa", - "defaultUserDescription": "Šie ir noklusējuma iestatījumi jaunajiem lietotājiem.", - "disableExternalLinks": "Atspējot ārējās saites (izņemot dokumentāciju)", - "disableUsedDiskPercentage": "Atspējot izmantotā diska procentuālās daļas grafiku", - "documentation": "dokumentācija", - "examples": "Piemēri", - "executeOnShell": "Izpildīt uz čaulas", - "executeOnShellDescription": "Pēc noklusējuma failu pārlūks izpilda komandas, tieši izsaucot to bināros failus. Ja vēlaties tās palaist čaulā (piemēram, Bash vai PowerShell), varat to definēt šeit ar nepieciešamajiem argumentiem un karodziņiem. Ja tas ir iestatīts, izpildītā komanda tiks pievienota kā arguments. Tas attiecas gan uz lietotāja komandām, gan notikumu piesaistes rīkiem.", - "globalRules": "Šis ir globāls atļaušanas un aizliegšanas noteikumu kopums. Tie attiecas uz katru lietotāju. Katra lietotāja iestatījumos varat definēt konkrētus noteikumus, lai tos ignorētu.", - "globalSettings": "Globālie iestatījumi", - "hideDotfiles": "Slēpt punktfailus", - "insertPath": "Ievietojiet ceļu", - "insertRegex": "Ievietojiet regex izteiksmi", - "instanceName": "Gadījuma nosaukums", - "language": "Valoda", - "lockPassword": "Neļaut lietotājam mainīt paroli", - "newPassword": "Jūsu jaunā parole", - "newPasswordConfirm": "Apstipriniet savu jauno paroli", - "newUser": "Jauns lietotājs", - "password": "Parole", - "passwordUpdated": "Parole atjaunināta!", - "path": "Ceļš", - "perm": { - "create": "Izveidojiet failus un direktorijus", - "delete": "Dzēst failus un direktorijus", - "download": "Lejupielādēt", - "execute": "Izpildīt komandas", - "modify": "Rediģēt failus", - "rename": "Pārdēvēt vai pārvietot failus un direktorijus", - "share": "Kopīgojiet failus" - }, - "permissions": "Atļaujas", - "permissionsHelp": "Varat iestatīt lietotāju kā administratoru vai izvēlēties atļaujas individuāli. Ja atlasīsiet “Administrators”, visas pārējās opcijas tiks automātiski atzīmētas. Lietotāju pārvaldība joprojām ir administratora privilēģija.\n", - "profileSettings": "Profila iestatījumi", - "ruleExample1": "neļauj piekļūt jebkuram dotfile failam (piemēram, .git, .gitignore) katrā mapē.\n", - "ruleExample2": "bloķē piekļuvi failam ar nosaukumu Caddyfile darbības jomas saknē.", - "rules": "Noteikumi", - "rulesHelp": "Šeit varat definēt atļaušanas un aizliegšanas noteikumu kopu šim konkrētajam lietotājam. Bloķētie faili netiks rādīti sarakstos, un lietotājs tiem nevarēs piekļūt. Mēs atbalstām regulārās izteiksmes un ceļus attiecībā pret lietotāja darbības jomu.\n", - "scope": "Darbības joma", - "setDateFormat": "Iestatiet precīzu datuma formātu", - "settingsUpdated": "Iestatījumi atjaunināti!", - "shareDuration": "Kopīgošanas ilgums", - "shareManagement": "Kopīgošanas pārvaldība", - "shareDeleted": "Kopīgošana ir izdzēsta!", - "singleClick": "Failu un direktoriju atvēršanai izmantojiet vienus klikšķi", - "themes": { - "default": "Sistēmas noklusējums", - "dark": "Tumša", - "light": "Gaiša", - "title": "Tēma" - }, - "user": "Lietotājs", - "userCommands": "Komandas", - "userCommandsHelp": "Ar atstarpi atdalīts saraksts ar šim lietotājam pieejamajām komandām. Piemērs:\n", - "userCreated": "Lietotājs izveidots!", - "userDefaults": "Lietotāja noklusējuma iestatījumi", - "userDeleted": "Lietotājs izdzēsts!", - "userManagement": "Lietotāju pārvaldība", - "userUpdated": "Lietotājs atjaunināts!", - "username": "Lietotājvārds", - "users": "Lietotāji", - "currentPassword": "Your Current Password" - }, - "sidebar": { - "help": "Palīdzība", - "hugoNew": "Hugo Jauns", - "login": "Pieteikties", - "logout": "Atteikties", - "myFiles": "Mani faili", - "newFile": "Jauns fails", - "newFolder": "Jauna mape", - "preview": "Priekšskatījums", - "settings": "Iestatījumi", - "signup": "Reģistrēties", - "siteSettings": "Vietnes iestatījumi" - }, - "success": { - "linkCopied": "Saite nokopēta!" - }, - "time": { - "days": "Dienas", - "hours": "Stundas", - "minutes": "Minūtes", - "seconds": "Sekundes", - "unit": "Laika vienība" - } -} diff --git a/frontend/src/i18n/lv_LV.json b/frontend/src/i18n/lv_LV.json deleted file mode 100644 index fabd4a86c9..0000000000 --- a/frontend/src/i18n/lv_LV.json +++ /dev/null @@ -1,287 +0,0 @@ -{ - "buttons": { - "cancel": "Atcelt", - "clear": "Tīrs", - "close": "Aizvērt", - "continue": "Turpināt", - "copy": "Kopēt", - "copyFile": "Kopēt failu", - "copyToClipboard": "Kopēt starpliktuvē", - "copyDownloadLinkToClipboard": "Kopēt lejupielādes saiti starpliktuvē", - "create": "Izveidot", - "delete": "Dzēst", - "download": "Lejupielādēt", - "file": "Fails", - "folder": "Mape", - "fullScreen": "Pārslēgt pilnekrāna režīmu", - "hideDotfiles": "Slēpt punktfailus", - "info": "Informācija", - "more": "Vairāk", - "move": "Pārvietot", - "moveFile": "Pārvietot failu", - "new": "Jauns", - "next": "Nākamais", - "ok": "Labi", - "permalink": "Iegūt pastāvīgo saiti", - "previous": "Iepriekšējais", - "preview": "Priekšskatījums", - "publish": "Publicēt", - "rename": "Pārdēvēt", - "replace": "Aizstāt", - "reportIssue": "Ziņot par problēmu", - "save": "Saglabāt", - "schedule": "Grafiks", - "search": "Meklēt", - "select": "Izvēlieties", - "selectMultiple": "Izvēlieties vairākus", - "share": "Dalīties", - "shell": "Pārslēgt apvalku", - "submit": "Iesniegt", - "switchView": "Pārslēgt skatu", - "toggleSidebar": "Pārslēgt sānjoslu", - "update": "Atjaunināt", - "upload": "Augšupielādēt", - "openFile": "Atvērt failu", - "discardChanges": "Izmest", - "stopSearch": "Stop searching", - "saveChanges": "Saglabāt izmaiņas", - "editAsText": "Rediģēt kā tekstu", - "increaseFontSize": "Palieliniet fonta lielumu", - "decreaseFontSize": "Samaziniet fonta lielumu" - }, - "download": { - "downloadFile": "Lejupielādēt failu", - "downloadFolder": "Lejupielādēt mapi", - "downloadSelected": "Lejupielādēt atlasīto" - }, - "upload": { - "abortUpload": "Vai tiešām vēlaties pārtraukt?" - }, - "errors": { - "forbidden": "Jums nav atļaujas piekļūt šim.", - "internal": "Kaut kas tiešām nogāja greizi.", - "notFound": "Šo atrašanās vietu nevar sasniegt.", - "connection": "Ar serveri nevar sazināties." - }, - "files": { - "body": "Ķermenis", - "closePreview": "Aizvērt priekšskatījumu", - "files": "Faili", - "folders": "Mapes", - "home": "Sākums", - "lastModified": "Pēdējoreiz modificēts", - "loading": "Notiek ielāde...", - "lonely": "Šeit ir tukša vieta...", - "metadata": "Metadati", - "multipleSelectionEnabled": "Vairākas atlases ir iespējotas", - "name": "Vārds", - "size": "Izmērs", - "sortByLastModified": "Kārtot pēc pēdējās modifikācijas", - "sortByName": "Kārtot pēc nosaukuma", - "sortBySize": "Kārtot pēc izmēra", - "noPreview": "Šim failam nav pieejams priekšskatījums.", - "csvTooLarge": "CSV fails ir pārāk liels priekšskatīšanai (>5 MB). Lūdzu, lejupielādējiet to, lai skatītu", - "csvLoadFailed": "Neizdevās ielādēt CSV failu.", - "showingRows": "Rāda {count} rindu(as)", - "columnSeparator": "Kolonnu atdalītājs", - "csvSeparators": { - "comma": "Komats (,)", - "semicolon": "Semikols (;)", - "both": "Gan (,) gan (;)" - } - }, - "help": { - "click": "atlasiet failu vai direktoriju", - "ctrl": { - "click": "atlasīt vairākus failus vai direktorijus", - "f": "atver meklēšanu", - "s": "saglabājiet failu vai lejupielādējiet direktoriju, kurā atrodaties" - }, - "del": "dzēst atlasītos vienumus", - "doubleClick": "atvērt failu vai direktoriju", - "esc": "notīrīt atlasi un/vai aizvērt uzvedni", - "f1": "šo informāciju", - "f2": "pārdēvēt failu", - "help": "Palīdzība" - }, - "login": { - "createAnAccount": "Izveidot kontu", - "loginInstead": "Jau ir konts", - "password": "Parole", - "passwordConfirm": "Paroles apstiprināšana", - "passwordsDontMatch": "Paroles nesakrīt", - "signup": "Reģistrēšanās", - "submit": "Pieteikties", - "username": "Lietotājvārds", - "usernameTaken": "Lietotājvārds jau aizņemts", - "wrongCredentials": "Nepareizi akreditācijas dati", - "passwordTooShort": "Parolei jābūt vismaz {min} rakstzīmju garai", - "logout_reasons": { - "inactivity": "Jūs esat atteicies no sistēmas neaktivitātes dēļ." - } - }, - "permanent": "Pastāvīgs", - "prompts": { - "copy": "Kopēt", - "copyMessage": "Izvēlieties atrašanās vietu, uz kuru kopēt failus:", - "currentlyNavigating": "Pašlaik navigācija:", - "deleteMessageMultiple": "Vai tiešām vēlaties dzēst {count} failu(s)?", - "deleteMessageSingle": "Vai tiešām vēlaties dzēst šo failu/mapi?", - "deleteMessageShare": "Vai tiešām vēlaties dzēst šo koplietojumu({path})?", - "deleteUser": "Vai tiešām vēlaties dzēst šo lietotāju?", - "deleteTitle": "Dzēst failus", - "displayName": "Displeja nosaukums:", - "download": "Lejupielādēt failus", - "downloadMessage": "Izvēlieties formātu, kuru vēlaties lejupielādēt.", - "error": "Kaut kas nogāja greizi", - "fileInfo": "Informācija par failu", - "filesSelected": "{count} atlasīti faili", - "lastModified": "Pēdējās izmaiņas", - "move": "Pārvietot", - "moveMessage": "Izvēlieties jaunu mājvietu failam(iem)/mapei(ēm):", - "newArchetype": "Izveidojiet jaunu ierakstu, pamatojoties uz arhtipu. Jūsu fails tiks izveidots satura mapē.", - "newDir": "Jauna direktorija", - "newDirMessage": "Nosaukums savai jaunajai direktorijai.", - "newFile": "Jauns fails", - "newFileMessage": "Nosauciet savu jauno failu.", - "numberDirs": "Katalogu skaits", - "numberFiles": "Failu skaits", - "rename": "Pārdēvēt", - "renameMessage": "Ievietojiet jaunu nosaukumu", - "replace": "Aizstāt", - "replaceMessage": "Vienam no failiem, kurus mēģināt augšupielādēt, ir konfliktējošs nosaukums. Vai vēlaties izlaist šo failu un turpināt augšupielādi vai aizstāt esošo?\n", - "schedule": "Grafiks", - "scheduleMessage": "Izvēlieties datumu un laiku, lai ieplānotu šī ieraksta publicēšanu.", - "show": "Rādīt", - "size": "Izmērs", - "upload": "Augšupielādēt", - "uploadFiles": "Notiek {files} failu augšupielāde...", - "uploadMessage": "Atlasiet augšupielādes opciju.", - "optionalPassword": "Izvēles parole", - "resolution": "Izšķirtspēja", - "discardEditorChanges": "Vai tiešām vēlaties atmest veiktās izmaiņas?" - }, - "search": { - "images": "Attēli", - "music": "Mūzika", - "pdf": "PDF", - "pressToSearch": "Nospiediet taustiņu Enter, lai meklētu...", - "search": "Meklē...", - "typeToSearch": "Ierakstiet, lai meklētu...", - "types": "Veidi", - "video": "Video" - }, - "settings": { - "aceEditorTheme": "Ace redaktora tēma", - "admin": "Admin", - "administrator": "Administrator", - "allowCommands": "Izpildīt komandas", - "allowEdit": "Rediģēt, pārdēvēt un dzēst failus vai direktorijus", - "allowNew": "Izveidojiet jaunus failus un direktorijus", - "allowPublish": "Publicēt jaunus ierakstus un lapas", - "allowSignup": "Atļaut lietotājiem reģistrēties", - "hideLoginButton": "Paslēpt pieteikšanās pogu publiskajās lapās", - "avoidChanges": "(atstājiet tukšu, lai izvairītos no izmaiņām)", - "branding": "Zīmols", - "brandingDirectoryPath": "Zīmola direktorijas ceļš", - "brandingHelp": "Jūs varat pielāgot sava failu pārlūka instances izskatu un darbību, mainot tās nosaukumu, aizstājot logotipu, pievienojot pielāgotus stilus un pat atspējojot ārējās saites uz GitHub.\nLai iegūtu plašāku informāciju par pielāgotu zīmola veidošanu, lūdzu, skatiet {0}.", - "changePassword": "Mainīt paroli", - "commandRunner": "Komandu skrējējs", - "commandRunnerHelp": "Šeit varat iestatīt komandas, kas tiek izpildītas nosauktajos notikumos. Katrā rindā jāraksta pa vienai. Būs pieejami vides mainīgie {0} un {1}, kas ir {0} relatīvi pret {1}. Lai iegūtu plašāku informāciju par šo funkciju un pieejamajiem vides mainīgajiem, lūdzu, izlasiet {2}.", - "commandsUpdated": "Komandas atjauninātas!", - "createUserDir": "Automātiski izveidot lietotāja mājas direktoriju, pievienojot jaunu lietotāju", - "minimumPasswordLength": "Minimālais paroles garums", - "tusUploads": "Sadalītas augšupielādes", - "tusUploadsHelp": "Failu pārlūks atbalsta failu augšupielādi fragmentos, ļaujot izveidot efektīvu, uzticamu, atsākamu un fragmentos sadalītu failu augšupielādi pat neuzticamos tīklos.", - "tusUploadsChunkSize": "Norāda pieprasījuma maksimālo izmēru (mazākiem augšupielādes apjomiem tiks izmantota tieša augšupielāde). Varat ievadīt vienkāršu veselu skaitli, kas apzīmē baitu izmēru, vai virkni, piemēram, 10 MB, 1 GB utt.", - "tusUploadsRetryCount": "Atkārtotu mēģinājumu skaits, kas jāveic, ja fragmenta augšupielāde neizdodas.", - "userHomeBasePath": "Lietotāja mājas direktoriju bāzes ceļš", - "userScopeGenerationPlaceholder": "Darbības joma tiks ģenerēta automātiski", - "createUserHomeDirectory": "Izveidojiet lietotāja mājas direktoriju", - "customStylesheet": "Pielāgota stila lapa", - "defaultUserDescription": "Šie ir noklusējuma iestatījumi jaunajiem lietotājiem.", - "disableExternalLinks": "Atspējot ārējās saites (izņemot dokumentāciju)", - "disableUsedDiskPercentage": "Atspējot izmantotā diska procentuālās daļas grafiku", - "documentation": "dokumentācija", - "examples": "Piemēri", - "executeOnShell": "Izpildīt uz čaulas", - "executeOnShellDescription": "Pēc noklusējuma failu pārlūks izpilda komandas, tieši izsaucot to bināros failus. Ja vēlaties tās palaist čaulā (piemēram, Bash vai PowerShell), varat to definēt šeit ar nepieciešamajiem argumentiem un karodziņiem. Ja tas ir iestatīts, izpildītā komanda tiks pievienota kā arguments. Tas attiecas gan uz lietotāja komandām, gan notikumu piesaistes rīkiem.", - "globalRules": "Šis ir globāls atļaušanas un aizliegšanas noteikumu kopums. Tie attiecas uz katru lietotāju. Katra lietotāja iestatījumos varat definēt konkrētus noteikumus, lai tos ignorētu.", - "globalSettings": "Globālie iestatījumi", - "hideDotfiles": "Slēpt punktfailus", - "insertPath": "Ievietojiet ceļu", - "insertRegex": "Ievietojiet regex izteiksmi", - "instanceName": "Gadījuma nosaukums", - "language": "Valoda", - "lockPassword": "Neļaut lietotājam mainīt paroli", - "newPassword": "Jūsu jaunā parole", - "newPasswordConfirm": "Apstipriniet savu jauno paroli", - "newUser": "Jauns lietotājs", - "password": "Parole", - "passwordUpdated": "Parole atjaunināta!", - "path": "Ceļš", - "perm": { - "create": "Izveidojiet failus un direktorijus", - "delete": "Dzēst failus un direktorijus", - "download": "Lejupielādēt", - "execute": "Izpildīt komandas", - "modify": "Rediģēt failus", - "rename": "Pārdēvēt vai pārvietot failus un direktorijus", - "share": "Kopīgojiet failus" - }, - "permissions": "Atļaujas", - "permissionsHelp": "Varat iestatīt lietotāju kā administratoru vai izvēlēties atļaujas individuāli. Ja atlasīsiet “Administrators”, visas pārējās opcijas tiks automātiski atzīmētas. Lietotāju pārvaldība joprojām ir administratora privilēģija.\n", - "profileSettings": "Profila iestatījumi", - "ruleExample1": "neļauj piekļūt jebkuram dotfile failam (piemēram, .git, .gitignore) katrā mapē.\n", - "ruleExample2": "bloķē piekļuvi failam ar nosaukumu Caddyfile darbības jomas saknē.", - "rules": "Noteikumi", - "rulesHelp": "Šeit varat definēt atļaušanas un aizliegšanas noteikumu kopu šim konkrētajam lietotājam. Bloķētie faili netiks rādīti sarakstos, un lietotājs tiem nevarēs piekļūt. Mēs atbalstām regulārās izteiksmes un ceļus attiecībā pret lietotāja darbības jomu.\n", - "scope": "Darbības joma", - "setDateFormat": "Iestatiet precīzu datuma formātu", - "settingsUpdated": "Iestatījumi atjaunināti!", - "shareDuration": "Kopīgošanas ilgums", - "shareManagement": "Kopīgošanas pārvaldība", - "shareDeleted": "Kopīgošana ir izdzēsta!", - "singleClick": "Failu un direktoriju atvēršanai izmantojiet vienus klikšķi", - "themes": { - "default": "Sistēmas noklusējums", - "dark": "Tumša", - "light": "Gaiša", - "title": "Tēma" - }, - "user": "Lietotājs", - "userCommands": "Komandas", - "userCommandsHelp": "Ar atstarpi atdalīts saraksts ar šim lietotājam pieejamajām komandām. Piemērs:\n", - "userCreated": "Lietotājs izveidots!", - "userDefaults": "Lietotāja noklusējuma iestatījumi", - "userDeleted": "Lietotājs izdzēsts!", - "userManagement": "Lietotāju pārvaldība", - "userUpdated": "Lietotājs atjaunināts!", - "username": "Lietotājvārds", - "users": "Lietotāji", - "currentPassword": "Your Current Password" - }, - "sidebar": { - "help": "Palīdzība", - "hugoNew": "Hugo Jauns", - "login": "Pieteikties", - "logout": "Atteikties", - "myFiles": "Mani faili", - "newFile": "Jauns fails", - "newFolder": "Jauna mape", - "preview": "Priekšskatījums", - "settings": "Iestatījumi", - "signup": "Reģistrēties", - "siteSettings": "Vietnes iestatījumi" - }, - "success": { - "linkCopied": "Saite nokopēta!" - }, - "time": { - "days": "Dienas", - "hours": "Stundas", - "minutes": "Minūtes", - "seconds": "Sekundes", - "unit": "Laika vienība" - } -} diff --git a/frontend/src/i18n/pt_PT.json b/frontend/src/i18n/pt_PT.json index f766ffc1ac..3795579b8b 100644 --- a/frontend/src/i18n/pt_PT.json +++ b/frontend/src/i18n/pt_PT.json @@ -46,12 +46,7 @@ "update": "Atualizar", "upload": "Enviar", "openFile": "Open file", - "discardChanges": "Discard", - "stopSearch": "Stop searching", - "saveChanges": "Save changes", - "editAsText": "Edit as Text", - "increaseFontSize": "Increase font size", - "decreaseFontSize": "Decrease font size" + "discardChanges": "Discard" }, "download": { "downloadFile": "Descarregar ficheiro", @@ -84,16 +79,7 @@ "sortByLastModified": "Ordenar pela última alteração", "sortByName": "Ordenar pelo nome", "sortBySize": "Ordenar pelo tamanho", - "noPreview": "Preview is not available for this file.", - "csvTooLarge": "CSV file is too large for preview (>5MB). Please download to view.", - "csvLoadFailed": "Failed to load CSV file.", - "showingRows": "Showing {count} row(s)", - "columnSeparator": "Column Separator", - "csvSeparators": { - "comma": "Comma (,)", - "semicolon": "Semicolon (;)", - "both": "Both (,) and (;)" - } + "noPreview": "Preview is not available for this file." }, "help": { "click": "selecionar pasta ou ficheiro", @@ -119,11 +105,7 @@ "submit": "Entrar", "username": "Nome de utilizador", "usernameTaken": "O nome de utilizador já está registado", - "wrongCredentials": "Dados errados", - "passwordTooShort": "Password must be at least {min} characters", - "logout_reasons": { - "inactivity": "You have been logged out due to inactivity." - } + "wrongCredentials": "Dados errados" }, "permanent": "Permanente", "prompts": { @@ -190,7 +172,6 @@ "video": "Vídeos" }, "settings": { - "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrador", "allowCommands": "Executar comandos", @@ -199,10 +180,9 @@ "allowPublish": "Publicar novas páginas e conteúdos", "allowSignup": "Permitir que os utilizadores criem contas", "avoidChanges": "(deixe em branco para evitar alterações)", - "hideLoginButton": "Hide the login button from public pages", - "branding": "Marca", - "brandingDirectoryPath": "Caminho da pasta de marca", - "brandingHelp": "Pode personalizar a aparência do seu Navegador de Ficheiros, alterar o nome, substituindo o logótipo, adicionando estilos personalizados e mesmo desativando links externos para o GitHub.\nPara mais informações sobre marca personalizada, por favor veja {0}.", + "branding": "Branding", + "brandingDirectoryPath": "Caminho da pasta branding", + "brandingHelp": "Pode personalizar a aparência do seu Navegador de Ficheiros, alterar o nome, substituindo o logotipo adicionando estilos personalizados e mesmo desativando links externos para o GitHub.\nPara mais informações sobre branding personalizado, por favor verifique {0}.", "changePassword": "Alterar palavra-passe", "commandRunner": "Execução de comandos", "commandRunnerHelp": "Aqui pode definir comandos que são executados nos eventos nomeados. Tem de escrever um por linha. As variáveis de ambiente {0} e {1} estarão disponíveis, sendo {0} relativo a {1}. Para mais informações sobre esta funcionalidade e as variáveis de ambiente, por favor verifique {2}.", @@ -276,8 +256,7 @@ "userManagement": "Gestão de utilizadores", "username": "Nome de utilizador", "users": "Utilizadores", - "userUpdated": "Utilizador atualizado!", - "currentPassword": "Your Current Password" + "userUpdated": "Utilizador atualizado!" }, "sidebar": { "help": "Ajuda", diff --git a/frontend/src/i18n/ru_RU.json b/frontend/src/i18n/ru_RU.json index 84bf7ec52c..677fa33881 100644 --- a/frontend/src/i18n/ru_RU.json +++ b/frontend/src/i18n/ru_RU.json @@ -46,12 +46,7 @@ "unarchive": "Разархивировать", "update": "Обновить", "upload": "Загрузить", - "discardChanges": "Отказаться", - "stopSearch": "Stop searching", - "saveChanges": "Сохранить", - "editAsText": "Редактировать как текст", - "increaseFontSize": "Увеличить размер шрифта", - "decreaseFontSize": "Уменьшить размер шрифта" + "discardChanges": "Отказаться" }, "download": { "downloadFile": "Скачать файл", @@ -86,20 +81,11 @@ "metadata": "Метаданные", "multipleSelectionEnabled": "Мультивыбор включен", "name": "Имя", + "noPreview": "Preview is not available for this file.", "size": "Размер", "sortByLastModified": "Сортировка по дате изменения", "sortByName": "Сортировка по имени", - "sortBySize": "Сортировка по размеру", - "noPreview": "Предварительный просмотр для этого файла недоступен.", - "csvTooLarge": "Этот CSV файл слишком большой для предпросмотра (>5 МБ). Скачайте и откройте его локально.", - "csvLoadFailed": "Не удалось загрузить этот CSV.", - "showingRows": "Отображается {count} строк(а)", - "columnSeparator": "Разделитель столбцов", - "csvSeparators": { - "comma": "Запятая (,)", - "semicolon": "Точка с запятой (;)", - "both": "Оба варианта — (,) и (;)" - } + "sortBySize": "Сортировка по размеру" }, "help": { "click": "выбрать файл или каталог", @@ -125,11 +111,7 @@ "submit": "Войти", "username": "Имя пользователя", "usernameTaken": "Данное имя пользователя уже занято", - "wrongCredentials": "Неверные данные", - "passwordTooShort": "Пароль должен состоять как минимум из {min} символов", - "logout_reasons": { - "inactivity": "Сессия завершена после долгого отсутствия." - } + "wrongCredentials": "Неверные данные для входа" }, "permanent": "Постоянный", "prompts": { @@ -194,15 +176,13 @@ "video": "Видео" }, "settings": { - "aceEditorTheme": "Тема редактора Ace", "admin": "Админ", "administrator": "Администратор", "allowCommands": "Запуск команд", "allowEdit": "Редактирование, переименование и удаление файлов или каталогов", "allowNew": "Создание новых файлов или каталогов", "allowPublish": "Публикация новых записей и страниц", - "allowSignup": "Разрешить пользователям регистрироваться", - "hideLoginButton": "Спрятать кнопку входа с публичных страниц", + "allowSignup": "Разрешать пользователям регистрироваться", "avoidChanges": "(оставьте поле пустым, чтобы избежать изменений)", "branding": "Брендинг", "brandingDirectoryPath": "Путь к каталогу брендов", @@ -212,7 +192,7 @@ "commandRunnerHelp": "Здесь вы можете установить команды, которые будут выполняться в указанных событиях. Вы должны указать по одной команде в каждой строке. Переменные среды {0} и {1} будут доступны, будучи {0} относительно {1}. Дополнительные сведения об этой функции и доступных переменных среды см. здесь {2}.", "commandsUpdated": "Команды обновлены!", "createUserDir": "Автоматическое создание домашнего каталога пользователя при добавлении нового пользователя", - "minimumPasswordLength": "Минимальная длина пароля", + "minimumPasswordLength": "Minimum password length", "tusUploads": "Загруженные файлы", "tusUploadsHelp": " File Browser поддерживает загрузку файлов по частям, что позволяет работать в сетях низкого качества.", "tusUploadsChunkSize": "Указывает максимальный размер запроса (мелкие загрузки пойдут напрямую). Вы можете ввести простое целое число, обозначающее размер ввода в байтах, или строку, например 10MB, 1GB и т. д.", @@ -280,8 +260,7 @@ "userManagement": "Управление пользователями", "username": "Имя пользователя", "users": "Пользователи", - "userUpdated": "Пользователь изменён!", - "currentPassword": "Your Current Password" + "userUpdated": "Пользователь изменён!" }, "sidebar": { "help": "Помощь", diff --git a/frontend/src/i18n/zh_CN.json b/frontend/src/i18n/zh_CN.json index 8696c02fed..46b511cf99 100644 --- a/frontend/src/i18n/zh_CN.json +++ b/frontend/src/i18n/zh_CN.json @@ -47,12 +47,7 @@ "update": "更新", "upload": "上传", "openFile": "打开文件", - "discardChanges": "放弃更改", - "stopSearch": "Stop searching", - "saveChanges": "保存更改", - "editAsText": "以文本形式编辑", - "increaseFontSize": "增大字体大小", - "decreaseFontSize": "减小字体大小" + "discardChanges": "放弃更改" }, "download": { "downloadFile": "下载文件", @@ -87,20 +82,11 @@ "metadata": "元数据", "multipleSelectionEnabled": "多选模式已开启", "name": "名称", + "noPreview": "此文件暂时不支持预览。", "size": "大小", "sortByLastModified": "按最后修改时间排序", "sortByName": "按名称排序", - "sortBySize": "按大小排序", - "noPreview": "此文件无法预览。", - "csvTooLarge": "CSV文件大到无法预览(>5MB)。请下载查看。", - "csvLoadFailed": "加载 CSV 文件失败。", - "showingRows": "正在显示 {count} 行", - "columnSeparator": "列分隔符", - "csvSeparators": { - "comma": "逗号 (,)", - "semicolon": "分号 (;)", - "both": "逗号 (,) 和分号 (;)" - } + "sortBySize": "按大小排序" }, "help": { "click": "选择文件或文件夹", @@ -126,11 +112,7 @@ "submit": "登录", "username": "用户名", "usernameTaken": "用户名已经被使用", - "wrongCredentials": "用户名或密码错误", - "passwordTooShort": "密码必须至少包含 {min} 个字符", - "logout_reasons": { - "inactivity": "由于未活动,您已登出。" - } + "wrongCredentials": "用户名或密码错误" }, "permanent": "永久", "prompts": { @@ -207,7 +189,6 @@ "video": "视频" }, "settings": { - "aceEditorTheme": "Ace编辑器主题", "admin": "管理员", "administrator": "管理员", "allowCommands": "执行命令(Shell 命令)", @@ -215,7 +196,6 @@ "allowNew": "创建新文件和文件夹", "allowPublish": "发布新的帖子与页面", "allowSignup": "允许用户注册", - "hideLoginButton": "从公开页面隐藏登录按钮", "avoidChanges": "(留空以避免更改)", "branding": "品牌", "brandingDirectoryPath": "品牌信息文件夹路径", @@ -293,8 +273,7 @@ "userManagement": "用户管理", "username": "用户名", "users": "用户", - "userUpdated": "用户已更新!", - "currentPassword": "Your Current Password" + "userUpdated": "用户已更新!" }, "sidebar": { "help": "帮助", diff --git a/frontend/src/stores/auth.ts b/frontend/src/stores/auth.ts index c33db87a78..459141ad0c 100644 --- a/frontend/src/stores/auth.ts +++ b/frontend/src/stores/auth.ts @@ -7,11 +7,9 @@ export const useAuthStore = defineStore("auth", { state: (): { user: IUser | null; jwt: string; - logoutTimer: number | null; } => ({ user: null, jwt: "", - logoutTimer: null, }), getters: { // user and jwt getter removed, no longer needed @@ -39,8 +37,5 @@ export const useAuthStore = defineStore("auth", { clearUser() { this.$reset(); }, - setLogoutTimer(logoutTimer: number | null) { - this.logoutTimer = logoutTimer; - }, }, }); diff --git a/frontend/src/stores/contextMenu.ts b/frontend/src/stores/contextMenu.ts new file mode 100644 index 0000000000..a8ac86c602 --- /dev/null +++ b/frontend/src/stores/contextMenu.ts @@ -0,0 +1,17 @@ +import { defineStore } from "pinia"; + +export const useContextMenuStore = defineStore("context-menu", { + state: (): { + position: ContextMenuPosition | null; + } => ({ + position: null, + }), + actions: { + show(x: number, y: number) { + this.position = { x, y }; + }, + hide() { + this.position = null; + }, + }, +}); diff --git a/frontend/src/stores/layout.ts b/frontend/src/stores/layout.ts index 372fca06e8..faf8bca721 100644 --- a/frontend/src/stores/layout.ts +++ b/frontend/src/stores/layout.ts @@ -41,7 +41,6 @@ export const useLayoutStore = defineStore("layout", { prompt: value, confirm: null, action: undefined, - saveAction: undefined, props: null, close: null, }); @@ -52,7 +51,6 @@ export const useLayoutStore = defineStore("layout", { prompt: value.prompt, confirm: value?.confirm, action: value?.action, - saveAction: value?.saveAction, props: value?.props, close: value?.close, }); diff --git a/frontend/src/types/contextMenu.d.ts b/frontend/src/types/contextMenu.d.ts new file mode 100644 index 0000000000..41e531a3ac --- /dev/null +++ b/frontend/src/types/contextMenu.d.ts @@ -0,0 +1,4 @@ +interface ContextMenuPosition { + x: number; + y: number; +} diff --git a/frontend/src/types/layout.d.ts b/frontend/src/types/layout.d.ts index a5c3f160d0..b625cc070d 100644 --- a/frontend/src/types/layout.d.ts +++ b/frontend/src/types/layout.d.ts @@ -2,7 +2,6 @@ interface PopupProps { prompt: string; confirm?: any; action?: PopupAction; - saveAction?: () => void; props?: any; close?: (() => Promise) | null; } diff --git a/frontend/src/types/settings.d.ts b/frontend/src/types/settings.d.ts index 18672bdf71..90ca6ae754 100644 --- a/frontend/src/types/settings.d.ts +++ b/frontend/src/types/settings.d.ts @@ -1,11 +1,9 @@ interface ISettings { signup: boolean; createUserDir: boolean; - hideLoginButton: boolean; minimumPasswordLength: number; userHomeBasePath: string; defaults: SettingsDefaults; - authMethod: string; rules: any[]; branding: SettingsBranding; tus: SettingsTus; @@ -18,13 +16,11 @@ interface SettingsDefaults { locale: string; viewMode: ViewModeType; singleClick: boolean; - redirectAfterCopyMove: boolean; sorting: Sorting; perm: Permissions; commands: any[]; hideDotfiles: boolean; dateFormat: boolean; - aceEditorTheme: string; } interface SettingsBranding { diff --git a/frontend/src/types/user.d.ts b/frontend/src/types/user.d.ts index 317f1e43a6..b81806fcab 100644 --- a/frontend/src/types/user.d.ts +++ b/frontend/src/types/user.d.ts @@ -10,11 +10,9 @@ interface IUser { lockPassword: boolean; hideDotfiles: boolean; singleClick: boolean; - redirectAfterCopyMove: boolean; dateFormat: boolean; viewMode: ViewModeType; sorting?: Sorting; - aceEditorTheme: string; } type ViewModeType = "list" | "mosaic" | "mosaic gallery"; @@ -31,7 +29,6 @@ interface IUserForm { lockPassword?: boolean; hideDotfiles?: boolean; singleClick?: boolean; - redirectAfterCopyMove?: boolean; dateFormat?: boolean; } diff --git a/frontend/src/utils/auth.ts b/frontend/src/utils/auth.ts index e75714f241..b868d90f9f 100644 --- a/frontend/src/utils/auth.ts +++ b/frontend/src/utils/auth.ts @@ -2,9 +2,8 @@ import { useAuthStore } from "@/stores/auth"; import router from "@/router"; import type { JwtPayload } from "jwt-decode"; import { jwtDecode } from "jwt-decode"; -import { authMethod, baseURL, noAuth, logoutPage } from "./constants"; +import { baseURL, noAuth } from "./constants"; import { StatusError } from "@/api/utils"; -import { setSafeTimeout } from "@/api/utils"; export function parseToken(token: string) { // falsy or malformed jwt will throw InvalidTokenError @@ -17,24 +16,6 @@ export function parseToken(token: string) { const authStore = useAuthStore(); authStore.jwt = token; authStore.setUser(data.user); - - // proxy auth with custom logout subject to unknown external timeout - if (logoutPage !== "/login" && authMethod === "proxy") { - console.warn("idle timeout disabled with proxy auth and custom logout"); - return; - } - - if (authStore.logoutTimer) { - clearTimeout(authStore.logoutTimer); - } - - const expiresAt = new Date(data.exp! * 1000); - const timeout = expiresAt.getTime() - Date.now(); - authStore.setLogoutTimer( - setSafeTimeout(() => { - logout("inactivity"); - }, timeout) - ); } export async function validateLogin() { @@ -107,15 +88,11 @@ export async function signup(username: string, password: string) { }); if (res.status !== 200) { - const body = await res.text(); - throw new StatusError( - body || `${res.status} ${res.statusText}`, - res.status - ); + throw new StatusError(`${res.status} ${res.statusText}`, res.status); } } -export function logout(reason?: string) { +export function logout() { document.cookie = "auth=; Max-Age=0; Path=/; SameSite=Strict;"; const authStore = useAuthStore(); @@ -124,18 +101,7 @@ export function logout(reason?: string) { localStorage.setItem("jwt", ""); if (noAuth) { window.location.reload(); - } else if (logoutPage !== "/login") { - document.location.href = `${logoutPage}`; } else { - if (typeof reason === "string" && reason.trim() !== "") { - router.push({ - path: "/login", - query: { "logout-reason": reason }, - }); - } else { - router.push({ - path: "/login", - }); - } + router.push({ path: "/login" }); } } diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts index da8b1badbd..36e712572a 100644 --- a/frontend/src/utils/constants.ts +++ b/frontend/src/utils/constants.ts @@ -14,7 +14,6 @@ const quotaExists: boolean = window.FileBrowser.QuotaExists; const noAuth: boolean = window.FileBrowser.NoAuth; const authMethod = window.FileBrowser.AuthMethod; const authLogoutURL: string = window.FileBrowser.AuthLogoutURL; -const logoutPage: string = window.FileBrowser.LogoutPage; const loginPage: boolean = window.FileBrowser.LoginPage; const theme: UserTheme = window.FileBrowser.Theme; const enableThumbs: boolean = window.FileBrowser.EnableThumbs; @@ -23,7 +22,6 @@ const enableExec: boolean = window.FileBrowser.EnableExec; const tusSettings = window.FileBrowser.TusSettings; const origin = window.location.origin; const tusEndpoint = `/api/tus`; -const hideLoginButton = window.FileBrowser.HideLoginButton; export { name, @@ -41,7 +39,6 @@ export { noAuth, authMethod, authLogoutURL, - logoutPage, loginPage, theme, enableThumbs, @@ -50,5 +47,4 @@ export { tusSettings, origin, tusEndpoint, - hideLoginButton, }; diff --git a/frontend/src/utils/csv.ts b/frontend/src/utils/csv.ts deleted file mode 100644 index c03731e7c2..0000000000 --- a/frontend/src/utils/csv.ts +++ /dev/null @@ -1,64 +0,0 @@ -export interface CsvData { - headers: string[]; - rows: string[][]; -} - -/** - * Parse CSV content into headers and rows - * Supports quoted fields and handles commas within quotes - */ -export function parseCSV( - content: string, - columnSeparator: Array -): CsvData { - if (!content || content.trim().length === 0) { - return { headers: [], rows: [] }; - } - - const lines = content.split(/\r?\n/); - const result: string[][] = []; - - for (const line of lines) { - if (line.trim().length === 0) continue; - - const row: string[] = []; - let currentField = ""; - let inQuotes = false; - - for (let i = 0; i < line.length; i++) { - const char = line[i]; - const nextChar = line[i + 1]; - - if (char === '"') { - if (inQuotes && nextChar === '"') { - // Escaped quote - currentField += '"'; - i++; // Skip next quote - } else { - // Toggle quote state - inQuotes = !inQuotes; - } - } else if (columnSeparator.includes(char) && !inQuotes) { - // Field separator - row.push(currentField); - currentField = ""; - } else { - currentField += char; - } - } - - // Add the last field - row.push(currentField); - result.push(row); - } - - if (result.length === 0) { - return { headers: [], rows: [] }; - } - - // First row is headers - const headers = result[0]; - const rows = result.slice(1); - - return { headers, rows }; -} diff --git a/frontend/src/utils/event.ts b/frontend/src/utils/event.ts new file mode 100644 index 0000000000..a8c990fec7 --- /dev/null +++ b/frontend/src/utils/event.ts @@ -0,0 +1,23 @@ +export function eventPosition(event: MouseEvent) { + let posx = 0; + let posy = 0; + + if (event.pageX || event.pageY) { + posx = event.pageX; + posy = event.pageY; + } else if (event.clientX || event.clientY) { + posx = + event.clientX + + document.body.scrollLeft + + document.documentElement.scrollLeft; + posy = + event.clientY + + document.body.scrollTop + + document.documentElement.scrollTop; + } + + return { + x: posx, + y: posy, + }; +} diff --git a/frontend/src/utils/theme.ts b/frontend/src/utils/theme.ts index 0244b0447b..8058356a55 100644 --- a/frontend/src/utils/theme.ts +++ b/frontend/src/utils/theme.ts @@ -1,6 +1,4 @@ import { theme } from "./constants"; -import "ace-builds"; -import { themesByName } from "ace-builds/src-noconflict/ext-themelist"; export const getTheme = (): UserTheme => { return (document.documentElement.className as UserTheme) || theme; @@ -34,17 +32,3 @@ export const getMediaPreference = (): UserTheme => { return "light"; } }; - -export const getEditorTheme = (themeName: string) => { - if (!themeName.startsWith("ace/theme/")) { - themeName = `ace/theme/${themeName}`; - } - const themeKey = themeName.replace("ace/theme/", ""); - if (themesByName[themeKey] !== undefined) { - return themeName; - } else if (getTheme() === "dark") { - return "ace/theme/twilight"; - } else { - return "ace/theme/chrome"; - } -}; diff --git a/frontend/src/views/Files.vue b/frontend/src/views/Files.vue index 8952f2097d..5001659fa8 100644 --- a/frontend/src/views/Files.vue +++ b/frontend/src/views/Files.vue @@ -69,12 +69,6 @@ const currentView = computed(() => { if (fileStore.req.isDir) { return FileListing; - } else if (fileStore.req.extension.toLowerCase() === ".csv") { - // CSV files use Preview for table view, unless ?edit=true - if (route.query.edit === "true") { - return Editor; - } - return Preview; } else if ( fileStore.req.type === "text" || fileStore.req.type === "textImmutable" diff --git a/frontend/src/views/Layout.vue b/frontend/src/views/Layout.vue index 5a91bee58e..e0f5411f90 100644 --- a/frontend/src/views/Layout.vue +++ b/frontend/src/views/Layout.vue @@ -17,6 +17,8 @@ /> + + @@ -26,10 +28,12 @@ import { useAuthStore } from "@/stores/auth"; import { useLayoutStore } from "@/stores/layout"; import { useFileStore } from "@/stores/file"; import { useUploadStore } from "@/stores/upload"; +import { useContextMenuStore } from "@/stores/contextMenu"; import Sidebar from "@/components/Sidebar.vue"; import Prompts from "@/components/prompts/Prompts.vue"; import Shell from "@/components/Shell.vue"; import UploadFiles from "@/components/prompts/UploadFiles.vue"; +import ContextMenu from "@/components/files/ContextMenu.vue"; import { enableExec } from "@/utils/constants"; import { computed, watch } from "vue"; import { useRoute } from "vue-router"; @@ -38,6 +42,7 @@ const layoutStore = useLayoutStore(); const authStore = useAuthStore(); const fileStore = useFileStore(); const uploadStore = useUploadStore(); +const contextMenuStore = useContextMenuStore(); const route = useRoute(); const sentPercent = computed(() => @@ -47,8 +52,14 @@ const sentPercent = computed(() => watch(route, () => { fileStore.selected = []; fileStore.multiple = false; + contextMenuStore.hide(); if (layoutStore.currentPromptName !== "success") { layoutStore.closeHovers(); } }); + +const contextMenuVisible = computed( + (): boolean => + (fileStore.isListing || false) && contextMenuStore.position !== null +); diff --git a/frontend/src/views/Login.vue b/frontend/src/views/Login.vue index c7f64a5bbc..5804789af8 100644 --- a/frontend/src/views/Login.vue +++ b/frontend/src/views/Login.vue @@ -3,9 +3,6 @@
File Browser

{{ name }}

-

- {{ t(`login.logout_reasons.${reason}`) }} -

{{ error }}
(createMode.value = !createMode.value); const $showError = inject("$showError")!; -const reason = route.query["logout-reason"] ?? null; - const submit = async (event: Event) => { event.preventDefault(); event.stopPropagation(); @@ -112,13 +107,6 @@ const submit = async (event: Event) => { error.value = t("login.usernameTaken"); } else if (e.status === 403) { error.value = t("login.wrongCredentials"); - } else if (e.status === 400) { - const match = e.message.match(/minimum length is (\d+)/); - if (match) { - error.value = t("login.passwordTooShort", { min: match[1] }); - } else { - error.value = e.message; - } } else { $showError(e); } diff --git a/frontend/src/views/Share.vue b/frontend/src/views/Share.vue index efe9d528b8..668a817417 100644 --- a/frontend/src/views/Share.vue +++ b/frontend/src/views/Share.vue @@ -304,7 +304,7 @@ import { pub as api } from "@/api"; import { filesize } from "@/utils"; import dayjs from "dayjs"; import { Base64 } from "js-base64"; -import { createURL } from "@/api/utils"; + import HeaderBar from "@/components/header/HeaderBar.vue"; import Action from "@/components/header/Action.vue"; import Breadcrumbs from "@/components/Breadcrumbs.vue"; @@ -357,11 +357,14 @@ const icon = computed(() => { const link = computed(() => (req.value ? api.getDownloadURL(req.value) : "")); const raw = computed(() => { - if (!req.value || !req.value.items[fileStore.selected[0]]) return ""; - return createURL( - `api/public/dl/${hash.value}${req.value.items[fileStore.selected[0]].path}`, - { token: token.value } - ); + return req.value + ? req.value.items[fileStore.selected[0]].url.replace( + /share/, + "api/public/dl" + ) + + "?token=" + + token.value + : ""; }); const inlineLink = computed(() => req.value ? api.getDownloadURL(req.value, true) : "" diff --git a/frontend/src/views/files/Editor.vue b/frontend/src/views/files/Editor.vue index 58f0d52451..3408fb9779 100644 --- a/frontend/src/views/files/Editor.vue +++ b/frontend/src/views/files/Editor.vue @@ -1,5 +1,5 @@