diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 827fbfd1..4c1605e6 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,5 +1 @@ -# These owners will be the default owners for everything in the repo. -# Unless a later match takes precedence, @o1egl will be requested for -# review when someone opens a pull request. - -* @o1egl @hacdias +* @filebrowser/maintainers diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..846b08f8 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,115 @@ +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 new file mode 100644 index 00000000..5b21ccba --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,52 @@ +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/pr-lint.yaml b/.github/workflows/lint-pr.yaml similarity index 92% rename from .github/workflows/pr-lint.yaml rename to .github/workflows/lint-pr.yaml index f2878cf2..f00f4415 100644 --- a/.github/workflows/pr-lint.yaml +++ b/.github/workflows/lint-pr.yaml @@ -13,10 +13,10 @@ permissions: jobs: main: - name: Validate PR title + name: Validate Title runs-on: ubuntu-latest steps: - - uses: amannn/action-semantic-pull-request@v5 + - uses: amannn/action-semantic-pull-request@v6 id: lint_pr_title env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -43,4 +43,4 @@ jobs: uses: marocchino/sticky-pull-request-comment@v2 with: header: pr-title-lint-error - delete: true \ No newline at end of file + delete: true diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml deleted file mode 100644 index 99d3bc64..00000000 --- a/.github/workflows/main.yaml +++ /dev/null @@ -1,105 +0,0 @@ -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" - - # release - release: - runs-on: ubuntu-latest - needs: [lint, test] - if: startsWith(github.event.ref, 'refs/tags/v') - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - uses: actions/setup-go@v5 - with: - go-version: '1.23' - - 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" - - name: Set up QEMU - uses: docker/setup-qemu-action@v1 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - name: Build frontend - run: make build-frontend - - name: Login to Docker Hub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v2 - with: - version: latest - args: release --clean - env: - GITHUB_TOKEN: ${{ secrets.GH_PAT }} diff --git a/.github/workflows/site-pr.yml b/.github/workflows/site-pr.yml deleted file mode 100644 index c3075c93..00000000 --- a/.github/workflows/site-pr.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Build Site - -on: - pull_request: - paths: - - 'www' - - '*.md' - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Build site - run: make site diff --git a/.github/workflows/site-publish.yml b/.github/workflows/site-publish.yml deleted file mode 100644 index e3618a99..00000000 --- a/.github/workflows/site-publish.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Build and Deploy Site - -on: - push: - branches: - - master - -jobs: - deploy: - permissions: - contents: read - deployments: write - pull-requests: write - runs-on: ubuntu-latest - timeout-minutes: 5 - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - - name: Build site - run: make site - - - name: Deploy to Cloudflare Pages - uses: cloudflare/wrangler-action@v3 - with: - apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - command: pages deploy www/public --project-name=${{ secrets.CLOUDFLARE_PROJECT_NAME }} - gitHubToken: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 47f34732..b9ee1fe0 100644 --- a/.gitignore +++ b/.gitignore @@ -35,10 +35,5 @@ 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 901a89b8..8819f48b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,132 +1,14 @@ version: "2" linters: - # inverted configuration with `default: all` and `disable` is not scalable during updates of golangci-lint - default: none + default: standard 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: false - 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: - - 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 + - comments paths: - frontend/ diff --git a/.goreleaser.yml b/.goreleaser.yml index 57b7b44a..be192ef8 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -17,6 +17,7 @@ builds: - linux - windows - freebsd + - openbsd goarch: - amd64 - "386" @@ -30,6 +31,12 @@ builds: ignore: - goos: darwin goarch: "386" + # Experimental, may not work properly + - goos: openbsd + goarch: riscv64 + # Broken as of Go 1.24, deprecated as of Go 1.26 + - goos: windows + goarch: arm - goos: freebsd goarch: arm diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f754b6f..0f49dca9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,387 @@ # Changelog -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. +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.55.0](https://github.com/filebrowser/filebrowser/compare/v2.54.0...v2.55.0) (2026-01-18) + + +### Features + +* added cut, copy, paste and show command palette functions in header ([#5648](https://github.com/filebrowser/filebrowser/issues/5648)) ([785b7ab](https://github.com/filebrowser/filebrowser/commit/785b7abb7ba7a86cc0deae1052c319ff714c222c)) +* update translations ([#5677](https://github.com/filebrowser/filebrowser/issues/5677)) ([e7ea1ad](https://github.com/filebrowser/filebrowser/commit/e7ea1ad27d3d17e249489d3338be40bfea15e2a1)) + + +### Bug Fixes + +* prevent context menu clicks from clearing file selection ([#5681](https://github.com/filebrowser/filebrowser/issues/5681)) ([59ca0c3](https://github.com/filebrowser/filebrowser/commit/59ca0c340afc7774747c70ede9a5a5a3c9349d6b)) +* request current password when deleting users ([#5667](https://github.com/filebrowser/filebrowser/issues/5667)) ([cfa6c58](https://github.com/filebrowser/filebrowser/commit/cfa6c5864e5e7673aa9f3180e4964e0db92cc4da)) +* retain file selection when closing the editor ([#5693](https://github.com/filebrowser/filebrowser/issues/5693)) ([4094fb3](https://github.com/filebrowser/filebrowser/commit/4094fb359babac70e88d0ed4bfe3bd100744aad6)) + +## [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)) + +### [2.42.5](https://github.com/filebrowser/filebrowser/compare/v2.42.4...v2.42.5) (2025-08-16) + + +### Bug Fixes + +* "new folder" button not working in the move and copy popup ([#5368](https://github.com/filebrowser/filebrowser/issues/5368)) ([3107ae4](https://github.com/filebrowser/filebrowser/commit/3107ae41475ae9383c3af414d25a133e549f8087)) + +### [2.42.4](https://github.com/filebrowser/filebrowser/compare/v2.42.3...v2.42.4) (2025-08-16) + + +### Bug Fixes + +* add libcap to Dockerfile.s6 ([342b239](https://github.com/filebrowser/filebrowser/commit/342b239ac6f4af2453d5f7aa27f7f0093024dd72)) + +### [2.42.3](https://github.com/filebrowser/filebrowser/compare/v2.42.2...v2.42.3) (2025-08-09) + + +### Bug Fixes + +* add missing CLI flags for user management ([#5351](https://github.com/filebrowser/filebrowser/issues/5351)) ([cd51a59](https://github.com/filebrowser/filebrowser/commit/cd51a59e72c72560fce7bcc9b12aaf02646b699c)) + +### [2.42.2](https://github.com/filebrowser/filebrowser/compare/v2.42.1...v2.42.2) (2025-08-06) + + +### Bug Fixes + +* show file upload errors ([06e8713](https://github.com/filebrowser/filebrowser/commit/06e8713fa55065d38f02499d3e8d39fc86926cab)) + + +### Refactorings + +* upload progress calculation ([#5350](https://github.com/filebrowser/filebrowser/issues/5350)) ([c14cf86](https://github.com/filebrowser/filebrowser/commit/c14cf86f8304e01d804e01a7eef5ea093627ef37)) + +### [2.42.1](https://github.com/filebrowser/filebrowser/compare/v2.42.0...v2.42.1) (2025-07-31) + + +### Features + +* Translate frontend/src/i18n/en.json in sk ([14ee054](https://github.com/filebrowser/filebrowser/commit/14ee0543599f2ec73b7f5d2dbd8415f47fe592aa)) +* Translate frontend/src/i18n/en.json in vi ([75baf7c](https://github.com/filebrowser/filebrowser/commit/75baf7ce337671a1045f897ba4a19967a31b1aec)) + + +### Bug Fixes + +* directory mode on config init ([4ff6347](https://github.com/filebrowser/filebrowser/commit/4ff634715543b65878943273dff70f340167900b)) ## [2.42.0](https://github.com/filebrowser/filebrowser/compare/v2.41.0...v2.42.0) (2025-07-27) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1cfc8a92..311a2fd7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,11 +15,23 @@ 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 are using [Node.js](https://nodejs.org/en/) on the frontend to manage the build process. The steps to build it are: +We use [Node.js](https://nodejs.org/en/) on the frontend to manage the build process. Prepare the frontend environment: ```bash # From the root of the repo, go to frontend/ @@ -27,37 +39,62 @@ cd frontend # Install the dependencies pnpm install +``` -# Build the frontend +If you just want to develop the backend, you can create a static build of the frontend: + +```bash pnpm run build ``` -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: +If you want to develop the frontend, start a development server which watches 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 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: +First prepare the backend environment by downloading all required dependencies: ```bash go mod download ``` -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 File Browser is just like any other Go program: +You can now build or run File Browser as any other Go project: ```bash +# Build go build + +# Run +go 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: +## Documentation + +We rely on Docker to abstract all the dependencies required for building the documentation. + +To build the documentation to `www/public`: ```bash -go build -tags dev +task docs +``` + +To start a local server on port `8000` to view the built documentation: + +```bash +task docs:serve +``` + +## Release + +To make a release, just run: + +```bash +task release ``` ## Translations diff --git a/Dockerfile b/Dockerfile index 8bd825da..92bbe1d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ ## Multistage build: First stage fetches dependencies -FROM alpine:3.22 AS fetcher +FROM alpine:3.23 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 7e281ad7..8b363cb3 100644 --- a/Dockerfile.s6 +++ b/Dockerfile.s6 @@ -1,7 +1,7 @@ -FROM ghcr.io/linuxserver/baseimage-alpine:3.22 +FROM ghcr.io/linuxserver/baseimage-alpine:3.23 RUN apk update && \ - apk --no-cache add ca-certificates mailcap jq + apk --no-cache add ca-certificates mailcap jq libcap # Make user and create necessary directories RUN mkdir -p /config /database /srv && \ @@ -12,7 +12,8 @@ COPY filebrowser /bin/filebrowser COPY docker/common/ / COPY docker/s6/ / -RUN chown -R abc:abc /bin/filebrowser /defaults healthcheck.sh +RUN chown -R abc:abc /bin/filebrowser /defaults healthcheck.sh && \ + setcap 'cap_net_bind_service=+ep' /bin/filebrowser # Define healthcheck script HEALTHCHECK --start-period=2s --interval=5s --timeout=3s CMD /healthcheck.sh diff --git a/Makefile b/Makefile deleted file mode 100644 index 10ec3ea9..00000000 --- a/Makefile +++ /dev/null @@ -1,88 +0,0 @@ -include common.mk -include tools.mk - -LDFLAGS += -X "$(MODULE)/version.Version=$(VERSION)" -X "$(MODULE)/version.CommitSHA=$(VERSION_HASH)" - -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: - -.PHONY: build -build: | build-frontend build-backend ## Build binary - -.PHONY: build-frontend -build-frontend: ## Build frontend - $Q cd frontend && pnpm install --frozen-lockfile && pnpm run build - -.PHONY: build-backend -build-backend: ## Build backend - $Q $(go) build -ldflags '$(LDFLAGS)' -o . - -.PHONY: test -test: | test-frontend test-backend ## Run all tests - -.PHONY: test-frontend -test-frontend: ## Run frontend tests - $Q cd frontend && pnpm install --frozen-lockfile && pnpm run typecheck - -.PHONY: test-backend -test-backend: ## Run backend tests - $Q $(go) test -v ./... - -.PHONY: lint -lint: lint-frontend lint-backend ## Run all linters - -.PHONY: lint-frontend -lint-frontend: ## Run frontend linters - $Q cd frontend && pnpm install --frozen-lockfile && pnpm run lint - -.PHONY: lint-backend -lint-backend: | $(golangci-lint) ## Run backend linters - $Q $(golangci-lint) run -v - -.PHONY: lint-commits -lint-commits: $(commitlint) ## Run commit linters - $Q ./scripts/commitlint.sh - -fmt: $(goimports) ## Format source files - $Q $(goimports) -local $(MODULE) -w $$(find . -type f -name '*.go' -not -path "./vendor/*") - -clean: clean-tools ## Clean - -## Release: - -.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 94ec1cef..1e15d592 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,10 @@

- +

-[![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) +[![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) [![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. @@ -16,18 +14,12 @@ Documentation on how to install, configure, and contribute to this project is ho ## Project Status -> [!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. +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: -[issues]: https://github.com/filebrowser/filebrowser/issues -[discussions]: https://github.com/filebrowser/filebrowser/discussions +- 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. ## Contributing diff --git a/Taskfile.yml b/Taskfile.yml new file mode 100644 index 00000000..378e3409 --- /dev/null +++ b/Taskfile.yml @@ -0,0 +1,83 @@ +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 849a923d..0c5efac5 100644 --- a/auth/hook.go +++ b/auth/hook.go @@ -8,9 +8,10 @@ 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" @@ -102,7 +103,7 @@ func (a *HookAuth) RunCommand() (string, error) { command[i] = os.Expand(arg, envMapping) } - cmd := exec.Command(command[0], command[1:]...) //nolint:gosec + cmd := exec.Command(command[0], command[1:]...) 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() @@ -123,7 +124,7 @@ func (a *HookAuth) GetValues(s string) { s = strings.ReplaceAll(s, "\r\n", "\n") // iterate input lines - for _, val := range strings.Split(s, "\n") { + for val := range strings.Lines(s) { v := strings.SplitN(val, "=", 2) // skips non key and value format @@ -145,7 +146,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 } @@ -157,16 +158,17 @@ 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, - 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, + 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, } u = a.GetUser(d) @@ -218,13 +220,14 @@ 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), + 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), Sorting: files.Sorting{ Asc: a.Fields.GetBoolean("user.sorting.asc", d.Sorting.Asc), By: a.Fields.GetString("user.sorting.by", d.Sorting.By), @@ -250,6 +253,7 @@ var validHookFields = []string{ "user.locale", "user.viewMode", "user.singleClick", + "user.redirectAfterCopyMove", "user.sorting.by", "user.sorting.asc", "user.commands", @@ -266,13 +270,7 @@ var validHookFields = []string{ // IsValid checks if the provided field is on the valid fields list func (hf *hookFields) IsValid(field string) bool { - for _, val := range validHookFields { - if field == val { - return true - } - } - - return false + return slices.Contains(validHookFields, field) } // GetString returns the string value or provided default diff --git a/auth/json.go b/auth/json.go index 81f430b3..2284dc7f 100644 --- a/auth/json.go +++ b/auth/json.go @@ -14,6 +14,10 @@ import ( // MethodJSONAuth is used to identify json auth. const MethodJSONAuth settings.AuthMethod = "json" +// dummyHash is used to prevent user enumeration timing attacks. +// It MUST be a valid bcrypt hash. +const dummyHash = "$2a$10$O4mEMeOL/nit6zqe.WQXauLRbRlzb3IgLHsa26Pf0N/GiU9b.wK1m" + type jsonCred struct { Password string `json:"password"` Username string `json:"username"` @@ -40,7 +44,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) //nolint:govet + ok, err := a.ReCaptcha.Ok(cred.ReCaptcha) if err != nil { return nil, err @@ -52,7 +56,17 @@ func (a JSONAuth) Auth(r *http.Request, usr users.Store, _ *settings.Settings, s } u, err := usr.Get(srv.Root, cred.Username) - if err != nil || !users.CheckPwd(cred.Password, u.Password) { + + hash := dummyHash + if err == nil { + hash = u.Password + } + + if !users.CheckPwd(cred.Password, hash) { + return nil, os.ErrPermission + } + + if err != nil { return nil, os.ErrPermission } diff --git a/auth/proxy.go b/auth/proxy.go index 301aa292..3f4a627c 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 new file mode 100644 index 00000000..9a533bfc Binary files /dev/null and b/branding/banner.png differ diff --git a/branding/banner.svg b/branding/banner.svg new file mode 100644 index 00000000..85de7525 --- /dev/null +++ b/branding/banner.svg @@ -0,0 +1 @@ +File Browser diff --git a/branding/icon.png b/branding/icon.png new file mode 100644 index 00000000..ba267bc0 Binary files /dev/null and b/branding/icon.png differ diff --git a/branding/icon.svg b/branding/icon.svg new file mode 100644 index 00000000..df65444a --- /dev/null +++ b/branding/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/branding/logo.png b/branding/logo.png new file mode 100644 index 00000000..22225604 Binary files /dev/null and b/branding/logo.png differ diff --git a/branding/logo.svg b/branding/logo.svg new file mode 100644 index 00000000..dac88ae2 --- /dev/null +++ b/branding/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/cmd/cmd_test.go b/cmd/cmd_test.go new file mode 100644 index 00000000..e4b45c47 --- /dev/null +++ b/cmd/cmd_test.go @@ -0,0 +1,35 @@ +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 a4d17061..a209b83f 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: python(func(_ *cobra.Command, args []string, d *pythonData) error { - s, err := d.store.Settings.Get() + RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { + s, err := st.Settings.Get() if err != nil { return err } command := strings.Join(args[1:], " ") s.Commands[args[0]] = append(s.Commands[args[0]], command) - err = d.store.Settings.Save(s) + err = st.Settings.Save(s) if err != nil { return err } printEvents(s.Commands) return nil - }, pythonConfig{}), + }, storeOptions{}), } diff --git a/cmd/cmds_ls.go b/cmd/cmds_ls.go index fa901a56..694be178 100644 --- a/cmd/cmds_ls.go +++ b/cmd/cmds_ls.go @@ -14,12 +14,13 @@ var cmdsLsCmd = &cobra.Command{ Short: "List all commands for each event", Long: `List all commands for each event.`, Args: cobra.NoArgs, - RunE: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { - s, err := d.store.Settings.Get() + RunE: withStore(func(cmd *cobra.Command, _ []string, st *store) error { + s, err := st.Settings.Get() if err != nil { return err } - evt, err := getString(cmd.Flags(), "event") + + evt, err := cmd.Flags().GetString("event") if err != nil { return err } @@ -32,6 +33,7 @@ var cmdsLsCmd = &cobra.Command{ show["after_"+evt] = s.Commands["after_"+evt] printEvents(show) } + return nil - }, pythonConfig{}), + }, storeOptions{}), } diff --git a/cmd/cmds_rm.go b/cmd/cmds_rm.go index 34089388..861f495f 100644 --- a/cmd/cmds_rm.go +++ b/cmd/cmds_rm.go @@ -35,8 +35,8 @@ including 'index_end'.`, return nil }, - RunE: python(func(_ *cobra.Command, args []string, d *pythonData) error { - s, err := d.store.Settings.Get() + RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { + s, err := st.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 = d.store.Settings.Save(s) + err = st.Settings.Save(s) if err != nil { return err } printEvents(s.Commands) return nil - }, pythonConfig{}), + }, storeOptions{}), } diff --git a/cmd/config.go b/cmd/config.go index 5ce54ad9..5b3314ed 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -2,7 +2,7 @@ package cmd import ( "encoding/json" - nerrors "errors" + "errors" "fmt" "os" "strings" @@ -12,7 +12,7 @@ import ( "github.com/spf13/pflag" "github.com/filebrowser/filebrowser/v2/auth" - "github.com/filebrowser/filebrowser/v2/errors" + fberrors "github.com/filebrowser/filebrowser/v2/errors" "github.com/filebrowser/filebrowser/v2/settings" ) @@ -30,14 +30,22 @@ var configCmd = &cobra.Command{ func addConfigFlags(flags *pflag.FlagSet) { addServerFlags(flags) addUserFlags(flags) + flags.BoolP("signup", "s", false, "allow users to signup") - 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.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.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.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") @@ -49,14 +57,13 @@ func addConfigFlags(flags *pflag.FlagSet) { flags.String("branding.files", "", "path to directory with images and custom styles") flags.Bool("branding.disableExternal", false, "disable external links such as GitHub links") flags.Bool("branding.disableUsedPercentage", false, "disable used disk percentage graph") - // NB: these are string so they can be presented as octal in the help text - // as that's the conventional representation for modes in Unix. - flags.String("file-mode", fmt.Sprintf("%O", settings.DefaultFileMode), "Mode bits that new files are created with") - flags.String("dir-mode", fmt.Sprintf("%O", settings.DefaultDirMode), "Mode bits that new directories are created with") + + flags.Uint64("tus.chunkSize", settings.DefaultTusChunkSize, "the tus chunk size") + flags.Uint16("tus.retryCount", settings.DefaultTusRetryCount, "the tus retry count") } func getAuthMethod(flags *pflag.FlagSet, defaults ...interface{}) (settings.AuthMethod, map[string]interface{}, error) { - methodStr, err := getString(flags, "auth.method") + methodStr, err := flags.GetString("auth.method") if err != nil { return "", nil, err } @@ -87,17 +94,17 @@ func getAuthMethod(flags *pflag.FlagSet, defaults ...interface{}) (settings.Auth } func getProxyAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) { - header, err := getString(flags, "auth.header") + header, err := flags.GetString("auth.header") if err != nil { return nil, err } - if header == "" { + if header == "" && defaultAuther != nil { header = defaultAuther["header"].(string) } if header == "" { - return nil, nerrors.New("you must set the flag 'auth.header' for method 'proxy'") + return nil, errors.New("you must set the flag 'auth.header' for method 'proxy'") } return &auth.ProxyAuth{Header: header}, nil @@ -109,15 +116,17 @@ func getNoAuth() auth.Auther { func getJSONAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) { jsonAuth := &auth.JSONAuth{} - host, err := getString(flags, "recaptcha.host") + host, err := flags.GetString("recaptcha.host") if err != nil { return nil, err } - key, err := getString(flags, "recaptcha.key") + + key, err := flags.GetString("recaptcha.key") if err != nil { return nil, err } - secret, err := getString(flags, "recaptcha.secret") + + secret, err := flags.GetString("recaptcha.secret") if err != nil { return nil, err } @@ -145,17 +154,16 @@ func getJSONAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (au } func getHookAuth(flags *pflag.FlagSet, defaultAuther map[string]interface{}) (auth.Auther, error) { - command, err := getString(flags, "auth.command") + command, err := flags.GetString("auth.command") if err != nil { return nil, err } - if command == "" { command = defaultAuther["command"].(string) } if command == "" { - return nil, nerrors.New("you must set the flag 'auth.command' for method 'hook'") + return nil, errors.New("you must set the flag 'auth.command' for method 'hook'") } return &auth.HookAuth{Command: command}, nil @@ -178,7 +186,7 @@ func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (settings. case auth.MethodHookAuth: auther, err = getHookAuth(flags, defaultAuther) default: - return "", nil, errors.ErrInvalidAuthMethod + return "", nil, fberrors.ErrInvalidAuthMethod } if err != nil { @@ -192,10 +200,13 @@ 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) @@ -203,6 +214,7 @@ 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) @@ -212,18 +224,32 @@ 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) @@ -233,6 +259,7 @@ 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, "", " ") @@ -242,3 +269,123 @@ 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 + + // 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) + } + + 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 39b1f664..b8d2f48f 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: python(func(_ *cobra.Command, _ []string, d *pythonData) error { - set, err := d.store.Settings.Get() + RunE: withStore(func(_ *cobra.Command, _ []string, st *store) error { + set, err := st.Settings.Get() if err != nil { return err } - ser, err := d.store.Settings.GetServer() + ser, err := st.Settings.GetServer() if err != nil { return err } - auther, err := d.store.Auth.Get(set.AuthMethod) + auther, err := st.Auth.Get(set.AuthMethod) if err != nil { return err } return printSettings(ser, set, auther) - }, pythonConfig{}), + }, storeOptions{}), } diff --git a/cmd/config_export.go b/cmd/config_export.go index 9877fb63..b19c10b6 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: python(func(_ *cobra.Command, args []string, d *pythonData) error { - settings, err := d.store.Settings.Get() + RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { + settings, err := st.Settings.Get() if err != nil { return err } - server, err := d.store.Settings.GetServer() + server, err := st.Settings.GetServer() if err != nil { return err } - auther, err := d.store.Auth.Get(settings.AuthMethod) + auther, err := st.Auth.Get(settings.AuthMethod) if err != nil { return err } @@ -42,5 +42,5 @@ and imported again with 'config import' command.`, return err } return nil - }, pythonConfig{}), + }, storeOptions{}), } diff --git a/cmd/config_import.go b/cmd/config_import.go index 7763517d..9a838721 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: python(func(_ *cobra.Command, args []string, d *pythonData) error { + RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { var key []byte var err error - if d.hadDB { - settings, settingErr := d.store.Settings.Get() + if st.databaseExisted { + settings, settingErr := st.Settings.Get() if settingErr != nil { return settingErr } @@ -53,13 +53,17 @@ 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 = d.store.Settings.Save(file.Settings) + err = st.Settings.Save(file.Settings) if err != nil { return err } - err = d.store.Settings.SaveServer(file.Server) + err = st.Settings.SaveServer(file.Server) if err != nil { return err } @@ -98,13 +102,13 @@ The path must be for a json or yaml file.`, return autherErr } - err = d.store.Auth.Save(auther) + err = st.Auth.Save(auther) if err != nil { return err } return printSettings(file.Server, file.Settings, auther) - }, pythonConfig{allowNoDB: true}), + }, storeOptions{allowsNoDatabase: true}), } func getAuther(sample auth.Auther, data interface{}) (interface{}, error) { diff --git a/cmd/config_init.go b/cmd/config_init.go index ea756d0b..359d02a3 100644 --- a/cmd/config_init.go +++ b/cmd/config_init.go @@ -22,152 +22,31 @@ 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: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { - defaults := settings.UserDefaults{} + RunE: withStore(func(cmd *cobra.Command, _ []string, st *store) error { flags := cmd.Flags() - err := getUserDefaults(flags, &defaults, true) - if err != nil { - return err - } - authMethod, auther, err := getAuthentication(flags) + + // Initialize config + s := &settings.Settings{Key: generateKey()} + ser := &settings.Server{} + + // Fill config with options + auther, err := getSettings(flags, s, ser, nil, true) if err != nil { return err } - key := generateKey() - - signup, err := getBool(flags, "signup") + // Save updated config + err = st.Settings.Save(s) if err != nil { return err } - createUserDir, err := getBool(flags, "create-user-dir") + err = st.Settings.SaveServer(ser) if err != nil { return err } - minLength, err := getUint(flags, "minimum-password-length") - if err != nil { - return err - } - - shell, err := getString(flags, "shell") - if err != nil { - return err - } - - brandingName, err := getString(flags, "branding.name") - if err != nil { - return err - } - - brandingDisableExternal, err := getBool(flags, "branding.disableExternal") - if err != nil { - return err - } - - brandingDisableUsedPercentage, err := getBool(flags, "branding.disableUsedPercentage") - if err != nil { - return err - } - - brandingTheme, err := getString(flags, "branding.theme") - if err != nil { - return err - } - - brandingFiles, err := getString(flags, "branding.files") - if err != nil { - return err - } - - s := &settings.Settings{ - Key: key, - Signup: signup, - CreateUserDir: createUserDir, - MinimumPasswordLength: minLength, - Shell: convertCmdStrToCmdArray(shell), - AuthMethod: authMethod, - 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, "file-mode") - if err != nil { - return err - } - - address, err := getString(flags, "address") - if err != nil { - return err - } - - socket, err := getString(flags, "socket") - if err != nil { - return err - } - - root, err := getString(flags, "root") - if err != nil { - return err - } - - baseURL, err := getString(flags, "baseurl") - if err != nil { - return err - } - - tlsKey, err := getString(flags, "key") - if err != nil { - return err - } - - cert, err := getString(flags, "cert") - if err != nil { - return err - } - - port, err := getString(flags, "port") - if err != nil { - return err - } - - log, err := getString(flags, "log") - if err != nil { - return err - } - - ser := &settings.Server{ - Address: 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) + err = st.Auth.Save(auther) if err != nil { return err } @@ -178,5 +57,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) - }, pythonConfig{noDB: true}), + }, storeOptions{expectsNoDatabase: true}), } diff --git a/cmd/config_set.go b/cmd/config_set.go index a7f66902..df357a02 100644 --- a/cmd/config_set.go +++ b/cmd/config_set.go @@ -2,7 +2,6 @@ package cmd import ( "github.com/spf13/cobra" - "github.com/spf13/pflag" ) func init() { @@ -16,105 +15,47 @@ 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: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { + RunE: withStore(func(cmd *cobra.Command, _ []string, st *store) error { flags := cmd.Flags() - set, err := d.store.Settings.Get() + + // Read existing config + set, err := st.Settings.Get() if err != nil { return err } - ser, err := d.store.Settings.GetServer() + ser, err := st.Settings.GetServer() if err != nil { return err } - 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 "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) - } - }) - + auther, err := st.Auth.Get(set.AuthMethod) if err != nil { return err } - err = getUserDefaults(flags, &set.Defaults, false) + // Get updated config + auther, err = getSettings(flags, set, ser, auther, false) if err != nil { return err } - // read the defaults - auther, err := d.store.Auth.Get(set.AuthMethod) + // Save updated config + err = st.Auth.Save(auther) if err != nil { return err } - // check if there are new flags for existing auth method - set.AuthMethod, auther, err = getAuthentication(flags, hasAuth, set, auther) + err = st.Settings.Save(set) if err != nil { return err } - 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) + err = st.Settings.SaveServer(ser) if err != nil { return err } return printSettings(ser, set, auther) - }, pythonConfig{}), + }, storeOptions{}), } diff --git a/cmd/docs.go b/cmd/docs.go index 5f26daf9..d65a29be 100644 --- a/cmd/docs.go +++ b/cmd/docs.go @@ -3,36 +3,18 @@ package cmd import ( "bytes" "fmt" - "io" "os" - "path/filepath" - "sort" + "path" + "regexp" "strings" "github.com/spf13/cobra" - "github.com/spf13/pflag" + "github.com/spf13/cobra/doc" ) func init() { rootCmd.AddCommand(docsCmd) - 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) + docsCmd.Flags().String("out", "www/docs/cli", "directory to write the docs to") } var docsCmd = &cobra.Command{ @@ -40,115 +22,61 @@ var docsCmd = &cobra.Command{ Hidden: true, Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, _ []string) error { - dir, err := getString(cmd.Flags(), "path") + outputDir, err := cmd.Flags().GetString("out") if err != nil { return err } - err = generateDocs(rootCmd, dir) + tempDir, err := os.MkdirTemp(os.TempDir(), "filebrowser-docs-") if err != nil { return err } - names := []string{} + defer os.RemoveAll(tempDir) - 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 - } - - names = append(names, info.Name()) - return nil + err = doc.GenMarkdownTreeCustom(cmd.Root(), tempDir, func(_ string) string { + return "" + }, func(s string) string { + return s }) if err != nil { return err } - 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) + entries, err := os.ReadDir(tempDir) 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) -} - -func generateMarkdown(cmd *cobra.Command, w io.Writer) error { - cmd.InitDefaultHelpCmd() - cmd.InitDefaultHelpFlag() - - buf := new(bytes.Buffer) - name := cmd.CommandPath() - - short := cmd.Short - long := cmd.Long - if long == "" { - long = short - } - - buf.WriteString("---\ndescription: " + short + "\n---\n\n") - buf.WriteString("# " + name + "\n\n") - buf.WriteString("## Synopsis\n\n") - buf.WriteString(long + "\n\n") - - if cmd.Runnable() { - _, _ = fmt.Fprintf(buf, "```\n%s\n```\n\n", cmd.UseLine()) - } - - if cmd.Example != "" { - buf.WriteString("## Examples\n\n") - _, _ = fmt.Fprintf(buf, "```\n%s\n```\n\n", cmd.Example) - } - - printOptions(buf, cmd) - _, err := buf.WriteTo(w) - return err -} - -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") - } + headerRegex := regexp.MustCompile(`(?m)^(##)(.*)$`) + linkRegex := regexp.MustCompile(`\(filebrowser(.*)\.md\)`) + + fmt.Println("Generated Documents:") + + for _, entry := range entries { + srcPath := path.Join(tempDir, entry.Name()) + dstPath := path.Join(outputDir, strings.ReplaceAll(entry.Name(), "_", "-")) + + data, err := os.ReadFile(srcPath) + if err != nil { + return err + } + + 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")) + + err = os.WriteFile(dstPath, data, 0666) + if err != nil { + return err + } + + fmt.Println("- " + dstPath) + } + + return nil + }, } diff --git a/cmd/root.go b/cmd/root.go index 286f6343..981eec4f 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -13,20 +13,17 @@ 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" - v "github.com/spf13/viper" + "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" @@ -36,28 +33,67 @@ import ( ) var ( - cfgFile string + 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{} ) +// 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 := rootCmd.Flags() + // Flags available across the whole program persistent := rootCmd.PersistentFlags() - - persistent.StringVarP(&cfgFile, "config", "c", "", "config file path") + persistent.StringP("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 config") - flags.String("password", "", "hashed password for the first user when using quick config") + // Runtime flags for the root command + flags := rootCmd.Flags() + 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") 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") @@ -66,15 +102,13 @@ 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.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.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") } var rootCmd = &cobra.Command{ @@ -89,65 +123,60 @@ 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 specific command, all the flags you have available (except -"config" for the configuration file), can be given either through -environment variables or configuration files. +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. -If you don't set "config", it will look for a configuration file called -.filebrowser.{json, toml, yaml, yml} in the following directories: +If "--config" is not specified, File Browser will look for a configuration +file named .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 - -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. +- Flags +- Environment variables +- Configuration file +- Database values +- Defaults 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: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { - log.Println(cfgFile) - - if !d.hadDB { - err := quickSetup(cmd.Flags(), *d) + RunE: withViperAndStore(func(_ *cobra.Command, _ []string, v *viper.Viper, st *store) error { + if !st.databaseExisted { + err := quickSetup(v, st.Storage) if err != nil { return err } } // build img service - workersCount, err := cmd.Flags().GetInt("img-processors") - if err != nil { - return err - } - if workersCount < 1 { + imgWorkersCount := v.GetInt("imageProcessors") + if imgWorkersCount < 1 { return errors.New("image resize workers count could not be < 1") } - imgSvc := img.New(workersCount) + imageService := img.New(imgWorkersCount) var fileCache diskcache.Interface = diskcache.NewNoOp() - cacheDir, err := cmd.Flags().GetString("cache-dir") - if err != nil { - return err - } + cacheDir := v.GetString("cacheDir") if cacheDir != "" { - if err := os.MkdirAll(cacheDir, 0700); err != nil { //nolint:govet + if err := os.MkdirAll(cacheDir, 0700); err != nil { return fmt.Errorf("can't make directory %s: %w", cacheDir, err) } fileCache = diskcache.New(afero.NewOsFs(), cacheDir) } - server, err := getRunParams(cmd.Flags(), d.store) + server, err := getServerSettings(v, st.Storage) if err != nil { return err } @@ -169,16 +198,13 @@ user created with the credentials from options "username" and "password".`, if err != nil { return err } - socketPerm, err := cmd.Flags().GetUint32("socket-perm") //nolint:govet - if err != nil { - return err - } + socketPerm := v.GetUint32("socketPerm") 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) //nolint:govet + cer, err := tls.LoadX509KeyPair(server.TLSCert, server.TLSKey) if err != nil { return err } @@ -201,7 +227,7 @@ user created with the credentials from options "username" and "password".`, panic(err) } - handler, err := fbhttp.NewHandler(imgSvc, fileCache, d.store, server, assetsFs) + handler, err := fbhttp.NewHandler(imageService, fileCache, st.Storage, server, assetsFs) if err != nil { return err } @@ -233,7 +259,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) //nolint:mnd + shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 10*time.Second) defer shutdownRelease() if err := srv.Shutdown(shutdownCtx); err != nil { @@ -241,66 +267,82 @@ user created with the credentials from options "username" and "password".`, } log.Println("Graceful shutdown complete.") - switch sig { - case syscall.SIGHUP: - d.err = fbErrors.ErrSighup - case syscall.SIGINT: - d.err = fbErrors.ErrSigint - case syscall.SIGQUIT: - d.err = fbErrors.ErrSigquit - case syscall.SIGTERM: - d.err = fbErrors.ErrSigTerm - } - - return d.err - }, pythonConfig{allowNoDB: true}), + return nil + }, storeOptions{allowsNoDatabase: true}), } -//nolint:gocyclo -func getRunParams(flags *pflag.FlagSet, st *storage.Storage) (*settings.Server, error) { +func getServerSettings(v *viper.Viper, st *storage.Storage) (*settings.Server, error) { server, err := st.Settings.GetServer() if err != nil { return nil, err } - if val, set := getStringParamB(flags, "root"); set { - server.Root = val - } - - if val, set := getStringParamB(flags, "baseurl"); set { - server.BaseURL = val - } - - if val, set := getStringParamB(flags, "log"); set { - server.Log = val - } - isSocketSet := false isAddrSet := false - if val, set := getStringParamB(flags, "address"); set { - server.Address = val - isAddrSet = isAddrSet || set + if v.IsSet("address") { + server.Address = v.GetString("address") + isAddrSet = true } - if val, set := getStringParamB(flags, "port"); set { - server.Port = val - isAddrSet = isAddrSet || set + if v.IsSet("log") { + server.Log = v.GetString("log") } - if val, set := getStringParamB(flags, "key"); set { - server.TLSKey = val - isAddrSet = isAddrSet || set + if v.IsSet("port") { + server.Port = v.GetString("port") + isAddrSet = true } - if val, set := getStringParamB(flags, "cert"); set { - server.TLSCert = val - isAddrSet = isAddrSet || set + if v.IsSet("cert") { + server.TLSCert = v.GetString("cert") + isAddrSet = true } - if val, set := getStringParamB(flags, "socket"); set { - server.Socket = val - isSocketSet = isSocketSet || set + if v.IsSet("key") { + server.TLSKey = v.GetString("key") + isAddrSet = true + } + + if v.IsSet("root") { + server.Root = v.GetString("root") + } + + if v.IsSet("socket") { + server.Socket = v.GetString("socket") + isSocketSet = true + } + + 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") + } + + if v.IsSet("disableThumbnails") { + server.EnableThumbnails = !v.GetBool("disableThumbnails") + } + + if v.IsSet("disablePreviewResize") { + server.ResizePreview = !v.GetBool("disablePreviewResize") + } + + if v.IsSet("disableTypeDetectionByHeader") { + server.TypeDetectionByHeader = !v.GetBool("disableTypeDetectionByHeader") + } + + if v.IsSet("disableImageResolutionCalc") { + server.ImageResolutionCal = !v.GetBool("disableImageResolutionCalc") + } + + if v.IsSet("disableExec") { + server.EnableExec = !v.GetBool("disableExec") } if isAddrSet && isSocketSet { @@ -312,18 +354,6 @@ func getRunParams(flags *pflag.FlagSet, st *storage.Storage) (*settings.Server, 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") @@ -331,71 +361,9 @@ func getRunParams(flags *pflag.FlagSet, st *storage.Storage) (*settings.Server, log.Println("WARNING: read https://github.com/filebrowser/filebrowser/issues/5199") } - if val, set := getStringParamB(flags, "token-expiration-time"); set { - server.TokenExpirationTime = 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": @@ -414,19 +382,22 @@ func setupLog(logMethod string) { } } -func quickSetup(flags *pflag.FlagSet, d pythonData) error { +func quickSetup(v *viper.Viper, s *storage.Storage) 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", - SingleClick: false, + Scope: ".", + Locale: "en", + SingleClick: false, + RedirectAfterCopyMove: true, + AceEditorTheme: v.GetString("defaults.aceEditorTheme"), Perm: users.Permissions{ Admin: false, Execute: true, @@ -450,39 +421,45 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) error { } var err error - if _, noauth := getStringParamB(flags, "noauth"); noauth { + if v.GetBool("noauth") { set.AuthMethod = auth.MethodNoAuth - err = d.store.Auth.Save(&auth.NoAuth{}) + err = s.Auth.Save(&auth.NoAuth{}) } else { set.AuthMethod = auth.MethodJSONAuth - err = d.store.Auth.Save(&auth.JSONAuth{}) + err = s.Auth.Save(&auth.JSONAuth{}) } if err != nil { return err } - err = d.store.Settings.Save(set) + err = s.Settings.Save(set) if err != nil { return err } ser := &settings.Server{ - 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"), + 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"), } - err = d.store.Settings.SaveServer(ser) + err = s.Settings.SaveServer(ser) if err != nil { return err } - username := getStringParam(flags, "username") - password := getStringParam(flags, "password") + username := v.GetString("username") + password := v.GetString("password") if password == "" { var pwd string @@ -513,35 +490,5 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) error { set.Defaults.Apply(user) user.Perm.Admin = true - 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() - } + return s.Users.Save(user) } diff --git a/cmd/rule_rm.go b/cmd/rule_rm.go index 26e801ae..8ed8f151 100644 --- a/cmd/rule_rm.go +++ b/cmd/rule_rm.go @@ -40,7 +40,7 @@ including 'index_end'.`, return nil }, - RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { + RunE: withStore(func(cmd *cobra.Command, args []string, st *store) 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 d.store.Users.Save(u) + return st.Users.Save(u) } global := func(s *settings.Settings) error { s.Rules = append(s.Rules[:i], s.Rules[f+1:]...) - return d.store.Settings.Save(s) + return st.Settings.Save(s) } - return runRules(d.store, cmd, user, global) - }, pythonConfig{}), + return runRules(st.Storage, cmd, user, global) + }, storeOptions{}), } diff --git a/cmd/rules.go b/cmd/rules.go index ffa5b1ae..bdb1d1cf 100644 --- a/cmd/rules.go +++ b/cmd/rules.go @@ -69,11 +69,12 @@ func runRules(st *storage.Storage, cmd *cobra.Command, usersFn func(*users.User) } func getUserIdentifier(flags *pflag.FlagSet) (interface{}, error) { - id, err := getUint(flags, "id") + id, err := flags.GetUint("id") if err != nil { return nil, err } - username, err := getString(flags, "username") + + username, err := flags.GetString("username") if err != nil { return nil, err } diff --git a/cmd/rules_add.go b/cmd/rules_add.go index 9d1f0cf9..3b34d940 100644 --- a/cmd/rules_add.go +++ b/cmd/rules_add.go @@ -21,15 +21,19 @@ 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: python(func(cmd *cobra.Command, args []string, d *pythonData) error { - allow, err := getBool(cmd.Flags(), "allow") + RunE: withStore(func(cmd *cobra.Command, args []string, st *store) error { + flags := cmd.Flags() + + allow, err := flags.GetBool("allow") if err != nil { return err } - regex, err := getBool(cmd.Flags(), "regex") + + regex, err := flags.GetBool("regex") if err != nil { return err } + exp := args[0] if regex { @@ -49,14 +53,14 @@ var rulesAddCmd = &cobra.Command{ user := func(u *users.User) error { u.Rules = append(u.Rules, rule) - return d.store.Users.Save(u) + return st.Users.Save(u) } global := func(s *settings.Settings) error { s.Rules = append(s.Rules, rule) - return d.store.Settings.Save(s) + return st.Settings.Save(s) } - return runRules(d.store, cmd, user, global) - }, pythonConfig{}), + return runRules(st.Storage, cmd, user, global) + }, storeOptions{}), } diff --git a/cmd/rules_ls.go b/cmd/rules_ls.go index 67a279dc..9aa073d0 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: python(func(cmd *cobra.Command, _ []string, d *pythonData) error { - return runRules(d.store, cmd, nil, nil) - }, pythonConfig{}), + RunE: withStore(func(cmd *cobra.Command, _ []string, st *store) error { + return runRules(st.Storage, cmd, nil, nil) + }, storeOptions{}), } diff --git a/cmd/upgrade.go b/cmd/upgrade.go deleted file mode 100644 index 7142b151..00000000 --- a/cmd/upgrade.go +++ /dev/null @@ -1,40 +0,0 @@ -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 a70b5fe4..66487862 100644 --- a/cmd/users.go +++ b/cmd/users.go @@ -30,13 +30,14 @@ 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\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%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, @@ -77,62 +78,72 @@ func addUserFlags(flags *pflag.FlagSet) { flags.String("locale", "en", "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 getViewMode(flags *pflag.FlagSet) (users.ViewMode, error) { - viewModeStr, err := getString(flags, "viewMode") +func getAndParseViewMode(flags *pflag.FlagSet) (users.ViewMode, error) { + viewModeStr, err := flags.GetString("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 { - var visitErr error + errs := []error{} + visit := func(flag *pflag.Flag) { - if visitErr != nil { - return - } var err error switch flag.Name { case "scope": - defaults.Scope, err = getString(flags, flag.Name) + defaults.Scope, err = flags.GetString(flag.Name) case "locale": - defaults.Locale, err = getString(flags, flag.Name) + defaults.Locale, err = flags.GetString(flag.Name) case "viewMode": - defaults.ViewMode, err = getViewMode(flags) + defaults.ViewMode, err = getAndParseViewMode(flags) case "singleClick": - defaults.SingleClick, err = getBool(flags, flag.Name) + 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) case "perm.admin": - defaults.Perm.Admin, err = getBool(flags, flag.Name) + defaults.Perm.Admin, err = flags.GetBool(flag.Name) case "perm.execute": - defaults.Perm.Execute, err = getBool(flags, flag.Name) + defaults.Perm.Execute, err = flags.GetBool(flag.Name) case "perm.create": - defaults.Perm.Create, err = getBool(flags, flag.Name) + defaults.Perm.Create, err = flags.GetBool(flag.Name) case "perm.rename": - defaults.Perm.Rename, err = getBool(flags, flag.Name) + defaults.Perm.Rename, err = flags.GetBool(flag.Name) case "perm.modify": - defaults.Perm.Modify, err = getBool(flags, flag.Name) + defaults.Perm.Modify, err = flags.GetBool(flag.Name) case "perm.delete": - defaults.Perm.Delete, err = getBool(flags, flag.Name) + defaults.Perm.Delete, err = flags.GetBool(flag.Name) case "perm.share": - defaults.Perm.Share, err = getBool(flags, flag.Name) + defaults.Perm.Share, err = flags.GetBool(flag.Name) case "perm.download": - defaults.Perm.Download, err = getBool(flags, flag.Name) + defaults.Perm.Download, err = flags.GetBool(flag.Name) case "commands": defaults.Commands, err = flags.GetStringSlice(flag.Name) case "sorting.by": - defaults.Sorting.By, err = getString(flags, flag.Name) + defaults.Sorting.By, err = flags.GetString(flag.Name) case "sorting.asc": - defaults.Sorting.Asc, err = getBool(flags, flag.Name) + defaults.Sorting.Asc, err = flags.GetBool(flag.Name) + case "hideDotfiles": + defaults.HideDotfiles, err = flags.GetBool(flag.Name) } + if err != nil { - visitErr = err + errs = append(errs, err) } } @@ -141,5 +152,6 @@ func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all } else { flags.Visit(visit) } - return visitErr + + return errors.Join(errs...) } diff --git a/cmd/users_add.go b/cmd/users_add.go index 9d763d3d..daf59aa3 100644 --- a/cmd/users_add.go +++ b/cmd/users_add.go @@ -16,12 +16,13 @@ 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: python(func(cmd *cobra.Command, args []string, d *pythonData) error { - s, err := d.store.Settings.Get() + RunE: withStore(func(cmd *cobra.Command, args []string, st *store) error { + flags := cmd.Flags() + s, err := st.Settings.Get() if err != nil { return err } - err = getUserDefaults(cmd.Flags(), &s.Defaults, false) + err = getUserDefaults(flags, &s.Defaults, false) if err != nil { return err } @@ -31,27 +32,36 @@ var usersAddCmd = &cobra.Command{ return err } - lockPassword, err := getBool(cmd.Flags(), "lockPassword") + user := &users.User{ + Username: args[0], + Password: password, + } + + user.LockPassword, err = flags.GetBool("lockPassword") if err != nil { return err } - user := &users.User{ - Username: args[0], - Password: password, - LockPassword: lockPassword, + user.DateFormat, err = flags.GetBool("dateFormat") + if err != nil { + return err + } + + user.HideDotfiles, err = flags.GetBool("hideDotfiles") + if err != nil { + return err } s.Defaults.Apply(user) - servSettings, err := d.store.Settings.GetServer() + servSettings, err := st.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 := d.store.Settings.Get() + s2, err := st.Settings.Get() if err != nil { return err } @@ -62,11 +72,11 @@ var usersAddCmd = &cobra.Command{ } user.Scope = userHome - err = d.store.Users.Save(user) + err = st.Users.Save(user) if err != nil { return err } printUsers([]*users.User{user}) return nil - }, pythonConfig{}), + }, storeOptions{}), } diff --git a/cmd/users_export.go b/cmd/users_export.go index d6009a37..9bbec6d8 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: python(func(_ *cobra.Command, args []string, d *pythonData) error { - list, err := d.store.Users.Gets("") + RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { + list, err := st.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 - }, pythonConfig{}), + }, storeOptions{}), } diff --git a/cmd/users_find.go b/cmd/users_find.go index 0dea071a..09bc8d47 100644 --- a/cmd/users_find.go +++ b/cmd/users_find.go @@ -26,7 +26,7 @@ var usersLsCmd = &cobra.Command{ RunE: findUsers, } -var findUsers = python(func(_ *cobra.Command, args []string, d *pythonData) error { +var findUsers = withStore(func(_ *cobra.Command, args []string, st *store) error { var ( list []*users.User user *users.User @@ -36,14 +36,14 @@ var findUsers = python(func(_ *cobra.Command, args []string, d *pythonData) erro if len(args) == 1 { username, id := parseUsernameOrID(args[0]) if username != "" { - user, err = d.store.Users.Get("", username) + user, err = st.Users.Get("", username) } else { - user, err = d.store.Users.Get("", id) + user, err = st.Users.Get("", id) } list = []*users.User{user} } else { - list, err = d.store.Users.Gets("") + list, err = st.Users.Gets("") } if err != nil { @@ -51,4 +51,4 @@ var findUsers = python(func(_ *cobra.Command, args []string, d *pythonData) erro } printUsers(list) return nil -}, pythonConfig{}) +}, storeOptions{}) diff --git a/cmd/users_import.go b/cmd/users_import.go index d20dca68..73effca6 100644 --- a/cmd/users_import.go +++ b/cmd/users_import.go @@ -25,7 +25,8 @@ 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: python(func(cmd *cobra.Command, args []string, d *pythonData) error { + RunE: withStore(func(cmd *cobra.Command, args []string, st *store) error { + flags := cmd.Flags() fd, err := os.Open(args[0]) if err != nil { return err @@ -45,13 +46,13 @@ list or set it to 0.`, } } - replace, err := getBool(cmd.Flags(), "replace") + replace, err := flags.GetBool("replace") if err != nil { return err } if replace { - oldUsers, userImportErr := d.store.Users.Gets("") + oldUsers, userImportErr := st.Users.Gets("") if userImportErr != nil { return userImportErr } @@ -62,20 +63,20 @@ list or set it to 0.`, } for _, user := range oldUsers { - err = d.store.Users.Delete(user.ID) + err = st.Users.Delete(user.ID) if err != nil { return err } } } - overwrite, err := getBool(cmd.Flags(), "overwrite") + overwrite, err := flags.GetBool("overwrite") if err != nil { return err } for _, user := range list { - onDB, err := d.store.Users.Get("", user.ID) + onDB, err := st.Users.Get("", user.ID) // User exists in DB. if err == nil { @@ -87,7 +88,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 := d.store.Users.Get("", user.Username); err == nil { //nolint:govet + if conflictuous, err := st.Users.Get("", user.Username); err == nil { return usernameConflictError(user.Username, conflictuous.ID, user.ID) } } @@ -97,13 +98,13 @@ list or set it to 0.`, user.ID = 0 } - err = d.store.Users.Save(user) + err = st.Users.Save(user) if err != nil { return err } } return nil - }, pythonConfig{}), + }, storeOptions{}), } func usernameConflictError(username string, originalID, newID uint) error { diff --git a/cmd/users_rm.go b/cmd/users_rm.go index 55b973f4..492a55c3 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: python(func(_ *cobra.Command, args []string, d *pythonData) error { + RunE: withStore(func(_ *cobra.Command, args []string, st *store) error { username, id := parseUsernameOrID(args[0]) var err error if username != "" { - err = d.store.Users.Delete(username) + err = st.Users.Delete(username) } else { - err = d.store.Users.Delete(id) + err = st.Users.Delete(id) } if err != nil { @@ -30,5 +30,5 @@ var usersRmCmd = &cobra.Command{ } fmt.Println("user deleted successfully") return nil - }, pythonConfig{}), + }, storeOptions{}), } diff --git a/cmd/users_update.go b/cmd/users_update.go index 624bfda8..e9a484fc 100644 --- a/cmd/users_update.go +++ b/cmd/users_update.go @@ -21,19 +21,20 @@ var usersUpdateCmd = &cobra.Command{ Long: `Updates an existing user. Set the flags for the options you want to change.`, Args: cobra.ExactArgs(1), - RunE: python(func(cmd *cobra.Command, args []string, d *pythonData) error { - username, id := parseUsernameOrID(args[0]) + RunE: withStore(func(cmd *cobra.Command, args []string, st *store) error { flags := cmd.Flags() - password, err := getString(flags, "password") - if err != nil { - return err - } - newUsername, err := getString(flags, "username") + username, id := parseUsernameOrID(args[0]) + password, err := flags.GetString("password") if err != nil { return err } - s, err := d.store.Settings.Get() + newUsername, err := flags.GetString("username") + if err != nil { + return err + } + + s, err := st.Settings.Get() if err != nil { return err } @@ -41,38 +42,50 @@ options you want to change.`, var ( user *users.User ) - if id != 0 { - user, err = d.store.Users.Get("", id) + user, err = st.Users.Get("", id) } else { - user, err = d.store.Users.Get("", username) + user, err = st.Users.Get("", username) } - if err != nil { return err } defaults := settings.UserDefaults{ - Scope: user.Scope, - Locale: user.Locale, - ViewMode: user.ViewMode, - SingleClick: user.SingleClick, - Perm: user.Perm, - Sorting: user.Sorting, - Commands: user.Commands, + Scope: user.Scope, + Locale: user.Locale, + ViewMode: user.ViewMode, + SingleClick: user.SingleClick, + RedirectAfterCopyMove: user.RedirectAfterCopyMove, + Perm: user.Perm, + Sorting: user.Sorting, + Commands: user.Commands, } + err = getUserDefaults(flags, &defaults, false) if err != nil { return err } + user.Scope = defaults.Scope 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 = getBool(flags, "lockPassword") + user.LockPassword, err = flags.GetBool("lockPassword") + if err != nil { + return err + } + + user.DateFormat, err = flags.GetBool("dateFormat") + if err != nil { + return err + } + + user.HideDotfiles, err = flags.GetBool("hideDotfiles") if err != nil { return err } @@ -88,11 +101,11 @@ options you want to change.`, } } - err = d.store.Users.Update(user) + err = st.Users.Update(user) if err != nil { return err } printUsers([]*users.User{user}) return nil - }, pythonConfig{}), + }, storeOptions{}), } diff --git a/cmd/utils.go b/cmd/utils.go index a4eb4d14..ee637fa3 100644 --- a/cmd/utils.go +++ b/cmd/utils.go @@ -12,51 +12,34 @@ 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" - yaml "gopkg.in/yaml.v2" + "github.com/spf13/viper" + yaml "gopkg.in/yaml.v3" "github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/storage" "github.com/filebrowser/filebrowser/v2/storage/bolt" ) -const dbPerms = 0640 +const databasePermissions = 0640 -func returnErr(err error) error { - if err != nil { - return err - } - return nil -} - -func getString(flags *pflag.FlagSet, flag string) (string, error) { - s, err := flags.GetString(flag) - return s, returnErr(err) -} - -func getMode(flags *pflag.FlagSet, flag string) (fs.FileMode, error) { - s, err := getString(flags, flag) +func getAndParseFileMode(flags *pflag.FlagSet, name string) (fs.FileMode, error) { + mode, err := flags.GetString(name) if err != nil { return 0, err } - b, err := strconv.ParseUint(s, 0, 32) + + b, err := strconv.ParseUint(mode, 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 { @@ -65,20 +48,6 @@ 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 { @@ -89,7 +58,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 { //nolint:govet + if err := os.MkdirAll(d, 0700); err != nil { return false, err } return false, nil @@ -99,42 +68,137 @@ func dbExists(path string) (bool, error) { return false, err } -func python(fn pythonFunc, cfg pythonConfig) cobraFunc { +// 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 { return func(cmd *cobra.Command, args []string) error { - data := &pythonData{hadDB: true} - - path := getStringParam(cmd.Flags(), "database") - absPath, err := filepath.Abs(path) + v, err := initViper(cmd) if err != nil { - panic(err) + return err } + + path, err := filepath.Abs(v.GetString("database")) + if err != nil { + return err + } + exists, err := dbExists(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")) + 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: " + absPath) - data.hadDB = exists - db, err := storm.Open(path, storm.BoltOptions(dbPerms, nil)) + log.Println("Using database: " + path) + + db, err := storm.Open(path, storm.BoltOptions(databasePermissions, nil)) if err != nil { return err } defer db.Close() - data.store, err = bolt.NewStorage(db) + + storage, err := bolt.NewStorage(db) if err != nil { return err } - return fn(cmd, args, data) + + store := &store{ + Storage: storage, + databaseExisted: exists, + } + + return fn(cmd, args, v, store) } } +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 deleted file mode 100644 index 23d00367..00000000 --- a/commitlint.config.js +++ /dev/null @@ -1,34 +0,0 @@ -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 deleted file mode 100644 index 206fc750..00000000 --- a/common.mk +++ /dev/null @@ -1,28 +0,0 @@ -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 cd5e27c7..b2979e4b 100644 --- a/diskcache/file_cache.go +++ b/diskcache/file_cache.go @@ -2,7 +2,7 @@ package diskcache import ( "context" - "crypto/sha1" //nolint:gosec + "crypto/sha1" "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() //nolint:gosec + hasher := sha1.New() _, _ = 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 31d58c8e..c6c750c0 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(t, ctx, fs, filepath.Join(cacheRoot, cachedFilePath), cache, key, value) + checkValue(ctx, t, fs, filepath.Join(cacheRoot, cachedFilePath), cache, key, value) // update existing key err = cache.Store(ctx, key, []byte(newValue)) require.NoError(t, err) - checkValue(t, ctx, fs, filepath.Join(cacheRoot, cachedFilePath), cache, key, newValue) + checkValue(ctx, t, 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(t *testing.T, ctx context.Context, fs afero.Fs, fileFullPath string, cache *FileCache, key, wantValue string) { //nolint:revive +func checkValue(ctx context.Context, t *testing.T, fs afero.Fs, fileFullPath string, cache *FileCache, key, wantValue string) { 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 e787ef87..cf7fb4ee 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 f8abee59..748354a8 100644 --- a/errors/errors.go +++ b/errors/errors.go @@ -1,40 +1,28 @@ -package errors +package fberrors 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") - 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") + 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") ) type ErrShortPassword struct { @@ -44,44 +32,3 @@ 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 8e27e549..2ba432dc 100644 --- a/files/file.go +++ b/files/file.go @@ -1,8 +1,8 @@ package files import ( - "crypto/md5" //nolint:gosec - "crypto/sha1" //nolint:gosec + "crypto/md5" + "crypto/sha1" "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" ) @@ -60,6 +60,7 @@ type FileOptions struct { Modify bool Expand bool ReadHeader bool + CalcImgRes bool Token string Checker rules.Checker Content bool @@ -90,13 +91,13 @@ func NewFileInfo(opts *FileOptions) (*FileInfo, error) { if opts.Expand { if file.IsDir { - if err := file.readListing(opts.Checker, opts.ReadHeader); err != nil { //nolint:govet + if err := file.readListing(opts.Checker, opts.ReadHeader, opts.CalcImgRes); err != nil { return nil, err } return file, nil } - err = file.detectType(opts.Modify, opts.Content, true) + err = file.detectType(opts.Modify, opts.Content, true, opts.CalcImgRes) if err != nil { return nil, err } @@ -168,7 +169,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 { @@ -183,7 +184,6 @@ func (i *FileInfo) Checksum(algo string) error { var h hash.Hash - //nolint:gosec switch algo { case "md5": h = md5.New() @@ -194,7 +194,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) @@ -219,7 +219,7 @@ func (i *FileInfo) RealPath() string { return i.Path } -func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error { +func (i *FileInfo) detectType(modify, saveContent, readHeader bool, calcImgRes bool) error { if IsNamedPipe(i.Mode) { i.Type = "blob" return nil @@ -250,11 +250,13 @@ func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error { return nil case strings.HasPrefix(mimetype, "image"): i.Type = "image" - resolution, err := calculateImageResolution(i.Fs, i.Path) - if err != nil { - log.Printf("Error calculating image resolution: %v", err) - } else { - i.Resolution = resolution + if calcImgRes { + 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"): @@ -388,7 +390,7 @@ func (i *FileInfo) addSubtitle(fPath string) { i.Subtitles = append(i.Subtitles, fPath) } -func (i *FileInfo) readListing(checker rules.Checker, readHeader bool) error { +func (i *FileInfo) readListing(checker rules.Checker, readHeader bool, calcImgRes bool) error { afs := &afero.Afero{Fs: i.Fs} dir, err := afs.ReadDir(i.Path) if err != nil { @@ -435,7 +437,7 @@ func (i *FileInfo) readListing(checker rules.Checker, readHeader bool) error { currentDir: dir, } - if !file.IsDir && strings.HasPrefix(mime.TypeByExtension(file.Extension), "image/") { + if !file.IsDir && strings.HasPrefix(mime.TypeByExtension(file.Extension), "image/") && calcImgRes { resolution, err := calculateImageResolution(file.Fs, file.Path) if err != nil { log.Printf("Error calculating resolution for image %s: %v", file.Path, err) @@ -452,7 +454,7 @@ func (i *FileInfo) readListing(checker rules.Checker, readHeader bool) error { if isInvalidLink { file.Type = "invalid_link" } else { - err := file.detectType(true, false, readHeader) + err := file.detectType(true, false, readHeader, calcImgRes) if err != nil { return err } diff --git a/files/mime.go b/files/mime.go index 33fd93bd..baa4d6d5 100644 --- a/files/mime.go +++ b/files/mime.go @@ -600,7 +600,6 @@ 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 01c523f0..7955822f 100644 --- a/frontend/assets.go +++ b/frontend/assets.go @@ -1,5 +1,4 @@ //go:build !dev -// +build !dev package frontend diff --git a/frontend/assets_dev.go b/frontend/assets_dev.go deleted file mode 100644 index 292cd1d0..00000000 --- a/frontend/assets_dev.go +++ /dev/null @@ -1,15 +0,0 @@ -//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 3b54dcdf..19308a95 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -12,7 +12,11 @@ - + @@ -35,6 +39,7 @@ DisableUsedPercentage: false, EnableExec: true, EnableThumbs: true, + LogoutPage: "", LoginPage: true, Name: "", NoAuth: false, diff --git a/frontend/package.json b/frontend/package.json index 680232c9..44144b3a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -4,37 +4,35 @@ "private": true, "type": "module", "engines": { - "node": ">=22.0.0", - "pnpm": ">=9.0.0" + "node": ">=24.0.0", + "pnpm": ">=10.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.tsc.json --noEmit", + "typecheck": "vue-tsc -p ./tsconfig.app.json --noEmit", "lint": "eslint src/", "lint:fix": "eslint --fix src/", - "format": "prettier --write .", - "test": "playwright test" + "format": "prettier --write ." }, "dependencies": { "@chenfengyuan/vue-number-input": "^2.0.1", - "@vueuse/core": "^12.5.0", - "@vueuse/integrations": "^12.5.0", + "@vueuse/core": "^14.0.0", + "@vueuse/integrations": "^14.0.0", "ace-builds": "^1.43.2", - "core-js": "^3.44.0", "dayjs": "^1.11.13", "dompurify": "^3.2.6", "epubjs": "^0.3.93", - "filesize": "^10.1.1", + "filesize": "^11.0.13", "js-base64": "^3.7.7", "jwt-decode": "^4.0.0", "lodash-es": "^4.17.21", - "marked": "^15.0.6", + "marked": "^17.0.0", "material-icons": "^1.13.14", "normalize.css": "^8.0.1", - "pinia": "^2.3.1", - "pretty-bytes": "^6.1.1", + "pinia": "^3.0.4", + "pretty-bytes": "^7.1.0", "qrcode.vue": "^3.6.0", "tus-js-client": "^4.3.1", "utif": "^3.1.0", @@ -50,30 +48,28 @@ "vue-toastification": "^2.0.0-rc.5" }, "devDependencies": { - "@intlify/unplugin-vue-i18n": "^6.0.8", - "@playwright/test": "^1.54.1", - "@tsconfig/node22": "^22.0.2", + "@intlify/unplugin-vue-i18n": "^11.0.1", + "@tsconfig/node24": "^24.0.2", "@types/lodash-es": "^4.17.12", - "@types/node": "^22.10.10", + "@types/node": "^24.10.1", "@typescript-eslint/eslint-plugin": "^8.37.0", - "@vitejs/plugin-legacy": "^6.0.0", - "@vitejs/plugin-vue": "^5.0.4", + "@vitejs/plugin-legacy": "^7.2.1", + "@vitejs/plugin-vue": "^6.0.1", "@vue/eslint-config-prettier": "^10.2.0", "@vue/eslint-config-typescript": "^14.6.0", - "@vue/tsconfig": "^0.7.0", + "@vue/tsconfig": "^0.8.1", "autoprefixer": "^10.4.21", - "concurrently": "^9.2.0", "eslint": "^9.31.0", "eslint-config-prettier": "^10.1.5", "eslint-plugin-prettier": "^5.5.1", - "eslint-plugin-vue": "^9.24.0", - "jsdom": "^26.1.0", + "eslint-plugin-vue": "^10.5.1", "postcss": "^8.5.6", "prettier": "^3.6.2", "terser": "^5.43.1", - "vite": "^6.1.6", - "vite-plugin-compression2": "^1.0.0", - "vue-tsc": "^2.2.0" + "typescript": "^5.9.3", + "vite": "^7.2.2", + "vite-plugin-compression2": "^2.3.1", + "vue-tsc": "^3.1.3" }, - "packageManager": "pnpm@9.15.4+sha512.b2dc20e2fc72b3e18848459b37359a32064663e5627a51e4c74b2c29dd8e8e0491483c3abb40789cfd578bf362fb6ba8261b05f0387d76792ed6e23ea3b1b6a0" + "packageManager": "pnpm@10.28.0+sha512.05df71d1421f21399e053fde567cea34d446fa02c76571441bfc1c7956e98e363088982d940465fd34480d4d90a0668bc12362f8aa88000a64e83d0b0e47be48" } diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts deleted file mode 100644 index af335a17..00000000 --- a/frontend/playwright.config.ts +++ /dev/null @@ -1,80 +0,0 @@ -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 0f5f79ad..d3b79699 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -10,43 +10,40 @@ importers: dependencies: '@chenfengyuan/vue-number-input': specifier: ^2.0.1 - version: 2.0.1(vue@3.5.17(typescript@5.6.3)) + version: 2.0.1(vue@3.5.26(typescript@5.9.3)) '@vueuse/core': - specifier: ^12.5.0 - version: 12.5.0(typescript@5.6.3) + specifier: ^14.0.0 + version: 14.1.0(vue@3.5.26(typescript@5.9.3)) '@vueuse/integrations': - specifier: ^12.5.0 - version: 12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3) + 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)) ace-builds: specifier: ^1.43.2 - version: 1.43.2 - core-js: - specifier: ^3.44.0 - version: 3.44.0 + version: 1.43.5 dayjs: specifier: ^1.11.13 - version: 1.11.13 + version: 1.11.19 dompurify: specifier: ^3.2.6 - version: 3.2.6 + version: 3.3.1 epubjs: specifier: ^0.3.93 version: 0.3.93 filesize: - specifier: ^10.1.1 - version: 10.1.6 + specifier: ^11.0.13 + version: 11.0.13 js-base64: specifier: ^3.7.7 - version: 3.7.7 + version: 3.7.8 jwt-decode: specifier: ^4.0.0 version: 4.0.0 lodash-es: specifier: ^4.17.21 - version: 4.17.21 + version: 4.17.22 marked: - specifier: ^15.0.6 - version: 15.0.6 + specifier: ^17.0.0 + version: 17.0.1 material-icons: specifier: ^1.13.14 version: 1.13.14 @@ -54,14 +51,14 @@ importers: specifier: ^8.0.1 version: 8.0.1 pinia: - specifier: ^2.3.1 - version: 2.3.1(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3)) + specifier: ^3.0.4 + version: 3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) pretty-bytes: - specifier: ^6.1.1 - version: 6.1.1 + specifier: ^7.1.0 + version: 7.1.0 qrcode.vue: specifier: ^3.6.0 - version: 3.6.0(vue@3.5.17(typescript@5.6.3)) + version: 3.6.0(vue@3.5.26(typescript@5.9.3)) tus-js-client: specifier: ^4.3.1 version: 4.3.1 @@ -70,273 +67,238 @@ importers: version: 3.1.0 video.js: specifier: ^8.23.3 - version: 8.23.3 + version: 8.23.4 videojs-hotkeys: specifier: ^0.2.28 version: 0.2.30 videojs-mobile-ui: specifier: ^1.1.1 - version: 1.1.1(video.js@8.23.3) + version: 1.1.3(video.js@8.23.4) vue: specifier: ^3.5.17 - version: 3.5.17(typescript@5.6.3) + version: 3.5.26(typescript@5.9.3) vue-final-modal: specifier: ^4.5.5 - version: 4.5.5(@vueuse/core@12.5.0(typescript@5.6.3))(@vueuse/integrations@12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3))(focus-trap@7.6.2)(vue@3.5.17(typescript@5.6.3)) + 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)) vue-i18n: specifier: ^11.1.10 - version: 11.1.10(vue@3.5.17(typescript@5.6.3)) + version: 11.2.8(vue@3.5.26(typescript@5.9.3)) vue-lazyload: specifier: ^3.0.0 version: 3.0.0 vue-reader: specifier: ^1.2.17 - version: 1.2.17(vue@3.5.17(typescript@5.6.3)) + version: 1.3.4 vue-router: specifier: ^4.5.1 - version: 4.5.1(vue@3.5.17(typescript@5.6.3)) + version: 4.6.4(vue@3.5.26(typescript@5.9.3)) vue-toastification: specifier: ^2.0.0-rc.5 - version: 2.0.0-rc.5(vue@3.5.17(typescript@5.6.3)) + version: 2.0.0-rc.5(vue@3.5.26(typescript@5.9.3)) devDependencies: '@intlify/unplugin-vue-i18n': - specifier: ^6.0.8 - version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.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 + 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.4 '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 '@types/node': - specifier: ^22.10.10 - version: 22.10.10 + specifier: ^24.10.1 + version: 24.10.9 '@typescript-eslint/eslint-plugin': specifier: ^8.37.0 - version: 8.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.6.3))(eslint@9.31.0)(typescript@5.6.3) + version: 8.53.0(@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2)(typescript@5.9.3) '@vitejs/plugin-legacy': - specifier: ^6.0.0 - version: 6.0.0(terser@5.43.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)) + specifier: ^7.2.1 + version: 7.2.1(terser@5.46.0)(vite@7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2)) '@vitejs/plugin-vue': - specifier: ^5.0.4 - version: 5.2.1(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3)) + specifier: ^6.0.1 + version: 6.0.3(vite@7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3)) '@vue/eslint-config-prettier': specifier: ^10.2.0 - version: 10.2.0(eslint@9.31.0)(prettier@3.6.2) + version: 10.2.0(eslint@9.39.2)(prettier@3.8.0) '@vue/eslint-config-typescript': specifier: ^14.6.0 - version: 14.6.0(eslint-plugin-vue@9.32.0(eslint@9.31.0))(eslint@9.31.0)(typescript@5.6.3) + version: 14.6.0(eslint-plugin-vue@10.7.0(@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/tsconfig': - specifier: ^0.7.0 - version: 0.7.0(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3)) + specifier: ^0.8.1 + version: 0.8.1(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)) autoprefixer: specifier: ^10.4.21 - version: 10.4.21(postcss@8.5.6) - concurrently: - specifier: ^9.2.0 - version: 9.2.0 + version: 10.4.23(postcss@8.5.6) eslint: specifier: ^9.31.0 - version: 9.31.0 + version: 9.39.2 eslint-config-prettier: specifier: ^10.1.5 - version: 10.1.5(eslint@9.31.0) + version: 10.1.8(eslint@9.39.2) eslint-plugin-prettier: specifier: ^5.5.1 - version: 5.5.1(eslint-config-prettier@10.1.5(eslint@9.31.0))(eslint@9.31.0)(prettier@3.6.2) + version: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.8.0) eslint-plugin-vue: - specifier: ^9.24.0 - version: 9.32.0(eslint@9.31.0) - jsdom: - specifier: ^26.1.0 - version: 26.1.0 + specifier: ^10.5.1 + version: 10.7.0(@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)) postcss: specifier: ^8.5.6 version: 8.5.6 prettier: specifier: ^3.6.2 - version: 3.6.2 + version: 3.8.0 terser: specifier: ^5.43.1 - version: 5.43.1 + version: 5.46.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 vite: - specifier: ^6.1.6 - version: 6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) + specifier: ^7.2.2 + version: 7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2) vite-plugin-compression2: - specifier: ^1.0.0 - version: 1.3.3(rollup@4.40.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)) + specifier: ^2.3.1 + version: 2.4.0(rollup@4.55.1) vue-tsc: - specifier: ^2.2.0 - version: 2.2.0(typescript@5.6.3) + specifier: ^3.1.3 + version: 3.2.2(typescript@5.9.3) packages: - '@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==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.26.2': - resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} - '@babel/core@7.26.0': - resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.26.2': - resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + '@babel/helper-annotate-as-pure@7.27.3': + resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': - resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} + '@babel/helper-compilation-targets@7.27.2': + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} engines: {node: '>=6.9.0'} - '@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.25.9': - resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} + '@babel/helper-create-class-features-plugin@7.28.5': + resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-regexp-features-plugin@7.25.9': - resolution: {integrity: sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==} + '@babel/helper-create-regexp-features-plugin@7.28.5': + resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.3': - resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + '@babel/helper-member-expression-to-functions@7.28.5': + resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + '@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==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} + '@babel/helper-optimise-call-expression@7.27.1': + resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} - '@babel/helper-plugin-utils@7.25.9': - resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + '@babel/helper-plugin-utils@7.27.1': + resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.25.9': - resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} + '@babel/helper-replace-supers@7.27.1': + resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@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==} + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': + resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} engines: {node: '>=6.9.0'} '@babel/helper-string-parser@7.27.1': resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-option@7.27.1': + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} - '@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==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} 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.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': + resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': + resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -347,14 +309,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -365,308 +327,314 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.25.9': - resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.25.9': - resolution: {integrity: sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==} + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.25.9': - resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} + '@babel/plugin-transform-block-scoping@7.28.5': + resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} + '@babel/plugin-transform-class-static-block@7.28.3': + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} + '@babel/plugin-transform-classes@7.28.4': + resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} + '@babel/plugin-transform-destructuring@7.28.5': + resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.25.9': - resolution: {integrity: sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==} + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} + '@babel/plugin-transform-exponentiation-operator@7.28.5': + resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-for-of@7.25.9': - resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} + '@babel/plugin-transform-logical-assignment-operators@7.28.5': + resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.25.9': - resolution: {integrity: sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==} + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} + '@babel/plugin-transform-modules-systemjs@7.28.5': + resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} + '@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==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.25.9': - resolution: {integrity: sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==} + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} + '@babel/plugin-transform-object-rest-spread@7.28.4': + resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} + '@babel/plugin-transform-optional-chaining@7.28.5': + resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.25.9': - resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} + '@babel/plugin-transform-regenerator@7.28.4': + resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.25.9': - resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.25.9': - resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/preset-env@7.26.0': - resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} + '@babel/preset-env@7.28.5': + resolution: {integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -676,32 +644,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.26.7': - resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.25.9': - resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.0': - resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.7': - resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.1': - resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} '@chenfengyuan/vue-number-input@2.0.1': @@ -709,251 +665,381 @@ packages: peerDependencies: vue: ^3.0.0 - '@csstools/color-helpers@5.0.1': - resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==} - engines: {node: '>=18'} - - '@csstools/css-calc@2.1.1': - resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 - - '@csstools/css-color-parser@3.0.7': - resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 - - '@csstools/css-parser-algorithms@3.0.4': - resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-tokenizer': ^3.0.3 - - '@csstools/css-tokenizer@3.0.3': - resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} - engines: {node: '>=18'} - - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@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-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@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-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@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-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@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==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@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==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@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-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + 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-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@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-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@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-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + 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/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + 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==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@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==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@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-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + '@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==} 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.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.31.0': - resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + '@eslint/object-schema@2.1.7': + resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.3': - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} 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.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + '@humanfs/node@0.16.7': + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} 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@10.0.1': - resolution: {integrity: sha512-WkaXfSevtpgtUR4t8K2M6lbR7g03mtOxFeh+vXp5KExvPqS12ppaRj1QxzwRuRI5VUto54A22BjKoBMLyHILWQ==} - engines: {node: '>= 18'} + '@intlify/bundle-utils@11.0.3': + resolution: {integrity: sha512-dURCDz1rQXwAb1+Hv4NDit6aZSRaAt4zUYBPEeaDCe3FSs8dMtdF6kEvgd9JwsYFSTAHcvbTs2CqwBjjt9Ltsw==} + engines: {node: '>= 20'} peerDependencies: petite-vue-i18n: '*' vue-i18n: '*' @@ -963,33 +1049,25 @@ packages: vue-i18n: optional: true - '@intlify/core-base@11.1.10': - resolution: {integrity: sha512-JhRb40hD93Vk0BgMgDc/xMIFtdXPHoytzeK6VafBNOj6bb6oUZrGamXkBKecMsmGvDQQaPRGG2zpa25VCw8pyw==} + '@intlify/core-base@11.2.8': + resolution: {integrity: sha512-nBq6Y1tVkjIUsLsdOjDSJj4AsjvD0UG3zsg9Fyc+OivwlA/oMHSKooUy9tpKj0HqZ+NWFifweHavdljlBLTwdA==} engines: {node: '>= 16'} - '@intlify/message-compiler@11.1.10': - resolution: {integrity: sha512-TABl3c8tSLWbcD+jkQTyBhrnW251dzqW39MPgEUCsd69Ua3ceoimsbIzvkcPzzZvt1QDxNkenMht+5//V3JvLQ==} + '@intlify/message-compiler@11.2.8': + resolution: {integrity: sha512-A5n33doOjmHsBtCN421386cG1tWp5rpOjOYPNsnpjIJbQ4POF0QY2ezhZR9kr0boKwaHjbOifvyQvHj2UTrDFQ==} engines: {node: '>= 16'} - '@intlify/message-compiler@11.1.2': - resolution: {integrity: sha512-T/xbNDzi+Yv0Qn2Dfz2CWCAJiwNgU5d95EhhAEf4YmOgjCKktpfpiUSmLcBvK1CtLpPQ85AMMQk/2NCcXnNj1g==} + '@intlify/shared@11.2.2': + resolution: {integrity: sha512-OtCmyFpSXxNu/oET/aN6HtPCbZ01btXVd0f3w00YsHOb13Kverk1jzA2k47pAekM55qbUw421fvPF1yxZ+gicw==} engines: {node: '>= 16'} - '@intlify/shared@11.1.10': - resolution: {integrity: sha512-6ZW/f3Zzjxfa1Wh0tYQI5pLKUtU+SY7l70pEG+0yd0zjcsYcK0EBt6Fz30Dy0tZhEqemziQQy2aNU3GJzyrMUA==} + '@intlify/shared@11.2.8': + resolution: {integrity: sha512-l6e4NZyUgv8VyXXH4DbuucFOBmxLF56C/mqh2tvApbzl2Hrhi1aTDcuv5TKdxzfHYmpO3UB0Cz04fgDT9vszfw==} engines: {node: '>= 16'} - '@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'} + '@intlify/unplugin-vue-i18n@11.0.3': + resolution: {integrity: sha512-iQuik0nXfdVZ5ab+IEyBFEuvMQ213zfbUpBXaEdHPk8DV+qB2CT/SdFuDhfUDRRBZc/e0qoLlfmc9urhnRYVWw==} + engines: {node: '>= 20'} peerDependencies: petite-vue-i18n: '*' vue: ^3.2.25 @@ -1018,30 +1096,24 @@ packages: vue-i18n: optional: true - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.11': + resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -1055,17 +1127,15 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgr/core@0.2.7': - resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} + '@pkgr/core@0.2.9': + resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.54.1': - resolution: {integrity: sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==} - engines: {node: '>=18'} - hasBin: true + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} - '@rollup/pluginutils@5.1.3': - resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -1073,123 +1143,136 @@ packages: rollup: optional: true - '@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.40.1': - resolution: {integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==} + '@rollup/rollup-android-arm-eabi@4.55.1': + resolution: {integrity: sha512-9R0DM/ykwfGIlNu6+2U09ga0WXeZ9MRC2Ter8jnz8415VbuIykVuc6bhdrbORFZANDmTDvq26mJrEVTl8TdnDg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.1': - resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==} + '@rollup/rollup-android-arm64@4.55.1': + resolution: {integrity: sha512-eFZCb1YUqhTysgW3sj/55du5cG57S7UTNtdMjCW7LwVcj3dTTcowCsC8p7uBdzKsZYa8J7IDE8lhMI+HX1vQvg==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.1': - resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==} + '@rollup/rollup-darwin-arm64@4.55.1': + resolution: {integrity: sha512-p3grE2PHcQm2e8PSGZdzIhCKbMCw/xi9XvMPErPhwO17vxtvCN5FEA2mSLgmKlCjHGMQTP6phuQTYWUnKewwGg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.1': - resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==} + '@rollup/rollup-darwin-x64@4.55.1': + resolution: {integrity: sha512-rDUjG25C9qoTm+e02Esi+aqTKSBYwVTaoS1wxcN47/Luqef57Vgp96xNANwt5npq9GDxsH7kXxNkJVEsWEOEaQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.1': - resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==} + '@rollup/rollup-freebsd-arm64@4.55.1': + resolution: {integrity: sha512-+JiU7Jbp5cdxekIgdte0jfcu5oqw4GCKr6i3PJTlXTCU5H5Fvtkpbs4XJHRmWNXF+hKmn4v7ogI5OQPaupJgOg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.1': - resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==} + '@rollup/rollup-freebsd-x64@4.55.1': + resolution: {integrity: sha512-V5xC1tOVWtLLmr3YUk2f6EJK4qksksOYiz/TCsFHu/R+woubcLWdC9nZQmwjOAbmExBIVKsm1/wKmEy4z4u4Bw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.1': - resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==} + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': + resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.1': - resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==} + '@rollup/rollup-linux-arm-musleabihf@4.55.1': + resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.1': - resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==} + '@rollup/rollup-linux-arm64-gnu@4.55.1': + resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.1': - resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==} + '@rollup/rollup-linux-arm64-musl@4.55.1': + resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.1': - resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==} + '@rollup/rollup-linux-loong64-gnu@4.55.1': + resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': - resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==} + '@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-riscv64-gnu@4.40.1': - resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==} + '@rollup/rollup-linux-ppc64-musl@4.55.1': + resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.55.1': + resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.1': - resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==} + '@rollup/rollup-linux-riscv64-musl@4.55.1': + resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.1': - resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==} + '@rollup/rollup-linux-s390x-gnu@4.55.1': + resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.1': - resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==} + '@rollup/rollup-linux-x64-gnu@4.55.1': + resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.1': - resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==} + '@rollup/rollup-linux-x64-musl@4.55.1': + resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.1': - resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==} + '@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==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.55.1': + resolution: {integrity: sha512-yR6Bl3tMC/gBok5cz/Qi0xYnVbIxGx5Fcf/ca0eB6/6JwOY+SRUcJfI0OpeTpPls7f194as62thCt/2BjxYN8g==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.1': - resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==} + '@rollup/rollup-win32-ia32-msvc@4.55.1': + resolution: {integrity: sha512-3fZBidchE0eY0oFZBnekYCfg+5wAB0mbpCBuofh5mZuzIU/4jIVkbESmd2dOsFNS78b53CYv3OAtwqkZZmU5nA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.1': - resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==} + '@rollup/rollup-win32-x64-gnu@4.55.1': + resolution: {integrity: sha512-xGGY5pXj69IxKb4yv/POoocPy/qmEGhimy/FoTpTSVju3FYXUQQMFCaZZXJVidsmGxRioZAwpThl/4zX41gRKg==} cpu: [x64] os: [win32] - '@tsconfig/node22@22.0.2': - resolution: {integrity: sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA==} + '@rollup/rollup-win32-x64-msvc@4.55.1': + resolution: {integrity: sha512-SPEpaL6DX4rmcXtnhdrQYgzQ5W2uW3SCJch88lB2zImhJRhIIK44fkUrgIV/Q8yUNfw5oyZ5vkeQsZLhCb06lw==} + cpu: [x64] + os: [win32] - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@tsconfig/node24@24.0.4': + resolution: {integrity: sha512-2A933l5P5oCbv6qSxHs7ckKwobs8BDAe9SJ/Xr2Hy+nDlwmLE1GhFh/g/vXGRZWgxBg9nX/5piDtHR9Dkw/XuA==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1204,14 +1287,14 @@ packages: '@types/lodash@4.17.13': resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} - '@types/node@22.10.10': - resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==} + '@types/node@24.10.9': + resolution: {integrity: sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==} '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@types/web-bluetooth@0.0.20': - resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} '@typescript-eslint/eslint-plugin@8.37.0': resolution: {integrity: sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==} @@ -1221,6 +1304,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/eslint-plugin@8.53.0': + resolution: {integrity: sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.53.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} @@ -1234,20 +1325,48 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.21.0': - resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} + '@typescript-eslint/project-service@8.49.0': + resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/project-service@8.53.0': + resolution: {integrity: sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==} + 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.53.0': + resolution: {integrity: sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==} + 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.53.0': + resolution: {integrity: sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==} + 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} @@ -1255,19 +1374,24 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.21.0': - resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} + '@typescript-eslint/type-utils@8.53.0': + resolution: {integrity: sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==} 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/typescript-estree@8.21.0': - resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} + '@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.53.0': + resolution: {integrity: sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==} 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==} @@ -1275,6 +1399,18 @@ 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.53.0': + resolution: {integrity: sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==} + 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} @@ -1282,16 +1418,27 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.21.0': - resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} + '@typescript-eslint/utils@8.53.0': + resolution: {integrity: sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==} 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} - '@videojs/http-streaming@3.17.0': - resolution: {integrity: sha512-Ch1P3tvvIEezeZXyK11UfWgp4cWKX4vIhZ30baN/lRinqdbakZ5hiAI3pGjRy3d+q/Epyc8Csz5xMdKNNGYpcw==} + '@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.53.0': + resolution: {integrity: sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@videojs/http-streaming@3.17.2': + resolution: {integrity: sha512-VBQ3W4wnKnVKb/limLdtSD2rAd5cmHN70xoMf4OmuDd0t2kfJX04G+sfw6u2j8oOm2BXYM9E1f4acHruqKnM1g==} engines: {node: '>=8', npm: '>=5'} peerDependencies: video.js: ^8.19.0 @@ -1303,53 +1450,53 @@ packages: '@videojs/xhr@2.7.0': resolution: {integrity: sha512-giab+EVRanChIupZK7gXjHy90y3nncA2phIOyG3Ne5fvpiMJzvqYwiTOnEVW2S4CoYcuKJkomat7bMXA/UoUZQ==} - '@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} + '@vitejs/plugin-legacy@7.2.1': + resolution: {integrity: sha512-CaXb/y0mlfu7jQRELEJJc2/5w2bX2m1JraARgFnvSB2yfvnCNJVWWlqAo6WjnKoepOwKx8gs0ugJThPLKCOXIg==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: terser: ^5.16.0 - vite: ^6.0.0 + vite: ^7.0.0 - '@vitejs/plugin-vue@5.2.1': - resolution: {integrity: sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==} - engines: {node: ^18.0.0 || >=20.0.0} + '@vitejs/plugin-vue@6.0.3': + resolution: {integrity: sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==} + engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 vue: ^3.2.25 - '@volar/language-core@2.4.11': - resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==} + '@volar/language-core@2.4.27': + resolution: {integrity: sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==} - '@volar/source-map@2.4.11': - resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==} + '@volar/source-map@2.4.27': + resolution: {integrity: sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==} - '@volar/typescript@2.4.11': - resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==} + '@volar/typescript@2.4.27': + resolution: {integrity: sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==} - '@vue/compiler-core@3.5.13': - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.26': + resolution: {integrity: sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==} - '@vue/compiler-core@3.5.17': - resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} + '@vue/compiler-dom@3.5.26': + resolution: {integrity: sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==} - '@vue/compiler-dom@3.5.13': - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-sfc@3.5.26': + resolution: {integrity: sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==} - '@vue/compiler-dom@3.5.17': - resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} - - '@vue/compiler-sfc@3.5.17': - resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} - - '@vue/compiler-ssr@3.5.17': - resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} - - '@vue/compiler-vue2@2.7.16': - resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + '@vue/compiler-ssr@3.5.26': + resolution: {integrity: sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==} '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + '@vue/devtools-api@7.7.8': + resolution: {integrity: sha512-BtFcAmDbtXGwurWUFf8ogIbgZyR+rcVES1TSNEI8Em80fD8Anu+qTRN1Fc3J6vdRHlVM3fzPV1qIo+B4AiqGzw==} + + '@vue/devtools-kit@7.7.8': + resolution: {integrity: sha512-4Y8op+AoxOJhB9fpcEF6d5vcJXWKgHxC3B0ytUB8zz15KbP9g9WgVzral05xluxi2fOeAy6t140rdQ943GcLRQ==} + + '@vue/devtools-shared@7.7.8': + resolution: {integrity: sha512-XHpO3jC5nOgYr40M9p8Z4mmKfTvUxKyRcUnpBAYg11pE78eaRFBKb0kG5yKLroMuJeeNH9LWmKp2zMU5LUc7CA==} + '@vue/eslint-config-prettier@10.2.0': resolution: {integrity: sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw==} peerDependencies: @@ -1367,36 +1514,28 @@ packages: typescript: optional: true - '@vue/language-core@2.2.0': - resolution: {integrity: sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==} + '@vue/language-core@3.2.2': + resolution: {integrity: sha512-5DAuhxsxBN9kbriklh3Q5AMaJhyOCNiQJvCskN9/30XOpdLiqZU9Q+WvjArP17ubdGEyZtBzlIeG5nIjEbNOrQ==} + + '@vue/reactivity@3.5.26': + resolution: {integrity: sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==} + + '@vue/runtime-core@3.5.26': + resolution: {integrity: sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==} + + '@vue/runtime-dom@3.5.26': + resolution: {integrity: sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==} + + '@vue/server-renderer@3.5.26': + resolution: {integrity: sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + vue: 3.5.26 - '@vue/reactivity@3.5.17': - resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} + '@vue/shared@3.5.26': + resolution: {integrity: sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==} - '@vue/runtime-core@3.5.17': - resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} - - '@vue/runtime-dom@3.5.17': - resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} - - '@vue/server-renderer@3.5.17': - resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} - peerDependencies: - vue: 3.5.17 - - '@vue/shared@3.5.13': - resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} - - '@vue/shared@3.5.17': - resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} - - '@vue/tsconfig@0.7.0': - resolution: {integrity: sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==} + '@vue/tsconfig@0.8.1': + resolution: {integrity: sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==} peerDependencies: typescript: 5.x vue: ^3.4.0 @@ -1406,11 +1545,13 @@ packages: vue: optional: true - '@vueuse/core@12.5.0': - resolution: {integrity: sha512-GVyH1iYqNANwcahAx8JBm6awaNgvR/SwZ1fjr10b8l1HIgDp82ngNbfzJUgOgWEoxjL+URAggnlilAEXwCOZtg==} + '@vueuse/core@14.1.0': + resolution: {integrity: sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==} + peerDependencies: + vue: ^3.5.0 - '@vueuse/integrations@12.5.0': - resolution: {integrity: sha512-HYLt8M6mjUfcoUOzyBcX2RjpfapIwHPBmQJtTmXOQW845Y/Osu9VuTJ5kPvnmWJ6IUa05WpblfOwZ+P0G4iZsQ==} + '@vueuse/integrations@14.1.0': + resolution: {integrity: sha512-eNQPdisnO9SvdydTIXnTE7c29yOsJBD/xkwEyQLdhDC/LKbqrFpXHb3uS//7NcIrQO3fWVuvMGp8dbK6mNEMCA==} peerDependencies: async-validator: ^4 axios: ^1 @@ -1423,7 +1564,8 @@ packages: nprogress: ^0.2 qrcode: ^1.5 sortablejs: ^1 - universal-cookie: ^7 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 peerDependenciesMeta: async-validator: optional: true @@ -1450,34 +1592,31 @@ packages: universal-cookie: optional: true - '@vueuse/metadata@12.5.0': - resolution: {integrity: sha512-Ui7Lo2a7AxrMAXRF+fAp9QsXuwTeeZ8fIB9wsLHqzq9MQk+2gMYE2IGJW48VMJ8ecvCB3z3GsGLKLbSasQ5Qlg==} + '@vueuse/metadata@14.1.0': + resolution: {integrity: sha512-7hK4g015rWn2PhKcZ99NyT+ZD9sbwm7SGvp7k+k+rKGWnLjS/oQozoIZzWfCewSUeBmnJkIb+CNr7Zc/EyRnnA==} - '@vueuse/shared@12.5.0': - resolution: {integrity: sha512-vMpcL1lStUU6O+kdj6YdHDixh0odjPAUM15uJ9f7MY781jcYkIwFA4iv2EfoIPO6vBmvutI1HxxAwmf0cx5ISQ==} + '@vueuse/shared@14.1.0': + resolution: {integrity: sha512-EcKxtYvn6gx1F8z9J5/rsg3+lTQnvOruQd8fUecW99DCK04BkWD7z5KQ/wTAx+DazyoEE9dJt/zV8OIEQbM6kw==} + peerDependencies: + vue: ^3.5.0 '@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.10': - resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} + '@xmldom/xmldom@0.8.11': + resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} engines: {node: '>=10.0.0'} - ace-builds@1.43.2: - resolution: {integrity: sha512-3wzJUJX0RpMc03jo0V8Q3bSb/cKPnS7Nqqw8fVHsCCHweKMiTIxT3fP46EhjmVy6MCuxwP801ere+RW245phGw==} + ace-builds@1.43.5: + resolution: {integrity: sha512-iH5FLBKdB7SVn9GR37UgA/tpQS8OTWIxWAuq3Ofaw+Qbc69FfPXsXd9jeW7KRG2xKpKMqBDnu0tHBrCWY5QI7A==} 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'} @@ -1486,19 +1625,11 @@ 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@0.4.14: - resolution: {integrity: sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + alien-signals@3.1.2: + resolution: {integrity: sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==} ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -1507,39 +1638,50 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} + autoprefixer@10.4.23: + resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 - babel-plugin-polyfill-corejs2@0.4.12: - resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.6: - resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-regenerator@0.6.3: - resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} 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.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -1552,13 +1694,13 @@ packages: peerDependencies: browserslist: '*' - browserslist@4.24.2: - resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + browserslist@4.28.0: + resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1569,20 +1711,16 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001685: - resolution: {integrity: sha512-e/kJN1EMyHQzgcMEEgoo+YTCO1NGCmIYHk5Qk8jT6AazWemS5QFKJ5ShCJlH3GZrNIdZofcNCEwZqbMjjKzmnA==} + caniuse-lite@1.0.30001754: + resolution: {integrity: sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==} - caniuse-lite@1.0.30001727: - resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} + caniuse-lite@1.0.30001760: + resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} 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'} @@ -1599,22 +1737,18 @@ 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==} - core-js-compat@3.39.0: - resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} - core-js@3.44.0: - resolution: {integrity: sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==} + core-js-compat@3.46.0: + resolution: {integrity: sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==} + + core-js@3.46.0: + resolution: {integrity: sha512-vDMm9B0xnqqZ8uSBpZ8sNtRtOdmfShrvT6h2TuQGLs0Is+cR0DYbj/KWP6ALVNbWPpqA/qPLoOuppJN07humpA==} core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -1628,12 +1762,8 @@ packages: engines: {node: '>=4'} hasBin: true - cssstyle@4.2.1: - resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} - engines: {node: '>=18'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} custom-error-instance@2.1.1: resolution: {integrity: sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==} @@ -1642,18 +1772,11 @@ packages: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - - de-indent@1.0.2: - resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1661,38 +1784,23 @@ 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.2.6: - resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} + dompurify@3.3.1: + resolution: {integrity: sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q==} - 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@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + entities@7.0.0: + resolution: {integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==} engines: {node: '>=0.12'} epubjs@0.3.93: @@ -1709,8 +1817,13 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} hasBin: true @@ -1727,14 +1840,14 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@10.1.5: - resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@5.5.1: - resolution: {integrity: sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==} + eslint-plugin-prettier@5.5.5: + resolution: {integrity: sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -1747,19 +1860,19 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-vue@9.32.0: - resolution: {integrity: sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - 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==} + eslint-plugin-vue@10.7.0: + resolution: {integrity: sha512-r2XFCK4qlo1sxEoAMIoTTX0PZAdla0JJDt1fmYiworZUX67WeEGqm+JbyAg3M+pGiJ5U6Mp5WQbontXWtIW7TA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.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-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} @@ -1769,16 +1882,12 @@ 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.31.0: - resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1791,10 +1900,6 @@ 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} @@ -1849,16 +1954,25 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - filesize@10.1.6: - resolution: {integrity: sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==} - engines: {node: '>= 10.4.0'} + filesize@11.0.13: + resolution: {integrity: sha512-mYJ/qXKvREuO0uH8LTQJ6v7GsUvVOguqxg2VTwQUkyTPXXRRWPdjuUPVqdBrJQhvci48OHlNGRnux+Slr2Rnvw==} + engines: {node: '>= 10.8.0'} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -1872,19 +1986,14 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} focus-trap@7.6.2: resolution: {integrity: sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==} - 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] + fraction.js@5.3.4: + resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -1898,10 +2007,6 @@ 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'} @@ -1913,14 +2018,6 @@ 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'} @@ -1939,25 +2036,8 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - 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'} + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} @@ -1970,8 +2050,8 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} imurmurhash@0.1.4: @@ -1981,18 +2061,14 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 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==} @@ -2004,40 +2080,32 @@ 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.7: - resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-base64@3.7.8: + resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true - 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==} + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true @@ -2055,8 +2123,8 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-eslint-parser@2.4.0: - resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} + jsonc-eslint-parser@2.4.2: + resolution: {integrity: sha512-1e4qoRgnn448pRuMvKGsFFymUCquZV0mpGgOyIKNgD3JVDTsVJyRBGH/Fm0tBb8WsWGgmB1mDe6/yJMQM37DUA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} jszip@3.10.1: @@ -2086,8 +2154,8 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash-es@4.17.22: + resolution: {integrity: sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==} lodash._baseiteratee@4.7.0: resolution: {integrity: sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==} @@ -2122,24 +2190,18 @@ 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.14: - resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} - - marked@15.0.6: - resolution: {integrity: sha512-Y07CUOE+HQXbVDCGl3LXggqJDbXDP2pArc2C1N1RRMN0ONiShoSsIInMd5Gsxupe7fKLpgimTV+HOJ9r7bA+pg==} - engines: {node: '>= 18'} + marked@17.0.1: + resolution: {integrity: sha512-boeBdiS0ghpWcSwoNm/jJBwdpFaMnZWRzjA6SkUMYb40SVaN1x7mmfGKp0jvexGcx+7y2La5zRZsYFZI6Qpypg==} + engines: {node: '>= 20'} hasBin: true marks-pane@1.0.9: @@ -2160,8 +2222,8 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - min-document@2.19.0: - resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==} + min-document@2.19.2: + resolution: {integrity: sha512-8S5I8db/uZN8r9HSLFVWPdJCvYOejMcEC82VIzNUc6Zkklf/d1gg2psfE79/vyhWOj4+J8MtwmoOz3TmvaGu5A==} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2170,8 +2232,8 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} mpd-parser@1.3.1: resolution: {integrity: sha512-1FuyEWI5k2HcmhS1HkKnUAQV7yFPfXPht2DnRRGtoiiAAW+ESTbtEXIDpRkwdU+XyrQuwrIym7UkoPKsZ0SyFw==} @@ -2199,15 +2261,8 @@ packages: next-tick@1.1.0: resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} - 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'} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} normalize.css@8.0.1: resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==} @@ -2215,9 +2270,6 @@ 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'} @@ -2237,9 +2289,6 @@ 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==} @@ -2257,11 +2306,11 @@ packages: path-webpack@0.0.3: resolution: {integrity: sha512-AmeDxedoo5svf7aB3FYqSAKqMxys014lVKBzy1o/5vv9CtU7U4wgGWL1dA2o6MOzcD53ScN4Jmiq6VbtLz1vIQ==} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathe@2.0.2: - resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2270,15 +2319,15 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pinia@2.3.1: - resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} + pinia@3.0.4: + resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==} peerDependencies: - typescript: '>=4.4.4' - vue: ^2.7.0 || ^3.5.11 + typescript: '>=4.5.0' + vue: ^3.5.11 peerDependenciesMeta: typescript: optional: true @@ -2287,21 +2336,8 @@ packages: resolution: {integrity: sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==} hasBin: true - 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==} + postcss-selector-parser@7.1.1: + resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} engines: {node: '>=4'} postcss-value-parser@4.2.0: @@ -2315,18 +2351,18 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} + prettier@3.8.0: + resolution: {integrity: sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==} engines: {node: '>=14'} hasBin: true - pretty-bytes@6.1.1: - resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} - engines: {node: ^14.13.1 || >=16.0.0} + pretty-bytes@7.1.0: + resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} + engines: {node: '>=20'} process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -2356,8 +2392,8 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} engines: {node: '>=4'} regenerate@1.4.2: @@ -2366,24 +2402,17 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} + regexpu-core@6.4.0: + resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + regjsparser@0.13.0: + resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} 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==} @@ -2391,48 +2420,39 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolve@1.22.11: + resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} + engines: {node: '>= 0.4'} hasBin: true retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.40.1: - resolution: {integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==} + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.55.1: + resolution: {integrity: sha512-wDv/Ht1BNHB4upNbK74s9usvl7hObDnvVzknxqY/E/O3X6rW1U1rV1aENEfJ54eFZDTNo7zv1f5N4edCluH7+A==} 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.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -2447,10 +2467,6 @@ 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==} @@ -2465,92 +2481,61 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} 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'} - symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - - synckit@0.11.8: - resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} systemjs@6.15.1: resolution: {integrity: sha512-Nk8c4lXvMB98MtbmjX7JwJRgJOL8fluecYCfCeYBznwmpOs8Bf15hLM6z4z71EDAhQVrQrI+wt1aLWSXZq+hXA==} - tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} tar-mini@0.2.0: resolution: {integrity: sha512-+qfUHz700DWnRutdUsxRRVZ38G1Qr27OetwaMYTdg8hcPxf46U0S1Zf76dQMWRBmusOt2ZCK5kbIaiLkoGO7WQ==} - terser@5.43.1: - resolution: {integrity: sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==} + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} engines: {node: '>=10'} hasBin: true - tldts-core@6.1.74: - resolution: {integrity: sha512-gTwtY6L2GfuxiL4CWpLknv9JDYYqBvKCk/BT5uAaAvCA0s6pzX7lr2IrkQZSUlnSjRHIjTl8ZwKCVXJ7XNRWYw==} - - tldts@6.1.74: - resolution: {integrity: sha512-O5vTZ1UmmEmrLl/59U9igitnSMlprALLaLgbv//dEvjobPT9vyURhHXKMCDLEhn3qxZFIkb9PwAfNYV0Ol7RPQ==} - hasBin: true + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - 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==} + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} 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'} @@ -2559,10 +2544,6 @@ 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==} @@ -2573,16 +2554,13 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -2592,26 +2570,26 @@ packages: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} - unicode-match-property-value-ecmascript@2.2.0: - resolution: {integrity: sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==} + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} engines: {node: '>=4'} - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} engines: {node: '>=4'} - unplugin@1.16.1: - resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==} - engines: {node: '>=14.0.0'} + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} - update-browserslist-db@1.1.1: - resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.2.2: + resolution: {integrity: sha512-E85pfNzMQ9jpKkA7+TJAi4TJN+tBCuWh5rUcS/sv6cFi+1q9LYDwDI5dpUL0u/73EElyQ8d3TEaeW4sPedBqYA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -2628,8 +2606,8 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - video.js@8.23.3: - resolution: {integrity: sha512-Toe0VLlDZcUhiaWfcePS1OEdT3ATfktm0hk/PELfD7zUoPDHeT+cJf/wZmCy5M5eGVwtGUg25RWPCj1L/1XufA==} + video.js@8.23.4: + resolution: {integrity: sha512-qI0VTlYmKzEqRsz1Nppdfcaww4RSxZAq77z2oNSl3cNg2h6do5C8Ffl0KqWQ1OpD8desWXsCrde7tKJ9gGTEyQ==} videojs-contrib-quality-levels@4.1.0: resolution: {integrity: sha512-TfrXJJg1Bv4t6TOCMEVMwF/CoS8iENYsWNKip8zfhB5kTcegiFYezEA0eHAJPU64ZC8NQbxQgOwAsYU8VXbOWA==} @@ -2643,8 +2621,8 @@ packages: videojs-hotkeys@0.2.30: resolution: {integrity: sha512-G8kEQZPapoWDoEajh2Nroy4bCN1qVEul5AuzZqBS7ZCG45K7hqTYKgf1+fmYvG8m8u84sZmVMUvSWZBjaFW66Q==} - videojs-mobile-ui@1.1.1: - resolution: {integrity: sha512-q7vx74++bqu2763Tc/GG4qFcMt42emC8uXe/z+zFVpBIiysgAf89AgorE6m30YHWtVJWgbRIyzFVYNOxCk9qow==} + videojs-mobile-ui@1.1.3: + resolution: {integrity: sha512-LyWIRZBQWRouUQ9i9HBBvhwFL1uZkg3Adt52nT+e297dwpOgTaELO7gCXgvj5f6a2AfEb8a5AQMY4SLeIf8cqw==} engines: {node: '>=14', npm: '>=6'} peerDependencies: video.js: ^8 @@ -2652,24 +2630,22 @@ packages: videojs-vtt.js@0.15.5: resolution: {integrity: sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==} - 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-plugin-compression2@2.4.0: + resolution: {integrity: sha512-8J4CBF1+dM1I06azba/eXJuJHinLF0Am7lUvRH8AZpu0otJoBaDEnxrIEr5iPZJSwH0AEglJGYCveh7pN52jCg==} - vite@6.1.6: - resolution: {integrity: sha512-u+jokLMwHVFUoUkfL+m/1hzucejL2639g9QXcrRdtN3WPHfW7imI83V96Oh1R0xVZqDjvcgp+7S8bSQpdVlmPA==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -2697,19 +2673,8 @@ packages: yaml: optional: true - 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 + vscode-uri@3.1.0: + resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} vue-eslint-parser@10.2.0: resolution: {integrity: sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==} @@ -2717,12 +2682,6 @@ 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: @@ -2731,8 +2690,8 @@ packages: focus-trap: '>=7.2.0' vue: '>=3.2.0' - vue-i18n@11.1.10: - resolution: {integrity: sha512-C+IwnSg8QDSOAox0gdFYP5tsKLx5jNWxiawNoiNB/Tw4CReXmM1VJMXbduhbrEzAFLhreqzfDocuSVjGbxQrag==} + vue-i18n@11.2.8: + resolution: {integrity: sha512-vJ123v/PXCZntd6Qj5Jumy7UBmIuE92VrtdX+AXr+1WzdBHojiBxnAxdfctUFL+/JIN+VQH4BhsfTtiGsvVObg==} engines: {node: '>= 16'} peerDependencies: vue: ^3.0.0 @@ -2740,62 +2699,36 @@ packages: vue-lazyload@3.0.0: resolution: {integrity: sha512-h2keL/Rj550dLgesgOtXJS9qOiSMmuJNeVlfNAYV1/IYwOQYaWk5mFJlwRxmZDK9YC5gECcFLYYj7z1lKSf9ug==} - 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-reader@1.3.4: + resolution: {integrity: sha512-QYTX9hlrV71gL/1vMejcBLLS9Ool29XMZcLQwvL0Ep1F//o0ymzYbKX2Lre+4BUBkVq49/GmmGCmAJACsJL9tw==} - vue-router@4.5.1: - resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} peerDependencies: - vue: ^3.2.0 + vue: ^3.5.0 vue-toastification@2.0.0-rc.5: resolution: {integrity: sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==} peerDependencies: vue: ^3.0.2 - vue-tsc@2.2.0: - resolution: {integrity: sha512-gtmM1sUuJ8aSb0KoAFmK9yMxb8TxjewmxqTJ1aKphD5Cbu0rULFY6+UQT51zW7SpUcenfPUuflKyVwyx9Qdnxg==} + vue-tsc@3.2.2: + resolution: {integrity: sha512-r9YSia/VgGwmbbfC06hDdAatH634XJ9nVl6Zrnz1iK4ucp8Wu78kawplXnIDa3MSu1XdQQePTHLXYwPDWn+nyQ==} hasBin: true peerDependencies: typescript: '>=5.0.0' - vue@3.5.17: - resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} + vue@3.5.26: + resolution: {integrity: sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==} 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'} @@ -2805,975 +2738,949 @@ 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.2.3: - resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==} + yaml-eslint-parser@1.3.2: + resolution: {integrity: sha512-odxVsHAkZYYglR30aPYRY4nUGJnoJ2y1ww2HDvZALo0BDETv9kWbi16J52eHs+PWRNmF4ub6nZqfVOeesOvntg==} engines: {node: ^14.17.0 || >=16.0.0} - yaml@2.7.0: - resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} - engines: {node: '>= 14'} + yaml@2.8.2: + resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} + engines: {node: '>= 14.6'} 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: - '@ampproject/remapping@2.3.0': + '@babel/code-frame@7.27.1': dependencies: - '@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 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.26.2': {} + '@babel/compat-data@7.28.5': {} - '@babel/core@7.26.0': + '@babel/core@7.28.5': dependencies: - '@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 + '@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 convert-source-map: 2.0.0 - debug: 4.3.7 + debug: 4.4.3 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.26.2': + '@babel/generator@7.28.5': dependencies: - '@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/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/helper-annotate-as-pure@7.25.9': + '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.28.5 - '@babel/helper-builder-binary-assignment-operator-visitor@7.25.9': + '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 - transitivePeerDependencies: - - supports-color - - '@babel/helper-compilation-targets@7.25.9': - dependencies: - '@babel/compat-data': 7.26.2 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.2 + '@babel/compat-data': 7.28.5 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.28.0 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.5)': dependencies: - '@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 + '@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 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-regexp-features-plugin@7.25.9(@babel/core@7.26.0)': + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - regexpu-core: 6.2.0 + '@babel/core': 7.28.5 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - debug: 4.3.7 + '@babel/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.3 lodash.debounce: 4.0.8 - resolve: 1.22.8 + resolve: 1.22.11 transitivePeerDependencies: - supports-color - '@babel/helper-member-expression-to-functions@7.25.9': + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.25.9': + '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.25.9': + '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.28.5 - '@babel/helper-plugin-utils@7.25.9': {} + '@babel/helper-plugin-utils@7.27.1': {} - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: - '@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 + '@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 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)': dependencies: - '@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 + '@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 transitivePeerDependencies: - supports-color - '@babel/helper-simple-access@7.25.9': + '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 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.25.9': {} + '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-validator-option@7.25.9': {} - - '@babel/helper-wrap-function@7.25.9': + '@babel/helper-wrap-function@7.28.3': dependencies: - '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helpers@7.26.0': + '@babel/helpers@7.28.4': dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.0 + '@babel/template': 7.27.2 + '@babel/types': 7.28.5 - '@babel/parser@7.26.2': + '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.26.0 + '@babel/types': 7.28.5 - '@babel/parser@7.26.7': + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/types': 7.26.7 - - '@babel/parser@7.28.0': - dependencies: - '@babel/types': 7.28.1 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)': dependencies: - '@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) + '@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) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 + '@babel/core': 7.28.5 - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': 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/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-arrow-functions@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': dependencies: - '@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 + '@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 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': dependencies: - '@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) + '@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) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-block-scoped-functions@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)': dependencies: - '@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 + '@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 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5)': dependencies: - '@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 + '@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 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5)': dependencies: - '@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 + '@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 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/template': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-dotall-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-duplicate-keys@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-duplicate-named-capturing-groups-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-dynamic-import@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-exponentiation-operator@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@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-for-of@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-duplicate-named-capturing-groups-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-dynamic-import@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.5)': + 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) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.25.9 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)': + 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 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-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-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-member-expression-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-modules-amd@7.25.9(@babel/core@7.26.0)': - dependencies: - '@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/core': 7.28.5 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5)': dependencies: - '@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 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-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-logical-assignment-operators@7.28.5(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-member-expression-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-modules-amd@7.27.1(@babel/core@7.28.5)': + 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 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)': dependencies: - '@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 + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.5)': dependencies: - '@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/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 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)': 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-new-target@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-nullish-coalescing-operator@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': - dependencies: - '@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.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) + '@babel/core': 7.28.5 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) + '@babel/helper-plugin-utils': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@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-optional-chaining@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)': + dependencies: + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)': + 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/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': - dependencies: - '@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 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)': dependencies: - '@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 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-optional-chaining@7.28.5(@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 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - regenerator-transform: 0.15.2 - - '@babel/plugin-transform-regexp-modifiers@7.26.0(@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-reserved-words@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 + '@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 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@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 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@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-property-regex@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)': 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/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)': 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/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)': 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/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/preset-env@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': 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 + '@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 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 - '@babel/types': 7.26.0 + '@babel/core': 7.28.5 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.5 esutils: 2.0.3 - '@babel/runtime@7.26.0': - dependencies: - regenerator-runtime: 0.14.1 + '@babel/runtime@7.28.4': {} - '@babel/runtime@7.26.7': + '@babel/template@7.27.2': dependencies: - regenerator-runtime: 0.14.1 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@babel/template@7.25.9': + '@babel/traverse@7.28.5': dependencies: - '@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 + '@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 transitivePeerDependencies: - supports-color - '@babel/types@7.26.0': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@babel/types@7.26.7': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@babel/types@7.28.1': + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 - '@chenfengyuan/vue-number-input@2.0.1(vue@3.5.17(typescript@5.6.3))': + '@chenfengyuan/vue-number-input@2.0.1(vue@3.5.26(typescript@5.9.3))': dependencies: - vue: 3.5.17(typescript@5.6.3) + vue: 3.5.26(typescript@5.9.3) - '@csstools/color-helpers@5.0.1': {} + '@esbuild/aix-ppc64@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)': + '@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 + + '@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 + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2)': dependencies: - '@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)': - 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 - - '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': - dependencies: - '@csstools/css-tokenizer': 3.0.3 - - '@csstools/css-tokenizer@3.0.3': {} - - '@esbuild/aix-ppc64@0.24.2': - optional: true - - '@esbuild/android-arm64@0.24.2': - optional: true - - '@esbuild/android-arm@0.24.2': - optional: true - - '@esbuild/android-x64@0.24.2': - optional: true - - '@esbuild/darwin-arm64@0.24.2': - optional: true - - '@esbuild/darwin-x64@0.24.2': - optional: true - - '@esbuild/freebsd-arm64@0.24.2': - optional: true - - '@esbuild/freebsd-x64@0.24.2': - optional: true - - '@esbuild/linux-arm64@0.24.2': - optional: true - - '@esbuild/linux-arm@0.24.2': - optional: true - - '@esbuild/linux-ia32@0.24.2': - optional: true - - '@esbuild/linux-loong64@0.24.2': - optional: true - - '@esbuild/linux-mips64el@0.24.2': - optional: true - - '@esbuild/linux-ppc64@0.24.2': - optional: true - - '@esbuild/linux-riscv64@0.24.2': - optional: true - - '@esbuild/linux-s390x@0.24.2': - optional: true - - '@esbuild/linux-x64@0.24.2': - optional: true - - '@esbuild/netbsd-arm64@0.24.2': - optional: true - - '@esbuild/netbsd-x64@0.24.2': - optional: true - - '@esbuild/openbsd-arm64@0.24.2': - optional: true - - '@esbuild/openbsd-x64@0.24.2': - optional: true - - '@esbuild/sunos-x64@0.24.2': - optional: true - - '@esbuild/win32-arm64@0.24.2': - optional: true - - '@esbuild/win32-ia32@0.24.2': - optional: true - - '@esbuild/win32-x64@0.24.2': - optional: true - - '@eslint-community/eslint-utils@4.4.1(eslint@9.31.0)': - dependencies: - eslint: 9.31.0 + eslint: 9.39.2 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2)': dependencies: - eslint: 9.31.0 + eslint: 9.39.2 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.0': + '@eslint/config-array@0.21.1': dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + '@eslint/object-schema': 2.1.7 + debug: 4.4.3 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.3.0': {} + '@eslint/config-helpers@0.4.2': + dependencies: + '@eslint/core': 0.17.0 - '@eslint/core@0.15.1': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.1': + '@eslint/eslintrc@3.3.3': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.3 espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 + import-fresh: 3.3.1 + js-yaml: 4.1.1 minimatch: 3.1.2 strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - '@eslint/js@9.31.0': {} + '@eslint/js@9.39.2': {} - '@eslint/object-schema@2.1.6': {} + '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.3.3': + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 0.15.1 + '@eslint/core': 0.17.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} - '@humanfs/node@0.16.6': + '@humanfs/node@0.16.7': dependencies: '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/retry': 0.4.3 '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.3': {} - '@intlify/bundle-utils@10.0.1(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))': + '@intlify/bundle-utils@11.0.3(vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)))': dependencies: - '@intlify/message-compiler': 11.1.2 - '@intlify/shared': 11.1.7 - acorn: 8.14.0 + '@intlify/message-compiler': 11.2.8 + '@intlify/shared': 11.2.2 + acorn: 8.15.0 + esbuild: 0.25.12 escodegen: 2.1.0 estree-walker: 2.0.2 - jsonc-eslint-parser: 2.4.0 - mlly: 1.7.4 + jsonc-eslint-parser: 2.4.2 source-map-js: 1.2.1 - yaml-eslint-parser: 1.2.3 + yaml-eslint-parser: 1.3.2 optionalDependencies: - vue-i18n: 11.1.10(vue@3.5.17(typescript@5.6.3)) + vue-i18n: 11.2.8(vue@3.5.26(typescript@5.9.3)) - '@intlify/core-base@11.1.10': + '@intlify/core-base@11.2.8': dependencies: - '@intlify/message-compiler': 11.1.10 - '@intlify/shared': 11.1.10 + '@intlify/message-compiler': 11.2.8 + '@intlify/shared': 11.2.8 - '@intlify/message-compiler@11.1.10': + '@intlify/message-compiler@11.2.8': dependencies: - '@intlify/shared': 11.1.10 + '@intlify/shared': 11.2.8 source-map-js: 1.2.1 - '@intlify/message-compiler@11.1.2': + '@intlify/shared@11.2.2': {} + + '@intlify/shared@11.2.8': {} + + '@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))': dependencies: - '@intlify/shared': 11.1.2 - source-map-js: 1.2.1 - - '@intlify/shared@11.1.10': {} - - '@intlify/shared@11.1.2': {} - - '@intlify/shared@11.1.7': {} - - '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.40.1)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0) - '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.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.40.1) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3) - debug: 4.4.0 + '@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 fast-glob: 3.3.3 - js-yaml: 4.1.0 - json5: 2.2.3 - pathe: 1.1.2 + pathe: 2.0.3 picocolors: 1.1.1 - source-map-js: 1.2.1 - unplugin: 1.16.1 - vue: 3.5.17(typescript@5.6.3) + unplugin: 2.3.11 + vue: 3.5.26(typescript@5.9.3) optionalDependencies: - vue-i18n: 11.1.10(vue@3.5.17(typescript@5.6.3)) + vue-i18n: 11.2.8(vue@3.5.26(typescript@5.9.3)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -3781,42 +3688,38 @@ snapshots: - supports-color - typescript - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))': + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.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))': dependencies: - '@babel/parser': 7.26.7 + '@babel/parser': 7.28.5 optionalDependencies: - '@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)) + '@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)) - '@jridgewell/gen-mapping@0.3.5': + '@jridgewell/gen-mapping@0.3.13': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/remapping@2.3.5': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.11': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 '@nodelib/fs.scandir@2.1.5': dependencies: @@ -3828,95 +3731,98 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.1 - '@pkgr/core@0.2.7': {} + '@pkgr/core@0.2.9': {} - '@playwright/test@1.54.1': + '@rolldown/pluginutils@1.0.0-beta.53': {} + + '@rollup/pluginutils@5.3.0(rollup@4.55.1)': dependencies: - playwright: 1.54.1 - - '@rollup/pluginutils@5.1.3(rollup@4.40.1)': - dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.2 + picomatch: 4.0.3 optionalDependencies: - rollup: 4.40.1 + rollup: 4.55.1 - '@rollup/pluginutils@5.1.4(rollup@4.40.1)': - dependencies: - '@types/estree': 1.0.7 - estree-walker: 2.0.2 - picomatch: 4.0.2 - optionalDependencies: - rollup: 4.40.1 - - '@rollup/rollup-android-arm-eabi@4.40.1': + '@rollup/rollup-android-arm-eabi@4.55.1': optional: true - '@rollup/rollup-android-arm64@4.40.1': + '@rollup/rollup-android-arm64@4.55.1': optional: true - '@rollup/rollup-darwin-arm64@4.40.1': + '@rollup/rollup-darwin-arm64@4.55.1': optional: true - '@rollup/rollup-darwin-x64@4.40.1': + '@rollup/rollup-darwin-x64@4.55.1': optional: true - '@rollup/rollup-freebsd-arm64@4.40.1': + '@rollup/rollup-freebsd-arm64@4.55.1': optional: true - '@rollup/rollup-freebsd-x64@4.40.1': + '@rollup/rollup-freebsd-x64@4.55.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.1': + '@rollup/rollup-linux-arm-gnueabihf@4.55.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.1': + '@rollup/rollup-linux-arm-musleabihf@4.55.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.1': + '@rollup/rollup-linux-arm64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.1': + '@rollup/rollup-linux-arm64-musl@4.55.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.1': + '@rollup/rollup-linux-loong64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': + '@rollup/rollup-linux-loong64-musl@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.1': + '@rollup/rollup-linux-ppc64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.1': + '@rollup/rollup-linux-ppc64-musl@4.55.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.1': + '@rollup/rollup-linux-riscv64-gnu@4.55.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.1': + '@rollup/rollup-linux-riscv64-musl@4.55.1': optional: true - '@rollup/rollup-linux-x64-musl@4.40.1': + '@rollup/rollup-linux-s390x-gnu@4.55.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.1': + '@rollup/rollup-linux-x64-gnu@4.55.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.1': + '@rollup/rollup-linux-x64-musl@4.55.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.1': + '@rollup/rollup-openbsd-x64@4.55.1': optional: true - '@tsconfig/node22@22.0.2': {} + '@rollup/rollup-openharmony-arm64@4.55.1': + optional: true - '@types/estree@1.0.6': {} + '@rollup/rollup-win32-arm64-msvc@4.55.1': + optional: true - '@types/estree@1.0.7': {} + '@rollup/rollup-win32-ia32-msvc@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.55.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.55.1': + optional: true + + '@tsconfig/node24@24.0.4': {} + + '@types/estree@1.0.8': {} '@types/json-schema@7.0.15': {} @@ -3930,359 +3836,438 @@ snapshots: '@types/lodash@4.17.13': {} - '@types/node@22.10.10': + '@types/node@24.10.9': dependencies: - undici-types: 6.20.0 + undici-types: 7.16.0 '@types/trusted-types@2.0.7': optional: true - '@types/web-bluetooth@0.0.20': {} + '@types/web-bluetooth@0.0.21': {} - '@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/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)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.37.0(eslint@9.31.0)(typescript@5.6.3) + '@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.37.0 - '@typescript-eslint/type-utils': 8.37.0(eslint@9.31.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.37.0(eslint@9.31.0)(typescript@5.6.3) + '@typescript-eslint/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/visitor-keys': 8.37.0 - eslint: 9.31.0 + eslint: 9.39.2 graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.6.3) - typescript: 5.6.3 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.53.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.53.0 + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.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 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.37.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: '@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.3) '@typescript-eslint/visitor-keys': 8.37.0 - debug: 4.4.0 - eslint: 9.31.0 - typescript: 5.6.3 + debug: 4.4.3 + eslint: 9.39.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.37.0(typescript@5.6.3)': + '@typescript-eslint/project-service@8.37.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.6.3) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.9.3) '@typescript-eslint/types': 8.37.0 - debug: 4.4.0 - typescript: 5.6.3 + debug: 4.4.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.21.0': + '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@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 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.53.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/scope-manager@8.37.0': dependencies: '@typescript-eslint/types': 8.37.0 '@typescript-eslint/visitor-keys': 8.37.0 - '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.6.3)': + '@typescript-eslint/scope-manager@8.49.0': dependencies: - typescript: 5.6.3 + '@typescript-eslint/types': 8.49.0 + '@typescript-eslint/visitor-keys': 8.49.0 - '@typescript-eslint/type-utils@8.37.0(eslint@9.31.0)(typescript@5.6.3)': + '@typescript-eslint/scope-manager@8.53.0': + dependencies: + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/visitor-keys': 8.53.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.53.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.37.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.37.0(eslint@9.31.0)(typescript@5.6.3) - debug: 4.4.0 - eslint: 9.31.0 - ts-api-utils: 2.1.0(typescript@5.6.3) - typescript: 5.6.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) + 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/type-utils@8.53.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.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.37.0': {} - '@typescript-eslint/typescript-estree@8.21.0(typescript@5.6.3)': - dependencies: - '@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.6.3 - ts-api-utils: 2.0.0(typescript@5.6.3) - typescript: 5.6.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.49.0': {} - '@typescript-eslint/typescript-estree@8.37.0(typescript@5.6.3)': + '@typescript-eslint/types@8.53.0': {} + + '@typescript-eslint/typescript-estree@8.37.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.37.0(typescript@5.6.3) - '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.6.3) + '@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.0 + debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 2.1.0(typescript@5.6.3) - typescript: 5.6.3 + semver: 7.7.3 + ts-api-utils: 2.4.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.37.0(eslint@9.31.0)(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0) + '@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 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.53.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.53.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/visitor-keys': 8.53.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 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.37.0(eslint@9.39.2)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) '@typescript-eslint/scope-manager': 8.37.0 '@typescript-eslint/types': 8.37.0 - '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.6.3) - eslint: 9.31.0 - typescript: 5.6.3 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.21.0': + '@typescript-eslint/utils@8.53.0(eslint@9.39.2)(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.21.0 - eslint-visitor-keys: 4.2.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + eslint: 9.39.2 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/visitor-keys@8.37.0': dependencies: '@typescript-eslint/types': 8.37.0 eslint-visitor-keys: 4.2.1 - '@videojs/http-streaming@3.17.0(video.js@8.23.3)': + '@typescript-eslint/visitor-keys@8.49.0': dependencies: - '@babel/runtime': 7.26.7 + '@typescript-eslint/types': 8.49.0 + eslint-visitor-keys: 4.2.1 + + '@typescript-eslint/visitor-keys@8.53.0': + dependencies: + '@typescript-eslint/types': 8.53.0 + eslint-visitor-keys: 4.2.1 + + '@videojs/http-streaming@3.17.2(video.js@8.23.4)': + dependencies: + '@babel/runtime': 7.28.4 '@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.3 + video.js: 8.23.4 '@videojs/vhs-utils@4.1.1': dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 global: 4.4.0 '@videojs/xhr@2.7.0': dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 global: 4.4.0 is-function: 1.0.2 - '@vitejs/plugin-legacy@6.0.0(terser@5.43.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))': + '@vitejs/plugin-legacy@7.2.1(terser@5.46.0)(vite@7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2))': 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 + '@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 regenerator-runtime: 0.14.1 systemjs: 6.15.1 - terser: 5.43.1 - vite: 6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) + terser: 5.46.0 + vite: 7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.1(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))': + '@vitejs/plugin-vue@6.0.3(vite@7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.26(typescript@5.9.3))': dependencies: - vite: 6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) - vue: 3.5.17(typescript@5.6.3) + '@rolldown/pluginutils': 1.0.0-beta.53 + vite: 7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2) + vue: 3.5.26(typescript@5.9.3) - '@volar/language-core@2.4.11': + '@volar/language-core@2.4.27': dependencies: - '@volar/source-map': 2.4.11 + '@volar/source-map': 2.4.27 - '@volar/source-map@2.4.11': {} + '@volar/source-map@2.4.27': {} - '@volar/typescript@2.4.11': + '@volar/typescript@2.4.27': dependencies: - '@volar/language-core': 2.4.11 + '@volar/language-core': 2.4.27 path-browserify: 1.0.1 - vscode-uri: 3.0.8 + vscode-uri: 3.1.0 - '@vue/compiler-core@3.5.13': + '@vue/compiler-core@3.5.26': dependencies: - '@babel/parser': 7.26.2 - '@vue/shared': 3.5.13 - entities: 4.5.0 + '@babel/parser': 7.28.5 + '@vue/shared': 3.5.26 + entities: 7.0.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-core@3.5.17': + '@vue/compiler-dom@3.5.26': dependencies: - '@babel/parser': 7.28.0 - '@vue/shared': 3.5.17 - entities: 4.5.0 + '@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 estree-walker: 2.0.2 - source-map-js: 1.2.1 - - '@vue/compiler-dom@3.5.13': - dependencies: - '@vue/compiler-core': 3.5.13 - '@vue/shared': 3.5.13 - - '@vue/compiler-dom@3.5.17': - dependencies: - '@vue/compiler-core': 3.5.17 - '@vue/shared': 3.5.17 - - '@vue/compiler-sfc@3.5.17': - dependencies: - '@babel/parser': 7.28.0 - '@vue/compiler-core': 3.5.17 - '@vue/compiler-dom': 3.5.17 - '@vue/compiler-ssr': 3.5.17 - '@vue/shared': 3.5.17 - estree-walker: 2.0.2 - magic-string: 0.30.17 + magic-string: 0.30.21 postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.17': + '@vue/compiler-ssr@3.5.26': dependencies: - '@vue/compiler-dom': 3.5.17 - '@vue/shared': 3.5.17 - - '@vue/compiler-vue2@2.7.16': - dependencies: - de-indent: 1.0.2 - he: 1.2.0 + '@vue/compiler-dom': 3.5.26 + '@vue/shared': 3.5.26 '@vue/devtools-api@6.6.4': {} - '@vue/eslint-config-prettier@10.2.0(eslint@9.31.0)(prettier@3.6.2)': + '@vue/devtools-api@7.7.8': dependencies: - 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 + '@vue/devtools-kit': 7.7.8 + + '@vue/devtools-kit@7.7.8': + 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/devtools-shared@7.7.8': + dependencies: + rfdc: 1.4.1 + + '@vue/eslint-config-prettier@10.2.0(eslint@9.39.2)(prettier@3.8.0)': + dependencies: + eslint: 9.39.2 + eslint-config-prettier: 10.1.8(eslint@9.39.2) + eslint-plugin-prettier: 5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.8.0) + prettier: 3.8.0 transitivePeerDependencies: - '@types/eslint' - '@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)': + '@vue/eslint-config-typescript@14.6.0(eslint-plugin-vue@10.7.0(@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)': dependencies: - '@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) + '@typescript-eslint/utils': 8.37.0(eslint@9.39.2)(typescript@5.9.3) + eslint: 9.39.2 + eslint-plugin-vue: 10.7.0(@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)) fast-glob: 3.3.3 - typescript-eslint: 8.37.0(eslint@9.31.0)(typescript@5.6.3) - vue-eslint-parser: 10.2.0(eslint@9.31.0) + typescript-eslint: 8.37.0(eslint@9.39.2)(typescript@5.9.3) + vue-eslint-parser: 10.2.0(eslint@9.39.2) optionalDependencies: - typescript: 5.6.3 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@vue/language-core@2.2.0(typescript@5.6.3)': + '@vue/language-core@3.2.2': dependencies: - '@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 + '@volar/language-core': 2.4.27 + '@vue/compiler-dom': 3.5.26 + '@vue/shared': 3.5.26 + alien-signals: 3.1.2 muggle-string: 0.4.1 path-browserify: 1.0.1 + picomatch: 4.0.3 + + '@vue/reactivity@3.5.26': + dependencies: + '@vue/shared': 3.5.26 + + '@vue/runtime-core@3.5.26': + dependencies: + '@vue/reactivity': 3.5.26 + '@vue/shared': 3.5.26 + + '@vue/runtime-dom@3.5.26': + dependencies: + '@vue/reactivity': 3.5.26 + '@vue/runtime-core': 3.5.26 + '@vue/shared': 3.5.26 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.26(vue@3.5.26(typescript@5.9.3))': + dependencies: + '@vue/compiler-ssr': 3.5.26 + '@vue/shared': 3.5.26 + vue: 3.5.26(typescript@5.9.3) + + '@vue/shared@3.5.26': {} + + '@vue/tsconfig@0.8.1(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3))': optionalDependencies: - typescript: 5.6.3 + typescript: 5.9.3 + vue: 3.5.26(typescript@5.9.3) - '@vue/reactivity@3.5.17': + '@vueuse/core@14.1.0(vue@3.5.26(typescript@5.9.3))': dependencies: - '@vue/shared': 3.5.17 + '@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) - '@vue/runtime-core@3.5.17': + '@vueuse/integrations@14.1.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(vue@3.5.26(typescript@5.9.3))': dependencies: - '@vue/reactivity': 3.5.17 - '@vue/shared': 3.5.17 - - '@vue/runtime-dom@3.5.17': - dependencies: - '@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.17(vue@3.5.17(typescript@5.6.3))': - dependencies: - '@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.17': {} - - '@vue/tsconfig@0.7.0(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3))': - optionalDependencies: - typescript: 5.6.3 - vue: 3.5.17(typescript@5.6.3) - - '@vueuse/core@12.5.0(typescript@5.6.3)': - dependencies: - '@types/web-bluetooth': 0.0.20 - '@vueuse/metadata': 12.5.0 - '@vueuse/shared': 12.5.0(typescript@5.6.3) - vue: 3.5.17(typescript@5.6.3) - transitivePeerDependencies: - - typescript - - '@vueuse/integrations@12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3)': - dependencies: - '@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) + '@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) optionalDependencies: focus-trap: 7.6.2 jwt-decode: 4.0.0 - transitivePeerDependencies: - - typescript - '@vueuse/metadata@12.5.0': {} + '@vueuse/metadata@14.1.0': {} - '@vueuse/shared@12.5.0(typescript@5.6.3)': + '@vueuse/shared@14.1.0(vue@3.5.26(typescript@5.9.3))': dependencies: - vue: 3.5.17(typescript@5.6.3) - transitivePeerDependencies: - - typescript + vue: 3.5.26(typescript@5.9.3) '@xmldom/xmldom@0.7.13': {} - '@xmldom/xmldom@0.8.10': {} + '@xmldom/xmldom@0.8.11': {} - ace-builds@1.43.2: {} - - acorn-jsx@5.3.2(acorn@8.14.0): - dependencies: - acorn: 8.14.0 + ace-builds@1.43.5: {} acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 - acorn@8.14.0: {} - acorn@8.15.0: {} aes-decrypter@4.0.2: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 '@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 @@ -4290,9 +4275,7 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - alien-signals@0.4.14: {} - - ansi-regex@5.0.1: {} + alien-signals@3.1.2: {} ansi-styles@4.3.0: dependencies: @@ -4300,50 +4283,55 @@ snapshots: argparse@2.0.1: {} - autoprefixer@10.4.21(postcss@8.5.6): + autoprefixer@10.4.23(postcss@8.5.6): dependencies: - browserslist: 4.25.1 - caniuse-lite: 1.0.30001727 - fraction.js: 4.3.7 - normalize-range: 0.1.2 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001760 + fraction.js: 5.3.4 picocolors: 1.1.1 postcss: 8.5.6 postcss-value-parser: 4.2.0 - babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): dependencies: - '@babel/compat-data': 7.26.2 - '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + '@babel/compat-data': 7.28.5 + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): dependencies: - '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) - core-js-compat: 3.39.0 + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) + core-js-compat: 3.46.0 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): dependencies: - '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) + '@babel/core': 7.28.5 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) 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.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -4351,44 +4339,40 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist-to-esbuild@2.1.1(browserslist@4.24.2): + browserslist-to-esbuild@2.1.1(browserslist@4.28.0): dependencies: - browserslist: 4.24.2 + browserslist: 4.28.0 meow: 13.2.0 - browserslist@4.24.2: + browserslist@4.28.0: dependencies: - 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) + 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) - browserslist@4.25.1: + browserslist@4.28.1: dependencies: - caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.183 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) + 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) buffer-from@1.1.2: {} callsites@3.1.0: {} - caniuse-lite@1.0.30001685: {} + caniuse-lite@1.0.30001754: {} - caniuse-lite@1.0.30001727: {} + caniuse-lite@1.0.30001760: {} 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 @@ -4404,25 +4388,17 @@ snapshots: concat-map@0.0.1: {} - concurrently@9.2.0: - dependencies: - 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.39.0: + copy-anything@4.0.5: dependencies: - browserslist: 4.24.2 + is-what: 5.5.0 - core-js@3.44.0: {} + core-js-compat@3.46.0: + dependencies: + browserslist: 4.28.0 + + core-js@3.46.0: {} core-util-is@1.0.3: {} @@ -4434,12 +4410,7 @@ snapshots: cssesc@3.0.0: {} - cssstyle@4.2.1: - dependencies: - '@asamuzakjp/css-color': 2.8.3 - rrweb-cssom: 0.8.0 - - csstype@3.1.3: {} + csstype@3.2.3: {} custom-error-instance@2.1.1: {} @@ -4448,46 +4419,31 @@ snapshots: es5-ext: 0.10.64 type: 2.7.3 - data-urls@5.0.0: - dependencies: - whatwg-mimetype: 4.0.0 - whatwg-url: 14.2.0 + dayjs@1.11.19: {} - dayjs@1.11.13: {} - - de-indent@1.0.2: {} - - debug@4.3.7: + debug@4.4.3: dependencies: ms: 2.1.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.2.6: + dompurify@3.3.1: optionalDependencies: '@types/trusted-types': 2.0.7 - electron-to-chromium@1.5.183: {} + electron-to-chromium@1.5.250: {} - electron-to-chromium@1.5.67: {} + electron-to-chromium@1.5.267: {} - emoji-regex@8.0.0: {} - - entities@4.5.0: {} + entities@7.0.0: {} epubjs@0.3.93: dependencies: '@types/localforage': 0.0.34 '@xmldom/xmldom': 0.7.13 - core-js: 3.44.0 + core-js: 3.46.0 event-emitter: 0.3.5 jszip: 3.10.1 localforage: 1.10.0 @@ -4513,33 +4469,63 @@ snapshots: d: 1.0.2 ext: 1.7.0 - esbuild@0.24.2: + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@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: + 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 escalade@3.2.0: {} @@ -4553,42 +4539,31 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.5(eslint@9.31.0): + eslint-config-prettier@10.1.8(eslint@9.39.2): dependencies: - eslint: 9.31.0 + eslint: 9.39.2 - eslint-plugin-prettier@5.5.1(eslint-config-prettier@10.1.5(eslint@9.31.0))(eslint@9.31.0)(prettier@3.6.2): + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@9.39.2))(eslint@9.39.2)(prettier@3.8.0): dependencies: - eslint: 9.31.0 - prettier: 3.6.2 - prettier-linter-helpers: 1.0.0 - synckit: 0.11.8 + eslint: 9.39.2 + prettier: 3.8.0 + prettier-linter-helpers: 1.0.1 + synckit: 0.11.12 optionalDependencies: - eslint-config-prettier: 10.1.5(eslint@9.31.0) + eslint-config-prettier: 10.1.8(eslint@9.39.2) - eslint-plugin-vue@9.32.0(eslint@9.31.0): + eslint-plugin-vue@10.7.0(@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)): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0) - eslint: 9.31.0 - globals: 13.24.0 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2) + eslint: 9.39.2 natural-compare: 1.4.0 nth-check: 2.1.1 - postcss-selector-parser: 6.1.2 - semver: 7.6.3 - vue-eslint-parser: 9.4.3(eslint@9.31.0) + postcss-selector-parser: 7.1.1 + semver: 7.7.3 + vue-eslint-parser: 10.2.0(eslint@9.39.2) xml-name-validator: 4.0.0 - 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 + optionalDependencies: + '@typescript-eslint/parser': 8.37.0(eslint@9.39.2)(typescript@5.9.3) eslint-scope@8.4.0: dependencies: @@ -4597,29 +4572,26 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.2.0: {} - eslint-visitor-keys@4.2.1: {} - eslint@9.31.0: + eslint@9.39.2: 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 + '@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 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.7 - '@types/json-schema': 7.0.15 + '@types/estree': 1.0.8 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.3 escape-string-regexp: 4.0.0 eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 @@ -4648,12 +4620,6 @@ 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 @@ -4662,8 +4628,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -4707,15 +4673,19 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.18.0: + fastq@1.19.1: dependencies: - reusify: 1.0.4 + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - filesize@10.1.6: {} + filesize@11.0.13: {} fill-range@7.1.1: dependencies: @@ -4728,19 +4698,16 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} focus-trap@7.6.2: dependencies: - tabbable: 6.2.0 + tabbable: 6.4.0 - fraction.js@4.3.7: {} - - fsevents@2.3.2: - optional: true + fraction.js@5.3.4: {} fsevents@2.3.3: optional: true @@ -4749,8 +4716,6 @@ snapshots: gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4761,15 +4726,9 @@ snapshots: global@4.4.0: dependencies: - min-document: 2.19.0 + min-document: 2.19.2 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: {} @@ -4782,29 +4741,7 @@ snapshots: dependencies: function-bind: 1.1.2 - 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 + hookable@5.5.3: {} ignore@5.3.2: {} @@ -4812,7 +4749,7 @@ snapshots: immediate@3.0.6: {} - import-fresh@3.3.0: + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 @@ -4821,14 +4758,12 @@ snapshots: inherits@2.0.4: {} - is-core-module@2.15.1: + is-core-module@2.16.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: @@ -4837,50 +4772,23 @@ snapshots: is-number@7.0.0: {} - is-potential-custom-element-name@1.0.1: {} - is-stream@2.0.1: {} + is-what@5.5.0: {} + isarray@1.0.0: {} isexe@2.0.0: {} - js-base64@3.7.7: {} + js-base64@3.7.8: {} js-tokens@4.0.0: {} - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 - 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: {} + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -4890,12 +4798,12 @@ snapshots: json5@2.2.3: {} - jsonc-eslint-parser@2.4.0: + jsonc-eslint-parser@2.4.2: dependencies: - acorn: 8.14.0 + acorn: 8.15.0 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - semver: 7.6.3 + semver: 7.7.3 jszip@3.10.1: dependencies: @@ -4931,7 +4839,7 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash-es@4.17.21: {} + lodash-es@4.17.22: {} lodash._baseiteratee@4.7.0: dependencies: @@ -4965,27 +4873,21 @@ 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.26.7 + '@babel/runtime': 7.28.4 '@videojs/vhs-utils': 4.1.1 global: 4.4.0 - magic-string@0.30.14: + magic-string@0.30.21: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.17: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - marked@15.0.6: {} + marked@17.0.1: {} marks-pane@1.0.9: {} @@ -5000,30 +4902,25 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - min-document@2.19.0: + min-document@2.19.2: dependencies: dom-walk: 0.1.2 minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 - mlly@1.7.4: - dependencies: - acorn: 8.14.0 - pathe: 2.0.2 - pkg-types: 1.3.1 - ufo: 1.5.4 + mitt@3.0.1: {} mpd-parser@1.3.1: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 '@videojs/vhs-utils': 4.1.1 - '@xmldom/xmldom': 0.8.10 + '@xmldom/xmldom': 0.8.11 global: 4.4.0 ms@2.1.3: {} @@ -5032,7 +4929,7 @@ snapshots: mux.js@7.1.0: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 global: 4.4.0 nanoid@3.3.11: {} @@ -5041,11 +4938,7 @@ snapshots: next-tick@1.1.0: {} - node-releases@2.0.18: {} - - node-releases@2.0.19: {} - - normalize-range@0.1.2: {} + node-releases@2.0.27: {} normalize.css@8.0.1: {} @@ -5053,8 +4946,6 @@ snapshots: dependencies: boolbase: 1.0.0 - nwsapi@2.2.16: {} - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -5078,10 +4969,6 @@ 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: {} @@ -5092,45 +4979,28 @@ snapshots: path-webpack@0.0.3: {} - pathe@1.1.2: {} + pathe@2.0.3: {} - pathe@2.0.2: {} + perfect-debounce@1.0.0: {} picocolors@1.1.1: {} picomatch@2.3.1: {} - picomatch@4.0.2: {} + picomatch@4.0.3: {} - pinia@2.3.1(typescript@5.6.3)(vue@3.5.17(typescript@5.6.3)): + pinia@3.0.4(typescript@5.9.3)(vue@3.5.26(typescript@5.9.3)): dependencies: - '@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)) + '@vue/devtools-api': 7.7.8 + vue: 3.5.26(typescript@5.9.3) optionalDependencies: - typescript: 5.6.3 - transitivePeerDependencies: - - '@vue/composition-api' + typescript: 5.9.3 pkcs7@1.0.4: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.28.4 - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.2 - - 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: + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -5145,13 +5015,13 @@ snapshots: prelude-ls@1.2.1: {} - prettier-linter-helpers@1.0.0: + prettier-linter-helpers@1.0.1: dependencies: fast-diff: 1.3.0 - prettier@3.6.2: {} + prettier@3.8.0: {} - pretty-bytes@6.1.1: {} + pretty-bytes@7.1.0: {} process-nextick-args@2.0.1: {} @@ -5165,9 +5035,9 @@ snapshots: punycode@2.3.1: {} - qrcode.vue@3.6.0(vue@3.5.17(typescript@5.6.3)): + qrcode.vue@3.6.0(vue@3.5.26(typescript@5.9.3)): dependencies: - vue: 3.5.17(typescript@5.6.3) + vue: 3.5.26(typescript@5.9.3) querystringify@2.2.0: {} @@ -5183,7 +5053,7 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - regenerate-unicode-properties@10.2.0: + regenerate-unicode-properties@10.2.2: dependencies: regenerate: 1.4.2 @@ -5191,88 +5061,77 @@ snapshots: regenerator-runtime@0.14.1: {} - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.26.0 - - regexpu-core@6.2.0: + regexpu-core@6.4.0: dependencies: regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 + regenerate-unicode-properties: 10.2.2 regjsgen: 0.8.0 - regjsparser: 0.12.0 + regjsparser: 0.13.0 unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.0 + unicode-match-property-value-ecmascript: 2.2.1 regjsgen@0.8.0: {} - regjsparser@0.12.0: + regjsparser@0.13.0: dependencies: - jsesc: 3.0.2 - - require-directory@2.1.1: {} + jsesc: 3.1.0 requires-port@1.0.0: {} resolve-from@4.0.0: {} - resolve@1.22.8: + resolve@1.22.11: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 retry@0.12.0: {} - reusify@1.0.4: {} + reusify@1.1.0: {} - rollup@4.40.1: + rfdc@1.4.1: {} + + rollup@4.55.1: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.1 - '@rollup/rollup-android-arm64': 4.40.1 - '@rollup/rollup-darwin-arm64': 4.40.1 - '@rollup/rollup-darwin-x64': 4.40.1 - '@rollup/rollup-freebsd-arm64': 4.40.1 - '@rollup/rollup-freebsd-x64': 4.40.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.1 - '@rollup/rollup-linux-arm-musleabihf': 4.40.1 - '@rollup/rollup-linux-arm64-gnu': 4.40.1 - '@rollup/rollup-linux-arm64-musl': 4.40.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.1 - '@rollup/rollup-linux-riscv64-gnu': 4.40.1 - '@rollup/rollup-linux-riscv64-musl': 4.40.1 - '@rollup/rollup-linux-s390x-gnu': 4.40.1 - '@rollup/rollup-linux-x64-gnu': 4.40.1 - '@rollup/rollup-linux-x64-musl': 4.40.1 - '@rollup/rollup-win32-arm64-msvc': 4.40.1 - '@rollup/rollup-win32-ia32-msvc': 4.40.1 - '@rollup/rollup-win32-x64-msvc': 4.40.1 + '@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 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.6.3: {} + semver@7.7.3: {} setimmediate@1.0.5: {} @@ -5282,8 +5141,6 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.2: {} - signal-exit@3.0.7: {} source-map-js@1.2.1: {} @@ -5295,87 +5152,60 @@ snapshots: source-map@0.6.1: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 + speakingurl@14.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: + dependencies: + copy-anything: 4.0.5 + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} - symbol-tree@3.2.4: {} - - synckit@0.11.8: + synckit@0.11.12: dependencies: - '@pkgr/core': 0.2.7 + '@pkgr/core': 0.2.9 systemjs@6.15.1: {} - tabbable@6.2.0: {} + tabbable@6.4.0: {} tar-mini@0.2.0: {} - terser@5.43.1: + terser@5.46.0: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.0 + '@jridgewell/source-map': 0.3.11 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 - tldts-core@6.1.74: {} - - tldts@6.1.74: + tinyglobby@0.2.15: dependencies: - tldts-core: 6.1.74 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - tough-cookie@5.1.2: + ts-api-utils@2.4.0(typescript@5.9.3): 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.6.3 - - ts-api-utils@2.1.0(typescript@5.6.3): - dependencies: - typescript: 5.6.3 - - tslib@2.8.1: {} + typescript: 5.9.3 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.7 + js-base64: 3.7.8 lodash.throttle: 4.1.1 proper-lockfile: 4.1.2 url-parse: 1.5.10 @@ -5384,52 +5214,50 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} - type@2.7.3: {} - typescript-eslint@8.37.0(eslint@9.31.0)(typescript@5.6.3): + typescript-eslint@8.37.0(eslint@9.39.2)(typescript@5.9.3): dependencies: - '@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 + '@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 transitivePeerDependencies: - supports-color - typescript@5.6.3: {} + typescript@5.9.3: {} - ufo@1.5.4: {} - - undici-types@6.20.0: {} + undici-types@7.16.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.1.0 + unicode-property-aliases-ecmascript: 2.2.0 - unicode-match-property-value-ecmascript@2.2.0: {} + unicode-match-property-value-ecmascript@2.2.1: {} - unicode-property-aliases-ecmascript@2.1.0: {} + unicode-property-aliases-ecmascript@2.2.0: {} - unplugin@1.16.1: + unplugin@2.3.11: dependencies: - acorn: 8.14.0 + '@jridgewell/remapping': 2.3.5 + acorn: 8.15.0 + picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 - update-browserslist-db@1.1.1(browserslist@4.24.2): + update-browserslist-db@1.1.4(browserslist@4.28.0): dependencies: - browserslist: 4.24.2 + browserslist: 4.28.0 escalade: 3.2.0 picocolors: 1.1.1 - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.2.2(browserslist@4.28.1): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -5448,10 +5276,10 @@ snapshots: util-deprecate@1.0.2: {} - video.js@8.23.3: + video.js@8.23.4: dependencies: - '@babel/runtime': 7.26.7 - '@videojs/http-streaming': 3.17.0(video.js@8.23.3) + '@babel/runtime': 7.28.4 + '@videojs/http-streaming': 3.17.2(video.js@8.23.4) '@videojs/vhs-utils': 4.1.1 '@videojs/xhr': 2.7.0 aes-decrypter: 4.0.2 @@ -5459,186 +5287,125 @@ 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.3) + videojs-contrib-quality-levels: 4.1.0(video.js@8.23.4) videojs-font: 4.2.0 videojs-vtt.js: 0.15.5 - videojs-contrib-quality-levels@4.1.0(video.js@8.23.3): + videojs-contrib-quality-levels@4.1.0(video.js@8.23.4): dependencies: global: 4.4.0 - video.js: 8.23.3 + video.js: 8.23.4 videojs-font@4.2.0: {} videojs-hotkeys@0.2.30: {} - videojs-mobile-ui@1.1.1(video.js@8.23.3): + videojs-mobile-ui@1.1.3(video.js@8.23.4): dependencies: global: 4.4.0 - video.js: 8.23.3 + video.js: 8.23.4 videojs-vtt.js@0.15.5: dependencies: global: 4.4.0 - vite-plugin-compression2@1.3.3(rollup@4.40.1)(vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)): + vite-plugin-compression2@2.4.0(rollup@4.55.1): dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.40.1) + '@rollup/pluginutils': 5.3.0(rollup@4.55.1) tar-mini: 0.2.0 - vite: 6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) transitivePeerDependencies: - rollup - vite@6.1.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0): + vite@7.3.1(@types/node@24.10.9)(terser@5.46.0)(yaml@2.8.2): dependencies: - esbuild: 0.24.2 + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.40.1 + rollup: 4.55.1 + tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 22.10.10 + '@types/node': 24.10.9 fsevents: 2.3.3 - terser: 5.43.1 - yaml: 2.7.0 + terser: 5.46.0 + yaml: 2.8.2 - vscode-uri@3.0.8: {} + vscode-uri@3.1.0: {} - vue-demi@0.14.10(vue@3.5.17(typescript@5.6.3)): + vue-eslint-parser@10.2.0(eslint@9.39.2): dependencies: - 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 + debug: 4.4.3 + eslint: 9.39.2 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 - semver: 7.6.3 + semver: 7.7.3 transitivePeerDependencies: - supports-color - vue-eslint-parser@9.4.3(eslint@9.31.0): + 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)): 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 - lodash: 4.17.21 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - vue-final-modal@4.5.5(@vueuse/core@12.5.0(typescript@5.6.3))(@vueuse/integrations@12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3))(focus-trap@7.6.2)(vue@3.5.17(typescript@5.6.3)): - dependencies: - '@vueuse/core': 12.5.0(typescript@5.6.3) - '@vueuse/integrations': 12.5.0(focus-trap@7.6.2)(jwt-decode@4.0.0)(typescript@5.6.3) + '@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.17(typescript@5.6.3) + vue: 3.5.26(typescript@5.9.3) - vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)): + vue-i18n@11.2.8(vue@3.5.26(typescript@5.9.3)): dependencies: - '@intlify/core-base': 11.1.10 - '@intlify/shared': 11.1.10 + '@intlify/core-base': 11.2.8 + '@intlify/shared': 11.2.8 '@vue/devtools-api': 6.6.4 - vue: 3.5.17(typescript@5.6.3) + vue: 3.5.26(typescript@5.9.3) vue-lazyload@3.0.0: {} - vue-reader@1.2.17(vue@3.5.17(typescript@5.6.3)): + vue-reader@1.3.4: 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.5.1(vue@3.5.17(typescript@5.6.3)): + vue-router@4.6.4(vue@3.5.26(typescript@5.9.3)): dependencies: '@vue/devtools-api': 6.6.4 - vue: 3.5.17(typescript@5.6.3) + vue: 3.5.26(typescript@5.9.3) - vue-toastification@2.0.0-rc.5(vue@3.5.17(typescript@5.6.3)): + vue-toastification@2.0.0-rc.5(vue@3.5.26(typescript@5.9.3)): dependencies: - vue: 3.5.17(typescript@5.6.3) + vue: 3.5.26(typescript@5.9.3) - vue-tsc@2.2.0(typescript@5.6.3): + vue-tsc@3.2.2(typescript@5.9.3): dependencies: - '@volar/typescript': 2.4.11 - '@vue/language-core': 2.2.0(typescript@5.6.3) - typescript: 5.6.3 + '@volar/typescript': 2.4.27 + '@vue/language-core': 3.2.2 + typescript: 5.9.3 - vue@3.5.17(typescript@5.6.3): + vue@3.5.26(typescript@5.9.3): dependencies: - '@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 + '@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 optionalDependencies: - typescript: 5.6.3 - - w3c-xmlserializer@5.0.0: - dependencies: - xml-name-validator: 5.0.0 - - webidl-conversions@7.0.0: {} + typescript: 5.9.3 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.2.3: + yaml-eslint-parser@1.3.2: dependencies: eslint-visitor-keys: 3.4.3 - 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 + yaml@2.8.2: {} yocto-queue@0.1.0: {} diff --git a/frontend/public/img/logo.svg b/frontend/public/img/logo.svg index 5e78eccf..dac88ae2 100644 --- a/frontend/public/img/logo.svg +++ b/frontend/public/img/logo.svg @@ -1,147 +1 @@ - -image/svg+xml - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/frontend/public/index.html b/frontend/public/index.html index 4675b268..15ff375e 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -18,9 +18,17 @@ - + - + diff --git a/frontend/src/api/pub.ts b/frontend/src/api/pub.ts index 964cb030..5070cae3 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 += encodeURIComponent(files[0]) + "?"; + url += files[0] + "?"; } else { let arg = ""; for (const file of files) { - arg += encodeURIComponent(file) + ","; + arg += file + ","; } arg = arg.substring(0, arg.length - 1); diff --git a/frontend/src/api/search.ts b/frontend/src/api/search.ts index 871f0aed..63cbdaa1 100644 --- a/frontend/src/api/search.ts +++ b/frontend/src/api/search.ts @@ -1,7 +1,12 @@ -import { fetchURL, removePrefix } from "./utils"; +import { fetchURL, removePrefix, StatusError } from "./utils"; import url from "../utils/url"; -export default async function search(base: string, query: string) { +export default async function search( + base: string, + query: string, + signal: AbortSignal, + callback: (item: ResourceItem) => void +) { base = removePrefix(base); query = encodeURIComponent(query); @@ -9,19 +14,60 @@ export default async function search(base: string, query: string) { base += "/"; } - const res = await fetchURL(`/api/search${base}?query=${query}`, {}); + 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; - let data = await res.json(); - - data = data.map((item: UploadItem) => { - item.url = `/files${base}` + url.encodePath(item.path); - - if (item.dir) { - item.url += "/"; + 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); + } + } } - - return item; - }); - - return data; + } 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); + } + throw e; + } } diff --git a/frontend/src/api/tus.ts b/frontend/src/api/tus.ts index fbfef4da..d6601166 100644 --- a/frontend/src/api/tus.ts +++ b/frontend/src/api/tus.ts @@ -1,17 +1,11 @@ import * as tus from "tus-js-client"; import { baseURL, tusEndpoint, tusSettings, origin } from "@/utils/constants"; import { useAuthStore } from "@/stores/auth"; -import { useUploadStore } from "@/stores/upload"; import { removePrefix } from "@/api/utils"; const RETRY_BASE_DELAY = 1000; const RETRY_MAX_DELAY = 20000; -const SPEED_UPDATE_INTERVAL = 1000; -const ALPHA = 0.2; -const ONE_MINUS_ALPHA = 1 - ALPHA; -const RECENT_SPEEDS_LIMIT = 5; -const MB_DIVISOR = 1024 * 1024; -const CURRENT_UPLOAD_LIST: CurrentUploadList = {}; +const CURRENT_UPLOAD_LIST: { [key: string]: tus.Upload } = {}; export async function upload( filePath: string, @@ -55,48 +49,35 @@ export async function upload( return true; }, - onError: function (error) { - if (CURRENT_UPLOAD_LIST[filePath].interval) { - clearInterval(CURRENT_UPLOAD_LIST[filePath].interval); - } + onError: function (error: Error | tus.DetailedError) { delete CURRENT_UPLOAD_LIST[filePath]; - reject(new Error(`Upload failed: ${error.message}`)); + + if (error.message === "Upload aborted") { + return reject(error); + } + + const message = + error instanceof tus.DetailedError + ? error.originalResponse === null + ? "000 No connection" + : error.originalResponse.getBody() + : "Upload failed"; + + console.error(error); + + reject(new Error(message)); }, onProgress: function (bytesUploaded) { - const fileData = CURRENT_UPLOAD_LIST[filePath]; - fileData.currentBytesUploaded = bytesUploaded; - - if (!fileData.hasStarted) { - fileData.hasStarted = true; - fileData.lastProgressTimestamp = Date.now(); - - fileData.interval = window.setInterval(() => { - calcProgress(filePath); - }, SPEED_UPDATE_INTERVAL); - } if (typeof onupload === "function") { onupload({ loaded: bytesUploaded }); } }, onSuccess: function () { - if (CURRENT_UPLOAD_LIST[filePath].interval) { - clearInterval(CURRENT_UPLOAD_LIST[filePath].interval); - } delete CURRENT_UPLOAD_LIST[filePath]; resolve(); }, }); - CURRENT_UPLOAD_LIST[filePath] = { - upload: upload, - recentSpeeds: [], - initialBytesUploaded: 0, - currentBytesUploaded: 0, - currentAverageSpeed: 0, - lastProgressTimestamp: null, - sumOfRecentSpeeds: 0, - hasStarted: false, - interval: undefined, - }; + CURRENT_UPLOAD_LIST[filePath] = upload; upload.start(); }); } @@ -128,76 +109,11 @@ function isTusSupported() { return tus.isSupported === true; } -function computeETA(speed?: number) { - const state = useUploadStore(); - if (state.speedMbyte === 0) { - return Infinity; - } - const totalSize = state.sizes.reduce( - (acc: number, size: number) => acc + size, - 0 - ); - const uploadedSize = state.progress.reduce((a, b) => a + b, 0); - const remainingSize = totalSize - uploadedSize; - const speedBytesPerSecond = (speed ?? state.speedMbyte) * 1024 * 1024; - return remainingSize / speedBytesPerSecond; -} - -function computeGlobalSpeedAndETA() { - let totalSpeed = 0; - let totalCount = 0; - - for (const filePath in CURRENT_UPLOAD_LIST) { - totalSpeed += CURRENT_UPLOAD_LIST[filePath].currentAverageSpeed; - totalCount++; - } - - if (totalCount === 0) return { speed: 0, eta: Infinity }; - - const averageSpeed = totalSpeed / totalCount; - const averageETA = computeETA(averageSpeed); - - return { speed: averageSpeed, eta: averageETA }; -} - -function calcProgress(filePath: string) { - const uploadStore = useUploadStore(); - const fileData = CURRENT_UPLOAD_LIST[filePath]; - - const elapsedTime = - (Date.now() - (fileData.lastProgressTimestamp ?? 0)) / 1000; - const bytesSinceLastUpdate = - fileData.currentBytesUploaded - fileData.initialBytesUploaded; - const currentSpeed = bytesSinceLastUpdate / MB_DIVISOR / elapsedTime; - - if (fileData.recentSpeeds.length >= RECENT_SPEEDS_LIMIT) { - fileData.sumOfRecentSpeeds -= fileData.recentSpeeds.shift() ?? 0; - } - - fileData.recentSpeeds.push(currentSpeed); - fileData.sumOfRecentSpeeds += currentSpeed; - - const avgRecentSpeed = - fileData.sumOfRecentSpeeds / fileData.recentSpeeds.length; - fileData.currentAverageSpeed = - ALPHA * avgRecentSpeed + ONE_MINUS_ALPHA * fileData.currentAverageSpeed; - - const { speed, eta } = computeGlobalSpeedAndETA(); - uploadStore.setUploadSpeed(speed); - uploadStore.setETA(eta); - - fileData.initialBytesUploaded = fileData.currentBytesUploaded; - fileData.lastProgressTimestamp = Date.now(); -} - export function abortAllUploads() { for (const filePath in CURRENT_UPLOAD_LIST) { - if (CURRENT_UPLOAD_LIST[filePath].interval) { - clearInterval(CURRENT_UPLOAD_LIST[filePath].interval); - } - if (CURRENT_UPLOAD_LIST[filePath].upload) { - CURRENT_UPLOAD_LIST[filePath].upload.abort(true); - CURRENT_UPLOAD_LIST[filePath].upload.options!.onError!( + if (CURRENT_UPLOAD_LIST[filePath]) { + CURRENT_UPLOAD_LIST[filePath].abort(true); + CURRENT_UPLOAD_LIST[filePath].options!.onError!( new Error("Upload aborted") ); } diff --git a/frontend/src/api/users.ts b/frontend/src/api/users.ts index 78096b49..dc45e084 100644 --- a/frontend/src/api/users.ts +++ b/frontend/src/api/users.ts @@ -8,12 +8,13 @@ export async function get(id: number) { return fetchJSON(`/api/users/${id}`, {}); } -export async function create(user: IUser) { +export async function create(user: IUser, currentPassword: string) { const res = await fetchURL(`/api/users`, { method: "POST", body: JSON.stringify({ what: "user", which: [], + current_password: currentPassword, data: user, }), }); @@ -25,19 +26,30 @@ export async function create(user: IUser) { throw new StatusError(await res.text(), res.status); } -export async function update(user: Partial, which = ["all"]) { +export async function update( + user: Partial, + which = ["all"], + currentPassword: string | null = null +) { await fetchURL(`/api/users/${user.id}`, { method: "PUT", body: JSON.stringify({ what: "user", which: which, + ...(currentPassword != null ? { current_password: currentPassword } : {}), data: user, }), }); } -export async function remove(id: number) { +export async function remove( + id: number, + currentPassword: string | null = null +) { await fetchURL(`/api/users/${id}`, { method: "DELETE", + body: JSON.stringify({ + ...(currentPassword != null ? { current_password: currentPassword } : {}), + }), }); } diff --git a/frontend/src/api/utils.ts b/frontend/src/api/utils.ts index ae509de2..f21fbe38 100644 --- a/frontend/src/api/utils.ts +++ b/frontend/src/api/utils.ts @@ -91,3 +91,21 @@ 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 new file mode 100644 index 00000000..14663fd9 --- /dev/null +++ b/frontend/src/components/ContextMenu.vue @@ -0,0 +1,47 @@ + + + diff --git a/frontend/src/components/Search.vue b/frontend/src/components/Search.vue index 08b40e3e..57d5ba0d 100644 --- a/frontend/src/components/Search.vue +++ b/frontend/src/components/Search.vue @@ -5,10 +5,11 @@ v-if="active" class="action" @click="close" - :aria-label="$t('buttons.close')" - :title="$t('buttons.close')" + :aria-label="closeButtonTitle" + :title="closeButtonTitle" > - arrow_back + stop_circle + arrow_back search + autorenew + + + {{ results.length }} +
@@ -57,9 +67,6 @@
-

- autorenew -

@@ -70,10 +77,11 @@ import { useLayoutStore } from "@/stores/layout"; import url from "@/utils/url"; import { search } from "@/api"; -import { computed, inject, onMounted, ref, watch } from "vue"; +import { computed, inject, onMounted, ref, watch, onUnmounted } 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" }, @@ -84,6 +92,7 @@ const boxes = { const layoutStore = useLayoutStore(); const fileStore = useFileStore(); +let searchAbortController = new AbortController(); const { currentPromptName } = storeToRefs(layoutStore); @@ -124,9 +133,7 @@ watch(currentPromptName, (newVal, oldVal) => { }); watch(prompt, () => { - if (results.value.length) { - reset(); - } + reset(); }); // ...mapState(useFileStore, ["isListing"]), @@ -149,6 +156,10 @@ 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; @@ -164,14 +175,23 @@ onMounted(() => { }); }); +onUnmounted(() => { + abortLastSearch(); +}); + const open = () => { !active.value && layoutStore.showHover("search"); }; const close = (event: Event) => { - event.stopPropagation(); - event.preventDefault(); - layoutStore.closeHovers(); + if (ongoing.value) { + abortLastSearch(); + ongoing.value = false; + } else { + event.stopPropagation(); + event.preventDefault(); + layoutStore.closeHovers(); + } }; const keyup = (event: KeyboardEvent) => { @@ -188,11 +208,16 @@ 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(); @@ -208,8 +233,16 @@ const submit = async (event: Event) => { ongoing.value = true; try { - results.value = await search(path, prompt.value); + abortLastSearch(); + searchAbortController = new AbortController(); + results.value = []; + await search(path, prompt.value, searchAbortController.signal, (item) => + results.value.push(item) + ); } 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 74fb45ad..c7961e3e 100644 --- a/frontend/src/components/Sidebar.vue +++ b/frontend/src/components/Sidebar.vue @@ -63,6 +63,7 @@ diff --git a/frontend/src/components/settings/AceEditorTheme.vue b/frontend/src/components/settings/AceEditorTheme.vue new file mode 100644 index 00000000..68585a3a --- /dev/null +++ b/frontend/src/components/settings/AceEditorTheme.vue @@ -0,0 +1,28 @@ + + + diff --git a/frontend/src/components/settings/Languages.vue b/frontend/src/components/settings/Languages.vue index f17ab8e2..72968511 100644 --- a/frontend/src/components/settings/Languages.vue +++ b/frontend/src/components/settings/Languages.vue @@ -15,9 +15,8 @@ export default { data() { const dataObj = {}; const locales = { - he: "עברית", - hu: "Magyar", ar: "العربية", + bg: "български език", ca: "Català", cs: "Čeština", de: "Deutsch", @@ -25,15 +24,18 @@ export default { en: "English", es: "Español", fr: "Français", + he: "עברית", + hr: "Hrvatski", + hu: "Magyar", is: "Icelandic", it: "Italiano", ja: "日本語", ko: "한국어", - "nl-be": "Dutch (Belgium)", no: "Norsk", + "nl-be": "Dutch (Belgium)", pl: "Polski", - "pt-br": "Português", - pt: "Português (Brasil)", + "pt-br": "Português (Brasil)", + pt: "Português (Portugal)", ro: "Romanian", ru: "Русский", sk: "Slovenčina", diff --git a/frontend/src/css/base.css b/frontend/src/css/base.css index be5b0b98..f0b8ef0c 100644 --- a/frontend/src/css/base.css +++ b/frontend/src/css/base.css @@ -185,3 +185,7 @@ html[dir="rtl"] .breadcrumbs a { .vfm-modal { z-index: 9999999 !important; } + +body > div[style*="z-index: 9990"] { + z-index: 10000 !important; +} diff --git a/frontend/src/css/context-menu.css b/frontend/src/css/context-menu.css new file mode 100644 index 00000000..d0741d16 --- /dev/null +++ b/frontend/src/css/context-menu.css @@ -0,0 +1,21 @@ +.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 2e65cff6..fdad54b9 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,8 +75,9 @@ 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 { @@ -142,8 +143,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 { @@ -154,8 +155,9 @@ 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 { @@ -221,8 +223,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 { @@ -233,8 +235,9 @@ 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/login.css b/frontend/src/css/login.css index 14bfd1a5..62150ee6 100644 --- a/frontend/src/css/login.css +++ b/frontend/src/css/login.css @@ -45,6 +45,15 @@ 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 bf2863f6..7d6cab86 100644 --- a/frontend/src/css/mdPreview.css +++ b/frontend/src/css/mdPreview.css @@ -1,6 +1,4 @@ .md_preview { - overflow-y: auto; - max-height: 80vh; padding: 1rem; border: 1px solid #000; font-size: 20px; @@ -9,5 +7,5 @@ #preview-container { overflow: auto; - max-height: 80vh; /* Match the max-height of md_preview for scrolling */ + flex: 1; } diff --git a/frontend/src/css/styles.css b/frontend/src/css/styles.css index a793b025..5ac7d8d5 100644 --- a/frontend/src/css/styles.css +++ b/frontend/src/css/styles.css @@ -17,6 +17,7 @@ @import "./mobile.css"; @import "./epubReader.css"; @import "./mdPreview.css"; +@import "./context-menu.css"; /* For testing only :focus { @@ -97,7 +98,8 @@ main .spinner .bounce2 { position: relative; } -.action.disabled { +.action.disabled, +.action[disabled] { opacity: 0.2; cursor: not-allowed; } diff --git a/frontend/src/i18n/ar.json b/frontend/src/i18n/ar.json index 03edf825..b8f431eb 100644 --- a/frontend/src/i18n/ar.json +++ b/frontend/src/i18n/ar.json @@ -24,7 +24,7 @@ "ok": "موافق", "permalink": "الحصول على رابط دائم", "previous": "السابق", - "preview": "Preview", + "preview": "معاينة", "publish": "نشر", "rename": "إعادة تسمية", "replace": "استبدال", @@ -42,7 +42,12 @@ "update": "تحديث", "upload": "رفع", "openFile": "فتح الملف", - "discardChanges": "إلغاء التغييرات" + "discardChanges": "إلغاء التغييرات", + "stopSearch": "توقف عن البحث", + "saveChanges": "حفظ التغييرات", + "editAsText": "تعديل على شكل نص", + "increaseFontSize": "زيادة حجم الخط", + "decreaseFontSize": "تصغير حجم الخط" }, "download": { "downloadFile": "تحميل الملف", @@ -74,7 +79,16 @@ "sortByLastModified": "الترتيب بآخر تعديل", "sortByName": "الترتيب باﻹسم", "sortBySize": "الترتيب بالحجم", - "noPreview": "لا يوجد عرض مسبق لهذا الملف." + "noPreview": "لا يوجد عرض مسبق لهذا الملف.", + "csvTooLarge": "حجم الملف اكبر من (<5MB), يرجى تحميل الملف للمعاينة", + "csvLoadFailed": "Failed to load CSV file.", + "showingRows": "Showing {count} row(s)", + "columnSeparator": "Column Separator", + "csvSeparators": { + "comma": "Comma (,)", + "semicolon": "Semicolon (;)", + "both": "Both (,) and (;)" + } }, "help": { "click": "حدد الملف أو المجلد", @@ -100,7 +114,11 @@ "submit": "تسجيل دخول", "username": "إسم المستخدم", "usernameTaken": "إسم المستخدم غير متاح", - "wrongCredentials": "بيانات دخول خاطئة" + "wrongCredentials": "بيانات دخول خاطئة", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "دائم", "prompts": { @@ -120,7 +138,7 @@ "filesSelected": "تم تحديد {count} ملفات.", "lastModified": "آخر تعديل", "move": "نقل", - "moveMessage": "إختر مكان جديد للملفات أو المجلدات المراد نقلها:", + "moveMessage": "اختر منزلاً جديداً لملفك (ملفاتك)/مجلدك (مجلداتك):", "newArchetype": "إنشاء منشور من المنشور اﻷصلي. الملف سيتم انشاءه في مجلد المحتويات.", "newDir": "مجلد جديد", "newDirMessage": "أدخل اسم المجلد الجديد.", @@ -154,6 +172,7 @@ "video": "فيديوهات" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "إدارة", "administrator": "مدير", "allowCommands": "تنفيذ اﻷوامر", @@ -161,6 +180,7 @@ "allowNew": "إنشاء ملفات و مجلدات جديدة", "allowPublish": "نشر مقالات و صفحات جديدة", "allowSignup": "اسمح للمستخدمين بالاشتراك", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(أتركه فارغاً إن لم ترد تغييره)", "branding": "الشعار", "brandingDirectoryPath": "مسار مجلد الشعار", @@ -169,15 +189,15 @@ "commandRunner": "منفذ اﻷوامر", "commandRunnerHelp": "هنا بإمكانك تعيين اﻷوامر التي سيتم تنفيذها في اﻷحداث المسماة. يجب كتابة أمر واحد في كل سطر. ستكون المتغيرات البيئية (env) {0} و {1} متاحة، حيث {0} نسبي لـ {1}. لمزيد من المعلومات حول هذه الميزة و المتغيرات البيئية المتاحة، يرجى قراءة {2}.", "commandsUpdated": "تم تحديث اﻷوامر", - "createUserDir": "إنشاء مجلد المستخدم (home) تلقائياً عند إنشاء مستخدم جديد", + "createUserDir": "إنشاء مجلد المستخدم الرئيسي تلقائياً عند إنشاء مستخدم جديد", "minimumPasswordLength": "Minimum password length", "tusUploads": "التحميلات المتقطعة", "tusUploadsHelp": "يدعم متصفح الملفات تحميل الملفات المتقطعة، مما يسمح بتحميلات الملفات بشكل فعال و موثوق و قابلة للمتابغة و متقطعة حتى على الشبكات غير الموثوقة.", "tusUploadsChunkSize": "يشير إلى الحد اﻷقصى لحجم الطلب (سيتم استخدام التحميل المباشر للتحميلات صغيرة الخحم). يمكنك إدخال عدد صحيح عادي يدل على الحجم بوحدة البايت أو نمظ مثل10MB, 1GB, إلخ.", "tusUploadsRetryCount": "عدد مرات إعادة المحاولة إذا فشلت عملية تحميل القطعة.", - "userHomeBasePath": "المسار الرئيسي لمجلد المستخدم (home)", + "userHomeBasePath": "المسار الرئيسي لمجلد المستخدم الرئيسي", "userScopeGenerationPlaceholder": "سيتم تعيين نطاق المستخدم تلقائياً", - "createUserHomeDirectory": "إنشاء مجلد المستخدم (home)", + "createUserHomeDirectory": "إنشاء مجلد المستخدم الرئيسي", "customStylesheet": "ستايل مخصص", "defaultUserDescription": "هذه اﻹعدادات اﻹفتراضية للمستخدمين الجدد.", "disableExternalLinks": "تعطيل الروابط الخارجية (بإسثناء الوثائق)", @@ -212,6 +232,7 @@ "permissions": "الصلاحيات", "permissionsHelp": "يمكنك تعيين المستخدم كـ \"مدير\" أو تحديد الصلاحيات بشكل منفرد.\n إذا قمت بتحديد المستخدم كـ \"مدير\"، باقي الخيارات سيتم تحديدها تلقائياً.\n إدارة المستخدمين تبقى صلاحية فريدة للـ \"مدير\" فقط.\n", "profileSettings": "إعدادات الحساب", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "منع الوصول إلى الملفات التي تبدأ بنقطة مثل (.git، و .gitignore) في كل مجلد.\n", "ruleExample2": "منع الوصول إلى الملف المسمى Caddyfile في نطاق الجذر.", "rules": "المجموعات", @@ -238,7 +259,8 @@ "userManagement": "إدارة المستخدمين", "userUpdated": "تم تعديل المستخدم", "username": "إسم المستخدم", - "users": "المستخدمين" + "users": "المستخدمين", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "مساعدة", diff --git a/frontend/src/i18n/bg.json b/frontend/src/i18n/bg.json new file mode 100644 index 00000000..d1388d3f --- /dev/null +++ b/frontend/src/i18n/bg.json @@ -0,0 +1,288 @@ +{ + "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": "Настройки на Профила", + "redirectAfterCopyMove": "Redirect to destination after copy/move", + "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/ca.json b/frontend/src/i18n/ca.json index 77e32e47..2ca2b5d4 100644 --- a/frontend/src/i18n/ca.json +++ b/frontend/src/i18n/ca.json @@ -42,7 +42,12 @@ "update": "Actualitzar", "upload": "Pujar", "openFile": "Obrir fitxer", - "discardChanges": "Descartar" + "discardChanges": "Descartar", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Descarregar fitxer", @@ -74,7 +79,16 @@ "sortByLastModified": "Ordenar per última modificació", "sortByName": "Ordenar per nom", "sortBySize": "Ordenar per mida", - "noPreview": "La vista prèvia no està disponible per a aquest fitxer." + "noPreview": "La vista prèvia no està disponible per a aquest fitxer.", + "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": "seleccionar fitxer o carpeta", @@ -100,7 +114,11 @@ "submit": "Iniciar sessió", "username": "Usuari", "usernameTaken": "Nom d'usuari no disponible", - "wrongCredentials": "Usuari i/o contrasenya incorrectes" + "wrongCredentials": "Usuari i/o contrasenya incorrectes", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Permanent", "prompts": { @@ -154,6 +172,7 @@ "video": "Vídeo" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrador", "allowCommands": "Executar comandes", @@ -161,6 +180,7 @@ "allowNew": "Crear nous fitxers i carpetes", "allowPublish": "Publicar nous posts i pàgines", "allowSignup": "Permetre registre d'usuaris", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(deixar en blanc per evitar canvis)", "branding": "Marca", "brandingDirectoryPath": "Ruta de la carpeta de personalització de marca", @@ -212,6 +232,7 @@ "permissions": "Permisos", "permissionsHelp": "Pots nomenar l'usuari com a administrador o triar els permisos individualment. Si selecciones \"Administrador\", totes les altres opcions s'activaran automàticament. L'administració d'usuaris és un privilegi d'administrador.\n", "profileSettings": "Ajustos del perfil", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "prevé l'accés a una extensió de fitxer (Com .git) en cada carpeta.\n", "ruleExample2": "bloqueja l'accés al fitxer anomenat Caddyfile a la carpeta arrel.", "rules": "Regles", @@ -238,7 +259,8 @@ "userManagement": "Administració d'usuaris", "userUpdated": "Usuari actualitzat!", "username": "Usuari", - "users": "Usuaris" + "users": "Usuaris", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Ajuda", diff --git a/frontend/src/i18n/cs.json b/frontend/src/i18n/cs.json index 1c1077c8..d57c4336 100644 --- a/frontend/src/i18n/cs.json +++ b/frontend/src/i18n/cs.json @@ -42,7 +42,12 @@ "update": "Aktualizovat", "upload": "Nahrát", "openFile": "Otevřít soubor", - "discardChanges": "Zrušit změny" + "discardChanges": "Zrušit změny", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Stáhnout soubor", @@ -74,7 +79,16 @@ "sortByLastModified": "Seřadit podle poslední změny", "sortByName": "Seřadit podle názvu", "sortBySize": "Seřadit podle velikosti", - "noPreview": "Náhled pro tento soubor není k dispozici." + "noPreview": "Náhled pro tento soubor není k dispozici.", + "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": "vyberte soubor nebo adresář", @@ -100,7 +114,11 @@ "submit": "Přihlásit se", "username": "Uživatelské jméno", "usernameTaken": "Uživatelské jméno již existuje", - "wrongCredentials": "Nesprávné přihlašovací údaje" + "wrongCredentials": "Nesprávné přihlašovací údaje", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Trvalý", "prompts": { @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrátor", "allowCommands": "Povolit příkazy", @@ -161,6 +180,7 @@ "allowNew": "Vytvářet nové soubory a adresáře", "allowPublish": "Publikovat nové příspěvky a stránky", "allowSignup": "Povolit uživatelům registraci", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(ponechte prázdné pro zabránění změnám)", "branding": "Branding", "brandingDirectoryPath": "Cesta ke složce s brandingem", @@ -212,6 +232,7 @@ "permissions": "Oprávnění", "permissionsHelp": "Můžete nastavit uživatele jako administrátora nebo zvolit jednotlivá oprávnění. Pokud vyberete \"Administrátor\", všechny ostatní možnosti budou automaticky zaškrtnuty. Správa uživatelů zůstává výsadou administrátora.\n", "profileSettings": "Nastavení profilu", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "zabraňuje přístupu k jakémukoli skrytému souboru (např. .git, .gitignore) v každé složce.\n", "ruleExample2": "blokuje přístup k souboru s názvem Caddyfile v kořenovém adresáři.", "rules": "Pravidla", @@ -238,7 +259,8 @@ "userManagement": "Správa uživatelů", "userUpdated": "Uživatel aktualizován!", "username": "Uživatelské jméno", - "users": "Uživatelé" + "users": "Uživatelé", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Nápověda", diff --git a/frontend/src/i18n/de.json b/frontend/src/i18n/de.json index 0a307f64..872b29e2 100644 --- a/frontend/src/i18n/de.json +++ b/frontend/src/i18n/de.json @@ -42,7 +42,12 @@ "update": "Update", "upload": "Upload", "openFile": "Datei öffnen", - "discardChanges": "Verwerfen" + "discardChanges": "Verwerfen", + "stopSearch": "Suche abbrechen", + "saveChanges": "Änderungen speichern", + "editAsText": "Als Text bearbeiten", + "increaseFontSize": "Schriftgröße vergrößern", + "decreaseFontSize": "Schriftgröße verkleinern" }, "download": { "downloadFile": "Download Datei", @@ -74,7 +79,16 @@ "sortByLastModified": "Nach Änderungsdatum sortieren", "sortByName": "Nach Namen sortieren", "sortBySize": "Nach Größe sortieren", - "noPreview": "Für diese Datei ist keine Vorschau verfügbar." + "noPreview": "Für diese Datei ist keine Vorschau verfügbar.", + "csvTooLarge": "Die CSV-Datei ist zu groß für die Vorschau (>5 MB). Bitte herunterladen, um sie anzuzeigen.", + "csvLoadFailed": "Fehler beim Laden der CSV-Datei.", + "showingRows": "{count} Zeile(n) werden angezeigt", + "columnSeparator": "Spaltentrennzeichen", + "csvSeparators": { + "comma": "Komma (,)", + "semicolon": "Semikolon (;)", + "both": "Sowohl (,) als auch (;)" + } }, "help": { "click": "Wähle Datei oder Ordner", @@ -100,7 +114,11 @@ "submit": "Login", "username": "Benutzername", "usernameTaken": "Benutzername ist bereits vergeben", - "wrongCredentials": "Falsche Zugangsdaten" + "wrongCredentials": "Falsche Zugangsdaten", + "passwordTooShort": "Passwort muss mindestens {min} Zeichen lang sein", + "logout_reasons": { + "inactivity": "Du wurdest aufgrund von Inaktivität abgemeldet." + } }, "permanent": "Permanent", "prompts": { @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Ace Editor Theme", "admin": "Admin", "administrator": "Administrator", "allowCommands": "Befehle ausführen", @@ -161,6 +180,7 @@ "allowNew": "Erstellen neuer Dateien und Ordner", "allowPublish": "Veröffentlichen von neuen Beiträgen und Seiten", "allowSignup": "Erlaube Benutzern sich zu registrieren", + "hideLoginButton": "Den Login-Button auf öffentlichen Seiten ausblenden", "avoidChanges": "(leer lassen, um Änderungen zu vermeiden)", "branding": "Design", "brandingDirectoryPath": "Designverzeichnispfad", @@ -170,7 +190,7 @@ "commandRunnerHelp": "Hier könne Sie Befehle eintragen, welche bei den benannten Aktionen ausgeführt werden. Sie müssen pro Zeile jeweils einen Befehl eingeben. Die Umgebungsvariable {0} und {1} sind verfügbar, wobei {0} relative zu {1} ist. Für mehr Informationen über diese Funktion und die verfügbaren Umgebungsvariablen lesen Sie bitte die {2}.", "commandsUpdated": "Befehle aktualisiert!", "createUserDir": "Automatisches Erstellen des Home-Verzeichnisses beim Anlegen neuer Benutzer", - "minimumPasswordLength": "Minimum password length", + "minimumPasswordLength": "Mindestlänge für Passwörter", "tusUploads": "Gestückelter Upload", "tusUploadsHelp": "File Browser unterstützt das Hochladen von gestückelten Dateien und ermöglicht so einen effizienten, zuverlässigen, fortsetzbaren und gestückelten Datei-Upload auch in unzuverlässigen Netzwerken.", "tusUploadsChunkSize": "Gibt die maximale Größe pro Anfrage an (direkte Uploads werden für kleinere Uploads verwendet). Bitte geben Sie eine Byte-Angabe oder eine Zeichenfolge wie 10 MB, 1 GB usw. an", @@ -194,7 +214,7 @@ "instanceName": "Instanzname", "language": "Sprache", "lockPassword": "Verhindere, dass der Benutzer sein Passwort ändert", - "newPassword": "Ihr neues Passwort.", + "newPassword": "Ihr neues Passwort", "newPasswordConfirm": "Bestätigen Sie Ihr neues Passwort", "newUser": "Neuer Benutzer", "password": "Passwort", @@ -212,6 +232,7 @@ "permissions": "Berechtigungen", "permissionsHelp": "Sie können einem Benutzer Administratorrechte einräumen oder die Berechtigungen individuell festlegen. Wenn Sie \"Administrator\" auswählen, werden alle anderen Rechte automatisch vergeben. Die Nutzerverwaltung kann nur durch einen Administrator erfolgen.\n", "profileSettings": "Profileinstellungen", + "redirectAfterCopyMove": "Nach Kopieren/Verschieben zum Zielverzeichnis wechseln", "ruleExample1": "Verhindert den Zugang zu versteckten Dateien (dot-Files, wie .git, .gitignore) in allen Ordnern\n", "ruleExample2": "blockiert den Zugang auf Dateien mit dem Namen Caddyfile in der Wurzel/Basis des Scopes.", "rules": "Regeln", @@ -238,7 +259,8 @@ "userManagement": "Benutzerverwaltung", "userUpdated": "Benutzer aktualisiert!", "username": "Nutzername", - "users": "Nutzer" + "users": "Nutzer", + "currentPassword": "Ihr aktuelles Passwort" }, "sidebar": { "help": "Hilfe", diff --git a/frontend/src/i18n/el.json b/frontend/src/i18n/el.json index 9b021b80..04e837f3 100644 --- a/frontend/src/i18n/el.json +++ b/frontend/src/i18n/el.json @@ -42,7 +42,12 @@ "update": "Ενημέρωση", "upload": "Μεταφόρτωση", "openFile": "Άνοιγμα αρχείου", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Λήψη αρχείου", @@ -74,7 +79,16 @@ "sortByLastModified": "Ταξινόμηση κατά πρόσφατη τροποποίηση", "sortByName": "Ταξινόμηση κατά όνομα", "sortBySize": "Ταξινόμηση κατά μέγεθος", - "noPreview": "Η προεπισκόπηση δεν είναι διαθέσιμη για αυτό το αρχείο." + "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": "επιλέξτε αρχείο ή φάκελο", @@ -100,7 +114,11 @@ "submit": "Είσοδος", "username": "Όνομα χρήστη", "usernameTaken": "Το όνομα χρήστη χρησιμοποιείται ήδη", - "wrongCredentials": "Λάθος όνομα ή/και κωδικός πρόσβασης" + "wrongCredentials": "Λάθος όνομα ή/και κωδικός πρόσβασης", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Μόνιμο", "prompts": { @@ -154,6 +172,7 @@ "video": "Βίντεο" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Διαχειριστής", "administrator": "Διαχειριστής", "allowCommands": "Εκτέλεση εντολών", @@ -161,6 +180,7 @@ "allowNew": "Δημιουργία νέων αρχείων και φακέλων", "allowPublish": "Δημοσίευση νέων αναρτήσεων και σελίδων", "allowSignup": "Να επιτρέπεται η εγγραφή νέων χρηστών", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(αφήστε το κενό για αποφυγή αλλαγών)", "branding": "Εξατομίκευση", "brandingDirectoryPath": "Διαδρομή φακέλου εξατομίκευσης", @@ -212,6 +232,7 @@ "permissions": "Δικαιώματα", "permissionsHelp": "Μπορείτε να ορίσετε τον χρήστη ως διαχειριστή ή να επιλέξετε τα δικαιώματα μεμονωμένα. Αν επιλέξετε \"Διαχειριστής\", όλες οι υπόλοιπες επιλογές θα είναι αυτόματα επιλεγμένες. Η διαχείριση χρηστών παραμένει προνόμιο ενός χρήστη με τον ρόλο του διαχειριστή.\n", "profileSettings": "Ρυθμίσεις προφίλ", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "αποκλείει την πρόσβαση σε οποιοδήποτε κρυφό αρχείο (όπως .git, .gitignore) σε κάθε φάκελο.\n", "ruleExample2": "αποκλείει την πρόσβαση στο αρχείο με το όνομα Caddyfile στον ριζικό φάκελο της εμβέλειας του κανόνα.", "rules": "Κανόνες", @@ -238,7 +259,8 @@ "userManagement": "Διαχείριση χρηστών", "userUpdated": "Ο χρήστης ενημερώθηκε!", "username": "Όνομα χρήστη", - "users": "Χρήστες" + "users": "Χρήστες", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Βοήθεια", diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index 7de128ed..3fcdf635 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -42,7 +42,12 @@ "update": "Update", "upload": "Upload", "openFile": "Open file", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Download File", @@ -74,7 +79,16 @@ "sortByLastModified": "Sort by last modified", "sortByName": "Sort by name", "sortBySize": "Sort by size", - "noPreview": "Preview is not available for this file." + "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 (;)" + } }, "help": { "click": "select file or directory", @@ -100,7 +114,11 @@ "submit": "Login", "username": "Username", "usernameTaken": "Username already taken", - "wrongCredentials": "Wrong credentials" + "wrongCredentials": "Wrong credentials", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Permanent", "prompts": { @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrator", "allowCommands": "Execute commands", @@ -161,6 +180,7 @@ "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", @@ -212,6 +232,7 @@ "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", @@ -238,7 +259,8 @@ "userManagement": "User Management", "userUpdated": "User updated!", "username": "Username", - "users": "Users" + "users": "Users", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Help", diff --git a/frontend/src/i18n/es.json b/frontend/src/i18n/es.json index babfd3eb..aaab108b 100644 --- a/frontend/src/i18n/es.json +++ b/frontend/src/i18n/es.json @@ -7,7 +7,7 @@ "copy": "Copiar", "copyFile": "Copiar archivo", "copyToClipboard": "Copiar al portapapeles", - "copyDownloadLinkToClipboard": "Copy download link to clipboard", + "copyDownloadLinkToClipboard": "Copiar enlace de descarga al portapapeles", "create": "Crear", "delete": "Borrar", "download": "Descargar", @@ -42,7 +42,12 @@ "update": "Actualizar", "upload": "Subir", "openFile": "Abrir archivo", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Guardar cambios", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Descargar fichero", @@ -74,7 +79,16 @@ "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." + "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 (;)" + } }, "help": { "click": "seleccionar archivo o carpeta", @@ -100,7 +114,11 @@ "submit": "Iniciar sesión", "username": "Usuario", "usernameTaken": "Nombre usuario no disponible", - "wrongCredentials": "Usuario y/o contraseña incorrectos" + "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." + } }, "permanent": "Permanente", "prompts": { @@ -154,6 +172,7 @@ "video": "Vídeo" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrador", "allowCommands": "Ejecutar comandos", @@ -161,6 +180,7 @@ "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", @@ -212,6 +232,7 @@ "permissions": "Permisos", "permissionsHelp": "Puedes nombrar al usuario como administrador o elegir los permisos individualmente. Si seleccionas \"Administrador\", todas las otras opciones serán activadas automáticamente. La administración de usuarios es un privilegio de administrador.\n", "profileSettings": "Ajustes del perfil", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "previene el acceso a una extensión de archivo (Como .git) en cada carpeta.\n", "ruleExample2": "bloquea el acceso al archivo llamado Caddyfile en la carpeta raíz.", "rules": "Reglas", @@ -238,7 +259,8 @@ "userManagement": "Administración de usuarios", "userUpdated": "¡Usuario actualizado!", "username": "Usuario", - "users": "Usuarios" + "users": "Usuarios", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Ayuda", diff --git a/frontend/src/i18n/fa.json b/frontend/src/i18n/fa.json index 478e8148..3484d3a0 100644 --- a/frontend/src/i18n/fa.json +++ b/frontend/src/i18n/fa.json @@ -42,7 +42,12 @@ "update": "به روز سانی", "upload": "آپلود", "openFile": "باز کردن فایل", - "discardChanges": "لغو کردن" + "discardChanges": "لغو کردن", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "دانلود فایل", @@ -74,7 +79,16 @@ "sortByLastModified": "مرتب سازی آخرین ویرایش", "sortByName": "مرتب سازی نام", "sortBySize": "مرتب سازی اندازه", - "noPreview": "این فایل قابل نمایش نیست" + "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": "انتخاب فایل یا پوشه", @@ -100,7 +114,11 @@ "submit": "ورود", "username": "نام کاربری", "usernameTaken": "نام کاربری تکراری", - "wrongCredentials": "خطا در اعتبارسنجی" + "wrongCredentials": "خطا در اعتبارسنجی", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "دائمی", "prompts": { @@ -154,6 +172,7 @@ "video": "ویدئو " }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrator", "allowCommands": "اجرای دستورات", @@ -161,6 +180,7 @@ "allowNew": "ایجاد فایلها و پوشه های جدید", "allowPublish": "انتشار پست ها و صفحات جدید", "allowSignup": "اجاره دادن به کاربران برای ثبت نام", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(خالی بگذارید تا تغییر ایجاد نشود)", "branding": "برندسازی", "brandingDirectoryPath": "مسیر پوشه برند", @@ -212,6 +232,7 @@ "permissions": "دسترسی ها", "permissionsHelp": "شما می‌توانید کاربر را به عنوان مدیر تنظیم کنید یا دسترسی‌ها را به صورت جداگانه انتخاب کنید. اگر \"مدیر\" را انتخاب کنید، تمام گزینه‌های دیگر به طور خودکار اعمال می‌شوند. مدیریت کاربران همچنان از اختیارات مدیر است.", "profileSettings": "تنظیمات ناحیه کاربری", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "از دسترسی به هرگونه فایل نقطه‌ای (مانند .git، .gitignore) در هر پوشه جلوگیری می‌کند.", "ruleExample2": "دسترسی به فایلی به نام Caddyfile را در ریشه دامنه مسدود می‌کند.", "rules": "قواعد", @@ -238,7 +259,8 @@ "userManagement": "مدیریت کاربران", "userUpdated": "کاربر به روز شد!", "username": "نام کاربری", - "users": "کاربران" + "users": "کاربران", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "راهنما", diff --git a/frontend/src/i18n/fr.json b/frontend/src/i18n/fr.json index cfe57022..798cee50 100644 --- a/frontend/src/i18n/fr.json +++ b/frontend/src/i18n/fr.json @@ -42,7 +42,12 @@ "update": "Mettre à jour", "upload": "Importer", "openFile": "Ouvrir le fichier", - "discardChanges": "Annuler" + "discardChanges": "Annuler", + "stopSearch": "Arrêter recherche", + "saveChanges": "Enregistrer changements", + "editAsText": "Editer comme Texte", + "increaseFontSize": "Augmenter taille police", + "decreaseFontSize": "Réduire taille police" }, "download": { "downloadFile": "Télécharger le fichier", @@ -74,17 +79,26 @@ "sortByLastModified": "Trier par date de modification", "sortByName": "Trier par nom", "sortBySize": "Trier par taille", - "noPreview": "L'aperçu n'est pas disponible pour ce fichier." + "noPreview": "L'aperçu n'est pas disponible pour ce fichier.", + "csvTooLarge": "Le fichier CSV est trop volumineux pour être prévisualisé (>5MB). Veuillez le télécharger pour le voir.", + "csvLoadFailed": "Impossible de charger le fichier CSV.", + "showingRows": "Affichage de {count} ligne(s)", + "columnSeparator": "Séparateur de Colonnes", + "csvSeparators": { + "comma": "Virgule (,)", + "semicolon": "Point-virgule (;)", + "both": "Les (,) et (;)" + } }, "help": { - "click": "Sélectionner un élément", + "click": "Sélectionner un fichier ou dossier", "ctrl": { - "click": "Sélectionner plusieurs éléments", + "click": "Sélectionner plusieurs fichiers ou dossiers", "f": "Ouvrir l'invité de recherche", - "s": "Télécharger l'élément actuel" + "s": "Enregistrer un fichier ou télécharger le dossier actuel" }, "del": "Supprimer les éléments sélectionnés", - "doubleClick": "Ouvrir un élément", + "doubleClick": "Ouvrir un fichier ou dossier", "esc": "Désélectionner et/ou fermer la boîte de dialogue", "f1": "Ouvrir l'aide", "f2": "Renommer le fichier", @@ -98,9 +112,13 @@ "passwordsDontMatch": "Les mots de passe ne concordent pas", "signup": "S'inscrire", "submit": "Se connecter", - "username": "Utilisateur", - "usernameTaken": "Le nom d'utilisateur est déjà pris", - "wrongCredentials": "Identifiants incorrects !" + "username": "Utilisateur·ice", + "usernameTaken": "Le nom d'utilisateur·ice est déjà pris", + "wrongCredentials": "Identifiants incorrects !", + "passwordTooShort": "Le mot de passe doit contenir au moins {min} caractères", + "logout_reasons": { + "inactivity": "Vous avez été déconnecté(e) en raison d'une inactivité prolongée." + } }, "permanent": "Permanent", "prompts": { @@ -110,7 +128,7 @@ "deleteMessageMultiple": "Êtes-vous sûr de vouloir supprimer ces {count} élément(s) ?", "deleteMessageSingle": "Êtes-vous sûr de vouloir supprimer cet élément ?", "deleteMessageShare": "Êtes-vous sûr de vouloir supprimer ce partage ({path}) ?", - "deleteUser": "Êtes-vous sûr de vouloir supprimer cet utilisateur ?", + "deleteUser": "Êtes-vous sûr de vouloir supprimer cet·te utilisateur·ice ?", "deleteTitle": "Supprimer", "displayName": "Nom :", "download": "Télécharger", @@ -120,7 +138,7 @@ "filesSelected": "{count} éléments sélectionnés", "lastModified": "Dernière modification", "move": "Déplacer", - "moveMessage": "Choisissez l'emplacement où déplacer la sélection :", + "moveMessage": "Choisissez un nouveau dossier principal pour vos fichier(s)/dossier(s) :", "newArchetype": "Créer un nouveau post basé sur un archétype. Votre fichier sera créé dans le dossier de contenu.", "newDir": "Nouveau dossier", "newDirMessage": "Nom du nouveau dossier :", @@ -154,13 +172,15 @@ "video": "Vidéo" }, "settings": { + "aceEditorTheme": "Éditeur de Thème Ace", "admin": "Admin", - "administrator": "Administrateur", + "administrator": "Administrateur·ice", "allowCommands": "Exécuter des commandes", "allowEdit": "Éditer, renommer et supprimer des fichiers ou des dossiers", "allowNew": "Créer de nouveaux fichiers et dossiers", "allowPublish": "Publier de nouveaux posts et pages", - "allowSignup": "Autoriser les utilisateurs à s'inscrire", + "allowSignup": "Autoriser les utilisateur·ices à s'inscrire", + "hideLoginButton": "Cacher le bouton d’identification sur les pages publiques", "avoidChanges": "(Laisser vide pour conserver l'actuel)", "branding": "Image de marque", "brandingDirectoryPath": "Chemin du dossier d'image de marque", @@ -169,17 +189,17 @@ "commandRunner": "Exécuteur de commandes", "commandRunnerHelp": "Ici, vous pouvez définir les commandes qui seront exécutées lors des événements nommés précédemments. Vous devez en écrire une par ligne. Les variables d'environnement {0} et {1} seront disponibles, {0} étant relatif à {1}. Pour plus d'informations sur cette fonctionnalité et les variables d'environnement disponibles, veuillez lire la {2}.", "commandsUpdated": "Commandes mises à jour !", - "createUserDir": "Créer automatiquement un dossier pour l'utilisateur", - "minimumPasswordLength": "Minimum password length", + "createUserDir": "Créer automatiquement un dossier pour l'utilisateur·ice", + "minimumPasswordLength": "Taille minimale du mot de passe", "tusUploads": "Uploads segmentés", "tusUploadsHelp": "File Browser prend en charge les uploads segmentés afin de permettre une gestion efficace, fiable et reprenable sur des réseaux instables.", "tusUploadsChunkSize": "Taille maximale autorisée par segment (les uploads directs seront utilisés pour les fichiers plus petits). Vous pouvez entrer un entier en octets ou une chaîne telle que 10MB, 1GB, etc.", "tusUploadsRetryCount": "Nombre de tentatives en cas d'échec d'un segment.", - "userHomeBasePath": "Chemin de base pour les répertoires personnels des utilisateurs", + "userHomeBasePath": "Chemin de base pour les dossiers personnels des utilisateur·ices", "userScopeGenerationPlaceholder": "Le périmètre sera généré automatiquement", - "createUserHomeDirectory": "Créer le répertoire personnel de l'utilisateur", + "createUserHomeDirectory": "Créer le dossier personnel de l'utilisateur·ice", "customStylesheet": "Feuille de style personnalisée", - "defaultUserDescription": "Paramètres par défaut pour les nouveaux utilisateurs.", + "defaultUserDescription": "Paramètres par défaut pour les nouveaux utilisateur·ices.", "disableExternalLinks": "Désactiver les liens externes (sauf la documentation)", "disableUsedDiskPercentage": "Désactiver le graphique de pourcentage d'utilisation du disque", "documentation": "documentation", @@ -188,12 +208,12 @@ "executeOnShellDescription": "Par défaut, File Browser exécute les commandes en appelant directement leurs binaires. Si vous voulez les exécuter sur un shell à la place (comme Bash ou PowerShell), vous pouvez le définir ici avec les arguments et les drapeaux requis. S'il est défini, la commande que vous exécutez sera ajoutée en tant qu'argument. Cela s'applique à la fois aux commandes utilisateur et aux crochets d'événements.", "globalRules": "Il s'agit d'un ensemble global de règles d'autorisation et d'interdiction. Elles s'appliquent à tous les utilisateurs. Vous pouvez définir des règles spécifiques sur les paramètres de chaque utilisateur pour remplacer celles-ci.", "globalSettings": "Paramètres globaux", - "hideDotfiles": "Cacher les fichiers de configuration utilisateur (dotfiles)", + "hideDotfiles": "Cacher les fichiers de configuration commançant par un point", "insertPath": "Insérer le chemin", "insertRegex": "Insérer une expression régulière", "instanceName": "Nom de l'instance", "language": "Langue", - "lockPassword": "Empêcher l'utilisateur de changer son mot de passe", + "lockPassword": "Empêcher l'utilisateur·ice de changer son mot de passe", "newPassword": "Votre nouveau mot de passe", "newPasswordConfirm": "Confirmation du nouveau mot de passe", "newUser": "Nouvel utilisateur", @@ -210,13 +230,14 @@ "share": "Partager des fichiers" }, "permissions": "Permissions", - "permissionsHelp": "Vous pouvez définir l'utilisateur comme étant un administrateur ou encore choisir les permissions individuellement. Si vous sélectionnez \"Administrateur\", toutes les autres options seront automatiquement activées. La gestion des utilisateurs est un privilège que seul l'administrateur possède.\n", + "permissionsHelp": "Vous pouvez définir l'utilisateur·ice comme étant administrateur·ice ou encore choisir les permissions individuellement. Si vous sélectionnez \"Administrateur·ice\", toutes les autres options seront automatiquement activées. La gestion des utilisateur·ices est un privilège que seul l'administrateur·ice possède.\n", "profileSettings": "Paramètres du profil", - "ruleExample1": "Bloque l'accès à tous les fichiers commençant par un point (comme par exemple .git, .gitignore) dans tous les dossiers", - "ruleExample2": "Bloque l'accès au fichier nommé \"Caddyfile\" à la racine du dossier utilisateur", + "redirectAfterCopyMove": "Redirect to destination after copy/move", + "ruleExample1": "Bloque l'accès à tous les fichiers commençant par un point (comme par exemple .git, .gitignore) dans tous les dossiers.\n", + "ruleExample2": "Bloque l'accès au fichier nommé \"Caddyfile\" à la racine du dossier utilisateur·ice.", "rules": "Règles", - "rulesHelp": "Vous pouvez définir ici un ensemble de règles pour cet utilisateur. Les fichiers bloqués ne seront pas affichés et ne seront pas accessibles par l'utilisateur. Les expressions régulières sont supportées et les chemins d'accès sont relatifs par rapport au dossier de l'utilisateur.\n", - "scope": "Portée du dossier utilisateur", + "rulesHelp": "Vous pouvez définir ici un ensemble de règles pour cet utilisateur·ice. Les fichiers bloqués ne seront pas affichés et ne seront pas accessibles par l'utilisateur·ice. Les expressions régulières sont supportées et les chemins d'accès sont relatifs par rapport au dossier de l'utilisateur·ice.\n", + "scope": "Portée du dossier utilisateur·ice", "setDateFormat": "Définir le format de la date", "settingsUpdated": "Les paramètres ont été mis à jour !", "shareDuration": "Durée du partage", @@ -224,21 +245,22 @@ "shareDeleted": "Partage supprimé !", "singleClick": "Utiliser un simple clic pour ouvrir les fichiers et les dossiers", "themes": { - "default": "System default", + "default": "Par défaut du système", "dark": "Sombre", "light": "Clair", "title": "Thème" }, - "user": "Utilisateur", + "user": "Utilisateur·ice", "userCommands": "Commandes", - "userCommandsHelp": "Une liste séparée par des espaces des commandes permises pour l'utilisateur. Exemple :\n", - "userCreated": "Utilisateur créé !", - "userDefaults": "Paramètres par défaut de l'utilisateur", - "userDeleted": "Utilisateur supprimé !", - "userManagement": "Gestion des utilisateurs", - "userUpdated": "Utilisateur mis à jour !", - "username": "Nom d'utilisateur", - "users": "Utilisateurs" + "userCommandsHelp": "Une liste séparée par des espaces des commandes permises pour l'utilisateur·ice. Exemple :\n", + "userCreated": "Utilisateur·ice créé !", + "userDefaults": "Paramètres par défaut de l'utilisateur.ice", + "userDeleted": "Utilisateur·ice supprimé !", + "userManagement": "Gestion des utilisateur·ices", + "userUpdated": "Utilisateur·ice mis à jour !", + "username": "Nom d'utilisateur·ice", + "users": "Utilisateur·ices", + "currentPassword": "Mot de Passe Actuel" }, "sidebar": { "help": "Aide", diff --git a/frontend/src/i18n/he.json b/frontend/src/i18n/he.json index 009f07b7..f340feca 100644 --- a/frontend/src/i18n/he.json +++ b/frontend/src/i18n/he.json @@ -42,7 +42,12 @@ "update": "עדכון", "upload": "העלאה", "openFile": "פתח קובץ", - "discardChanges": "זריקת השינויים" + "discardChanges": "זריקת השינויים", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "הורד קובץ", @@ -74,7 +79,16 @@ "sortByLastModified": "מיין לפי השינוי האחרון", "sortByName": "מיין לפי שם", "sortBySize": "מיין לפי גודל", - "noPreview": "לא זמינה תצוגה מקדימה לקובץ זה" + "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": "בחר קובץ או תיקייה", @@ -100,7 +114,11 @@ "submit": "התחברות", "username": "שם משתמש", "usernameTaken": "שם המשתמש כבר קיים", - "wrongCredentials": "פרטי התחברות שגויים" + "wrongCredentials": "פרטי התחברות שגויים", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "קבוע", "prompts": { @@ -154,6 +172,7 @@ "video": "וידאו" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "מנהל", "administrator": "מנהל ראשי", "allowCommands": "הפעלת פקודות", @@ -161,6 +180,7 @@ "allowNew": "יצירת קבצים ותיקיות חדשות", "allowPublish": "פרסום פוסטים ודפים חדשים", "allowSignup": "אפשר למשתמשים חדשים להירשם", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(השאר ריק כדי למנוע שינויים)", "branding": "מיתוג", "brandingDirectoryPath": "נתיב תיקיית מיתוג", @@ -212,6 +232,7 @@ "permissions": "הרשאות", "permissionsHelp": "אתה יכול להגדיר את המשתמש להיות מנהל מערכת או לבחור את ההרשאות בנפרד. אם תבחר \"מנהל מערכת\", כל ההרשאות יינתנו אוטומטית. ניהול המשתמשים נשאר הרשאה של מנהל מערכת.\n", "profileSettings": "הגדרות פרופיל", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "מנע גישה לקבצים נסתרים (כל קובץ/תיקייה שמתחיל בנקודה, לדוגמא .git)", "ruleExample2": "חסימת גישה לקובץ בשם Caddyfile בהיקף הראשי.", "rules": "חוקים", @@ -238,7 +259,8 @@ "userManagement": "ניהול משתמש", "userUpdated": "המשתמש עודכן!", "username": "שם משתמש", - "users": "משתמשים" + "users": "משתמשים", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "עזרה", diff --git a/frontend/src/i18n/hr.json b/frontend/src/i18n/hr.json new file mode 100644 index 00000000..e21ffd80 --- /dev/null +++ b/frontend/src/i18n/hr.json @@ -0,0 +1,288 @@ +{ + "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", + "redirectAfterCopyMove": "Redirect to destination after copy/move", + "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/hu.json b/frontend/src/i18n/hu.json index 507f08da..f6d856cf 100644 --- a/frontend/src/i18n/hu.json +++ b/frontend/src/i18n/hu.json @@ -42,7 +42,12 @@ "update": "Frissítés", "upload": "Feltöltés", "openFile": "Fájl megnyitása", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Fájl letöltése", @@ -74,7 +79,16 @@ "sortByLastModified": "Rendezés utolsó módosítás szerint", "sortByName": "Rendezés név szerint", "sortBySize": "Rendezés méret szerint", - "noPreview": "Ehhez a fájlhoz nincs előnézet." + "noPreview": "Ehhez a fájlhoz nincs előnézet.", + "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": "mappa vagy fájl kijelölése", @@ -100,7 +114,11 @@ "submit": "Belépés", "username": "Felhasználói név", "usernameTaken": "A felhasználói név már foglalt", - "wrongCredentials": "Hibás hitelesítő adatok" + "wrongCredentials": "Hibás hitelesítő adatok", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Állandó", "prompts": { @@ -154,6 +172,7 @@ "video": "Videó" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Adminisztrátor", "allowCommands": "Parancsok futtatása", @@ -161,6 +180,7 @@ "allowNew": "Új fájlok és mappák létrehozása", "allowPublish": "Új bejegyzések és oldalak létrehozása", "allowSignup": "Felhasználók regisztrációjának engedélyezése", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(üresen hagyva nincs változás)", "branding": "Márkázás", "brandingDirectoryPath": "Márkázás mappaútvonala", @@ -212,6 +232,7 @@ "permissions": "Jogosultságok", "permissionsHelp": "A felhasználót beállíthatja rendszergazdának, vagy egyénileg is kiválaszthatja a jogosultságokat. Ha a \"Rendszergazda\" lehetőséget választja, az összes többi opció automatikusan be lesz jelölve. A felhasználók kezelése továbbra is a rendszergazda kiváltsága marad.\n", "profileSettings": "Profilbeállítások", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "megakadályozza a hozzáférést bármely rejtett fájlhoz (pl. .git, .gitignore) bármely mappában.\n", "ruleExample2": "blokkolja a hozzáférést a Caddyfile nevű fájlhoz a hatókör gyökerében.", "rules": "Szabályok", @@ -238,7 +259,8 @@ "userManagement": "Felhasználókezelés", "userUpdated": "Felhasználó frissítve!", "username": "Felhasználói név", - "users": "Felhasználók" + "users": "Felhasználók", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Súgó", diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts index dcf6cef9..d576d183 100644 --- a/frontend/src/i18n/index.ts +++ b/frontend/src/i18n/index.ts @@ -2,17 +2,21 @@ import dayjs from "dayjs"; import { createI18n } from "vue-i18n"; import("dayjs/locale/ar"); +import("dayjs/locale/bg"); +import("dayjs/locale/cs"); import("dayjs/locale/de"); import("dayjs/locale/el"); import("dayjs/locale/en"); import("dayjs/locale/es"); import("dayjs/locale/fr"); import("dayjs/locale/he"); +import("dayjs/locale/hr"); import("dayjs/locale/hu"); import("dayjs/locale/is"); import("dayjs/locale/it"); import("dayjs/locale/ja"); import("dayjs/locale/ko"); +import("dayjs/locale/nb"); import("dayjs/locale/nl-be"); import("dayjs/locale/pl"); import("dayjs/locale/pt-br"); @@ -26,8 +30,6 @@ 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 @@ -41,6 +43,9 @@ export function detectLocale() { case /^he\b/.test(locale): locale = "he"; break; + case /^hr\b/.test(locale): + locale = "hr"; + break; case /^hu\b/.test(locale): locale = "hu"; break; @@ -105,6 +110,7 @@ export function detectLocale() { case /^uk\b/.test(locale): locale = "uk"; break; + case /^vi\b/.test(locale): locale = "vi"; break; @@ -119,6 +125,9 @@ export function detectLocale() { case /^no\b/.test(locale): locale = "no"; break; + case /^bg\b/.test(locale): + locale = "bg"; + break; default: locale = "en"; } diff --git a/frontend/src/i18n/is.json b/frontend/src/i18n/is.json index 54eeb727..01b3ace6 100644 --- a/frontend/src/i18n/is.json +++ b/frontend/src/i18n/is.json @@ -42,7 +42,12 @@ "update": "Vista", "upload": "Hlaða upp", "openFile": "Open file", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Sækja skjal", @@ -74,7 +79,16 @@ "sortByLastModified": "Flokka eftir Seinast breytt", "sortByName": "Flokka eftir nafni", "sortBySize": "Flokka eftir stærð", - "noPreview": "Preview is not available for this file." + "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 (;)" + } }, "help": { "click": "velja skjal eða möppu", @@ -100,7 +114,11 @@ "submit": "Innskráning", "username": "Notendanafn", "usernameTaken": "Þetta norendanafn er þegar í notkun", - "wrongCredentials": "Rangar notendaupplýsingar" + "wrongCredentials": "Rangar notendaupplýsingar", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Varanlegt", "prompts": { @@ -154,6 +172,7 @@ "video": "Myndbönd" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Stjórnandi", "administrator": "Stjórnandi", "allowCommands": "Senda skipanir", @@ -161,6 +180,7 @@ "allowNew": "Búa til ný skjöl og möppur", "allowPublish": "Gefa út nýjar færslur og síður", "allowSignup": "Leyfa nýjum notendum að skrá sig", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(engar breytingar ef ekkert er skrifað)", "branding": "Útlit", "brandingDirectoryPath": "Mappa fyrir branding-skjöl", @@ -212,6 +232,7 @@ "permissions": "Heimildir", "permissionsHelp": "Þú getur stillt notenda sem stjórnanda eða valið einstaklingsbundnar heimildir. Ef þú velur \"Stjórnandi\", þá verða allir aðrir valmöguleikar valdir sjálfrafa. Aðgangstýring notenda er á hendi stjórnenda. \n", "profileSettings": "Stilla prófíl", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "kemur í veg fyrir aðgang að dot-skjali (t.d. .git, .gitignore) í öllum möppum. \n", "ruleExample2": "kemur í veg fyrir aðgang að Caddyfile-skjalinu í root-möppu í sýn notandans. ", "rules": "Reglur", @@ -238,7 +259,8 @@ "userManagement": "Notendastýring", "userUpdated": "Notandastillingar vistaðar!", "username": "Notendanafn", - "users": "Notendur" + "users": "Notendur", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Hjálp", diff --git a/frontend/src/i18n/it.json b/frontend/src/i18n/it.json index bf09156d..ad54172c 100644 --- a/frontend/src/i18n/it.json +++ b/frontend/src/i18n/it.json @@ -7,13 +7,13 @@ "copy": "Copia", "copyFile": "Copia file", "copyToClipboard": "Copia negli appunti", - "copyDownloadLinkToClipboard": "Copy download link to clipboard", + "copyDownloadLinkToClipboard": "Copia link di scarica negli appunti", "create": "Crea", "delete": "Elimina", "download": "Scarica", "file": "File", - "folder": "Folder", - "fullScreen": "Toggle full screen", + "folder": "Cartella", + "fullScreen": "Abilita schermo intero", "hideDotfiles": "Nascondi dotfile", "info": "Informazioni", "more": "Altro", @@ -24,7 +24,7 @@ "ok": "OK", "permalink": "Ottieni link permanente", "previous": "Precedente", - "preview": "Preview", + "preview": "Anteprima", "publish": "Publica", "rename": "Rinomina", "replace": "Sostituisci", @@ -36,13 +36,18 @@ "selectMultiple": "Seleziona molteplici", "share": "Condividi", "shell": "Mostra/nascondi shell", - "submit": "Submit", + "submit": "Invia", "switchView": "Cambia vista", "toggleSidebar": "Mostra/nascondi la barra laterale", "update": "Aggiorna", "upload": "Carica", - "openFile": "Open file", - "discardChanges": "Discard" + "openFile": "Apri file", + "discardChanges": "Ignora", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Scarica file", @@ -50,13 +55,13 @@ "downloadSelected": "Scarica selezionati" }, "upload": { - "abortUpload": "Are you sure you wish to abort?" + "abortUpload": "Sei sicuro di voler abortire la procedura?" }, "errors": { "forbidden": "Non hai i permessi per accedere a questo file.", "internal": "Qualcosa è andato veramente male.", "notFound": "Questo percorso non può essere raggiunto.", - "connection": "The server can't be reached." + "connection": "Il server non è raggiungibile" }, "files": { "body": "Contenuto", @@ -74,7 +79,16 @@ "sortByLastModified": "Ordina per ultima modifica", "sortByName": "Ordina per nome", "sortBySize": "Ordina per dimensione", - "noPreview": "Preview is not available for this file." + "noPreview": "L'anteprima non è disponibile per questo 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 (;)" + } }, "help": { "click": "seleziona un file o una cartella", @@ -100,7 +114,11 @@ "submit": "Entra", "username": "Nome utente", "usernameTaken": "Username già usato", - "wrongCredentials": "Credenziali errate" + "wrongCredentials": "Credenziali errate", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Permanente", "prompts": { @@ -109,8 +127,8 @@ "currentlyNavigating": "Attualmente navigando su:", "deleteMessageMultiple": "Sei sicuro di voler eliminare {count} file?", "deleteMessageSingle": "Sei sicuro di voler eliminare questo file/cartella?", - "deleteMessageShare": "Are you sure you wish to delete this share({path})?", - "deleteUser": "Are you sure you want to delete this user?", + "deleteMessageShare": "Sei sicuro di voler eliminare questo percorso condiviso ({path})?", + "deleteUser": "Sei sicuro di voler eliminare questo utente?", "deleteTitle": "Elimina", "displayName": "Nome visualizzato:", "download": "Scarica files", @@ -137,11 +155,11 @@ "show": "Mostra", "size": "Dimensione", "upload": "Carica", - "uploadFiles": "Uploading {files} files...", + "uploadFiles": "Inviando {files} file...", "uploadMessage": "Seleziona un'opzione per il caricamento.", - "optionalPassword": "Optional password", - "resolution": "Resolution", - "discardEditorChanges": "Are you sure you wish to discard the changes you've made?" + "optionalPassword": "Password opzionale", + "resolution": "Risoluzione", + "discardEditorChanges": "Sei sicuro di voler scartare le modifiche apportate?" }, "search": { "images": "Immagini", @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Amministratore", "allowCommands": "Esegui comandi", @@ -161,6 +180,7 @@ "allowNew": "Crea nuovi files o cartelle", "allowPublish": "Pubblica nuovi post e pagine", "allowSignup": "Permetti agli utenti di registrarsi", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(lascia vuoto per evitare cambiamenti)", "branding": "Branding", "brandingDirectoryPath": "Directory del branding", @@ -170,14 +190,14 @@ "commandRunnerHelp": "Qui puoi impostare i comandi da eseguire negli eventi nominati. Ne devi scrivere uno per riga. Le variabili d'ambiente {0} e {1} sono disponibili, essendo {0} relativo a {1}. Per altre informazioni su questa funzionalità e sulle variabili d'ambiente utilizzabili, leggi la {2}.", "commandsUpdated": "Comandi aggiornati!", "createUserDir": "Crea automaticamente la home directory dell'utente quando lo aggiungi", - "minimumPasswordLength": "Minimum password length", - "tusUploads": "Chunked Uploads", - "tusUploadsHelp": "File Browser supports chunked file uploads, allowing for the creation of efficient, reliable, resumable and chunked file uploads even on unreliable networks.", - "tusUploadsChunkSize": "Indicates to maximum size of a request (direct uploads will be used for smaller uploads). You may input a plain integer denoting byte size input or a string like 10MB, 1GB etc.", - "tusUploadsRetryCount": "Number of retries to perform if a chunk fails to upload.", - "userHomeBasePath": "Base path for user home directories", - "userScopeGenerationPlaceholder": "The scope will be auto generated", - "createUserHomeDirectory": "Create user home directory", + "minimumPasswordLength": "Lunghezza minima della password", + "tusUploads": "Tranci di invii", + "tusUploadsHelp": "File Browser supporta tranci di invii fornendo così la possibilità di inviare efficientemente i file anche su reti instabili.", + "tusUploadsChunkSize": "Indica la dimensione massima di una richiesta (invii diretti saranno usati per piccoli invii). Puoi inserire un numero intero per indicare la dimensione in byte, oppure una stringa con l'unità di misura come in 10MB, 1GB, etc.", + "tusUploadsRetryCount": "Numero di tentativi da effettuare se un trancio di file fallisce.", + "userHomeBasePath": "Percorso base per le cartelle utente", + "userScopeGenerationPlaceholder": "La portata verrà autogenerata", + "createUserHomeDirectory": "Crea cartella utente", "customStylesheet": "Foglio di stile personalizzato", "defaultUserDescription": "Queste sono le impostazioni predefinite per i nuovi utenti.", "disableExternalLinks": "Disabilita link esterni (tranne per la documentazione)", @@ -212,19 +232,20 @@ "permissions": "Permessi", "permissionsHelp": "È possibile impostare l'utente come amministratore o scegliere i permessi singolarmente. Se si seleziona \"Amministratore\", tutte le altre opzioni saranno automaticamente assegnate. La gestione degli utenti rimane un privilegio di un amministratore.\n", "profileSettings": "Impostazioni del profilo", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "impedisci l'accesso a qualsiasi file avente come prefisso un punto\n (ad esempio .git, .gitignore) presente in ogni cartella.\n", "ruleExample2": "blocca l'accesso al file denominato Caddyfile nella radice del campo di applicazione.", "rules": "Regole", "rulesHelp": "Qui è possibile definire una serie di regole e permessi per questo specifico utente. I file bloccati non appariranno negli elenchi e non saranno accessibili dagli utenti. all'utente. Sia regex che i percorsi relativi all'ambito di applicazione degli utenti sono supportati.\n", "scope": "Scope", - "setDateFormat": "Set exact date format", + "setDateFormat": "Fissa il formato di data esatto", "settingsUpdated": "Impostazioni aggiornate!", "shareDuration": "Durata della condivisione", "shareManagement": "Gestione delle condivisioni", - "shareDeleted": "Share deleted!", + "shareDeleted": "Percorso condiviso eliminato!", "singleClick": "Usa un singolo click per aprire file e cartelle", "themes": { - "default": "System default", + "default": "Impostazione predefinita del sistema", "dark": "Scuro", "light": "Chiaro", "title": "Tema" @@ -238,7 +259,8 @@ "userManagement": "Gestione degli utenti", "userUpdated": "Utente aggiornato!", "username": "Nome utente", - "users": "Utenti" + "users": "Utenti", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Aiuto", diff --git a/frontend/src/i18n/ja.json b/frontend/src/i18n/ja.json index cd380304..44beb9cb 100644 --- a/frontend/src/i18n/ja.json +++ b/frontend/src/i18n/ja.json @@ -42,7 +42,12 @@ "update": "更新", "upload": "アップロード", "openFile": "ファイルを開く", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "ファイルのダウンロード", @@ -74,7 +79,16 @@ "sortByLastModified": "更新日時で並べ替え", "sortByName": "名前で並べ替え", "sortBySize": "サイズで並べ替え", - "noPreview": "プレビューはこのファイルでは利用できません" + "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": "ファイルやフォルダーを選択", @@ -100,7 +114,11 @@ "submit": "ログイン", "username": "ユーザー名", "usernameTaken": "ユーザー名はすでに取得されています", - "wrongCredentials": "ユーザー名またはパスワードが間違っています" + "wrongCredentials": "ユーザー名またはパスワードが間違っています", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "永久", "prompts": { @@ -154,6 +172,7 @@ "video": "動画" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "管理者", "administrator": "管理者", "allowCommands": "コマンドの実行", @@ -161,6 +180,7 @@ "allowNew": "ファイルやフォルダーの新規作成", "allowPublish": "新しい投稿やページの公開", "allowSignup": "ユーザーの新規登録を許可", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(変更しない場合は空白のままにしてください)", "branding": "ブランディング", "brandingDirectoryPath": "ブランディングのディレクトリへのパス", @@ -212,6 +232,7 @@ "permissions": "権限", "permissionsHelp": "ユーザーを管理者に設定するか、その他の権限を個別に選択することができます。「管理者」を選択すると、他のオプションはすべて自動的にチェックされます。ユーザーを管理するには管理者権限が必要です。\n", "profileSettings": "プロフィール設定", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": ".git や .gitignore のようなドットから始まるファイルへのアクセスを禁止します。\n", "ruleExample2": "スコープのルートにある Caddyfile という名前のファイルへのアクセスを禁止します。", "rules": "ルール", @@ -238,7 +259,8 @@ "userManagement": "ユーザー管理", "userUpdated": "ユーザーを更新しました!", "username": "ユーザー名", - "users": "ユーザー" + "users": "ユーザー", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "ヘルプ", diff --git a/frontend/src/i18n/ko.json b/frontend/src/i18n/ko.json index 11fe3aac..c1d49b18 100644 --- a/frontend/src/i18n/ko.json +++ b/frontend/src/i18n/ko.json @@ -3,17 +3,17 @@ "cancel": "취소", "clear": "지우기", "close": "닫기", - "continue": "Continue", + "continue": "계속", "copy": "복사", "copyFile": "파일 복사", "copyToClipboard": "클립보드 복사", - "copyDownloadLinkToClipboard": "Copy download link to clipboard", + "copyDownloadLinkToClipboard": "다운로드 링크 복사", "create": "생성", "delete": "삭제", "download": "다운로드", - "file": "File", - "folder": "Folder", - "fullScreen": "Toggle full screen", + "file": "파일", + "folder": "폴더", + "fullScreen": "전체 화면 전환", "hideDotfiles": "숨김파일(dotfile)을 표시 안함", "info": "정보", "more": "더보기", @@ -24,7 +24,7 @@ "ok": "확인", "permalink": "링크 얻기", "previous": "이전", - "preview": "Preview", + "preview": "미리보기", "publish": "게시", "rename": "이름 바꾸기", "replace": "대체", @@ -36,13 +36,18 @@ "selectMultiple": "다중 선택", "share": "공유", "shell": "쉘 전환", - "submit": "Submit", + "submit": "제출", "switchView": "보기 전환", "toggleSidebar": "사이드바 전환", "update": "업데이트", "upload": "업로드", - "openFile": "Open file", - "discardChanges": "Discard" + "openFile": "파일 열기", + "discardChanges": "변경 사항 취소", + "stopSearch": "Stop searching", + "saveChanges": "변경사항 저장", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "파일 다운로드", @@ -50,13 +55,13 @@ "downloadSelected": "선택 항목 다운로드" }, "upload": { - "abortUpload": "Are you sure you wish to abort?" + "abortUpload": "업로드를 중단하시겠습니까?" }, "errors": { "forbidden": "접근 권한이 없습니다.", "internal": "오류가 발생하였습니다.", "notFound": "해당 경로를 찾을 수 없습니다.", - "connection": "The server can't be reached." + "connection": "서버에 연결할 수 없습니다." }, "files": { "body": "본문", @@ -74,7 +79,16 @@ "sortByLastModified": "수정시간순 정렬", "sortByName": "이름순", "sortBySize": "크기순", - "noPreview": "Preview is not available for this file." + "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": "파일이나 디렉토리를 선택해주세요.", @@ -100,7 +114,11 @@ "submit": "로그인", "username": "사용자 이름", "usernameTaken": "사용자 이름이 존재합니다", - "wrongCredentials": "사용자 이름 또는 비밀번호를 확인하십시오" + "wrongCredentials": "사용자 이름 또는 비밀번호를 확인하십시오", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "영구", "prompts": { @@ -109,8 +127,8 @@ "currentlyNavigating": "현재 위치:", "deleteMessageMultiple": "{count} 개의 파일을 삭제하시겠습니까?", "deleteMessageSingle": "파일 혹은 디렉토리를 삭제하시겠습니까?", - "deleteMessageShare": "Are you sure you wish to delete this share({path})?", - "deleteUser": "Are you sure you want to delete this user?", + "deleteMessageShare": "이 공유({path})를 삭제하시겠습니까?", + "deleteUser": "이 계정을 삭제하시겠습니까?", "deleteTitle": "파일 삭제", "displayName": "게시 이름:", "download": "파일 다운로드", @@ -137,11 +155,11 @@ "show": "보기", "size": "크기", "upload": "업로드", - "uploadFiles": "Uploading {files} files...", + "uploadFiles": "{files}개의 파일 업로드 중...", "uploadMessage": "업로드 옵션을 선택하세요.", - "optionalPassword": "Optional password", - "resolution": "Resolution", - "discardEditorChanges": "Are you sure you wish to discard the changes you've made?" + "optionalPassword": "비밀번호 (선택)", + "resolution": "해상도", + "discardEditorChanges": "변경 사항을 취소하시겠습니까?" }, "search": { "images": "이미지", @@ -154,6 +172,7 @@ "video": "비디오" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "관리자", "administrator": "관리자", "allowCommands": "명령 실행", @@ -161,6 +180,7 @@ "allowNew": "파일/디렉토리 생성 허용", "allowPublish": "새 포스트/페이지 생성 허용", "allowSignup": "사용자 가입 허용", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(수정하지 않으면 비워두세요)", "branding": "브랜딩", "brandingDirectoryPath": "브랜드 디렉토리 경로", @@ -170,14 +190,14 @@ "commandRunnerHelp": "이벤트에 해당하는 명령을 설정하세요. 줄당 1개의 명령을 적으세요. 환경 변수{0} 와 {1}이 사용가능하며, {0} 은 {1}에 상대 경로 입니다. 자세한 사항은 {2} 를 참조하세요.", "commandsUpdated": "명령 수정됨!", "createUserDir": "Auto create user home dir while adding new user", - "minimumPasswordLength": "Minimum password length", - "tusUploads": "Chunked Uploads", - "tusUploadsHelp": "File Browser supports chunked file uploads, allowing for the creation of efficient, reliable, resumable and chunked file uploads even on unreliable networks.", - "tusUploadsChunkSize": "Indicates to maximum size of a request (direct uploads will be used for smaller uploads). You may input a plain integer denoting byte size input or a string like 10MB, 1GB etc.", - "tusUploadsRetryCount": "Number of retries to perform if a chunk fails to upload.", - "userHomeBasePath": "Base path for user home directories", - "userScopeGenerationPlaceholder": "The scope will be auto generated", - "createUserHomeDirectory": "Create user home directory", + "minimumPasswordLength": "최소 비밀번호 길이", + "tusUploads": "분할 업로드", + "tusUploadsHelp": "File Browser는 불안정한 네트워크에서도 효율적이고 신뢰성 있는 분할 업로드를 지원합니다.", + "tusUploadsChunkSize": "업로드 요청의 최대 크기 (예: 10MB, 1GB)", + "tusUploadsRetryCount": "업로드 실패 시 재시도 횟수", + "userHomeBasePath": "사용자 홈 폴더 기본 경로", + "userScopeGenerationPlaceholder": "범위는 자동으로 생성됩니다.", + "createUserHomeDirectory": "사용자 홈 폴더 생성", "customStylesheet": "커스텀 스타일시트", "defaultUserDescription": "아래 사항은 신규 사용자들에 대한 기본 설정입니다.", "disableExternalLinks": "외부 링크 감추기", @@ -212,19 +232,20 @@ "permissions": "권한", "permissionsHelp": "사용자를 관리자로 만들거나 권한을 부여할 수 있습니다. 관리자를 선택하면, 모든 옵션이 자동으로 선택됩니다. 사용자 관리는 현재 관리자만 할 수 있습니다.\n", "profileSettings": "프로필 설정", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "점(.)으로 시작하는 모든 파일의 접근을 방지합니다.(예 .git, .gitignore)\n", "ruleExample2": "Caddyfile파일의 접근을 방지합니다.", "rules": "룰", "rulesHelp": "사용자별로 규칙을 허용/방지를 지정할 수 있습니다. 방지된 파일은 보이지 않고 사용자들은 접근할 수 없습니다. 사용자의 접근 허용 범위와 관련해 정규표현식(regex)과 경로를 지원합니다.\n", "scope": "범위", - "setDateFormat": "Set exact date format", + "setDateFormat": "날짜 형식 설정", "settingsUpdated": "설정 수정됨!", "shareDuration": "공유 기간", "shareManagement": "공유 내역 관리", - "shareDeleted": "Share deleted!", + "shareDeleted": "공유 삭제됨!", "singleClick": "한번 클릭으로 파일과 폴더를 열도록 합니다.", "themes": { - "default": "System default", + "default": "시스템 기본값", "dark": "다크테마", "light": "라이트테마", "title": "테마" @@ -238,7 +259,8 @@ "userManagement": "사용자 관리", "userUpdated": "사용자 수정됨!", "username": "사용자 이름", - "users": "사용자" + "users": "사용자", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "도움말", diff --git a/frontend/src/i18n/lv.json b/frontend/src/i18n/lv.json new file mode 100644 index 00000000..c7e1d02f --- /dev/null +++ b/frontend/src/i18n/lv.json @@ -0,0 +1,288 @@ +{ + "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", + "redirectAfterCopyMove": "Redirect to destination after copy/move", + "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 new file mode 100644 index 00000000..c6af9aed --- /dev/null +++ b/frontend/src/i18n/lv_LV.json @@ -0,0 +1,288 @@ +{ + "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": "Beigt meklēšanu", + "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", + "redirectAfterCopyMove": "Pārvirzīt uz galapunktu pēc kopēšanas/pārvietošanas", + "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īgojums izdzēsts!", + "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": "Esošā Parole" + }, + "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/nl-be.json b/frontend/src/i18n/nl-be.json index 9bf3b1fa..a5fcb062 100644 --- a/frontend/src/i18n/nl-be.json +++ b/frontend/src/i18n/nl-be.json @@ -42,7 +42,12 @@ "update": "Updaten", "upload": "Uploaden", "openFile": "Open file", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Bestand downloaden", @@ -74,7 +79,16 @@ "sortByLastModified": "Sorteren op laatst bewerkt", "sortByName": "Sorteren op naam", "sortBySize": "Sorteren op grootte", - "noPreview": "Preview is not available for this file." + "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 (;)" + } }, "help": { "click": "selecteer bestand of map", @@ -100,7 +114,11 @@ "submit": "Log in", "username": "Gebruikersnaam", "usernameTaken": "Gebruikersnaam reeds in gebruik", - "wrongCredentials": "Verkeerde inloggegevens" + "wrongCredentials": "Verkeerde inloggegevens", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Permanent", "prompts": { @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrator", "allowCommands": "Commando's uitvoeren", @@ -161,6 +180,7 @@ "allowNew": "Nieuwe bestanden of mappen aanmaken", "allowPublish": "Publiceer nieuwe berichten en pagina's", "allowSignup": "Sta gebruikers toe om zich te registreren", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(laat leeg om wijzigingen te voorkomen)", "branding": "Branding", "brandingDirectoryPath": "Branding directory path", @@ -212,6 +232,7 @@ "permissions": "Permissies", "permissionsHelp": "U kunt de gebruiker instellen als beheerder of de machtigingen afzonderlijk kiezen. Als u \"Beheerder\" selecteert, worden alle andere opties automatisch gecontroleerd. Het beheer van gebruikers blijft een privilege van een beheerder.\n", "profileSettings": "Profielinstellingen", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "voorkomt de toegang tot elk puntbestand (zoals .git, .gitignore) in elke map.\n", "ruleExample2": "blokkeert de toegang tot het bestand met de naam Caddyfile in de hoofdmap van het bereik.", "rules": "Regels", @@ -238,7 +259,8 @@ "userManagement": "Gebruikersbeheer", "userUpdated": "Gebruiker bijgewerkt!", "username": "Gebruikersnaam", - "users": "Gebruikers" + "users": "Gebruikers", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Help", diff --git a/frontend/src/i18n/no.json b/frontend/src/i18n/no.json index d077e96f..3a5e7bdd 100644 --- a/frontend/src/i18n/no.json +++ b/frontend/src/i18n/no.json @@ -42,7 +42,12 @@ "update": "Opptater", "upload": "Last opp", "openFile": "Open file", - "discardChanges": "Slett" + "discardChanges": "Slett", + "stopSearch": "Stop searching", + "saveChanges": "Lagre Endringane ", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Nedlast filen", @@ -74,7 +79,16 @@ "sortByLastModified": "Sorter etter sist endret", "sortByName": "Sorter etter navn", "sortBySize": "Sorter etter størrelse", - "noPreview": "Forhåndsvisning er ikkje tilgjengeleg for denne filen." + "noPreview": "Forhåndsvisning er ikkje tilgjengeleg for denne filen.", + "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": "velg fil eller katalog", @@ -100,7 +114,11 @@ "submit": "Logg inn", "username": "Brukernavn", "usernameTaken": "Brukernavn er allerede i bruk", - "wrongCredentials": "Feil legitimasjon" + "wrongCredentials": "Feil legitimasjon", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "Du har blitt logget ut på grunn av inaktivitet" + } }, "permanent": "Permanent", "prompts": { @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrator", "allowCommands": "Utfør kommandoer", @@ -161,6 +180,7 @@ "allowNew": "Opprett nye filer og direktorater", "allowPublish": "Publiser nye innlegg og sider", "allowSignup": "Tilat brukere å registrere seg", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(la stå tomt for å unngå endringer)", "branding": "Merkevarebygging", "brandingDirectoryPath": "Bane for merkevarekatalog", @@ -212,6 +232,7 @@ "permissions": "Tilaterser", "permissionsHelp": "Du kan angi brukeren som administrator eller velge tillatelsene individuelt. Hvis du velger «Administrator», vil alle de andre alternativene bli automatisk avkrysset. Administrasjon av brukere er fortsatt et privilegium for en administrator.\n", "profileSettings": "Profil Innstilinger", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "forhindrer tilgang til noen dotfiler (som .git, .gitignore) i alle mapper.\n", "ruleExample2": "blokkerer tilgangen til filen med navnet Caddyfile på roten av omfanget.", "rules": "Regler", @@ -238,7 +259,8 @@ "userManagement": "Brukeradministrasjon", "userUpdated": "Bruker opprettet!", "username": "Brukernavn", - "users": "Bruker" + "users": "Bruker", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Hjelp", diff --git a/frontend/src/i18n/pl.json b/frontend/src/i18n/pl.json index 3d7835cc..64b9f04a 100644 --- a/frontend/src/i18n/pl.json +++ b/frontend/src/i18n/pl.json @@ -42,7 +42,12 @@ "update": "Aktualizuj", "upload": "Wyślij", "openFile": "Otwórz plik", - "discardChanges": "Odrzuć" + "discardChanges": "Odrzuć", + "stopSearch": "Zatrzymaj wyszukiwanie", + "saveChanges": "Zapisz zmiany", + "editAsText": "Edytuj jako tekst", + "increaseFontSize": "Zwiększ rozmiar czcionki", + "decreaseFontSize": "Zmniejsz rozmiar czcionki" }, "download": { "downloadFile": "Pobierz plik", @@ -74,7 +79,16 @@ "sortByLastModified": "Sortuj wg ostatniej modyfikacji", "sortByName": "Sortuj wg nazwy", "sortBySize": "Sortuj wg rozmiaru", - "noPreview": "Podgląd tego pliku jest niedostępny." + "noPreview": "Podgląd tego pliku jest niedostępny.", + "csvTooLarge": "Plik CSV jest za duży do podglądu (>5 MB). Pobierz, aby wyświetlić.", + "csvLoadFailed": "Nie udało się załadować pliku CSV.", + "showingRows": "Wyświetlanie wierszy: {count}", + "columnSeparator": "Separator kolumn", + "csvSeparators": { + "comma": "Przecinek (,)", + "semicolon": "Średnik (;)", + "both": "Zarówno (,), jak i (;)" + } }, "help": { "click": "zaznacz plik lub folder", @@ -100,7 +114,11 @@ "submit": "Zaloguj", "username": "Nazwa użytkownika", "usernameTaken": "Ta nazwa użytkownika jest zajęta", - "wrongCredentials": "Błędne dane logowania" + "wrongCredentials": "Błędne dane logowania", + "passwordTooShort": "Wymagana minimalna liczba znaków hasła: {min}", + "logout_reasons": { + "inactivity": "Wylogowano z powodu braku aktywności." + } }, "permanent": "Permanentny", "prompts": { @@ -154,6 +172,7 @@ "video": "Wideo" }, "settings": { + "aceEditorTheme": "Motyw edytora Ace", "admin": "Admin", "administrator": "Administrator", "allowCommands": "Wykonaj polecenie", @@ -161,6 +180,7 @@ "allowNew": "Tworzenie nowych plików lub folderów", "allowPublish": "Tworzenie nowych wpisów i stron", "allowSignup": "Pozwól użytkownikom na rejestrację", + "hideLoginButton": "Ukryj przycisk logowania na stronach publicznych", "avoidChanges": "(pozostaw puste, aby uniknąć zmian)", "branding": "Personalizacja", "brandingDirectoryPath": "Ścieżka do folderu personalizacji", @@ -211,7 +231,8 @@ }, "permissions": "Uprawnienia", "permissionsHelp": "Możesz ustawić użytkownika jako administratora lub wybrać uprawnienia indywidualnie. Jeśli wybierzesz „Administrator”, wszystkie pozostałe opcje zostaną automatycznie zaznaczone. Zarządzanie użytkownikami pozostaje przywilejem administratora.\n", - "profileSettings": "Twój profil", + "profileSettings": "Ustawienia profilu", + "redirectAfterCopyMove": "Przekieruj do miejsca docelowego po skopiowaniu lub przeniesieniu", "ruleExample1": "uniemożliwia dostęp do plików poprzedzonych kropką (takich jak .git, .gitignore) we wszystkich folderach.\n", "ruleExample2": "blokuje dostęp do pliku o nazwie Caddyfile w katalogu głównym zakresu.", "rules": "Uprawnienia", @@ -238,7 +259,8 @@ "userManagement": "Zarządzanie użytkownikami", "userUpdated": "Użytkownik zapisany!", "username": "Nazwa użytkownika", - "users": "Użytkownicy" + "users": "Użytkownicy", + "currentPassword": "Twoje aktualne hasło" }, "sidebar": { "help": "Pomoc", diff --git a/frontend/src/i18n/pt-br.json b/frontend/src/i18n/pt-br.json index e0f04b66..f6aa8f4e 100644 --- a/frontend/src/i18n/pt-br.json +++ b/frontend/src/i18n/pt-br.json @@ -42,7 +42,12 @@ "update": "Atualizar", "upload": "Enviar", "openFile": "Abrir", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Baixar arquivo", @@ -74,7 +79,16 @@ "sortByLastModified": "Ordenar pela última modificação", "sortByName": "Ordenar pelo nome", "sortBySize": "Ordenar pelo tamanho", - "noPreview": "Pré-visualização não disponível para este arquivo." + "noPreview": "Pré-visualização não disponível para este arquivo.", + "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": "selecionar pasta ou arquivo", @@ -100,7 +114,11 @@ "submit": "Login", "username": "Nome do usuário", "usernameTaken": "Nome de usuário já existe", - "wrongCredentials": "Ops! Dados incorretos." + "wrongCredentials": "Ops! Dados incorretos.", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Permanente", "prompts": { @@ -154,6 +172,7 @@ "video": "Vídeos" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrador", "allowCommands": "Executar comandos", @@ -161,6 +180,7 @@ "allowNew": "Criar novos arquivos e pastas", "allowPublish": "Publicar novas páginas e conteúdos", "allowSignup": "Permitir cadastro de usuários", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(deixe em branco para manter)", "branding": "Customização", "brandingDirectoryPath": "Diretório de customização", @@ -212,6 +232,7 @@ "permissions": "Permissões", "permissionsHelp": "Pode definir o usuário como administrador ou escolher as permissões manualmente. Se selecionar a opção \"Administrador\", todas as outras opções serão automaticamente selecionadas. A gestão dos usuários é um privilégio restringido aos administradores.\n", "profileSettings": "Configurações do usuário", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "previne o acesso a qualquer \"dotfile\" (como .git, .gitignore) em qualquer pasta\n", "ruleExample2": "bloqueia o acesso ao arquivo chamado Caddyfile.", "rules": "Regras", @@ -238,7 +259,8 @@ "userManagement": "Gerenciamento de usuários", "userUpdated": "Usuário atualizado!", "username": "Nome do usuário", - "users": "Usuários" + "users": "Usuários", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Ajuda", diff --git a/frontend/src/i18n/pt.json b/frontend/src/i18n/pt.json index 6041ddd2..dcacf3b6 100644 --- a/frontend/src/i18n/pt.json +++ b/frontend/src/i18n/pt.json @@ -42,7 +42,12 @@ "update": "Atualizar", "upload": "Enviar", "openFile": "Open file", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Descarregar ficheiro", @@ -74,7 +79,16 @@ "sortByLastModified": "Ordenar pela última alteração", "sortByName": "Ordenar pelo nome", "sortBySize": "Ordenar pelo tamanho", - "noPreview": "Preview is not available for this file." + "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 (;)" + } }, "help": { "click": "selecionar pasta ou ficheiro", @@ -100,7 +114,11 @@ "submit": "Entrar na conta", "username": "Nome de utilizador", "usernameTaken": "O nome de utilizador já está registado", - "wrongCredentials": "Dados errados" + "wrongCredentials": "Dados errados", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Permanente", "prompts": { @@ -154,6 +172,7 @@ "video": "Vídeos" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrador", "allowCommands": "Executar comandos", @@ -161,6 +180,7 @@ "allowNew": "Criar novos ficheiros e pastas", "allowPublish": "Publicar novas páginas e conteúdos", "allowSignup": "Permitir que os utilizadores criem contas", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(deixe em branco para manter)", "branding": "Marca", "brandingDirectoryPath": "Caminho da pasta de marca", @@ -212,6 +232,7 @@ "permissions": "Permissões", "permissionsHelp": "Pode definir o utilizador como administrador ou escolher as permissões manualmente. Se selecionar a opção \"Administrador\", todas as outras opções serão automaticamente selecionadas. A gestão dos utilizadores é um privilégio restringido aos administradores.\n", "profileSettings": "Configurações do utilizador", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "previne o acesso a qualquer \"dotfile\" (como .git, .gitignore) em qualquer pasta\n", "ruleExample2": "bloqueia o acesso ao ficheiro chamado Caddyfile na raiz.", "rules": "Regras", @@ -238,7 +259,8 @@ "userManagement": "Gestão de utilizadores", "userUpdated": "Utilizador atualizado!", "username": "Nome de utilizador", - "users": "Utilizadores" + "users": "Utilizadores", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Ajuda", diff --git a/frontend/src/i18n/ro.json b/frontend/src/i18n/ro.json index 8063e655..c80c4e28 100644 --- a/frontend/src/i18n/ro.json +++ b/frontend/src/i18n/ro.json @@ -42,7 +42,12 @@ "update": "Actualizează", "upload": "Încarcă", "openFile": "Open file", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Descarcă fișier", @@ -74,7 +79,16 @@ "sortByLastModified": "Ordonează dup ultima modificare", "sortByName": "Ordonează după nume", "sortBySize": "Ordonează după dimensiune", - "noPreview": "Preview is not available for this file." + "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 (;)" + } }, "help": { "click": "alege fișier sau director", @@ -100,7 +114,11 @@ "submit": "Autentificare", "username": "Utilizator", "usernameTaken": "Utilizatorul există", - "wrongCredentials": "Informații greșite" + "wrongCredentials": "Informații greșite", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Permanent", "prompts": { @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrator", "allowCommands": "Execută comenzi", @@ -161,6 +180,7 @@ "allowNew": "Crează noi fișiere sau directoare", "allowPublish": "Publică noi pagini și postări", "allowSignup": "Permite utilizatorilor să se înregistreze", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(lasă gol pentru a nu schimba)", "branding": "Branding", "brandingDirectoryPath": "Calea către directorul de branding", @@ -212,6 +232,7 @@ "permissions": "Permisiuni", "permissionsHelp": "Poți alege ca un utilizator să fie administrator sau să-i alegi permisiunile individual. Dacă alegi \"Administrator\", toate celelalte opțiuni vor fi bifate automat. Gestionarea utilizatorilor rămâne un privilegiu exclusiv al administratorilor.\n", "profileSettings": "Setări profil", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "împiedică accesul la fisiere cu punct in față (.), cum ar fi .git, .gitignore în orice director.\n", "ruleExample2": "împiedică accesul la fișierul Caddyfile din rădăcina domeniului.", "rules": "Reguli", @@ -238,7 +259,8 @@ "userManagement": "Gestionare utilizatori", "userUpdated": "Utilizator actualizat!", "username": "Utilizator", - "users": "Utilizatori" + "users": "Utilizatori", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Ajutor", diff --git a/frontend/src/i18n/ru.json b/frontend/src/i18n/ru.json index 6d8d8059..60b211f6 100644 --- a/frontend/src/i18n/ru.json +++ b/frontend/src/i18n/ru.json @@ -42,7 +42,12 @@ "update": "Обновить", "upload": "Загрузить", "openFile": "Открыть файл", - "discardChanges": "Отказаться" + "discardChanges": "Отказаться", + "stopSearch": "Stop searching", + "saveChanges": "Сохранить", + "editAsText": "Редактировать как текст", + "increaseFontSize": "Увеличить размер шрифта", + "decreaseFontSize": "Уменьшить размер шрифта" }, "download": { "downloadFile": "Скачать файл", @@ -74,7 +79,16 @@ "sortByLastModified": "Сортировка по дате изменения", "sortByName": "Сортировка по имени", "sortBySize": "Сортировка по размеру", - "noPreview": "Предварительный просмотр для этого файла недоступен." + "noPreview": "Предварительный просмотр для этого файла недоступен.", + "csvTooLarge": "Этот CSV файл слишком большой для предпросмотра (>5 МБ). Скачайте и откройте его локально.", + "csvLoadFailed": "Не удалось загрузить этот CSV.", + "showingRows": "Отображается {count} строк(а)", + "columnSeparator": "Разделитель столбцов", + "csvSeparators": { + "comma": "Запятая (,)", + "semicolon": "Точка с запятой (;)", + "both": "Оба варианта — (,) и (;)" + } }, "help": { "click": "выбрать файл или каталог", @@ -100,7 +114,11 @@ "submit": "Войти", "username": "Имя пользователя", "usernameTaken": "Данное имя пользователя уже занято", - "wrongCredentials": "Неверные данные" + "wrongCredentials": "Неверные данные", + "passwordTooShort": "Пароль должен состоять как минимум из {min} символов", + "logout_reasons": { + "inactivity": "Сессия завершена после долгого отсутствия." + } }, "permanent": "Постоянный", "prompts": { @@ -154,6 +172,7 @@ "video": "Видео" }, "settings": { + "aceEditorTheme": "Тема редактора Ace", "admin": "Админ", "administrator": "Администратор", "allowCommands": "Запуск команд", @@ -161,6 +180,7 @@ "allowNew": "Создание новых файлов или каталогов", "allowPublish": "Публикация новых записей и страниц", "allowSignup": "Разрешить пользователям регистрироваться", + "hideLoginButton": "Спрятать кнопку входа с публичных страниц", "avoidChanges": "(оставьте поле пустым, чтобы избежать изменений)", "branding": "Брендинг", "brandingDirectoryPath": "Путь к каталогу брендов", @@ -170,7 +190,7 @@ "commandRunnerHelp": "Здесь вы можете установить команды, которые будут выполняться в указанных событиях. Вы должны указать по одной команде в каждой строке. Переменные среды {0} и {1} будут доступны, будучи {0} относительно {1}. Дополнительные сведения об этой функции и доступных переменных среды см. В {2}.", "commandsUpdated": "Команды обновлены!", "createUserDir": "Автоматическое создание домашнего каталога пользователя при добавлении нового пользователя", - "minimumPasswordLength": "Minimum password length", + "minimumPasswordLength": "Минимальная длина пароля", "tusUploads": "Загруженные файлы", "tusUploadsHelp": " File Browser поддерживает загрузку файлов по частям, что позволяет работать в сетях низкого качества.", "tusUploadsChunkSize": "Указывает максимальный размер запроса (мелкие загрузки пойдут напрямую). Вы можете ввести простое целое число, обозначающее размер ввода в байтах, или строку, например 10MB, 1GB и т. д.", @@ -212,6 +232,7 @@ "permissions": "Права доступа", "permissionsHelp": "Можно настроить пользователя как администратора или выбрать разрешения индивидуально. При выборе \"Администратор\", все остальные параметры будут автоматически выбраны. Управление пользователями - привилегия администратора.\n", "profileSettings": "Настройки профиля", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "предотвратить доступ к любому скрытому файлу (например: .git, .gitignore) в каждой папке.\n", "ruleExample2": "блокирует доступ к файлу с именем Caddyfile в корневой области.", "rules": "Права", @@ -238,7 +259,8 @@ "userManagement": "Управление пользователями", "userUpdated": "Пользователь изменен!", "username": "Имя пользователя", - "users": "Пользователи" + "users": "Пользователи", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Помощь", diff --git a/frontend/src/i18n/sk.json b/frontend/src/i18n/sk.json index 5f36b283..201d2d3d 100644 --- a/frontend/src/i18n/sk.json +++ b/frontend/src/i18n/sk.json @@ -7,13 +7,13 @@ "copy": "Kopírovať", "copyFile": "Kopírovať súbor", "copyToClipboard": "Kopírovať do schránky", - "copyDownloadLinkToClipboard": "Copy download link to clipboard", + "copyDownloadLinkToClipboard": "Kopírovať odkaz na stiahnutie do schránky", "create": "Vytvoriť", "delete": "Odstrániť", "download": "Stiahnuť", "file": "Súbor", "folder": "Priečinok", - "fullScreen": "Toggle full screen", + "fullScreen": "Prepnúť na celú obrazovku", "hideDotfiles": "Skryť súbory začínajúce bodkou", "info": "Info", "more": "Viac", @@ -24,7 +24,7 @@ "ok": "OK", "permalink": "Získať trvalý odkaz", "previous": "Predošlé", - "preview": "Preview", + "preview": "Náhľad", "publish": "Zverejniť", "rename": "Premenovať", "replace": "Nahradiť", @@ -42,7 +42,12 @@ "update": "Aktualizovať", "upload": "Nahrať", "openFile": "Otvoriť súbor", - "discardChanges": "Discard" + "discardChanges": "Zahodiť", + "stopSearch": "Stop searching", + "saveChanges": "Uložiť zmeny", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Stiahnuť súbor", @@ -50,7 +55,7 @@ "downloadSelected": "Stiahnuť vybraté" }, "upload": { - "abortUpload": "Are you sure you wish to abort?" + "abortUpload": "Naozaj chcete prerušiť?" }, "errors": { "forbidden": "You don't have permissions to access this.", @@ -74,7 +79,16 @@ "sortByLastModified": "Zoradiť podľa dátumu", "sortByName": "Zoradiť podľa názvu", "sortBySize": "Zoradiť podľa veľkosti", - "noPreview": "Pre tento súbor nie je dostupný náhľad." + "noPreview": "Pre tento súbor nie je dostupný náhľad.", + "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": "vyberie súbor alebo priečinok", @@ -100,7 +114,11 @@ "submit": "Prihlásiť", "username": "Používateľské meno", "usernameTaken": "Meno je už obsadené", - "wrongCredentials": "Nesprávne prihlasovacie údaje" + "wrongCredentials": "Nesprávne prihlasovacie údaje", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "Boli ste odhlásení z dôvodu nečinnosti." + } }, "permanent": "Trvalé", "prompts": { @@ -110,7 +128,7 @@ "deleteMessageMultiple": "Naozaj chcete odstrániť {count} súbor(ov)?", "deleteMessageSingle": "Naozaj chcete odstrániť tento súbor/priečinok?", "deleteMessageShare": "Naozaj chcete odstrániť toto zdieľanie({path})?", - "deleteUser": "Are you sure you want to delete this user?", + "deleteUser": "Naozaj chcete odstrániť tohto používateľa?", "deleteTitle": "Odstránenie súborov", "displayName": "Zobrazený názov:", "download": "Stiahnuť súbory", @@ -137,11 +155,11 @@ "show": "Zobraziť", "size": "Veľkosť", "upload": "Nahrať", - "uploadFiles": "Uploading {files} files...", + "uploadFiles": "Nahráva sa {files} súborov...", "uploadMessage": "Zvoľte možnosť nahrávania.", "optionalPassword": "Voliteľné heslo", - "resolution": "Resolution", - "discardEditorChanges": "Are you sure you wish to discard the changes you've made?" + "resolution": "Rozlíšenie", + "discardEditorChanges": "Naozaj chcete zahodiť vykonané zmeny?" }, "search": { "images": "Obrázky", @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Admin", "administrator": "Administrátor", "allowCommands": "Vykonávať príkazy", @@ -161,6 +180,7 @@ "allowNew": "Vytvárať nové súbory a priečinky", "allowPublish": "Zverejňovať nové príspevky a stránky", "allowSignup": "Povoliť registráciu používateľov", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(nechajte prázdne, aby sa nezmenilo)", "branding": "Vlastný vzhľad", "brandingDirectoryPath": "Cesta k priečinku s vlastným vzhľadom", @@ -170,14 +190,14 @@ "commandRunnerHelp": "Sem môžete nastaviť príkazy, ktoré sa vykonajú pri určitých udalostiach. Musíte písať jeden na riadok. Premenné prostredia {0} a {1} sú k dispozícii, s tým že {0} relatívne k {1}. Viac informácií o tejto funkcionalite a dostupných premenných prostredia nájdete na {2}.", "commandsUpdated": "Príkazy upravené!", "createUserDir": "Automaticky vytvoriť domovský priečinok pri pridaní používateľa", - "minimumPasswordLength": "Minimum password length", - "tusUploads": "Chunked Uploads", - "tusUploadsHelp": "File Browser supports chunked file uploads, allowing for the creation of efficient, reliable, resumable and chunked file uploads even on unreliable networks.", - "tusUploadsChunkSize": "Indicates to maximum size of a request (direct uploads will be used for smaller uploads). You may input a plain integer denoting byte size input or a string like 10MB, 1GB etc.", - "tusUploadsRetryCount": "Number of retries to perform if a chunk fails to upload.", - "userHomeBasePath": "Base path for user home directories", - "userScopeGenerationPlaceholder": "The scope will be auto generated", - "createUserHomeDirectory": "Create user home directory", + "minimumPasswordLength": "Minimálna dĺžka hesla", + "tusUploads": "Nahrávanie po častiach", + "tusUploadsHelp": "Prehliadač súborov podporuje nahrávanie súborov po častiach, čo umožňuje vytváranie efektívnych, spoľahlivých, obnoviteľných a po častiach nahrávaných súborov aj v prípade nespoľahlivých sietí.", + "tusUploadsChunkSize": "Označuje maximálnu veľkosť požiadavky (pre menšie nahratia sa použijú priame nahratia). Môžete zadať celé číslo označujúce veľkosť v bajtoch alebo reťazec ako 10 MB, 1 GB atď.", + "tusUploadsRetryCount": "Počet opakovaných pokusov, ktoré sa majú vykonať, ak sa nepodarí nahrať časť súboru.", + "userHomeBasePath": "Východisková cesta pre domáce adresáre používateľov", + "userScopeGenerationPlaceholder": "Rozsah bude automaticky generovaný", + "createUserHomeDirectory": "Vytvoriť domovský adresár používateľa", "customStylesheet": "Vlastný Stylesheet", "defaultUserDescription": "Toto sú predvolané nastavenia nového používateľa.", "disableExternalLinks": "Vypnúť externé odkazy (okrem dokumentácie)", @@ -212,19 +232,20 @@ "permissions": "Práva", "permissionsHelp": "Môžete nastaviť používateľa, aby bol administrátorom alebo vybrať práva jednotlivo. Ak zvolíte \"Administrator\", všetky ďalšie budú automaticky zaškrtnuté. Manažment používateľov ostáva v správe administrátora.\n", "profileSettings": "Nastavenia profilu", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "blokuje prístup ku všetkým súborom začínajúcim bodkou (napríklad .git, .gitignore) v každom priečinku.\n", "ruleExample2": "blokuje prístup k súborom s názvom Caddyfile v koreňovom priečinku.", "rules": "Pravidlá", "rulesHelp": "Tu môžete definovať pravidlá pre konkrétneho používateľa. Blokované súbory používateľ nebude vidieť a ani nebude k nim mať prístup. Podporujeme regex a cesty relatívne k používateľovi.\n", "scope": "Scope", - "setDateFormat": "Set exact date format", + "setDateFormat": "Nastaviť presný formát dátumu", "settingsUpdated": "Nastavenia upravené!", "shareDuration": "Trvanie zdieľania", "shareManagement": "Správa zdieľania", "shareDeleted": "Zdieľanie odstránené!", "singleClick": "Používať jeden klik na otváranie súborov a priečinkov", "themes": { - "default": "System default", + "default": "Predvolené nastavenie systému", "dark": "Tmavá", "light": "Svetlá", "title": "Téma" @@ -238,7 +259,8 @@ "userManagement": "Správa používateľov", "userUpdated": "Používateľ upravený!", "username": "Meno používateľa", - "users": "Používatelia" + "users": "Používatelia", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Pomoc", diff --git a/frontend/src/i18n/sv-se.json b/frontend/src/i18n/sv-se.json index 015c106b..642252d9 100644 --- a/frontend/src/i18n/sv-se.json +++ b/frontend/src/i18n/sv-se.json @@ -3,18 +3,18 @@ "cancel": "Avbryt", "clear": "Rensa", "close": "Stäng", - "continue": "Continue", + "continue": "Fortsätt", "copy": "Kopiera", "copyFile": "Kopiera fil", "copyToClipboard": "Kopiera till urklipp", - "copyDownloadLinkToClipboard": "Copy download link to clipboard", + "copyDownloadLinkToClipboard": "Kopiera hämtningslänk till urklipp", "create": "Skapa", "delete": "Ta bort", "download": "Ladda ner", - "file": "File", - "folder": "Folder", - "fullScreen": "Toggle full screen", - "hideDotfiles": "Hide dotfiles", + "file": "Fil", + "folder": "Mapp", + "fullScreen": "Växla helskärm", + "hideDotfiles": "Dölj punktfiler", "info": "Info", "more": "Mer", "move": "Flytta", @@ -24,7 +24,7 @@ "ok": "OK", "permalink": "Skapa en permanent länk", "previous": "Föregående", - "preview": "Preview", + "preview": "Förhandsvisa", "publish": "Publisera", "rename": "Ändra namn", "replace": "Ersätt", @@ -36,27 +36,32 @@ "selectMultiple": "Välj flera", "share": "Dela", "shell": "Växla skal", - "submit": "Submit", + "submit": "Skicka", "switchView": "Byt vy", "toggleSidebar": "Växla sidofält", "update": "Uppdatera", "upload": "Ladda upp", - "openFile": "Open file", - "discardChanges": "Discard" + "openFile": "Öppna fil", + "discardChanges": "Förkasta", + "stopSearch": "Stop searching", + "saveChanges": "Spara ändringar", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Ladda ner fil", "downloadFolder": "Ladda ner mapp", - "downloadSelected": "Download Selected" + "downloadSelected": "Hämta markerade" }, "upload": { - "abortUpload": "Are you sure you wish to abort?" + "abortUpload": "Är du säker på att du vill avbryta?" }, "errors": { "forbidden": "Du saknar rättigheter till detta", "internal": "Något gick fel", "notFound": "Det går inte att nå den här platsen.", - "connection": "The server can't be reached." + "connection": "Servern går inte att nå." }, "files": { "body": "Huvud", @@ -74,7 +79,16 @@ "sortByLastModified": "Sortera på senast ändrad", "sortByName": "Sortera på namn", "sortBySize": "Sortera på storlek", - "noPreview": "Preview is not available for this file." + "noPreview": "Förhandsvisning är inte tillgänglig för denna fil.", + "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": "välj fil eller mapp", @@ -100,7 +114,11 @@ "submit": "Logga in", "username": "Användarnamn", "usernameTaken": "Användarnamn upptaget", - "wrongCredentials": "Fel inloggning" + "wrongCredentials": "Fel inloggning", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "Du har blivit utloggad på grund av inaktivitet." + } }, "permanent": "Permanent", "prompts": { @@ -109,8 +127,8 @@ "currentlyNavigating": "För närvarande navigerar du på:", "deleteMessageMultiple": "Är du säker på att du vill radera {count} filer(na)?", "deleteMessageSingle": "Är du säker på att du vill radera denna fil/mapp", - "deleteMessageShare": "Are you sure you wish to delete this share({path})?", - "deleteUser": "Are you sure you want to delete this user?", + "deleteMessageShare": "Är du säker på att du vill ta bort denna utdelning({path})?", + "deleteUser": "Är du säker på att du vill ta bort denna användare?", "deleteTitle": "Ta bort filer", "displayName": "Visningsnamn:", "download": "Ladda ner filer", @@ -136,12 +154,12 @@ "scheduleMessage": "Pick a date and time to schedule the publication of this post.", "show": "Visa", "size": "Storlek", - "upload": "Upload", - "uploadFiles": "Uploading {files} files...", - "uploadMessage": "Select an option to upload.", - "optionalPassword": "Optional password", - "resolution": "Resolution", - "discardEditorChanges": "Are you sure you wish to discard the changes you've made?" + "upload": "Ladda upp", + "uploadFiles": "Laddar upp {files} filer...", + "uploadMessage": "Välj ett alternativ att ladda upp.", + "optionalPassword": "Valfritt lösenord", + "resolution": "Upplösning", + "discardEditorChanges": "Är du säker på att du vill förkasta ändringarna du gjort?" }, "search": { "images": "Bilder", @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Tema för Ace editor", "admin": "Admin", "administrator": "Administratör", "allowCommands": "Exekvera kommandon", @@ -161,6 +180,7 @@ "allowNew": "Skapa nya filer eller mappar", "allowPublish": "Publicera nya inlägg och sidor", "allowSignup": "Tillåt användare att registrera sig", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(lämna blankt för att undvika ändringar)", "branding": "Varumärke", "brandingDirectoryPath": "Sökväg till varumärkes katalog", @@ -170,14 +190,14 @@ "commandRunnerHelp": "Här kan du ange kommandon som körs i de namngivna händelserna. Du måste skriva en per rad. Miljövariablerna {0} och {1} kommer att vara tillgängliga, och vara {0} i förhållande till {1}. För mer information om den här funktionen och de tillgängliga miljövariablerna, vänligen läs {2}.", "commandsUpdated": "Kommandon uppdaterade!", "createUserDir": "Auto skapa användarens hemkatalog när du lägger till nya användare", - "minimumPasswordLength": "Minimum password length", - "tusUploads": "Chunked Uploads", - "tusUploadsHelp": "File Browser supports chunked file uploads, allowing for the creation of efficient, reliable, resumable and chunked file uploads even on unreliable networks.", - "tusUploadsChunkSize": "Indicates to maximum size of a request (direct uploads will be used for smaller uploads). You may input a plain integer denoting byte size input or a string like 10MB, 1GB etc.", - "tusUploadsRetryCount": "Number of retries to perform if a chunk fails to upload.", - "userHomeBasePath": "Base path for user home directories", - "userScopeGenerationPlaceholder": "The scope will be auto generated", - "createUserHomeDirectory": "Create user home directory", + "minimumPasswordLength": "Minsta lösenordslängd", + "tusUploads": "Uppdelade uppladdningar", + "tusUploadsHelp": "Filbläddraren stöder uppdelade filuppladdningar, vilket möjliggör effektiva, tillförlitliga, återupptagbara och uppdelade filuppladdningar även på otillförlitliga nätverk.", + "tusUploadsChunkSize": "Anger maximal storlek för en begäran (direkta uppladdningar används för mindre uppladdningar). Du kan ange ett helt tal som anger storleken i byte eller en sträng som 10 MB, 1 GB osv.", + "tusUploadsRetryCount": "Antal försök som ska göras om en del inte kan laddas upp.", + "userHomeBasePath": "Bassökväg för användarnas hemkataloger", + "userScopeGenerationPlaceholder": "Omfånget kommer att automatiskt genereras", + "createUserHomeDirectory": "Skapa användarens hemkatalog", "customStylesheet": "Anpassad formatmall", "defaultUserDescription": "Detta är standard inställningar för användare.", "disableExternalLinks": "Inaktivera externa länkar (förutom dokumentation)", @@ -188,7 +208,7 @@ "executeOnShellDescription": "Som standard kör fil bläddraren kommandona genom att anropa deras binärfiler direkt. Om du vill köra dem på ett skal i stället (till exempel bash eller PowerShell), kan du definiera det här med nödvändiga argument och flaggor. Om det är inställt kommer kommandot du kör att läggas till som ett argument. Detta gäller både användar kommandon och händelse krokar.", "globalRules": "Det här är en global uppsättning regler för att tillåta och inte tillåta. De gäller för alla användare. Du kan definiera specifika regler för varje användares inställningar för att åsidosätta de här inställningarna.", "globalSettings": "Globala inställningar", - "hideDotfiles": "Hide dotfiles", + "hideDotfiles": "Dölj punktfiler", "insertPath": "Ange sökväg", "insertRegex": "Sätt in regex expression", "instanceName": "Instans namn", @@ -199,7 +219,7 @@ "newUser": "Ny användare", "password": "Lösenord", "passwordUpdated": "Lösenord uppdaterat", - "path": "Path", + "path": "Sökväg", "perm": { "create": "Skapa filer och mappar", "delete": "Ta bort filer och mappar", @@ -212,22 +232,23 @@ "permissions": "Rättigheter", "permissionsHelp": "Du kan ange att användaren ska vara administratör eller välja behörigheterna individuellt. Om du väljer \"administratör \" kommer alla andra alternativ att kontrolleras automatiskt. Hanteringen av användare är fortfarande ett privilegium för en administratör.\n", "profileSettings": "Profil inställningar", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "förhindrar åtkomst till en dot-fil (till exempel. git,. gitignore) i varje mapp.\n", "ruleExample2": "blockerar åtkomsten till filen som heter Caddyfilen i roten av scopet.", "rules": "Regler", "rulesHelp": "Här kan du definiera en uppsättning regler för godkänna och neka för den här specifika användaren. Den blockerade filen kommer inte upp i listningarna och kommer inte att vara tillgänglig till användaren. Vi stöder regex och sökvägar i förhållande till användarnas omfång.\n", "scope": "Omfattning", - "setDateFormat": "Set exact date format", + "setDateFormat": "Ställ in exakt datumformat", "settingsUpdated": "Inställning uppdaterad!", - "shareDuration": "Share Duration", - "shareManagement": "Share Management", - "shareDeleted": "Share deleted!", - "singleClick": "Use single clicks to open files and directories", + "shareDuration": "Utdelningstid", + "shareManagement": "Utdelningshantering", + "shareDeleted": "Utdelning borttagen!", + "singleClick": "Använd enkla klick för att öppna filer och kataloger", "themes": { - "default": "System default", - "dark": "Dark", - "light": "Light", - "title": "Theme" + "default": "Systemet standard", + "dark": "Mörk", + "light": "Ljus", + "title": "Tema" }, "user": "Användare", "userCommands": "Kommandon", @@ -238,7 +259,8 @@ "userManagement": "Användarehantering", "userUpdated": "Användare uppdaterad!", "username": "Användarnamn", - "users": "Användare" + "users": "Användare", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Hjälp", diff --git a/frontend/src/i18n/tr.json b/frontend/src/i18n/tr.json index 1c4572c0..f83e7103 100644 --- a/frontend/src/i18n/tr.json +++ b/frontend/src/i18n/tr.json @@ -42,7 +42,12 @@ "update": "Güncelle", "upload": "Yükle", "openFile": "Dosyayı aç", - "discardChanges": "Discard" + "discardChanges": "Discard", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Dosyayı indir", @@ -74,7 +79,16 @@ "sortByLastModified": "Güncelleme tarihine göre sırala", "sortByName": "İsme göre sırala", "sortBySize": "Boyuta göre sırala", - "noPreview": "Bu dosya için önizleme aktif değil" + "noPreview": "Bu dosya için önizleme aktif değil", + "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": "dosya veya klasör seçin", @@ -100,7 +114,11 @@ "submit": "Giriş", "username": "Kullanıcı adı", "usernameTaken": "Kullanıcı adı mevcut", - "wrongCredentials": "Yanlış hesap bilgileri" + "wrongCredentials": "Yanlış hesap bilgileri", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Kalıcı", "prompts": { @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Yönetim", "administrator": "Yönetici", "allowCommands": "Komutları çalıştır", @@ -161,6 +180,7 @@ "allowNew": "Yeni dosyalar ve dizinler oluşturun", "allowPublish": "Yeni linkler ve sayfaları yayınlayın", "allowSignup": "Kullanıcıların kaydolmasına izin ver", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(değişiklikleri önlemek için boş bırakın)", "branding": "Marka", "brandingDirectoryPath": "Marka dizin yolu", @@ -212,6 +232,7 @@ "permissions": "İzinler", "permissionsHelp": "Kullanıcıyı yönetici olarak ayarlayabilir veya izinleri ayrı ayrı seçebilirsiniz. \"Yönetici\"yi seçerseniz, diğer tüm seçenekler otomatik olarak kontrol edilecektir. Kullanıcıların yönetimi, bir yöneticinin yetkisi olarak kalır.\n", "profileSettings": "Profil ayarları", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "her klasördeki herhangi bir noktalı dosyaya (.git, .gitignore gibi) erişimi engeller.\n", "ruleExample2": "Root erişimidenki CaddyFile dosyalarına erişimi engelle.", "rules": "Kurallar", @@ -238,7 +259,8 @@ "userManagement": "Kullanıcı yönetimi", "userUpdated": "Kullanıcı güncellendi!", "username": "Kullanıcı adı", - "users": "Kullanıcılar" + "users": "Kullanıcılar", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Yardım", diff --git a/frontend/src/i18n/uk.json b/frontend/src/i18n/uk.json index aa4080df..782b86e9 100644 --- a/frontend/src/i18n/uk.json +++ b/frontend/src/i18n/uk.json @@ -42,7 +42,12 @@ "update": "Оновити", "upload": "Вивантажити", "openFile": "Відкрити файл", - "discardChanges": "Скасувати" + "discardChanges": "Скасувати", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Завантажити файл", @@ -74,7 +79,16 @@ "sortByLastModified": "Сортувати за останнім зміненням", "sortByName": "Сортувати за іменем", "sortBySize": "Сортувати за розміром", - "noPreview": "Попередній перегляд для цього файлу недоступний." + "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": "вибрати файл чи каталог", @@ -100,7 +114,11 @@ "submit": "Увійти", "username": "Ім'я користувача", "usernameTaken": "Ім'я користувача вже використовується", - "wrongCredentials": "Неправильне ім'я користувача або пароль" + "wrongCredentials": "Неправильне ім'я користувача або пароль", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Постійний", "prompts": { @@ -154,6 +172,7 @@ "video": "Відео" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Адмін", "administrator": "Адміністратор", "allowCommands": "Запуск команд", @@ -161,6 +180,7 @@ "allowNew": "Створення нових файлів або каталогів", "allowPublish": "Публікація нових записів та сторінок", "allowSignup": "Дозволити користувачам реєструватися", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(залишіть поле порожнім, щоб уникнути змін)", "branding": "Брендинг", "brandingDirectoryPath": "Шлях до каталогу брендів", @@ -173,15 +193,15 @@ "minimumPasswordLength": "Мінімальна довжина паролю", "tusUploads": "Фрагментовані завантаження", "tusUploadsHelp": "File Browser підтримує завантаження частинами, дозволяючи створення ефективних, надійних, відновлюваних та фрагментованих завантажень навіть при ненадійному з'єднанні.", - "tusUploadsChunkSize": "Вказує на максимальний розмір запиту (для менших завантажень використовуватиметься пряме завантаження). Ви можете ввести цілочисельне значення у байтах або ж рядок на кшталт 10MB, 1GB тощо.", - "tusUploadsRetryCount": "Кількість повторних спроб які потрібно виконати, якщо фрагмент не вдалося завантажити.", + "tusUploadsChunkSize": "Максимальний розмір запиту (для менших завантажень використовуватиметься пряме завантаження). Ви можете ввести цілочисельне значення у байтах або ж рядок на кшталт 10MB, 1GB тощо", + "tusUploadsRetryCount": "Кількість повторних спроб які потрібно виконати, якщо фрагмент не вдалося завантажити", "userHomeBasePath": "Основний шлях для домашніх каталогів користувачів", "userScopeGenerationPlaceholder": "Кореневий каталог буде згенеровано автоматично", "createUserHomeDirectory": "Створити домашній каталог користувача", "customStylesheet": "Свій стиль", "defaultUserDescription": "Це налаштування за замовчуванням для нових користувачів.", "disableExternalLinks": "Вимкнути зовнішні посилання (крім документації)", - "disableUsedDiskPercentage": "Disable used disk percentage graph", + "disableUsedDiskPercentage": "Вимкнути графік використання диску", "documentation": "документація", "examples": "Приклади", "executeOnShell": "Виконати в командному рядку", @@ -212,6 +232,7 @@ "permissions": "Дозволи", "permissionsHelp": "Можна налаштувати користувача як адміністратора чи вибрати індивідуальні дозволи. При виборі \"Адміністратор\" всі інші параметри будуть автоматично вибрані. Керування користувачами - привілей адміністратора.\n", "profileSettings": "Налаштування профілю", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "запобігти доступу до будь-якого прихованого файлу (наприклад: .git, .gitignore) у кожній папці.\n", "ruleExample2": "блокує доступ до файлу з ім'ям Caddyfile у кореневій області.", "rules": "Права", @@ -231,14 +252,15 @@ }, "user": "Користувач", "userCommands": "Команди", - "userCommandsHelp": "Список команд, доступних користувачу, розділений пробілами. Приклад:\n", + "userCommandsHelp": "Список команд, доступних користувачу, розділений пробілами. Наприклад:\n", "userCreated": "Користувача створено!", "userDefaults": "Налаштування користувача за замовчуванням", "userDeleted": "Користувача видалено!", "userManagement": "Керування користувачами", "userUpdated": "Користувача змінено!", "username": "Ім'я користувача", - "users": "Користувачі" + "users": "Користувачі", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Допомога", diff --git a/frontend/src/i18n/vi.json b/frontend/src/i18n/vi.json index cc301e1f..65e7fe01 100644 --- a/frontend/src/i18n/vi.json +++ b/frontend/src/i18n/vi.json @@ -42,7 +42,12 @@ "update": "Cập nhật", "upload": "Tải lên", "openFile": "Mở tệp", - "discardChanges": "Hủy bỏ thay đổi" + "discardChanges": "Hủy bỏ thay đổi", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "Tải xuống tệp tin", @@ -74,7 +79,16 @@ "sortByLastModified": "Sắp xếp theo ngày sửa đổi", "sortByName": "Sắp xếp theo tên", "sortBySize": "Sắp xếp theo kích thước", - "noPreview": "Không có bản xem trước cho tập tin này." + "noPreview": "Không có bản xem trước cho tập tin này.", + "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": "chọn tập tin hoặc thư mục", @@ -100,7 +114,11 @@ "submit": "Đăng nhập", "username": "Tên người dùng", "usernameTaken": "Tên người dùng đã tồn tại", - "wrongCredentials": "Thông tin đăng nhập không đúng" + "wrongCredentials": "Thông tin đăng nhập không đúng", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "Vĩnh viễn", "prompts": { @@ -154,6 +172,7 @@ "video": "Video" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "Quản trị viên", "administrator": "Người quản trị", "allowCommands": "Thực thi lệnh", @@ -161,6 +180,7 @@ "allowNew": "Tạo tệp và thư mục mới", "allowPublish": "Xuất bản bài viết và trang mới", "allowSignup": "Cho phép người dùng đăng ký", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(để trống để tránh thay đổi)", "branding": "Thương hiệu", "brandingDirectoryPath": "Đường dẫn thư mục thương hiệu", @@ -170,7 +190,7 @@ "commandRunnerHelp": "Tại đây, bạn có thể thiết lập các lệnh được thực thi trong các sự kiện đã định. Bạn phải viết một lệnh trên mỗi dòng. Các biến môi trường {0} và {1} sẽ có sẵn, trong đó {0} tương đối với {1}. Để biết thêm thông tin về tính năng này và các biến môi trường có sẵn, vui lòng đọc {2}.", "commandsUpdated": "Lệnh đã được cập nhật!", "createUserDir": "Tự động tạo thư mục chính của người dùng khi thêm người dùng mới", - "minimumPasswordLength": "Minimum password length", + "minimumPasswordLength": "Độ dài mật khẩu tối thiểu", "tusUploads": "Tải lên theo phân đoạn", "tusUploadsHelp": "File Browser hỗ trợ tải lên tệp theo phân đoạn, giúp việc tải lên trở nên hiệu quả, đáng tin cậy, có thể tiếp tục và phù hợp với mạng không ổn định.", "tusUploadsChunkSize": "Kích thước tối đa của một yêu cầu (tải lên trực tiếp sẽ được sử dụng cho các tệp nhỏ hơn). Bạn có thể nhập một số nguyên biểu thị kích thước theo byte hoặc một chuỗi như 10MB, 1GB, v.v.", @@ -212,6 +232,7 @@ "permissions": "Quyền", "permissionsHelp": "Bạn có thể đặt người dùng làm quản trị viên hoặc chọn quyền riêng lẻ. Nếu chọn \"Người quản trị\", tất cả các tùy chọn khác sẽ tự động được chọn. Việc quản lý người dùng vẫn là đặc quyền của quản trị viên.\n", "profileSettings": "Cài đặt hồ sơ", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "ngăn truy cập vào bất kỳ tệp ẩn nào (chẳng hạn như .git, .gitignore) trong mọi thư mục.\n", "ruleExample2": "chặn truy cập vào tệp có tên Caddyfile trong thư mục gốc của phạm vi.", "rules": "Quy tắc", @@ -238,7 +259,8 @@ "userManagement": "Quản lý người dùng", "userUpdated": "Người dùng đã được cập nhật!", "username": "Tên người dùng", - "users": "Người dùng" + "users": "Người dùng", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "Trợ giúp", diff --git a/frontend/src/i18n/zh-cn.json b/frontend/src/i18n/zh-cn.json index fac470e8..93486c21 100644 --- a/frontend/src/i18n/zh-cn.json +++ b/frontend/src/i18n/zh-cn.json @@ -42,7 +42,12 @@ "update": "更新", "upload": "上传", "openFile": "打开文件", - "discardChanges": "放弃更改" + "discardChanges": "放弃更改", + "stopSearch": "停止搜索", + "saveChanges": "保存更改", + "editAsText": "以文本形式编辑", + "increaseFontSize": "增大字体大小", + "decreaseFontSize": "减小字体大小" }, "download": { "downloadFile": "下载文件", @@ -74,7 +79,16 @@ "sortByLastModified": "按最后修改时间排序", "sortByName": "按名称排序", "sortBySize": "按大小排序", - "noPreview": "此文件无法预览。" + "noPreview": "此文件无法预览。", + "csvTooLarge": "CSV文件大到无法预览(>5MB)。请下载查看。", + "csvLoadFailed": "加载 CSV 文件失败。", + "showingRows": "正在显示 {count} 行", + "columnSeparator": "列分隔符", + "csvSeparators": { + "comma": "逗号 (,)", + "semicolon": "分号 (;)", + "both": "逗号 (,) 和分号 (;)" + } }, "help": { "click": "选择文件或文件夹", @@ -100,7 +114,11 @@ "submit": "登录", "username": "用户名", "usernameTaken": "用户名已经被使用", - "wrongCredentials": "用户名或密码错误" + "wrongCredentials": "用户名或密码错误", + "passwordTooShort": "密码必须至少包含 {min} 个字符", + "logout_reasons": { + "inactivity": "由于未活动,您已登出。" + } }, "permanent": "永久", "prompts": { @@ -154,6 +172,7 @@ "video": "视频" }, "settings": { + "aceEditorTheme": "Ace编辑器主题", "admin": "管理员", "administrator": "管理员", "allowCommands": "执行命令(Shell 命令)", @@ -161,6 +180,7 @@ "allowNew": "创建新文件和文件夹", "allowPublish": "发布新的帖子与页面", "allowSignup": "允许用户注册", + "hideLoginButton": "从公开页面隐藏登录按钮", "avoidChanges": "(留空以避免更改)", "branding": "品牌", "brandingDirectoryPath": "品牌信息文件夹路径", @@ -212,6 +232,7 @@ "permissions": "权限", "permissionsHelp": "你可以将该用户设置为管理员或单独选择各项权限。如果你选择了“管理员”,则其他的选项会被自动选中,同时该用户可以管理其他用户。\n", "profileSettings": "个人设置", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "阻止用户访问所有文件夹下任何以 . 开头的文件(隐藏文件, 例如: .git, .gitignore)。\n", "ruleExample2": "阻止用户访问其目录范围的根目录下名为 Caddyfile 的文件。", "rules": "规则", @@ -238,7 +259,8 @@ "userManagement": "用户管理", "userUpdated": "用户已更新!", "username": "用户名", - "users": "用户" + "users": "用户", + "currentPassword": "您当前的密码" }, "sidebar": { "help": "帮助", diff --git a/frontend/src/i18n/zh-tw.json b/frontend/src/i18n/zh-tw.json index 966cb14e..c0cafc3d 100644 --- a/frontend/src/i18n/zh-tw.json +++ b/frontend/src/i18n/zh-tw.json @@ -42,7 +42,12 @@ "update": "更新", "upload": "上傳", "openFile": "開啟檔案", - "discardChanges": "放棄變更" + "discardChanges": "放棄變更", + "stopSearch": "Stop searching", + "saveChanges": "Save changes", + "editAsText": "Edit as Text", + "increaseFontSize": "Increase font size", + "decreaseFontSize": "Decrease font size" }, "download": { "downloadFile": "下載檔案", @@ -74,7 +79,16 @@ "sortByLastModified": "按最後修改時間排序", "sortByName": "按名稱排序", "sortBySize": "按大小排序", - "noPreview": "此檔案無法預覽。" + "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": "選擇檔案或目錄", @@ -100,7 +114,11 @@ "submit": "登入", "username": "帳號", "usernameTaken": "用戶名已存在", - "wrongCredentials": "帳號或密碼錯誤" + "wrongCredentials": "帳號或密碼錯誤", + "passwordTooShort": "Password must be at least {min} characters", + "logout_reasons": { + "inactivity": "You have been logged out due to inactivity." + } }, "permanent": "永久", "prompts": { @@ -154,6 +172,7 @@ "video": "影片" }, "settings": { + "aceEditorTheme": "Ace editor theme", "admin": "管理員", "administrator": "管理員", "allowCommands": "執行命令", @@ -161,6 +180,7 @@ "allowNew": "建立新檔案和目錄", "allowPublish": "發佈新的貼文與頁面", "allowSignup": "允許使用者註冊", + "hideLoginButton": "Hide the login button from public pages", "avoidChanges": "(留空以避免更改)", "branding": "品牌", "brandingDirectoryPath": "品牌資訊資料夾路徑", @@ -212,6 +232,7 @@ "permissions": "權限", "permissionsHelp": "您可以將該使用者設置為管理員,也可以單獨選擇各項權限。如果選擇了“管理員”,則其他的選項會被自動勾上,同時該使用者可以管理其他使用者。", "profileSettings": "個人設定", + "redirectAfterCopyMove": "Redirect to destination after copy/move", "ruleExample1": "封鎖使用者存取所有資料夾下任何以 . 開頭的檔案(隱藏文件, 例如: .git, .gitignore)。", "ruleExample2": "封鎖使用者存取其目錄範圍的根目錄下名為 Caddyfile 的檔案。", "rules": "規則", @@ -238,7 +259,8 @@ "userManagement": "使用者管理", "userUpdated": "使用者已更新!", "username": "使用者名稱", - "users": "使用者" + "users": "使用者", + "currentPassword": "Your Current Password" }, "sidebar": { "help": "幫助", diff --git a/frontend/src/stores/auth.ts b/frontend/src/stores/auth.ts index 459141ad..c33db87a 100644 --- a/frontend/src/stores/auth.ts +++ b/frontend/src/stores/auth.ts @@ -7,9 +7,11 @@ 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 @@ -37,5 +39,8 @@ export const useAuthStore = defineStore("auth", { clearUser() { this.$reset(); }, + setLogoutTimer(logoutTimer: number | null) { + this.logoutTimer = logoutTimer; + }, }, }); diff --git a/frontend/src/stores/layout.ts b/frontend/src/stores/layout.ts index faf8bca7..372fca06 100644 --- a/frontend/src/stores/layout.ts +++ b/frontend/src/stores/layout.ts @@ -41,6 +41,7 @@ export const useLayoutStore = defineStore("layout", { prompt: value, confirm: null, action: undefined, + saveAction: undefined, props: null, close: null, }); @@ -51,6 +52,7 @@ 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/stores/upload.ts b/frontend/src/stores/upload.ts index 8429146e..53d96ea9 100644 --- a/frontend/src/stores/upload.ts +++ b/frontend/src/stores/upload.ts @@ -1,8 +1,9 @@ import { defineStore } from "pinia"; import { useFileStore } from "./file"; import { files as api } from "@/api"; -import { throttle } from "lodash-es"; import buttons from "@/utils/buttons"; +import { computed, inject, markRaw, ref } from "vue"; +import * as tus from "@/api/tus"; // TODO: make this into a user setting const UPLOADS_LIMIT = 5; @@ -13,208 +14,167 @@ const beforeUnload = (event: Event) => { // event.returnValue = ""; }; -// Utility function to format bytes into a readable string -function formatSize(bytes: number): string { - if (bytes === 0) return "0.00 Bytes"; +export const useUploadStore = defineStore("upload", () => { + const $showError = inject("$showError")!; - const k = 1024; - const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]; - const i = Math.floor(Math.log(bytes) / Math.log(k)); + let progressInterval: number | null = null; - // Return the rounded size with two decimal places - return (bytes / k ** i).toFixed(2) + " " + sizes[i]; -} + // + // STATE + // -export const useUploadStore = defineStore("upload", { - // convert to a function - state: (): { - id: number; - sizes: number[]; - progress: number[]; - queue: UploadItem[]; - uploads: Uploads; - speedMbyte: number; - eta: number; - error: Error | null; - } => ({ - id: 0, - sizes: [], - progress: [], - queue: [], - uploads: {}, - speedMbyte: 0, - eta: 0, - error: null, - }), - getters: { - // user and jwt getter removed, no longer needed - getProgress: (state) => { - if (state.progress.length === 0) { - return 0; + const allUploads = ref([]); + const activeUploads = ref>(new Set()); + const lastUpload = ref(-1); + const totalBytes = ref(0); + const sentBytes = ref(0); + + // + // ACTIONS + // + + const upload = ( + path: string, + name: string, + file: File | null, + overwrite: boolean, + type: ResourceType + ) => { + if (!hasActiveUploads() && !hasPendingUploads()) { + window.addEventListener("beforeunload", beforeUnload); + buttons.loading("upload"); + } + + const upload: Upload = { + path, + name, + file, + overwrite, + type, + totalBytes: file?.size || 1, + sentBytes: 0, + // Stores rapidly changing sent bytes value without causing component re-renders + rawProgress: markRaw({ + sentBytes: 0, + }), + }; + + totalBytes.value += upload.totalBytes; + allUploads.value.push(upload); + + processUploads(); + }; + + const abort = () => { + // Resets the state by preventing the processing of the remaning uploads + lastUpload.value = Infinity; + tus.abortAllUploads(); + }; + + // + // GETTERS + // + + const pendingUploadCount = computed( + () => + allUploads.value.length - + (lastUpload.value + 1) + + activeUploads.value.size + ); + + // + // PRIVATE FUNCTIONS + // + + const hasActiveUploads = () => activeUploads.value.size > 0; + + const hasPendingUploads = () => + allUploads.value.length > lastUpload.value + 1; + + const isActiveUploadsOnLimit = () => activeUploads.value.size < UPLOADS_LIMIT; + + const processUploads = async () => { + if (!hasActiveUploads() && !hasPendingUploads()) { + const fileStore = useFileStore(); + window.removeEventListener("beforeunload", beforeUnload); + buttons.success("upload"); + reset(); + fileStore.reload = true; + } + + if (isActiveUploadsOnLimit() && hasPendingUploads()) { + if (!hasActiveUploads()) { + // Update the state in a fixed time interval + progressInterval = window.setInterval(syncState, 1000); } - const totalSize = state.sizes.reduce((a, b) => a + b, 0); - const sum = state.progress.reduce((a, b) => a + b, 0); - return Math.ceil((sum / totalSize) * 100); - }, - getProgressDecimal: (state) => { - if (state.progress.length === 0) { - return 0; + const upload = nextUpload(); + + if (upload.type === "dir") { + await api.post(upload.path).catch($showError); + } else { + const onUpload = (event: ProgressEvent) => { + upload.rawProgress.sentBytes = event.loaded; + }; + + await api + .post(upload.path, upload.file!, upload.overwrite, onUpload) + .catch((err) => err.message !== "Upload aborted" && $showError(err)); } - const totalSize = state.sizes.reduce((a, b) => a + b, 0); - const sum = state.progress.reduce((a, b) => a + b, 0); - return ((sum / totalSize) * 100).toFixed(2); - }, - getTotalProgressBytes: (state) => { - if (state.progress.length === 0 || state.sizes.length === 0) { - return "0 Bytes"; - } - const sum = state.progress.reduce((a, b) => a + b, 0); - return formatSize(sum); - }, - getTotalSize: (state) => { - if (state.sizes.length === 0) { - return "0 Bytes"; - } - const totalSize = state.sizes.reduce((a, b) => a + b, 0); - return formatSize(totalSize); - }, - filesInUploadCount: (state) => { - return Object.keys(state.uploads).length + state.queue.length; - }, - filesInUpload: (state) => { - const files = []; + finishUpload(upload); + } + }; - for (const index in state.uploads) { - const upload = state.uploads[index]; - const id = upload.id; - const type = upload.type; - const name = upload.file.name; - const size = state.sizes[id]; - const isDir = upload.file.isDir; - const progress = isDir - ? 100 - : Math.ceil((state.progress[id] / size) * 100); + const nextUpload = (): Upload => { + lastUpload.value++; - files.push({ - id, - name, - progress, - type, - isDir, - }); - } + const upload = allUploads.value[lastUpload.value]; + activeUploads.value.add(upload); - return files.sort((a, b) => a.progress - b.progress); - }, - uploadSpeed: (state) => { - return state.speedMbyte; - }, - getETA: (state) => state.eta, - }, - actions: { - // no context as first argument, use `this` instead - setProgress({ id, loaded }: { id: number; loaded: number }) { - this.progress[id] = loaded; - }, - setError(error: Error) { - this.error = error; - }, - reset() { - this.id = 0; - this.sizes = []; - this.progress = []; - this.queue = []; - this.uploads = {}; - this.speedMbyte = 0; - this.eta = 0; - this.error = null; - }, - addJob(item: UploadItem) { - this.queue.push(item); - this.sizes[this.id] = item.file.size; - this.id++; - }, - moveJob() { - const item = this.queue[0]; - this.queue.shift(); - this.uploads[item.id] = item; - }, - removeJob(id: number) { - delete this.uploads[id]; - }, - upload(item: UploadItem) { - const uploadsCount = Object.keys(this.uploads).length; + return upload; + }; - const isQueueEmpty = this.queue.length == 0; - const isUploadsEmpty = uploadsCount == 0; + const finishUpload = (upload: Upload) => { + sentBytes.value += upload.totalBytes - upload.sentBytes; + upload.sentBytes = upload.totalBytes; + upload.file = null; - if (isQueueEmpty && isUploadsEmpty) { - window.addEventListener("beforeunload", beforeUnload); - buttons.loading("upload"); - } + activeUploads.value.delete(upload); + processUploads(); + }; - this.addJob(item); - this.processUploads(); - }, - finishUpload(item: UploadItem) { - this.setProgress({ id: item.id, loaded: item.file.size }); - this.removeJob(item.id); - this.processUploads(); - }, - async processUploads() { - const uploadsCount = Object.keys(this.uploads).length; + const syncState = () => { + for (const upload of activeUploads.value) { + sentBytes.value += upload.rawProgress.sentBytes - upload.sentBytes; + upload.sentBytes = upload.rawProgress.sentBytes; + } + }; - const isBelowLimit = uploadsCount < UPLOADS_LIMIT; - const isQueueEmpty = this.queue.length == 0; - const isUploadsEmpty = uploadsCount == 0; + const reset = () => { + if (progressInterval !== null) { + clearInterval(progressInterval); + progressInterval = null; + } - const isFinished = isQueueEmpty && isUploadsEmpty; - const canProcess = isBelowLimit && !isQueueEmpty; + allUploads.value = []; + activeUploads.value = new Set(); + lastUpload.value = -1; + totalBytes.value = 0; + sentBytes.value = 0; + }; - if (isFinished) { - const fileStore = useFileStore(); - window.removeEventListener("beforeunload", beforeUnload); - buttons.success("upload"); - this.reset(); - fileStore.reload = true; - } + return { + // STATE + activeUploads, + totalBytes, + sentBytes, - if (canProcess) { - const item = this.queue[0]; - this.moveJob(); + // ACTIONS + upload, + abort, - if (item.file.isDir) { - await api.post(item.path).catch(this.setError); - } else { - const onUpload = throttle( - (event: ProgressEvent) => - this.setProgress({ - id: item.id, - loaded: event.loaded, - }), - 100, - { leading: true, trailing: false } - ); - - await api - .post(item.path, item.file.file as File, item.overwrite, onUpload) - .catch(this.setError); - } - - this.finishUpload(item); - } - }, - setUploadSpeed(value: number) { - this.speedMbyte = value; - }, - setETA(value: number) { - this.eta = value; - }, - // easily reset state using `$reset` - clearUpload() { - this.$reset(); - }, - }, + // GETTERS + pendingUploadCount, + }; }); diff --git a/frontend/src/types/file.d.ts b/frontend/src/types/file.d.ts index db2aa5fe..5664c16b 100644 --- a/frontend/src/types/file.d.ts +++ b/frontend/src/types/file.d.ts @@ -29,6 +29,7 @@ interface ResourceItem extends ResourceBase { } type ResourceType = + | "dir" | "video" | "audio" | "image" diff --git a/frontend/src/types/layout.d.ts b/frontend/src/types/layout.d.ts index b625cc07..a5c3f160 100644 --- a/frontend/src/types/layout.d.ts +++ b/frontend/src/types/layout.d.ts @@ -2,6 +2,7 @@ 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 90ca6ae7..18672bdf 100644 --- a/frontend/src/types/settings.d.ts +++ b/frontend/src/types/settings.d.ts @@ -1,9 +1,11 @@ interface ISettings { signup: boolean; createUserDir: boolean; + hideLoginButton: boolean; minimumPasswordLength: number; userHomeBasePath: string; defaults: SettingsDefaults; + authMethod: string; rules: any[]; branding: SettingsBranding; tus: SettingsTus; @@ -16,11 +18,13 @@ 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/upload.d.ts b/frontend/src/types/upload.d.ts index 131f4b2c..4bad9e06 100644 --- a/frontend/src/types/upload.d.ts +++ b/frontend/src/types/upload.d.ts @@ -1,22 +1,15 @@ -interface Uploads { - [key: number]: Upload; -} - -interface Upload { - id: number; - file: UploadEntry; - type?: ResourceType; -} - -interface UploadItem { - id: number; - url?: string; +type Upload = { path: string; - file: UploadEntry; - dir?: boolean; - overwrite?: boolean; - type?: ResourceType; -} + name: string; + file: File | null; + type: ResourceType; + overwrite: boolean; + totalBytes: number; + sentBytes: number; + rawProgress: { + sentBytes: number; + }; +}; interface UploadEntry { name: string; @@ -27,17 +20,3 @@ interface UploadEntry { } type UploadList = UploadEntry[]; - -type CurrentUploadList = { - [key: string]: { - upload: import("tus-js-client").Upload; - recentSpeeds: number[]; - initialBytesUploaded: number; - currentBytesUploaded: number; - currentAverageSpeed: number; - lastProgressTimestamp: number | null; - sumOfRecentSpeeds: number; - hasStarted: boolean; - interval: number | undefined; - }; -}; diff --git a/frontend/src/types/user.d.ts b/frontend/src/types/user.d.ts index b81806fc..317f1e43 100644 --- a/frontend/src/types/user.d.ts +++ b/frontend/src/types/user.d.ts @@ -10,9 +10,11 @@ interface IUser { lockPassword: boolean; hideDotfiles: boolean; singleClick: boolean; + redirectAfterCopyMove: boolean; dateFormat: boolean; viewMode: ViewModeType; sorting?: Sorting; + aceEditorTheme: string; } type ViewModeType = "list" | "mosaic" | "mosaic gallery"; @@ -29,6 +31,7 @@ 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 b868d90f..e75714f2 100644 --- a/frontend/src/utils/auth.ts +++ b/frontend/src/utils/auth.ts @@ -2,8 +2,9 @@ import { useAuthStore } from "@/stores/auth"; import router from "@/router"; import type { JwtPayload } from "jwt-decode"; import { jwtDecode } from "jwt-decode"; -import { baseURL, noAuth } from "./constants"; +import { authMethod, baseURL, noAuth, logoutPage } from "./constants"; import { StatusError } from "@/api/utils"; +import { setSafeTimeout } from "@/api/utils"; export function parseToken(token: string) { // falsy or malformed jwt will throw InvalidTokenError @@ -16,6 +17,24 @@ 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() { @@ -88,11 +107,15 @@ export async function signup(username: string, password: string) { }); if (res.status !== 200) { - throw new StatusError(`${res.status} ${res.statusText}`, res.status); + const body = await res.text(); + throw new StatusError( + body || `${res.status} ${res.statusText}`, + res.status + ); } } -export function logout() { +export function logout(reason?: string) { document.cookie = "auth=; Max-Age=0; Path=/; SameSite=Strict;"; const authStore = useAuthStore(); @@ -101,7 +124,18 @@ export function logout() { localStorage.setItem("jwt", ""); if (noAuth) { window.location.reload(); + } else if (logoutPage !== "/login") { + document.location.href = `${logoutPage}`; } else { - router.push({ path: "/login" }); + if (typeof reason === "string" && reason.trim() !== "") { + router.push({ + path: "/login", + query: { "logout-reason": reason }, + }); + } else { + router.push({ + path: "/login", + }); + } } } diff --git a/frontend/src/utils/clipboard.ts b/frontend/src/utils/clipboard.ts index 23bb7895..53e03589 100644 --- a/frontend/src/utils/clipboard.ts +++ b/frontend/src/utils/clipboard.ts @@ -51,6 +51,20 @@ export function copy(data: ClipboardArgs, opts?: ClipboardOpts) { }); } +export function read() { + return new Promise((resolve, reject) => { + if ( + // Clipboard API requires secure context + window.isSecureContext && + typeof navigator.clipboard !== "undefined" + ) { + navigator.clipboard.readText().then(resolve).catch(reject); + } else { + reject(); + } + }); +} + function getPermission(name: string) { return new Promise((resolve, reject) => { typeof navigator.permissions !== "undefined" && diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts index 3f131b1a..0580205a 100644 --- a/frontend/src/utils/constants.ts +++ b/frontend/src/utils/constants.ts @@ -10,6 +10,7 @@ const version: string = window.FileBrowser.Version; const logoURL = `${staticURL}/img/logo.svg`; const noAuth: boolean = window.FileBrowser.NoAuth; const authMethod = window.FileBrowser.AuthMethod; +const logoutPage: string = window.FileBrowser.LogoutPage; const loginPage: boolean = window.FileBrowser.LoginPage; const theme: UserTheme = window.FileBrowser.Theme; const enableThumbs: boolean = window.FileBrowser.EnableThumbs; @@ -18,6 +19,7 @@ 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, @@ -31,6 +33,7 @@ export { version, noAuth, authMethod, + logoutPage, loginPage, theme, enableThumbs, @@ -39,4 +42,5 @@ export { tusSettings, origin, tusEndpoint, + hideLoginButton, }; diff --git a/frontend/src/utils/csv.ts b/frontend/src/utils/csv.ts new file mode 100644 index 00000000..c03731e7 --- /dev/null +++ b/frontend/src/utils/csv.ts @@ -0,0 +1,64 @@ +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/theme.ts b/frontend/src/utils/theme.ts index 8058356a..0244b044 100644 --- a/frontend/src/utils/theme.ts +++ b/frontend/src/utils/theme.ts @@ -1,4 +1,6 @@ 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; @@ -32,3 +34,17 @@ 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/utils/upload.ts b/frontend/src/utils/upload.ts index cdd974e8..e951cb43 100644 --- a/frontend/src/utils/upload.ts +++ b/frontend/src/utils/upload.ts @@ -132,7 +132,6 @@ export function handleFiles( layoutStore.closeHovers(); for (const file of files) { - const id = uploadStore.id; let path = base; if (file.fullPath !== undefined) { @@ -145,14 +144,8 @@ export function handleFiles( path += "/"; } - const item: UploadItem = { - id, - path, - file, - overwrite, - ...(!file.isDir && { type: detectType((file.file as File).type) }), - }; + const type = file.isDir ? "dir" : detectType((file.file as File).type); - uploadStore.upload(item); + uploadStore.upload(path, file.name, file.file ?? null, overwrite, type); } } diff --git a/frontend/src/views/Files.vue b/frontend/src/views/Files.vue index 805f4027..8952f209 100644 --- a/frontend/src/views/Files.vue +++ b/frontend/src/views/Files.vue @@ -36,7 +36,6 @@ import { files as api } from "@/api"; import { storeToRefs } from "pinia"; import { useFileStore } from "@/stores/file"; import { useLayoutStore } from "@/stores/layout"; -import { useUploadStore } from "@/stores/upload"; import HeaderBar from "@/components/header/HeaderBar.vue"; import Breadcrumbs from "@/components/Breadcrumbs.vue"; @@ -52,10 +51,8 @@ const Preview = defineAsyncComponent(() => import("@/views/files/Preview.vue")); const layoutStore = useLayoutStore(); const fileStore = useFileStore(); -const uploadStore = useUploadStore(); const { reload } = storeToRefs(fileStore); -const { error: uploadError } = storeToRefs(uploadStore); const route = useRoute(); @@ -72,6 +69,12 @@ 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" @@ -108,9 +111,6 @@ watch(route, () => { watch(reload, (newValue) => { newValue && fetchData(); }); -watch(uploadError, (newValue) => { - newValue && layoutStore.showError(); -}); // Define functions diff --git a/frontend/src/views/Layout.vue b/frontend/src/views/Layout.vue index 597a680e..5a91bee5 100644 --- a/frontend/src/views/Layout.vue +++ b/frontend/src/views/Layout.vue @@ -1,7 +1,11 @@