Compare commits

...

19 Commits

Author SHA1 Message Date
Henrique Dias
c18afcddc4 chore(release): 2.44.2 2025-10-22 10:39:43 +02:00
Henrique Dias
57db25d08a fix(http): remove auth query parameter 2025-10-22 10:38:30 +02:00
dependabot[bot]
b8f64a1c1b build(deps-dev): bump vite from 6.3.6 to 6.4.1 in /frontend
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.3.6 to 6.4.1.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@6.4.1/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 6.4.1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-10-22 08:54:36 +02:00
Henrique Dias
de35dee1c5 chore(release): 2.44.1 2025-10-17 17:41:27 +02:00
MSomnium Studios
dd883985bb fix(auth): prevent integer overflow in logout timer using safeTimeout (#5470) 2025-10-17 17:38:57 +02:00
rocksload
97b8911ba8 refactor: use slices.Contains to simplify code (#5483) 2025-10-17 16:45:47 +02:00
Ryan
a397e7305d fix: editor discard prompt doesn't save nor discard
Co-authored-by: Ryan Miller <ryan.miller@infinitetactics.com>
2025-10-17 16:45:36 +02:00
Ryan
d0039afbb7 fix: wrong url on settings branding link 2025-10-03 10:42:24 +02:00
Henrique Dias
878cdfbc52 chore(release): 2.44.0 2025-09-25 17:20:12 +02:00
transifex-integration[bot]
1165f00bd4 feat: Updates for project File Browser (#5457)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-25 17:19:21 +02:00
Henrique Dias
949ddffef2 fix: some formatting issues with i18n files 2025-09-25 17:13:30 +02:00
Henrique Dias
c4725428e0 fix: computation of file path 2025-09-25 17:09:16 +02:00
MSomnium Studios
d29ad356d1 feat: Improved path display in the new file and directory modal (#5451) 2025-09-25 16:57:30 +02:00
MSomnium Studios
692ca5eaf0 fix(upload): throttle upload speed calculation to 100ms to avoid Infinity MB/s (#5456)
Co-authored-by: Henrique Dias <mail@hacdias.com>
2025-09-25 16:54:28 +02:00
Adam
b9787c78f3 feat: allow setting ace editor theme (#3826)
Co-authored-by: Henrique Dias <mail@hacdias.com>
2025-09-25 16:47:00 +02:00
transifex-integration[bot]
dec7a02737 feat: Translate frontend/src/i18n/en.json in no
100% translated source file: 'frontend/src/i18n/en.json'
on 'no'.
2025-09-25 16:46:45 +02:00
transifex-integration[bot]
0eade717ce feat: Updates for project File Browser (#5450)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-19 21:32:15 +02:00
MSomnium Studios
e6c674b3c6 fix: show login when session token expires 2025-09-19 15:09:26 +02:00
transifex-integration[bot]
4ff247e134 feat: Updates for project File Browser (#5446)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-18 13:10:27 +02:00
57 changed files with 822 additions and 387 deletions

View File

@@ -2,6 +2,52 @@
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 [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [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) ## [2.43.0](https://github.com/filebrowser/filebrowser/compare/v2.42.5...v2.43.0) (2025-09-13)

View File

@@ -8,6 +8,7 @@ import (
"net/http" "net/http"
"os" "os"
"os/exec" "os/exec"
"slices"
"strings" "strings"
fbErrors "github.com/filebrowser/filebrowser/v2/errors" fbErrors "github.com/filebrowser/filebrowser/v2/errors"
@@ -266,13 +267,7 @@ var validHookFields = []string{
// IsValid checks if the provided field is on the valid fields list // IsValid checks if the provided field is on the valid fields list
func (hf *hookFields) IsValid(field string) bool { func (hf *hookFields) IsValid(field string) bool {
for _, val := range validHookFields { return slices.Contains(validHookFields, field)
if field == val {
return true
}
}
return false
} }
// GetString returns the string value or provided default // GetString returns the string value or provided default

View File

@@ -221,6 +221,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
fmt.Fprintf(w, "\tFile Creation Mode:\t%O\n", set.FileMode) 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, "\tDirectory Creation Mode:\t%O\n", set.DirMode)
fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " ")) 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, "\tSorting:\n")
fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By) 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, "\t\tAsc:\t%t\n", set.Defaults.Sorting.Asc)

View File

@@ -424,9 +424,10 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) error {
MinimumPasswordLength: settings.DefaultMinimumPasswordLength, MinimumPasswordLength: settings.DefaultMinimumPasswordLength,
UserHomeBasePath: settings.DefaultUsersHomeBasePath, UserHomeBasePath: settings.DefaultUsersHomeBasePath,
Defaults: settings.UserDefaults{ Defaults: settings.UserDefaults{
Scope: ".", Scope: ".",
Locale: "en", Locale: "en",
SingleClick: false, SingleClick: false,
AceEditorTheme: getStringParam(flags, "defaults.aceEditorTheme"),
Perm: users.Permissions{ Perm: users.Permissions{
Admin: false, Admin: false,
Execute: true, Execute: true,

View File

@@ -79,6 +79,7 @@ func addUserFlags(flags *pflag.FlagSet) {
flags.Bool("singleClick", false, "use single clicks only") flags.Bool("singleClick", false, "use single clicks only")
flags.Bool("dateFormat", false, "use date format (true for absolute time, false for relative)") flags.Bool("dateFormat", false, "use date format (true for absolute time, false for relative)")
flags.Bool("hideDotfiles", false, "hide dotfiles") 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) { func getViewMode(flags *pflag.FlagSet) (users.ViewMode, error) {
@@ -110,6 +111,8 @@ func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all
defaults.ViewMode, err = getViewMode(flags) defaults.ViewMode, err = getViewMode(flags)
case "singleClick": case "singleClick":
defaults.SingleClick, err = getBool(flags, flag.Name) defaults.SingleClick, err = getBool(flags, flag.Name)
case "aceEditorTheme":
defaults.AceEditorTheme, err = getString(flags, flag.Name)
case "perm.admin": case "perm.admin":
defaults.Perm.Admin, err = getBool(flags, flag.Name) defaults.Perm.Admin, err = getBool(flags, flag.Name)
case "perm.execute": case "perm.execute":

View File

@@ -71,7 +71,7 @@
"postcss": "^8.5.6", "postcss": "^8.5.6",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"terser": "^5.43.1", "terser": "^5.43.1",
"vite": "^6.3.6", "vite": "^6.4.1",
"vite-plugin-compression2": "^1.0.0", "vite-plugin-compression2": "^1.0.0",
"vue-tsc": "^2.2.0" "vue-tsc": "^2.2.0"
}, },

445
frontend/pnpm-lock.yaml generated
View File

@@ -101,7 +101,7 @@ importers:
devDependencies: devDependencies:
'@intlify/unplugin-vue-i18n': '@intlify/unplugin-vue-i18n':
specifier: ^6.0.8 specifier: ^6.0.8
version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.50.1)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3)) version: 6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.52.5)(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': '@playwright/test':
specifier: ^1.54.1 specifier: ^1.54.1
version: 1.54.1 version: 1.54.1
@@ -119,10 +119,10 @@ importers:
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.37.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0)(typescript@5.6.3))(eslint@9.31.0)(typescript@5.6.3)
'@vitejs/plugin-legacy': '@vitejs/plugin-legacy':
specifier: ^6.0.0 specifier: ^6.0.0
version: 6.0.0(terser@5.43.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)) version: 6.0.0(terser@5.43.1)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))
'@vitejs/plugin-vue': '@vitejs/plugin-vue':
specifier: ^5.0.4 specifier: ^5.0.4
version: 5.2.1(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3)) version: 5.2.1(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))
'@vue/eslint-config-prettier': '@vue/eslint-config-prettier':
specifier: ^10.2.0 specifier: ^10.2.0
version: 10.2.0(eslint@9.31.0)(prettier@3.6.2) version: 10.2.0(eslint@9.31.0)(prettier@3.6.2)
@@ -163,11 +163,11 @@ importers:
specifier: ^5.43.1 specifier: ^5.43.1
version: 5.43.1 version: 5.43.1
vite: vite:
specifier: ^6.3.6 specifier: ^6.4.1
version: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) version: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
vite-plugin-compression2: vite-plugin-compression2:
specifier: ^1.0.0 specifier: ^1.0.0
version: 1.3.3(rollup@4.50.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)) version: 1.3.3(rollup@4.52.5)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))
vue-tsc: vue-tsc:
specifier: ^2.2.0 specifier: ^2.2.0
version: 2.2.0(typescript@5.6.3) version: 2.2.0(typescript@5.6.3)
@@ -737,158 +737,158 @@ packages:
resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==}
engines: {node: '>=18'} engines: {node: '>=18'}
'@esbuild/aix-ppc64@0.25.9': '@esbuild/aix-ppc64@0.25.11':
resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ppc64] cpu: [ppc64]
os: [aix] os: [aix]
'@esbuild/android-arm64@0.25.9': '@esbuild/android-arm64@0.25.11':
resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
'@esbuild/android-arm@0.25.9': '@esbuild/android-arm@0.25.11':
resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm] cpu: [arm]
os: [android] os: [android]
'@esbuild/android-x64@0.25.9': '@esbuild/android-x64@0.25.11':
resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [android] os: [android]
'@esbuild/darwin-arm64@0.25.9': '@esbuild/darwin-arm64@0.25.11':
resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@esbuild/darwin-x64@0.25.9': '@esbuild/darwin-x64@0.25.11':
resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@esbuild/freebsd-arm64@0.25.9': '@esbuild/freebsd-arm64@0.25.11':
resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
'@esbuild/freebsd-x64@0.25.9': '@esbuild/freebsd-x64@0.25.11':
resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
'@esbuild/linux-arm64@0.25.9': '@esbuild/linux-arm64@0.25.11':
resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@esbuild/linux-arm@0.25.9': '@esbuild/linux-arm@0.25.11':
resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@esbuild/linux-ia32@0.25.9': '@esbuild/linux-ia32@0.25.11':
resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ia32] cpu: [ia32]
os: [linux] os: [linux]
'@esbuild/linux-loong64@0.25.9': '@esbuild/linux-loong64@0.25.11':
resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
'@esbuild/linux-mips64el@0.25.9': '@esbuild/linux-mips64el@0.25.11':
resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [mips64el] cpu: [mips64el]
os: [linux] os: [linux]
'@esbuild/linux-ppc64@0.25.9': '@esbuild/linux-ppc64@0.25.11':
resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
'@esbuild/linux-riscv64@0.25.9': '@esbuild/linux-riscv64@0.25.11':
resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@esbuild/linux-s390x@0.25.9': '@esbuild/linux-s390x@0.25.11':
resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@esbuild/linux-x64@0.25.9': '@esbuild/linux-x64@0.25.11':
resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@esbuild/netbsd-arm64@0.25.9': '@esbuild/netbsd-arm64@0.25.11':
resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [netbsd] os: [netbsd]
'@esbuild/netbsd-x64@0.25.9': '@esbuild/netbsd-x64@0.25.11':
resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [netbsd] os: [netbsd]
'@esbuild/openbsd-arm64@0.25.9': '@esbuild/openbsd-arm64@0.25.11':
resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [openbsd] os: [openbsd]
'@esbuild/openbsd-x64@0.25.9': '@esbuild/openbsd-x64@0.25.11':
resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [openbsd] os: [openbsd]
'@esbuild/openharmony-arm64@0.25.9': '@esbuild/openharmony-arm64@0.25.11':
resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [openharmony] os: [openharmony]
'@esbuild/sunos-x64@0.25.9': '@esbuild/sunos-x64@0.25.11':
resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [sunos] os: [sunos]
'@esbuild/win32-arm64@0.25.9': '@esbuild/win32-arm64@0.25.11':
resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@esbuild/win32-ia32@0.25.9': '@esbuild/win32-ia32@0.25.11':
resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
'@esbuild/win32-x64@0.25.9': '@esbuild/win32-x64@0.25.11':
resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
engines: {node: '>=18'} engines: {node: '>=18'}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -1088,108 +1088,113 @@ packages:
rollup: rollup:
optional: true optional: true
'@rollup/rollup-android-arm-eabi@4.50.1': '@rollup/rollup-android-arm-eabi@4.52.5':
resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==}
cpu: [arm] cpu: [arm]
os: [android] os: [android]
'@rollup/rollup-android-arm64@4.50.1': '@rollup/rollup-android-arm64@4.52.5':
resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==}
cpu: [arm64] cpu: [arm64]
os: [android] os: [android]
'@rollup/rollup-darwin-arm64@4.50.1': '@rollup/rollup-darwin-arm64@4.52.5':
resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==}
cpu: [arm64] cpu: [arm64]
os: [darwin] os: [darwin]
'@rollup/rollup-darwin-x64@4.50.1': '@rollup/rollup-darwin-x64@4.52.5':
resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==}
cpu: [x64] cpu: [x64]
os: [darwin] os: [darwin]
'@rollup/rollup-freebsd-arm64@4.50.1': '@rollup/rollup-freebsd-arm64@4.52.5':
resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==}
cpu: [arm64] cpu: [arm64]
os: [freebsd] os: [freebsd]
'@rollup/rollup-freebsd-x64@4.50.1': '@rollup/rollup-freebsd-x64@4.52.5':
resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==}
cpu: [x64] cpu: [x64]
os: [freebsd] os: [freebsd]
'@rollup/rollup-linux-arm-gnueabihf@4.50.1': '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@rollup/rollup-linux-arm-musleabihf@4.50.1': '@rollup/rollup-linux-arm-musleabihf@4.52.5':
resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==}
cpu: [arm] cpu: [arm]
os: [linux] os: [linux]
'@rollup/rollup-linux-arm64-gnu@4.50.1': '@rollup/rollup-linux-arm64-gnu@4.52.5':
resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@rollup/rollup-linux-arm64-musl@4.50.1': '@rollup/rollup-linux-arm64-musl@4.52.5':
resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==}
cpu: [arm64] cpu: [arm64]
os: [linux] os: [linux]
'@rollup/rollup-linux-loongarch64-gnu@4.50.1': '@rollup/rollup-linux-loong64-gnu@4.52.5':
resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==}
cpu: [loong64] cpu: [loong64]
os: [linux] os: [linux]
'@rollup/rollup-linux-ppc64-gnu@4.50.1': '@rollup/rollup-linux-ppc64-gnu@4.52.5':
resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==}
cpu: [ppc64] cpu: [ppc64]
os: [linux] os: [linux]
'@rollup/rollup-linux-riscv64-gnu@4.50.1': '@rollup/rollup-linux-riscv64-gnu@4.52.5':
resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@rollup/rollup-linux-riscv64-musl@4.50.1': '@rollup/rollup-linux-riscv64-musl@4.52.5':
resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==}
cpu: [riscv64] cpu: [riscv64]
os: [linux] os: [linux]
'@rollup/rollup-linux-s390x-gnu@4.50.1': '@rollup/rollup-linux-s390x-gnu@4.52.5':
resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==}
cpu: [s390x] cpu: [s390x]
os: [linux] os: [linux]
'@rollup/rollup-linux-x64-gnu@4.50.1': '@rollup/rollup-linux-x64-gnu@4.52.5':
resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@rollup/rollup-linux-x64-musl@4.50.1': '@rollup/rollup-linux-x64-musl@4.52.5':
resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==}
cpu: [x64] cpu: [x64]
os: [linux] os: [linux]
'@rollup/rollup-openharmony-arm64@4.50.1': '@rollup/rollup-openharmony-arm64@4.52.5':
resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==}
cpu: [arm64] cpu: [arm64]
os: [openharmony] os: [openharmony]
'@rollup/rollup-win32-arm64-msvc@4.50.1': '@rollup/rollup-win32-arm64-msvc@4.52.5':
resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==}
cpu: [arm64] cpu: [arm64]
os: [win32] os: [win32]
'@rollup/rollup-win32-ia32-msvc@4.50.1': '@rollup/rollup-win32-ia32-msvc@4.52.5':
resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==}
cpu: [ia32] cpu: [ia32]
os: [win32] os: [win32]
'@rollup/rollup-win32-x64-msvc@4.50.1': '@rollup/rollup-win32-x64-gnu@4.52.5':
resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==}
cpu: [x64]
os: [win32]
'@rollup/rollup-win32-x64-msvc@4.52.5':
resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==}
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
@@ -1723,8 +1728,8 @@ packages:
resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==}
engines: {node: '>=0.12'} engines: {node: '>=0.12'}
esbuild@0.25.9: esbuild@0.25.11:
resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
engines: {node: '>=18'} engines: {node: '>=18'}
hasBin: true hasBin: true
@@ -2426,8 +2431,8 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'} engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
rollup@4.50.1: rollup@4.52.5:
resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'} engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true hasBin: true
@@ -2684,8 +2689,8 @@ packages:
peerDependencies: peerDependencies:
vite: ^2.0.0||^3.0.0||^4.0.0||^5.0.0 ||^6.0.0 vite: ^2.0.0||^3.0.0||^4.0.0||^5.0.0 ||^6.0.0
vite@6.3.6: vite@6.4.1:
resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} resolution: {integrity: sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@@ -3609,82 +3614,82 @@ snapshots:
'@csstools/css-tokenizer@3.0.3': {} '@csstools/css-tokenizer@3.0.3': {}
'@esbuild/aix-ppc64@0.25.9': '@esbuild/aix-ppc64@0.25.11':
optional: true optional: true
'@esbuild/android-arm64@0.25.9': '@esbuild/android-arm64@0.25.11':
optional: true optional: true
'@esbuild/android-arm@0.25.9': '@esbuild/android-arm@0.25.11':
optional: true optional: true
'@esbuild/android-x64@0.25.9': '@esbuild/android-x64@0.25.11':
optional: true optional: true
'@esbuild/darwin-arm64@0.25.9': '@esbuild/darwin-arm64@0.25.11':
optional: true optional: true
'@esbuild/darwin-x64@0.25.9': '@esbuild/darwin-x64@0.25.11':
optional: true optional: true
'@esbuild/freebsd-arm64@0.25.9': '@esbuild/freebsd-arm64@0.25.11':
optional: true optional: true
'@esbuild/freebsd-x64@0.25.9': '@esbuild/freebsd-x64@0.25.11':
optional: true optional: true
'@esbuild/linux-arm64@0.25.9': '@esbuild/linux-arm64@0.25.11':
optional: true optional: true
'@esbuild/linux-arm@0.25.9': '@esbuild/linux-arm@0.25.11':
optional: true optional: true
'@esbuild/linux-ia32@0.25.9': '@esbuild/linux-ia32@0.25.11':
optional: true optional: true
'@esbuild/linux-loong64@0.25.9': '@esbuild/linux-loong64@0.25.11':
optional: true optional: true
'@esbuild/linux-mips64el@0.25.9': '@esbuild/linux-mips64el@0.25.11':
optional: true optional: true
'@esbuild/linux-ppc64@0.25.9': '@esbuild/linux-ppc64@0.25.11':
optional: true optional: true
'@esbuild/linux-riscv64@0.25.9': '@esbuild/linux-riscv64@0.25.11':
optional: true optional: true
'@esbuild/linux-s390x@0.25.9': '@esbuild/linux-s390x@0.25.11':
optional: true optional: true
'@esbuild/linux-x64@0.25.9': '@esbuild/linux-x64@0.25.11':
optional: true optional: true
'@esbuild/netbsd-arm64@0.25.9': '@esbuild/netbsd-arm64@0.25.11':
optional: true optional: true
'@esbuild/netbsd-x64@0.25.9': '@esbuild/netbsd-x64@0.25.11':
optional: true optional: true
'@esbuild/openbsd-arm64@0.25.9': '@esbuild/openbsd-arm64@0.25.11':
optional: true optional: true
'@esbuild/openbsd-x64@0.25.9': '@esbuild/openbsd-x64@0.25.11':
optional: true optional: true
'@esbuild/openharmony-arm64@0.25.9': '@esbuild/openharmony-arm64@0.25.11':
optional: true optional: true
'@esbuild/sunos-x64@0.25.9': '@esbuild/sunos-x64@0.25.11':
optional: true optional: true
'@esbuild/win32-arm64@0.25.9': '@esbuild/win32-arm64@0.25.11':
optional: true optional: true
'@esbuild/win32-ia32@0.25.9': '@esbuild/win32-ia32@0.25.11':
optional: true optional: true
'@esbuild/win32-x64@0.25.9': '@esbuild/win32-x64@0.25.11':
optional: true optional: true
'@eslint-community/eslint-utils@4.4.1(eslint@9.31.0)': '@eslint-community/eslint-utils@4.4.1(eslint@9.31.0)':
@@ -3784,13 +3789,13 @@ snapshots:
'@intlify/shared@11.1.7': {} '@intlify/shared@11.1.7': {}
'@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.50.1)(typescript@5.6.3)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))': '@intlify/unplugin-vue-i18n@6.0.8(@vue/compiler-dom@3.5.17)(eslint@9.31.0)(rollup@4.52.5)(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: dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@9.31.0) '@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/bundle-utils': 10.0.1(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))
'@intlify/shared': 11.1.7 '@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)) '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.7)(@vue/compiler-dom@3.5.17)(vue-i18n@11.1.10(vue@3.5.17(typescript@5.6.3)))(vue@3.5.17(typescript@5.6.3))
'@rollup/pluginutils': 5.1.4(rollup@4.50.1) '@rollup/pluginutils': 5.1.4(rollup@4.52.5)
'@typescript-eslint/scope-manager': 8.21.0 '@typescript-eslint/scope-manager': 8.21.0
'@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3) '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.6.3)
debug: 4.4.0 debug: 4.4.0
@@ -3866,83 +3871,86 @@ snapshots:
dependencies: dependencies:
playwright: 1.54.1 playwright: 1.54.1
'@rollup/pluginutils@5.1.3(rollup@4.50.1)': '@rollup/pluginutils@5.1.3(rollup@4.52.5)':
dependencies: dependencies:
'@types/estree': 1.0.6 '@types/estree': 1.0.6
estree-walker: 2.0.2 estree-walker: 2.0.2
picomatch: 4.0.3 picomatch: 4.0.3
optionalDependencies: optionalDependencies:
rollup: 4.50.1 rollup: 4.52.5
'@rollup/pluginutils@5.1.4(rollup@4.50.1)': '@rollup/pluginutils@5.1.4(rollup@4.52.5)':
dependencies: dependencies:
'@types/estree': 1.0.7 '@types/estree': 1.0.7
estree-walker: 2.0.2 estree-walker: 2.0.2
picomatch: 4.0.3 picomatch: 4.0.3
optionalDependencies: optionalDependencies:
rollup: 4.50.1 rollup: 4.52.5
'@rollup/rollup-android-arm-eabi@4.50.1': '@rollup/rollup-android-arm-eabi@4.52.5':
optional: true optional: true
'@rollup/rollup-android-arm64@4.50.1': '@rollup/rollup-android-arm64@4.52.5':
optional: true optional: true
'@rollup/rollup-darwin-arm64@4.50.1': '@rollup/rollup-darwin-arm64@4.52.5':
optional: true optional: true
'@rollup/rollup-darwin-x64@4.50.1': '@rollup/rollup-darwin-x64@4.52.5':
optional: true optional: true
'@rollup/rollup-freebsd-arm64@4.50.1': '@rollup/rollup-freebsd-arm64@4.52.5':
optional: true optional: true
'@rollup/rollup-freebsd-x64@4.50.1': '@rollup/rollup-freebsd-x64@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-arm-gnueabihf@4.50.1': '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-arm-musleabihf@4.50.1': '@rollup/rollup-linux-arm-musleabihf@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-arm64-gnu@4.50.1': '@rollup/rollup-linux-arm64-gnu@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-arm64-musl@4.50.1': '@rollup/rollup-linux-arm64-musl@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-loongarch64-gnu@4.50.1': '@rollup/rollup-linux-loong64-gnu@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-ppc64-gnu@4.50.1': '@rollup/rollup-linux-ppc64-gnu@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-riscv64-gnu@4.50.1': '@rollup/rollup-linux-riscv64-gnu@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-riscv64-musl@4.50.1': '@rollup/rollup-linux-riscv64-musl@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-s390x-gnu@4.50.1': '@rollup/rollup-linux-s390x-gnu@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-x64-gnu@4.50.1': '@rollup/rollup-linux-x64-gnu@4.52.5':
optional: true optional: true
'@rollup/rollup-linux-x64-musl@4.50.1': '@rollup/rollup-linux-x64-musl@4.52.5':
optional: true optional: true
'@rollup/rollup-openharmony-arm64@4.50.1': '@rollup/rollup-openharmony-arm64@4.52.5':
optional: true optional: true
'@rollup/rollup-win32-arm64-msvc@4.50.1': '@rollup/rollup-win32-arm64-msvc@4.52.5':
optional: true optional: true
'@rollup/rollup-win32-ia32-msvc@4.50.1': '@rollup/rollup-win32-ia32-msvc@4.52.5':
optional: true optional: true
'@rollup/rollup-win32-x64-msvc@4.50.1': '@rollup/rollup-win32-x64-gnu@4.52.5':
optional: true
'@rollup/rollup-win32-x64-msvc@4.52.5':
optional: true optional: true
'@tsconfig/node22@22.0.2': {} '@tsconfig/node22@22.0.2': {}
@@ -4115,7 +4123,7 @@ snapshots:
global: 4.4.0 global: 4.4.0
is-function: 1.0.2 is-function: 1.0.2
'@vitejs/plugin-legacy@6.0.0(terser@5.43.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))': '@vitejs/plugin-legacy@6.0.0(terser@5.43.1)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))':
dependencies: dependencies:
'@babel/core': 7.26.0 '@babel/core': 7.26.0
'@babel/preset-env': 7.26.0(@babel/core@7.26.0) '@babel/preset-env': 7.26.0(@babel/core@7.26.0)
@@ -4126,13 +4134,13 @@ snapshots:
regenerator-runtime: 0.14.1 regenerator-runtime: 0.14.1
systemjs: 6.15.1 systemjs: 6.15.1
terser: 5.43.1 terser: 5.43.1
vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) vite: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
'@vitejs/plugin-vue@5.2.1(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))': '@vitejs/plugin-vue@5.2.1(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0))(vue@3.5.17(typescript@5.6.3))':
dependencies: dependencies:
vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) vite: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
vue: 3.5.17(typescript@5.6.3) vue: 3.5.17(typescript@5.6.3)
'@volar/language-core@2.4.11': '@volar/language-core@2.4.11':
@@ -4548,34 +4556,34 @@ snapshots:
d: 1.0.2 d: 1.0.2
ext: 1.7.0 ext: 1.7.0
esbuild@0.25.9: esbuild@0.25.11:
optionalDependencies: optionalDependencies:
'@esbuild/aix-ppc64': 0.25.9 '@esbuild/aix-ppc64': 0.25.11
'@esbuild/android-arm': 0.25.9 '@esbuild/android-arm': 0.25.11
'@esbuild/android-arm64': 0.25.9 '@esbuild/android-arm64': 0.25.11
'@esbuild/android-x64': 0.25.9 '@esbuild/android-x64': 0.25.11
'@esbuild/darwin-arm64': 0.25.9 '@esbuild/darwin-arm64': 0.25.11
'@esbuild/darwin-x64': 0.25.9 '@esbuild/darwin-x64': 0.25.11
'@esbuild/freebsd-arm64': 0.25.9 '@esbuild/freebsd-arm64': 0.25.11
'@esbuild/freebsd-x64': 0.25.9 '@esbuild/freebsd-x64': 0.25.11
'@esbuild/linux-arm': 0.25.9 '@esbuild/linux-arm': 0.25.11
'@esbuild/linux-arm64': 0.25.9 '@esbuild/linux-arm64': 0.25.11
'@esbuild/linux-ia32': 0.25.9 '@esbuild/linux-ia32': 0.25.11
'@esbuild/linux-loong64': 0.25.9 '@esbuild/linux-loong64': 0.25.11
'@esbuild/linux-mips64el': 0.25.9 '@esbuild/linux-mips64el': 0.25.11
'@esbuild/linux-ppc64': 0.25.9 '@esbuild/linux-ppc64': 0.25.11
'@esbuild/linux-riscv64': 0.25.9 '@esbuild/linux-riscv64': 0.25.11
'@esbuild/linux-s390x': 0.25.9 '@esbuild/linux-s390x': 0.25.11
'@esbuild/linux-x64': 0.25.9 '@esbuild/linux-x64': 0.25.11
'@esbuild/netbsd-arm64': 0.25.9 '@esbuild/netbsd-arm64': 0.25.11
'@esbuild/netbsd-x64': 0.25.9 '@esbuild/netbsd-x64': 0.25.11
'@esbuild/openbsd-arm64': 0.25.9 '@esbuild/openbsd-arm64': 0.25.11
'@esbuild/openbsd-x64': 0.25.9 '@esbuild/openbsd-x64': 0.25.11
'@esbuild/openharmony-arm64': 0.25.9 '@esbuild/openharmony-arm64': 0.25.11
'@esbuild/sunos-x64': 0.25.9 '@esbuild/sunos-x64': 0.25.11
'@esbuild/win32-arm64': 0.25.9 '@esbuild/win32-arm64': 0.25.11
'@esbuild/win32-ia32': 0.25.9 '@esbuild/win32-ia32': 0.25.11
'@esbuild/win32-x64': 0.25.9 '@esbuild/win32-x64': 0.25.11
escalade@3.2.0: {} escalade@3.2.0: {}
@@ -5266,31 +5274,32 @@ snapshots:
reusify@1.0.4: {} reusify@1.0.4: {}
rollup@4.50.1: rollup@4.52.5:
dependencies: dependencies:
'@types/estree': 1.0.8 '@types/estree': 1.0.8
optionalDependencies: optionalDependencies:
'@rollup/rollup-android-arm-eabi': 4.50.1 '@rollup/rollup-android-arm-eabi': 4.52.5
'@rollup/rollup-android-arm64': 4.50.1 '@rollup/rollup-android-arm64': 4.52.5
'@rollup/rollup-darwin-arm64': 4.50.1 '@rollup/rollup-darwin-arm64': 4.52.5
'@rollup/rollup-darwin-x64': 4.50.1 '@rollup/rollup-darwin-x64': 4.52.5
'@rollup/rollup-freebsd-arm64': 4.50.1 '@rollup/rollup-freebsd-arm64': 4.52.5
'@rollup/rollup-freebsd-x64': 4.50.1 '@rollup/rollup-freebsd-x64': 4.52.5
'@rollup/rollup-linux-arm-gnueabihf': 4.50.1 '@rollup/rollup-linux-arm-gnueabihf': 4.52.5
'@rollup/rollup-linux-arm-musleabihf': 4.50.1 '@rollup/rollup-linux-arm-musleabihf': 4.52.5
'@rollup/rollup-linux-arm64-gnu': 4.50.1 '@rollup/rollup-linux-arm64-gnu': 4.52.5
'@rollup/rollup-linux-arm64-musl': 4.50.1 '@rollup/rollup-linux-arm64-musl': 4.52.5
'@rollup/rollup-linux-loongarch64-gnu': 4.50.1 '@rollup/rollup-linux-loong64-gnu': 4.52.5
'@rollup/rollup-linux-ppc64-gnu': 4.50.1 '@rollup/rollup-linux-ppc64-gnu': 4.52.5
'@rollup/rollup-linux-riscv64-gnu': 4.50.1 '@rollup/rollup-linux-riscv64-gnu': 4.52.5
'@rollup/rollup-linux-riscv64-musl': 4.50.1 '@rollup/rollup-linux-riscv64-musl': 4.52.5
'@rollup/rollup-linux-s390x-gnu': 4.50.1 '@rollup/rollup-linux-s390x-gnu': 4.52.5
'@rollup/rollup-linux-x64-gnu': 4.50.1 '@rollup/rollup-linux-x64-gnu': 4.52.5
'@rollup/rollup-linux-x64-musl': 4.50.1 '@rollup/rollup-linux-x64-musl': 4.52.5
'@rollup/rollup-openharmony-arm64': 4.50.1 '@rollup/rollup-openharmony-arm64': 4.52.5
'@rollup/rollup-win32-arm64-msvc': 4.50.1 '@rollup/rollup-win32-arm64-msvc': 4.52.5
'@rollup/rollup-win32-ia32-msvc': 4.50.1 '@rollup/rollup-win32-ia32-msvc': 4.52.5
'@rollup/rollup-win32-x64-msvc': 4.50.1 '@rollup/rollup-win32-x64-gnu': 4.52.5
'@rollup/rollup-win32-x64-msvc': 4.52.5
fsevents: 2.3.3 fsevents: 2.3.3
rrweb-cssom@0.8.0: {} rrweb-cssom@0.8.0: {}
@@ -5527,21 +5536,21 @@ snapshots:
dependencies: dependencies:
global: 4.4.0 global: 4.4.0
vite-plugin-compression2@1.3.3(rollup@4.50.1)(vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)): vite-plugin-compression2@1.3.3(rollup@4.52.5)(vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)):
dependencies: dependencies:
'@rollup/pluginutils': 5.1.3(rollup@4.50.1) '@rollup/pluginutils': 5.1.3(rollup@4.52.5)
tar-mini: 0.2.0 tar-mini: 0.2.0
vite: 6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0) vite: 6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0)
transitivePeerDependencies: transitivePeerDependencies:
- rollup - rollup
vite@6.3.6(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0): vite@6.4.1(@types/node@22.10.10)(terser@5.43.1)(yaml@2.7.0):
dependencies: dependencies:
esbuild: 0.25.9 esbuild: 0.25.11
fdir: 6.5.0(picomatch@4.0.3) fdir: 6.5.0(picomatch@4.0.3)
picomatch: 4.0.3 picomatch: 4.0.3
postcss: 8.5.6 postcss: 8.5.6
rollup: 4.50.1 rollup: 4.52.5
tinyglobby: 0.2.15 tinyglobby: 0.2.15
optionalDependencies: optionalDependencies:
'@types/node': 22.10.10 '@types/node': 22.10.10

View File

@@ -91,3 +91,21 @@ export function createURL(endpoint: string, searchParams = {}): string {
return url.toString(); 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();
}

View File

@@ -0,0 +1,86 @@
<template>
<div>
<div class="path-container" ref="container">
<template v-for="(item, index) in path" :key="index">
/
<span class="path-item">
<span
v-if="isDir === true || index < path.length - 1"
class="material-icons"
>folder
</span>
<span v-else class="material-icons">insert_drive_file</span>
{{ item }}
</span>
</template>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, computed, watch, nextTick, defineProps } from "vue";
import { useRoute } from "vue-router";
import { useFileStore } from "@/stores/file";
import url from "@/utils/url";
const fileStore = useFileStore();
const route = useRoute();
const props = defineProps({
name: {
type: String,
required: true,
},
isDir: {
type: Boolean,
default: false,
},
});
const container = ref<HTMLElement | null>(null);
const path = computed(() => {
let basePath = fileStore.isFiles ? route.path : url.removeLastDir(route.path);
if (!basePath.endsWith("/")) {
basePath += "/";
}
basePath += props.name;
return basePath.split("/").filter(Boolean).splice(1);
});
watch(path, () => {
nextTick(() => {
const lastItem = container.value?.lastElementChild;
lastItem?.scrollIntoView({ behavior: "auto", inline: "end" });
});
});
</script>
<style scoped>
.path-container {
display: flex;
align-items: center;
margin: 0.2em 0;
gap: 0.25em;
overflow-x: auto;
max-width: 100%;
scrollbar-width: none;
opacity: 0.5;
}
.path-container::-webkit-scrollbar {
display: none;
}
.path-item {
display: flex;
align-items: center;
margin: 0.2em 0;
gap: 0.25em;
white-space: nowrap;
}
.path-item > span {
font-size: 0.9em;
}
</style>

View File

@@ -17,7 +17,7 @@
</button> </button>
<button <button
class="button button--flat button--blue" class="button button--flat button--blue"
@click="saveAndClose" @click="currentPrompt.saveAction"
:aria-label="$t('buttons.saveChanges')" :aria-label="$t('buttons.saveChanges')"
:title="$t('buttons.saveChanges')" :title="$t('buttons.saveChanges')"
tabindex="1" tabindex="1"
@@ -39,8 +39,8 @@
</template> </template>
<script> <script>
import { mapState, mapActions } from "pinia";
import { useLayoutStore } from "@/stores/layout"; import { useLayoutStore } from "@/stores/layout";
import { mapActions, mapState } from "pinia";
export default { export default {
name: "discardEditorChanges", name: "discardEditorChanges",
@@ -49,12 +49,6 @@ export default {
}, },
methods: { methods: {
...mapActions(useLayoutStore, ["closeHovers"]), ...mapActions(useLayoutStore, ["closeHovers"]),
saveAndClose() {
if (this.currentPrompt?.saveAction) {
this.currentPrompt.saveAction();
}
this.closeHovers();
},
}, },
}; };
</script> </script>

View File

@@ -14,6 +14,7 @@
v-model.trim="name" v-model.trim="name"
tabindex="1" tabindex="1"
/> />
<CreateFilePath :name="name" :is-dir="true" />
</div> </div>
<div class="card-action"> <div class="card-action">
@@ -48,6 +49,7 @@ import { files as api } from "@/api";
import url from "@/utils/url"; import url from "@/utils/url";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import CreateFilePath from "@/components/prompts/CreateFilePath.vue";
const $showError = inject<IToastError>("$showError")!; const $showError = inject<IToastError>("$showError")!;

View File

@@ -13,6 +13,7 @@
@keyup.enter="submit" @keyup.enter="submit"
v-model.trim="name" v-model.trim="name"
/> />
<CreateFilePath :name="name" />
</div> </div>
<div class="card-action"> <div class="card-action">
@@ -42,6 +43,7 @@ import { useI18n } from "vue-i18n";
import { useRoute, useRouter } from "vue-router"; import { useRoute, useRouter } from "vue-router";
import { useFileStore } from "@/stores/file"; import { useFileStore } from "@/stores/file";
import { useLayoutStore } from "@/stores/layout"; import { useLayoutStore } from "@/stores/layout";
import CreateFilePath from "@/components/prompts/CreateFilePath.vue";
import { files as api } from "@/api"; import { files as api } from "@/api";
import url from "@/utils/url"; import url from "@/utils/url";

View File

@@ -14,7 +14,7 @@
}} }}
</h2> </h2>
<div class="upload-info"> <div class="upload-info">
<div class="upload-speed">{{ speedMbytes }}/s</div> <div class="upload-speed">{{ speedText }}/s</div>
<div class="upload-eta">{{ formattedETA }} remaining</div> <div class="upload-eta">{{ formattedETA }} remaining</div>
<div class="upload-percentage">{{ sentPercent }}% Completed</div> <div class="upload-percentage">{{ sentPercent }}% Completed</div>
<div class="upload-fraction"> <div class="upload-fraction">
@@ -88,6 +88,7 @@ const uploadStore = useUploadStore();
const { sentBytes, totalBytes } = storeToRefs(uploadStore); const { sentBytes, totalBytes } = storeToRefs(uploadStore);
const byteToMbyte = partial({ exponent: 2 }); const byteToMbyte = partial({ exponent: 2 });
const byteToKbyte = partial({ exponent: 1 });
const sentPercent = computed(() => const sentPercent = computed(() =>
((uploadStore.sentBytes / uploadStore.totalBytes) * 100).toFixed(2) ((uploadStore.sentBytes / uploadStore.totalBytes) * 100).toFixed(2)
@@ -95,11 +96,33 @@ const sentPercent = computed(() =>
const sentMbytes = computed(() => byteToMbyte(uploadStore.sentBytes)); const sentMbytes = computed(() => byteToMbyte(uploadStore.sentBytes));
const totalMbytes = computed(() => byteToMbyte(uploadStore.totalBytes)); const totalMbytes = computed(() => byteToMbyte(uploadStore.totalBytes));
const speedMbytes = computed(() => byteToMbyte(speed.value)); const speedText = computed(() => {
const bytes = speed.value;
if (bytes < 1024 * 1024) {
const kb = parseFloat(byteToKbyte(bytes));
return `${kb.toFixed(2)} KB`;
} else {
const mb = parseFloat(byteToMbyte(bytes));
return `${mb.toFixed(2)} MB`;
}
});
let lastSpeedUpdate: number = 0; let lastSpeedUpdate: number = 0;
let recentSpeeds: number[] = []; let recentSpeeds: number[] = [];
let lastThrottleTime = 0;
const throttledCalculateSpeed = (sentBytes: number, oldSentBytes: number) => {
const now = Date.now();
if (now - lastThrottleTime < 100) {
return;
}
lastThrottleTime = now;
calculateSpeed(sentBytes, oldSentBytes);
};
const calculateSpeed = (sentBytes: number, oldSentBytes: number) => { const calculateSpeed = (sentBytes: number, oldSentBytes: number) => {
// Reset the state when the uploads batch is complete // Reset the state when the uploads batch is complete
if (sentBytes === 0) { if (sentBytes === 0) {
@@ -149,7 +172,7 @@ const calculateEta = () => {
eta.value = remainingSize / speedBytesPerSecond; eta.value = remainingSize / speedBytesPerSecond;
}; };
watch(sentBytes, calculateSpeed); watch(sentBytes, throttledCalculateSpeed);
watch(totalBytes, (totalBytes, oldTotalBytes) => { watch(totalBytes, (totalBytes, oldTotalBytes) => {
if (oldTotalBytes !== 0) { if (oldTotalBytes !== 0) {

View File

@@ -0,0 +1,24 @@
<template>
<select name="selectAceEditorTheme" v-on:change="change" :value="aceEditorTheme">
<option v-for="theme in themes" :value="theme.theme" :key="theme.theme">
{{ theme.name }}
</option>
</select>
</template>
<script setup lang="ts">
import { type SelectHTMLAttributes } from "vue";
import { themes } from "ace-builds/src-noconflict/ext-themelist";
defineProps<{
aceEditorTheme: string;
}>();
const emit = defineEmits<{
(e: "update:aceEditorTheme", val: string | null): void;
}>();
const change = (event: Event) => {
emit("update:aceEditorTheme", (event.target as SelectHTMLAttributes)?.value);
};
</script>

View File

@@ -45,6 +45,15 @@
animation: 0.2s opac forwards; 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 { @keyframes opac {
0% { 0% {
opacity: 0; opacity: 0;

View File

@@ -42,7 +42,8 @@
"update": "تحديث", "update": "تحديث",
"upload": "رفع", "upload": "رفع",
"openFile": "فتح الملف", "openFile": "فتح الملف",
"discardChanges": "إلغاء التغييرات" "discardChanges": "إلغاء التغييرات",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "تحميل الملف", "downloadFile": "تحميل الملف",
@@ -100,7 +101,10 @@
"submit": "تسجيل دخول", "submit": "تسجيل دخول",
"username": "إسم المستخدم", "username": "إسم المستخدم",
"usernameTaken": "إسم المستخدم غير متاح", "usernameTaken": "إسم المستخدم غير متاح",
"wrongCredentials": "بيانات دخول خاطئة" "wrongCredentials": "بيانات دخول خاطئة",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "دائم", "permanent": "دائم",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "فيديوهات" "video": "فيديوهات"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "إدارة", "admin": "إدارة",
"administrator": "مدير", "administrator": "مدير",
"allowCommands": "تنفيذ اﻷوامر", "allowCommands": "تنفيذ اﻷوامر",

View File

@@ -42,7 +42,8 @@
"update": "Actualitzar", "update": "Actualitzar",
"upload": "Pujar", "upload": "Pujar",
"openFile": "Obrir fitxer", "openFile": "Obrir fitxer",
"discardChanges": "Descartar" "discardChanges": "Descartar",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Descarregar fitxer", "downloadFile": "Descarregar fitxer",
@@ -100,7 +101,10 @@
"submit": "Iniciar sessió", "submit": "Iniciar sessió",
"username": "Usuari", "username": "Usuari",
"usernameTaken": "Nom d'usuari no disponible", "usernameTaken": "Nom d'usuari no disponible",
"wrongCredentials": "Usuari i/o contrasenya incorrectes" "wrongCredentials": "Usuari i/o contrasenya incorrectes",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanent", "permanent": "Permanent",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Vídeo" "video": "Vídeo"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrador", "administrator": "Administrador",
"allowCommands": "Executar comandes", "allowCommands": "Executar comandes",

View File

@@ -42,7 +42,8 @@
"update": "Aktualizovat", "update": "Aktualizovat",
"upload": "Nahrát", "upload": "Nahrát",
"openFile": "Otevřít soubor", "openFile": "Otevřít soubor",
"discardChanges": "Zrušit změny" "discardChanges": "Zrušit změny",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Stáhnout soubor", "downloadFile": "Stáhnout soubor",
@@ -100,7 +101,10 @@
"submit": "Přihlásit se", "submit": "Přihlásit se",
"username": "Uživatelské jméno", "username": "Uživatelské jméno",
"usernameTaken": "Uživatelské jméno již existuje", "usernameTaken": "Uživatelské jméno již existuje",
"wrongCredentials": "Nesprávné přihlašovací údaje" "wrongCredentials": "Nesprávné přihlašovací údaje",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Trvalý", "permanent": "Trvalý",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrátor", "administrator": "Administrátor",
"allowCommands": "Povolit příkazy", "allowCommands": "Povolit příkazy",

View File

@@ -42,7 +42,8 @@
"update": "Update", "update": "Update",
"upload": "Upload", "upload": "Upload",
"openFile": "Datei öffnen", "openFile": "Datei öffnen",
"discardChanges": "Verwerfen" "discardChanges": "Verwerfen",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Download Datei", "downloadFile": "Download Datei",
@@ -100,7 +101,10 @@
"submit": "Login", "submit": "Login",
"username": "Benutzername", "username": "Benutzername",
"usernameTaken": "Benutzername ist bereits vergeben", "usernameTaken": "Benutzername ist bereits vergeben",
"wrongCredentials": "Falsche Zugangsdaten" "wrongCredentials": "Falsche Zugangsdaten",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanent", "permanent": "Permanent",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Befehle ausführen", "allowCommands": "Befehle ausführen",

View File

@@ -42,7 +42,8 @@
"update": "Ενημέρωση", "update": "Ενημέρωση",
"upload": "Μεταφόρτωση", "upload": "Μεταφόρτωση",
"openFile": "Άνοιγμα αρχείου", "openFile": "Άνοιγμα αρχείου",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Λήψη αρχείου", "downloadFile": "Λήψη αρχείου",
@@ -100,7 +101,10 @@
"submit": "Είσοδος", "submit": "Είσοδος",
"username": "Όνομα χρήστη", "username": "Όνομα χρήστη",
"usernameTaken": "Το όνομα χρήστη χρησιμοποιείται ήδη", "usernameTaken": "Το όνομα χρήστη χρησιμοποιείται ήδη",
"wrongCredentials": "Λάθος όνομα ή/και κωδικός πρόσβασης" "wrongCredentials": "Λάθος όνομα ή/και κωδικός πρόσβασης",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Μόνιμο", "permanent": "Μόνιμο",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Βίντεο" "video": "Βίντεο"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Διαχειριστής", "admin": "Διαχειριστής",
"administrator": "Διαχειριστής", "administrator": "Διαχειριστής",
"allowCommands": "Εκτέλεση εντολών", "allowCommands": "Εκτέλεση εντολών",

View File

@@ -42,8 +42,8 @@
"update": "Update", "update": "Update",
"upload": "Upload", "upload": "Upload",
"openFile": "Open file", "openFile": "Open file",
"discardChanges": "Discard", "discardChanges": "Discard",
"saveChanges": "Save changes" "saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Download File", "downloadFile": "Download File",
@@ -101,7 +101,10 @@
"submit": "Login", "submit": "Login",
"username": "Username", "username": "Username",
"usernameTaken": "Username already taken", "usernameTaken": "Username already taken",
"wrongCredentials": "Wrong credentials" "wrongCredentials": "Wrong credentials",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanent", "permanent": "Permanent",
"prompts": { "prompts": {
@@ -155,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Execute commands", "allowCommands": "Execute commands",

View File

@@ -42,7 +42,8 @@
"update": "Actualizar", "update": "Actualizar",
"upload": "Subir", "upload": "Subir",
"openFile": "Abrir archivo", "openFile": "Abrir archivo",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Guardar cambios"
}, },
"download": { "download": {
"downloadFile": "Descargar fichero", "downloadFile": "Descargar fichero",
@@ -100,7 +101,10 @@
"submit": "Iniciar sesión", "submit": "Iniciar sesión",
"username": "Usuario", "username": "Usuario",
"usernameTaken": "Nombre usuario no disponible", "usernameTaken": "Nombre usuario no disponible",
"wrongCredentials": "Usuario y/o contraseña incorrectos" "wrongCredentials": "Usuario y/o contraseña incorrectos",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanente", "permanent": "Permanente",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Vídeo" "video": "Vídeo"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrador", "administrator": "Administrador",
"allowCommands": "Ejecutar comandos", "allowCommands": "Ejecutar comandos",

View File

@@ -42,7 +42,8 @@
"update": "به روز سانی", "update": "به روز سانی",
"upload": "آپلود", "upload": "آپلود",
"openFile": "باز کردن فایل", "openFile": "باز کردن فایل",
"discardChanges": "لغو کردن" "discardChanges": "لغو کردن",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "دانلود فایل", "downloadFile": "دانلود فایل",
@@ -100,7 +101,10 @@
"submit": "ورود", "submit": "ورود",
"username": "نام کاربری", "username": "نام کاربری",
"usernameTaken": "نام کاربری تکراری", "usernameTaken": "نام کاربری تکراری",
"wrongCredentials": "خطا در اعتبارسنجی" "wrongCredentials": "خطا در اعتبارسنجی",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "دائمی", "permanent": "دائمی",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "ویدئو " "video": "ویدئو "
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "اجرای دستورات", "allowCommands": "اجرای دستورات",

View File

@@ -42,7 +42,8 @@
"update": "Mettre à jour", "update": "Mettre à jour",
"upload": "Importer", "upload": "Importer",
"openFile": "Ouvrir le fichier", "openFile": "Ouvrir le fichier",
"discardChanges": "Annuler" "discardChanges": "Annuler",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Télécharger le fichier", "downloadFile": "Télécharger le fichier",
@@ -100,7 +101,10 @@
"submit": "Se connecter", "submit": "Se connecter",
"username": "Utilisateur·ice", "username": "Utilisateur·ice",
"usernameTaken": "Le nom d'utilisateur·ice est déjà pris", "usernameTaken": "Le nom d'utilisateur·ice est déjà pris",
"wrongCredentials": "Identifiants incorrects !" "wrongCredentials": "Identifiants incorrects !",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanent", "permanent": "Permanent",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Vidéo" "video": "Vidéo"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrateur·ice", "administrator": "Administrateur·ice",
"allowCommands": "Exécuter des commandes", "allowCommands": "Exécuter des commandes",

View File

@@ -42,7 +42,8 @@
"update": "עדכון", "update": "עדכון",
"upload": "העלאה", "upload": "העלאה",
"openFile": "פתח קובץ", "openFile": "פתח קובץ",
"discardChanges": "זריקת השינויים" "discardChanges": "זריקת השינויים",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "הורד קובץ", "downloadFile": "הורד קובץ",
@@ -100,7 +101,10 @@
"submit": "התחברות", "submit": "התחברות",
"username": "שם משתמש", "username": "שם משתמש",
"usernameTaken": "שם המשתמש כבר קיים", "usernameTaken": "שם המשתמש כבר קיים",
"wrongCredentials": "פרטי התחברות שגויים" "wrongCredentials": "פרטי התחברות שגויים",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "קבוע", "permanent": "קבוע",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "וידאו" "video": "וידאו"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "מנהל", "admin": "מנהל",
"administrator": "מנהל ראשי", "administrator": "מנהל ראשי",
"allowCommands": "הפעלת פקודות", "allowCommands": "הפעלת פקודות",

View File

@@ -42,7 +42,8 @@
"update": "Frissítés", "update": "Frissítés",
"upload": "Feltöltés", "upload": "Feltöltés",
"openFile": "Fájl megnyitása", "openFile": "Fájl megnyitása",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Fájl letöltése", "downloadFile": "Fájl letöltése",
@@ -100,7 +101,10 @@
"submit": "Belépés", "submit": "Belépés",
"username": "Felhasználói név", "username": "Felhasználói név",
"usernameTaken": "A felhasználói név már foglalt", "usernameTaken": "A felhasználói név már foglalt",
"wrongCredentials": "Hibás hitelesítő adatok" "wrongCredentials": "Hibás hitelesítő adatok",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Állandó", "permanent": "Állandó",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Videó" "video": "Videó"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Adminisztrátor", "administrator": "Adminisztrátor",
"allowCommands": "Parancsok futtatása", "allowCommands": "Parancsok futtatása",

View File

@@ -42,7 +42,8 @@
"update": "Vista", "update": "Vista",
"upload": "Hlaða upp", "upload": "Hlaða upp",
"openFile": "Open file", "openFile": "Open file",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Sækja skjal", "downloadFile": "Sækja skjal",
@@ -100,7 +101,10 @@
"submit": "Innskráning", "submit": "Innskráning",
"username": "Notendanafn", "username": "Notendanafn",
"usernameTaken": "Þetta norendanafn er þegar í notkun", "usernameTaken": "Þetta norendanafn er þegar í notkun",
"wrongCredentials": "Rangar notendaupplýsingar" "wrongCredentials": "Rangar notendaupplýsingar",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Varanlegt", "permanent": "Varanlegt",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Myndbönd" "video": "Myndbönd"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Stjórnandi", "admin": "Stjórnandi",
"administrator": "Stjórnandi", "administrator": "Stjórnandi",
"allowCommands": "Senda skipanir", "allowCommands": "Senda skipanir",

View File

@@ -42,7 +42,8 @@
"update": "Aggiorna", "update": "Aggiorna",
"upload": "Carica", "upload": "Carica",
"openFile": "Apri file", "openFile": "Apri file",
"discardChanges": "Ignora" "discardChanges": "Ignora",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Scarica file", "downloadFile": "Scarica file",
@@ -100,7 +101,10 @@
"submit": "Entra", "submit": "Entra",
"username": "Nome utente", "username": "Nome utente",
"usernameTaken": "Username già usato", "usernameTaken": "Username già usato",
"wrongCredentials": "Credenziali errate" "wrongCredentials": "Credenziali errate",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanente", "permanent": "Permanente",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Amministratore", "administrator": "Amministratore",
"allowCommands": "Esegui comandi", "allowCommands": "Esegui comandi",

View File

@@ -42,7 +42,8 @@
"update": "更新", "update": "更新",
"upload": "アップロード", "upload": "アップロード",
"openFile": "ファイルを開く", "openFile": "ファイルを開く",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "ファイルのダウンロード", "downloadFile": "ファイルのダウンロード",
@@ -100,7 +101,10 @@
"submit": "ログイン", "submit": "ログイン",
"username": "ユーザー名", "username": "ユーザー名",
"usernameTaken": "ユーザー名はすでに取得されています", "usernameTaken": "ユーザー名はすでに取得されています",
"wrongCredentials": "ユーザー名またはパスワードが間違っています" "wrongCredentials": "ユーザー名またはパスワードが間違っています",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "永久", "permanent": "永久",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "動画" "video": "動画"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "管理者", "admin": "管理者",
"administrator": "管理者", "administrator": "管理者",
"allowCommands": "コマンドの実行", "allowCommands": "コマンドの実行",

View File

@@ -3,17 +3,17 @@
"cancel": "취소", "cancel": "취소",
"clear": "지우기", "clear": "지우기",
"close": "닫기", "close": "닫기",
"continue": "Continue", "continue": "계속",
"copy": "복사", "copy": "복사",
"copyFile": "파일 복사", "copyFile": "파일 복사",
"copyToClipboard": "클립보드 복사", "copyToClipboard": "클립보드 복사",
"copyDownloadLinkToClipboard": "Copy download link to clipboard", "copyDownloadLinkToClipboard": "다운로드 링크 복사",
"create": "생성", "create": "생성",
"delete": "삭제", "delete": "삭제",
"download": "다운로드", "download": "다운로드",
"file": "File", "file": "파일",
"folder": "Folder", "folder": "폴더",
"fullScreen": "Toggle full screen", "fullScreen": "전체 화면 전환",
"hideDotfiles": "숨김파일(dotfile)을 표시 안함", "hideDotfiles": "숨김파일(dotfile)을 표시 안함",
"info": "정보", "info": "정보",
"more": "더보기", "more": "더보기",
@@ -24,7 +24,7 @@
"ok": "확인", "ok": "확인",
"permalink": "링크 얻기", "permalink": "링크 얻기",
"previous": "이전", "previous": "이전",
"preview": "Preview", "preview": "미리보기",
"publish": "게시", "publish": "게시",
"rename": "이름 바꾸기", "rename": "이름 바꾸기",
"replace": "대체", "replace": "대체",
@@ -36,13 +36,14 @@
"selectMultiple": "다중 선택", "selectMultiple": "다중 선택",
"share": "공유", "share": "공유",
"shell": "쉘 전환", "shell": "쉘 전환",
"submit": "Submit", "submit": "제출",
"switchView": "보기 전환", "switchView": "보기 전환",
"toggleSidebar": "사이드바 전환", "toggleSidebar": "사이드바 전환",
"update": "업데이트", "update": "업데이트",
"upload": "업로드", "upload": "업로드",
"openFile": "Open file", "openFile": "파일 열기",
"discardChanges": "Discard" "discardChanges": "변경 사항 취소",
"saveChanges": "변경사항 저장"
}, },
"download": { "download": {
"downloadFile": "파일 다운로드", "downloadFile": "파일 다운로드",
@@ -50,13 +51,13 @@
"downloadSelected": "선택 항목 다운로드" "downloadSelected": "선택 항목 다운로드"
}, },
"upload": { "upload": {
"abortUpload": "Are you sure you wish to abort?" "abortUpload": "업로드를 중단하시겠습니까?"
}, },
"errors": { "errors": {
"forbidden": "접근 권한이 없습니다.", "forbidden": "접근 권한이 없습니다.",
"internal": "오류가 발생하였습니다.", "internal": "오류가 발생하였습니다.",
"notFound": "해당 경로를 찾을 수 없습니다.", "notFound": "해당 경로를 찾을 수 없습니다.",
"connection": "The server can't be reached." "connection": "서버에 연결할 수 없습니다."
}, },
"files": { "files": {
"body": "본문", "body": "본문",
@@ -74,7 +75,7 @@
"sortByLastModified": "수정시간순 정렬", "sortByLastModified": "수정시간순 정렬",
"sortByName": "이름순", "sortByName": "이름순",
"sortBySize": "크기순", "sortBySize": "크기순",
"noPreview": "Preview is not available for this file." "noPreview": "미리 보기가 지원되지 않는 파일 유형입니다."
}, },
"help": { "help": {
"click": "파일이나 디렉토리를 선택해주세요.", "click": "파일이나 디렉토리를 선택해주세요.",
@@ -100,7 +101,10 @@
"submit": "로그인", "submit": "로그인",
"username": "사용자 이름", "username": "사용자 이름",
"usernameTaken": "사용자 이름이 존재합니다", "usernameTaken": "사용자 이름이 존재합니다",
"wrongCredentials": "사용자 이름 또는 비밀번호를 확인하십시오" "wrongCredentials": "사용자 이름 또는 비밀번호를 확인하십시오",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "영구", "permanent": "영구",
"prompts": { "prompts": {
@@ -109,8 +113,8 @@
"currentlyNavigating": "현재 위치:", "currentlyNavigating": "현재 위치:",
"deleteMessageMultiple": "{count} 개의 파일을 삭제하시겠습니까?", "deleteMessageMultiple": "{count} 개의 파일을 삭제하시겠습니까?",
"deleteMessageSingle": "파일 혹은 디렉토리를 삭제하시겠습니까?", "deleteMessageSingle": "파일 혹은 디렉토리를 삭제하시겠습니까?",
"deleteMessageShare": "Are you sure you wish to delete this share({path})?", "deleteMessageShare": "이 공유({path})를 삭제하시겠습니까?",
"deleteUser": "Are you sure you want to delete this user?", "deleteUser": "이 계정을 삭제하시겠습니까?",
"deleteTitle": "파일 삭제", "deleteTitle": "파일 삭제",
"displayName": "게시 이름:", "displayName": "게시 이름:",
"download": "파일 다운로드", "download": "파일 다운로드",
@@ -137,11 +141,11 @@
"show": "보기", "show": "보기",
"size": "크기", "size": "크기",
"upload": "업로드", "upload": "업로드",
"uploadFiles": "Uploading {files} files...", "uploadFiles": "{files}개의 파일 업로드 중...",
"uploadMessage": "업로드 옵션을 선택하세요.", "uploadMessage": "업로드 옵션을 선택하세요.",
"optionalPassword": "Optional password", "optionalPassword": "비밀번호 (선택)",
"resolution": "Resolution", "resolution": "해상도",
"discardEditorChanges": "Are you sure you wish to discard the changes you've made?" "discardEditorChanges": "변경 사항을 취소하시겠습니까?"
}, },
"search": { "search": {
"images": "이미지", "images": "이미지",
@@ -154,6 +158,7 @@
"video": "비디오" "video": "비디오"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "관리자", "admin": "관리자",
"administrator": "관리자", "administrator": "관리자",
"allowCommands": "명령 실행", "allowCommands": "명령 실행",
@@ -170,14 +175,14 @@
"commandRunnerHelp": "이벤트에 해당하는 명령을 설정하세요. 줄당 1개의 명령을 적으세요. 환경 변수{0} 와 {1}이 사용가능하며, {0} 은 {1}에 상대 경로 입니다. 자세한 사항은 {2} 를 참조하세요.", "commandRunnerHelp": "이벤트에 해당하는 명령을 설정하세요. 줄당 1개의 명령을 적으세요. 환경 변수{0} 와 {1}이 사용가능하며, {0} 은 {1}에 상대 경로 입니다. 자세한 사항은 {2} 를 참조하세요.",
"commandsUpdated": "명령 수정됨!", "commandsUpdated": "명령 수정됨!",
"createUserDir": "Auto create user home dir while adding new user", "createUserDir": "Auto create user home dir while adding new user",
"minimumPasswordLength": "Minimum password length", "minimumPasswordLength": "최소 비밀번호 길이",
"tusUploads": "Chunked Uploads", "tusUploads": "분할 업로드",
"tusUploadsHelp": "File Browser supports chunked file uploads, allowing for the creation of efficient, reliable, resumable and chunked file uploads even on unreliable networks.", "tusUploadsHelp": "File Browser는 불안정한 네트워크에서도 효율적이고 신뢰성 있는 분할 업로드를 지원합니다.",
"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.", "tusUploadsChunkSize": "업로드 요청의 최대 크기 (예: 10MB, 1GB)",
"tusUploadsRetryCount": "Number of retries to perform if a chunk fails to upload.", "tusUploadsRetryCount": "업로드 실패 시 재시도 횟수",
"userHomeBasePath": "Base path for user home directories", "userHomeBasePath": "사용자 홈 폴더 기본 경로",
"userScopeGenerationPlaceholder": "The scope will be auto generated", "userScopeGenerationPlaceholder": "범위는 자동으로 생성됩니다.",
"createUserHomeDirectory": "Create user home directory", "createUserHomeDirectory": "사용자 홈 폴더 생성",
"customStylesheet": "커스텀 스타일시트", "customStylesheet": "커스텀 스타일시트",
"defaultUserDescription": "아래 사항은 신규 사용자들에 대한 기본 설정입니다.", "defaultUserDescription": "아래 사항은 신규 사용자들에 대한 기본 설정입니다.",
"disableExternalLinks": "외부 링크 감추기", "disableExternalLinks": "외부 링크 감추기",
@@ -217,14 +222,14 @@
"rules": "룰", "rules": "룰",
"rulesHelp": "사용자별로 규칙을 허용/방지를 지정할 수 있습니다. 방지된 파일은 보이지 않고 사용자들은 접근할 수 없습니다. 사용자의 접근 허용 범위와 관련해 정규표현식(regex)과 경로를 지원합니다.\n", "rulesHelp": "사용자별로 규칙을 허용/방지를 지정할 수 있습니다. 방지된 파일은 보이지 않고 사용자들은 접근할 수 없습니다. 사용자의 접근 허용 범위와 관련해 정규표현식(regex)과 경로를 지원합니다.\n",
"scope": "범위", "scope": "범위",
"setDateFormat": "Set exact date format", "setDateFormat": "날짜 형식 설정",
"settingsUpdated": "설정 수정됨!", "settingsUpdated": "설정 수정됨!",
"shareDuration": "공유 기간", "shareDuration": "공유 기간",
"shareManagement": "공유 내역 관리", "shareManagement": "공유 내역 관리",
"shareDeleted": "Share deleted!", "shareDeleted": "공유 삭제됨!",
"singleClick": "한번 클릭으로 파일과 폴더를 열도록 합니다.", "singleClick": "한번 클릭으로 파일과 폴더를 열도록 합니다.",
"themes": { "themes": {
"default": "System default", "default": "시스템 기본값",
"dark": "다크테마", "dark": "다크테마",
"light": "라이트테마", "light": "라이트테마",
"title": "테마" "title": "테마"

View File

@@ -42,7 +42,8 @@
"update": "Updaten", "update": "Updaten",
"upload": "Uploaden", "upload": "Uploaden",
"openFile": "Open file", "openFile": "Open file",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Bestand downloaden", "downloadFile": "Bestand downloaden",
@@ -100,7 +101,10 @@
"submit": "Log in", "submit": "Log in",
"username": "Gebruikersnaam", "username": "Gebruikersnaam",
"usernameTaken": "Gebruikersnaam reeds in gebruik", "usernameTaken": "Gebruikersnaam reeds in gebruik",
"wrongCredentials": "Verkeerde inloggegevens" "wrongCredentials": "Verkeerde inloggegevens",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanent", "permanent": "Permanent",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Commando's uitvoeren", "allowCommands": "Commando's uitvoeren",

View File

@@ -42,7 +42,8 @@
"update": "Opptater", "update": "Opptater",
"upload": "Last opp", "upload": "Last opp",
"openFile": "Open file", "openFile": "Open file",
"discardChanges": "Slett" "discardChanges": "Slett",
"saveChanges": "Lagre Endringane "
}, },
"download": { "download": {
"downloadFile": "Nedlast filen", "downloadFile": "Nedlast filen",
@@ -100,7 +101,10 @@
"submit": "Logg inn", "submit": "Logg inn",
"username": "Brukernavn", "username": "Brukernavn",
"usernameTaken": "Brukernavn er allerede i bruk", "usernameTaken": "Brukernavn er allerede i bruk",
"wrongCredentials": "Feil legitimasjon" "wrongCredentials": "Feil legitimasjon",
"logout_reasons": {
"inactivity": "Du har blitt logget ut på grunn av inaktivitet"
}
}, },
"permanent": "Permanent", "permanent": "Permanent",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Utfør kommandoer", "allowCommands": "Utfør kommandoer",

View File

@@ -42,7 +42,8 @@
"update": "Aktualizuj", "update": "Aktualizuj",
"upload": "Wyślij", "upload": "Wyślij",
"openFile": "Otwórz plik", "openFile": "Otwórz plik",
"discardChanges": "Odrzuć" "discardChanges": "Odrzuć",
"saveChanges": "Zapisz zmiany"
}, },
"download": { "download": {
"downloadFile": "Pobierz plik", "downloadFile": "Pobierz plik",
@@ -100,7 +101,10 @@
"submit": "Zaloguj", "submit": "Zaloguj",
"username": "Nazwa użytkownika", "username": "Nazwa użytkownika",
"usernameTaken": "Ta nazwa użytkownika jest zajęta", "usernameTaken": "Ta nazwa użytkownika jest zajęta",
"wrongCredentials": "Błędne dane logowania" "wrongCredentials": "Błędne dane logowania",
"logout_reasons": {
"inactivity": "Wylogowano z powodu braku aktywności."
}
}, },
"permanent": "Permanentny", "permanent": "Permanentny",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Wideo" "video": "Wideo"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Wykonaj polecenie", "allowCommands": "Wykonaj polecenie",

View File

@@ -42,7 +42,8 @@
"update": "Atualizar", "update": "Atualizar",
"upload": "Enviar", "upload": "Enviar",
"openFile": "Abrir", "openFile": "Abrir",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Baixar arquivo", "downloadFile": "Baixar arquivo",
@@ -100,7 +101,10 @@
"submit": "Login", "submit": "Login",
"username": "Nome do usuário", "username": "Nome do usuário",
"usernameTaken": "Nome de usuário já existe", "usernameTaken": "Nome de usuário já existe",
"wrongCredentials": "Ops! Dados incorretos." "wrongCredentials": "Ops! Dados incorretos.",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanente", "permanent": "Permanente",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Vídeos" "video": "Vídeos"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrador", "administrator": "Administrador",
"allowCommands": "Executar comandos", "allowCommands": "Executar comandos",

View File

@@ -42,7 +42,8 @@
"update": "Atualizar", "update": "Atualizar",
"upload": "Enviar", "upload": "Enviar",
"openFile": "Open file", "openFile": "Open file",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Descarregar ficheiro", "downloadFile": "Descarregar ficheiro",
@@ -100,7 +101,10 @@
"submit": "Entrar na conta", "submit": "Entrar na conta",
"username": "Nome de utilizador", "username": "Nome de utilizador",
"usernameTaken": "O nome de utilizador já está registado", "usernameTaken": "O nome de utilizador já está registado",
"wrongCredentials": "Dados errados" "wrongCredentials": "Dados errados",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanente", "permanent": "Permanente",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Vídeos" "video": "Vídeos"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrador", "administrator": "Administrador",
"allowCommands": "Executar comandos", "allowCommands": "Executar comandos",

View File

@@ -42,7 +42,8 @@
"update": "Actualizează", "update": "Actualizează",
"upload": "Încarcă", "upload": "Încarcă",
"openFile": "Open file", "openFile": "Open file",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Descarcă fișier", "downloadFile": "Descarcă fișier",
@@ -100,7 +101,10 @@
"submit": "Autentificare", "submit": "Autentificare",
"username": "Utilizator", "username": "Utilizator",
"usernameTaken": "Utilizatorul există", "usernameTaken": "Utilizatorul există",
"wrongCredentials": "Informații greșite" "wrongCredentials": "Informații greșite",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanent", "permanent": "Permanent",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Execută comenzi", "allowCommands": "Execută comenzi",

View File

@@ -42,7 +42,8 @@
"update": "Обновить", "update": "Обновить",
"upload": "Загрузить", "upload": "Загрузить",
"openFile": "Открыть файл", "openFile": "Открыть файл",
"discardChanges": "Отказаться" "discardChanges": "Отказаться",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Скачать файл", "downloadFile": "Скачать файл",
@@ -100,7 +101,10 @@
"submit": "Войти", "submit": "Войти",
"username": "Имя пользователя", "username": "Имя пользователя",
"usernameTaken": "Данное имя пользователя уже занято", "usernameTaken": "Данное имя пользователя уже занято",
"wrongCredentials": "Неверные данные" "wrongCredentials": "Неверные данные",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Постоянный", "permanent": "Постоянный",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Видео" "video": "Видео"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Админ", "admin": "Админ",
"administrator": "Администратор", "administrator": "Администратор",
"allowCommands": "Запуск команд", "allowCommands": "Запуск команд",

View File

@@ -42,7 +42,8 @@
"update": "Aktualizovať", "update": "Aktualizovať",
"upload": "Nahrať", "upload": "Nahrať",
"openFile": "Otvoriť súbor", "openFile": "Otvoriť súbor",
"discardChanges": "Zahodiť" "discardChanges": "Zahodiť",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Stiahnuť súbor", "downloadFile": "Stiahnuť súbor",
@@ -100,7 +101,10 @@
"submit": "Prihlásiť", "submit": "Prihlásiť",
"username": "Používateľské meno", "username": "Používateľské meno",
"usernameTaken": "Meno je už obsadené", "usernameTaken": "Meno je už obsadené",
"wrongCredentials": "Nesprávne prihlasovacie údaje" "wrongCredentials": "Nesprávne prihlasovacie údaje",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Trvalé", "permanent": "Trvalé",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrátor", "administrator": "Administrátor",
"allowCommands": "Vykonávať príkazy", "allowCommands": "Vykonávať príkazy",

View File

@@ -42,7 +42,8 @@
"update": "Uppdatera", "update": "Uppdatera",
"upload": "Ladda upp", "upload": "Ladda upp",
"openFile": "Open file", "openFile": "Open file",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Ladda ner fil", "downloadFile": "Ladda ner fil",
@@ -100,7 +101,10 @@
"submit": "Logga in", "submit": "Logga in",
"username": "Användarnamn", "username": "Användarnamn",
"usernameTaken": "Användarnamn upptaget", "usernameTaken": "Användarnamn upptaget",
"wrongCredentials": "Fel inloggning" "wrongCredentials": "Fel inloggning",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Permanent", "permanent": "Permanent",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Admin", "admin": "Admin",
"administrator": "Administratör", "administrator": "Administratör",
"allowCommands": "Exekvera kommandon", "allowCommands": "Exekvera kommandon",

View File

@@ -42,7 +42,8 @@
"update": "Güncelle", "update": "Güncelle",
"upload": "Yükle", "upload": "Yükle",
"openFile": "Dosyayı aç", "openFile": "Dosyayı aç",
"discardChanges": "Discard" "discardChanges": "Discard",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Dosyayı indir", "downloadFile": "Dosyayı indir",
@@ -100,7 +101,10 @@
"submit": "Giriş", "submit": "Giriş",
"username": "Kullanıcı adı", "username": "Kullanıcı adı",
"usernameTaken": "Kullanıcı adı mevcut", "usernameTaken": "Kullanıcı adı mevcut",
"wrongCredentials": "Yanlış hesap bilgileri" "wrongCredentials": "Yanlış hesap bilgileri",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Kalıcı", "permanent": "Kalıcı",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Yönetim", "admin": "Yönetim",
"administrator": "Yönetici", "administrator": "Yönetici",
"allowCommands": "Komutları çalıştır", "allowCommands": "Komutları çalıştır",

View File

@@ -42,7 +42,8 @@
"update": "Оновити", "update": "Оновити",
"upload": "Вивантажити", "upload": "Вивантажити",
"openFile": "Відкрити файл", "openFile": "Відкрити файл",
"discardChanges": "Скасувати" "discardChanges": "Скасувати",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Завантажити файл", "downloadFile": "Завантажити файл",
@@ -100,7 +101,10 @@
"submit": "Увійти", "submit": "Увійти",
"username": "Ім'я користувача", "username": "Ім'я користувача",
"usernameTaken": "Ім'я користувача вже використовується", "usernameTaken": "Ім'я користувача вже використовується",
"wrongCredentials": "Неправильне ім'я користувача або пароль" "wrongCredentials": "Неправильне ім'я користувача або пароль",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Постійний", "permanent": "Постійний",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Відео" "video": "Відео"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Адмін", "admin": "Адмін",
"administrator": "Адміністратор", "administrator": "Адміністратор",
"allowCommands": "Запуск команд", "allowCommands": "Запуск команд",

View File

@@ -42,7 +42,8 @@
"update": "Cập nhật", "update": "Cập nhật",
"upload": "Tải lên", "upload": "Tải lên",
"openFile": "Mở tệp", "openFile": "Mở tệp",
"discardChanges": "Hủy bỏ thay đổi" "discardChanges": "Hủy bỏ thay đổi",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "Tải xuống tệp tin", "downloadFile": "Tải xuống tệp tin",
@@ -100,7 +101,10 @@
"submit": "Đăng nhập", "submit": "Đăng nhập",
"username": "Tên người dùng", "username": "Tên người dùng",
"usernameTaken": "Tên người dùng đã tồn tại", "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",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "Vĩnh viễn", "permanent": "Vĩnh viễn",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "Video" "video": "Video"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "Quản trị viên", "admin": "Quản trị viên",
"administrator": "Người quản trị", "administrator": "Người quản trị",
"allowCommands": "Thực thi lệnh", "allowCommands": "Thực thi lệnh",

View File

@@ -42,7 +42,8 @@
"update": "更新", "update": "更新",
"upload": "上传", "upload": "上传",
"openFile": "打开文件", "openFile": "打开文件",
"discardChanges": "放弃更改" "discardChanges": "放弃更改",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "下载文件", "downloadFile": "下载文件",
@@ -100,7 +101,10 @@
"submit": "登录", "submit": "登录",
"username": "用户名", "username": "用户名",
"usernameTaken": "用户名已经被使用", "usernameTaken": "用户名已经被使用",
"wrongCredentials": "用户名或密码错误" "wrongCredentials": "用户名或密码错误",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "永久", "permanent": "永久",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "视频" "video": "视频"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "管理员", "admin": "管理员",
"administrator": "管理员", "administrator": "管理员",
"allowCommands": "执行命令Shell 命令)", "allowCommands": "执行命令Shell 命令)",

View File

@@ -42,7 +42,8 @@
"update": "更新", "update": "更新",
"upload": "上傳", "upload": "上傳",
"openFile": "開啟檔案", "openFile": "開啟檔案",
"discardChanges": "放棄變更" "discardChanges": "放棄變更",
"saveChanges": "Save changes"
}, },
"download": { "download": {
"downloadFile": "下載檔案", "downloadFile": "下載檔案",
@@ -100,7 +101,10 @@
"submit": "登入", "submit": "登入",
"username": "帳號", "username": "帳號",
"usernameTaken": "用戶名已存在", "usernameTaken": "用戶名已存在",
"wrongCredentials": "帳號或密碼錯誤" "wrongCredentials": "帳號或密碼錯誤",
"logout_reasons": {
"inactivity": "You have been logged out due to inactivity."
}
}, },
"permanent": "永久", "permanent": "永久",
"prompts": { "prompts": {
@@ -154,6 +158,7 @@
"video": "影片" "video": "影片"
}, },
"settings": { "settings": {
"aceEditorTheme": "Ace editor theme",
"admin": "管理員", "admin": "管理員",
"administrator": "管理員", "administrator": "管理員",
"allowCommands": "執行命令", "allowCommands": "執行命令",

View File

@@ -7,9 +7,11 @@ export const useAuthStore = defineStore("auth", {
state: (): { state: (): {
user: IUser | null; user: IUser | null;
jwt: string; jwt: string;
logoutTimer: number | null;
} => ({ } => ({
user: null, user: null,
jwt: "", jwt: "",
logoutTimer: null,
}), }),
getters: { getters: {
// user and jwt getter removed, no longer needed // user and jwt getter removed, no longer needed
@@ -37,5 +39,8 @@ export const useAuthStore = defineStore("auth", {
clearUser() { clearUser() {
this.$reset(); this.$reset();
}, },
setLogoutTimer(logoutTimer: number | null) {
this.logoutTimer = logoutTimer;
},
}, },
}); });

View File

@@ -21,6 +21,7 @@ interface SettingsDefaults {
commands: any[]; commands: any[];
hideDotfiles: boolean; hideDotfiles: boolean;
dateFormat: boolean; dateFormat: boolean;
aceEditorTheme: string;
} }
interface SettingsBranding { interface SettingsBranding {

View File

@@ -13,6 +13,7 @@ interface IUser {
dateFormat: boolean; dateFormat: boolean;
viewMode: ViewModeType; viewMode: ViewModeType;
sorting?: Sorting; sorting?: Sorting;
aceEditorTheme: string;
} }
type ViewModeType = "list" | "mosaic" | "mosaic gallery"; type ViewModeType = "list" | "mosaic" | "mosaic gallery";

View File

@@ -4,6 +4,7 @@ import type { JwtPayload } from "jwt-decode";
import { jwtDecode } from "jwt-decode"; import { jwtDecode } from "jwt-decode";
import { baseURL, noAuth } from "./constants"; import { baseURL, noAuth } from "./constants";
import { StatusError } from "@/api/utils"; import { StatusError } from "@/api/utils";
import { setSafeTimeout } from "@/api/utils";
export function parseToken(token: string) { export function parseToken(token: string) {
// falsy or malformed jwt will throw InvalidTokenError // falsy or malformed jwt will throw InvalidTokenError
@@ -16,6 +17,18 @@ export function parseToken(token: string) {
const authStore = useAuthStore(); const authStore = useAuthStore();
authStore.jwt = token; authStore.jwt = token;
authStore.setUser(data.user); authStore.setUser(data.user);
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() { export async function validateLogin() {
@@ -92,7 +105,7 @@ export async function signup(username: string, password: string) {
} }
} }
export function logout() { export function logout(reason?: string) {
document.cookie = "auth=; Max-Age=0; Path=/; SameSite=Strict;"; document.cookie = "auth=; Max-Age=0; Path=/; SameSite=Strict;";
const authStore = useAuthStore(); const authStore = useAuthStore();
@@ -102,6 +115,15 @@ export function logout() {
if (noAuth) { if (noAuth) {
window.location.reload(); window.location.reload();
} else { } else {
router.push({ path: "/login" }); if (typeof reason === "string" && reason.trim() !== "") {
router.push({
path: "/login",
query: { "logout-reason": reason },
});
} else {
router.push({
path: "/login",
});
}
} }
} }

View File

@@ -1,4 +1,6 @@
import { theme } from "./constants"; import { theme } from "./constants";
import "ace-builds";
import { themesByName } from "ace-builds/src-noconflict/ext-themelist";
export const getTheme = (): UserTheme => { export const getTheme = (): UserTheme => {
return (document.documentElement.className as UserTheme) || theme; return (document.documentElement.className as UserTheme) || theme;
@@ -32,3 +34,17 @@ export const getMediaPreference = (): UserTheme => {
return "light"; 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";
}
};

View File

@@ -3,6 +3,9 @@
<form @submit="submit"> <form @submit="submit">
<img :src="logoURL" alt="File Browser" /> <img :src="logoURL" alt="File Browser" />
<h1>{{ name }}</h1> <h1>{{ name }}</h1>
<p v-if="reason != null" class="logout-message">
{{ t(`login.logout_reasons.${reason}`) }}
</p>
<div v-if="error !== ''" class="wrong">{{ error }}</div> <div v-if="error !== ''" class="wrong">{{ error }}</div>
<input <input
@@ -70,6 +73,8 @@ const toggleMode = () => (createMode.value = !createMode.value);
const $showError = inject<IToastError>("$showError")!; const $showError = inject<IToastError>("$showError")!;
const reason = route.query["logout-reason"] ?? null;
const submit = async (event: Event) => { const submit = async (event: Event) => {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();

View File

@@ -69,7 +69,7 @@ import HeaderBar from "@/components/header/HeaderBar.vue";
import { useAuthStore } from "@/stores/auth"; import { useAuthStore } from "@/stores/auth";
import { useFileStore } from "@/stores/file"; import { useFileStore } from "@/stores/file";
import { useLayoutStore } from "@/stores/layout"; import { useLayoutStore } from "@/stores/layout";
import { getTheme } from "@/utils/theme"; import { getEditorTheme } from "@/utils/theme";
import { marked } from "marked"; import { marked } from "marked";
import { inject, onBeforeUnmount, onMounted, ref, watchEffect } from "vue"; import { inject, onBeforeUnmount, onMounted, ref, watchEffect } from "vue";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
@@ -122,7 +122,7 @@ onMounted(() => {
value: fileContent, value: fileContent,
showPrintMargin: false, showPrintMargin: false,
readOnly: fileStore.req?.type === "textImmutable", readOnly: fileStore.req?.type === "textImmutable",
theme: "ace/theme/chrome", theme: getEditorTheme(authStore.user?.aceEditorTheme ?? ""),
mode: modelist.getModeForPath(fileStore.req!.name).mode, mode: modelist.getModeForPath(fileStore.req!.name).mode,
wrap: true, wrap: true,
enableBasicAutocompletion: true, enableBasicAutocompletion: true,
@@ -130,10 +130,6 @@ onMounted(() => {
enableSnippets: true, enableSnippets: true,
}); });
if (getTheme() === "dark") {
editor.value!.setTheme("ace/theme/twilight");
}
editor.value.setFontSize(fontSize.value); editor.value.setFontSize(fontSize.value);
editor.value.focus(); editor.value.focus();
}); });
@@ -219,6 +215,25 @@ const decreaseFontSize = () => {
}; };
const close = () => { const close = () => {
if (!editor.value?.session.getUndoManager().isClean()) {
layoutStore.showHover({
prompt: "discardEditorChanges",
confirm: (event: Event) => {
event.preventDefault();
finishClose();
},
saveAction: async () => {
await save();
finishClose();
},
});
return;
}
finishClose();
};
const finishClose = () => {
fileStore.updateRequest(null);
const uri = url.removeLastDir(route.path) + "/"; const uri = url.removeLastDir(route.path) + "/";
router.push({ path: uri }); router.push({ path: uri });
}; };

View File

@@ -65,7 +65,7 @@
<a <a
class="link" class="link"
target="_blank" target="_blank"
href="https://filebrowser.org/configuration.html#command-runner" href="https://filebrowser.org/configuration.html#custom-branding"
>{{ t("settings.documentation") }}</a >{{ t("settings.documentation") }}</a
> >
</i18n-t> </i18n-t>

View File

@@ -24,6 +24,13 @@
class="input input--block" class="input input--block"
v-model:locale="locale" v-model:locale="locale"
></languages> ></languages>
<h3>{{ t("settings.aceEditorTheme") }}</h3>
<AceEditorTheme
class="input input--block"
v-model:aceEditorTheme="aceEditorTheme"
id="aceTheme"
></AceEditorTheme>
</div> </div>
<div class="card-action"> <div class="card-action">
@@ -81,6 +88,7 @@
import { useAuthStore } from "@/stores/auth"; import { useAuthStore } from "@/stores/auth";
import { useLayoutStore } from "@/stores/layout"; import { useLayoutStore } from "@/stores/layout";
import { users as api } from "@/api"; import { users as api } from "@/api";
import AceEditorTheme from "@/components/settings/AceEditorTheme.vue";
import Languages from "@/components/settings/Languages.vue"; import Languages from "@/components/settings/Languages.vue";
import { computed, inject, onMounted, ref } from "vue"; import { computed, inject, onMounted, ref } from "vue";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
@@ -98,6 +106,7 @@ const hideDotfiles = ref<boolean>(false);
const singleClick = ref<boolean>(false); const singleClick = ref<boolean>(false);
const dateFormat = ref<boolean>(false); const dateFormat = ref<boolean>(false);
const locale = ref<string>(""); const locale = ref<string>("");
const aceEditorTheme = ref<string>("");
const passwordClass = computed(() => { const passwordClass = computed(() => {
const baseClass = "input input--block"; const baseClass = "input input--block";
@@ -113,13 +122,14 @@ const passwordClass = computed(() => {
return `${baseClass} input--red`; return `${baseClass} input--red`;
}); });
onMounted(() => { onMounted(async () => {
layoutStore.loading = true; layoutStore.loading = true;
if (authStore.user === null) return false; if (authStore.user === null) return false;
locale.value = authStore.user.locale; locale.value = authStore.user.locale;
hideDotfiles.value = authStore.user.hideDotfiles; hideDotfiles.value = authStore.user.hideDotfiles;
singleClick.value = authStore.user.singleClick; singleClick.value = authStore.user.singleClick;
dateFormat.value = authStore.user.dateFormat; dateFormat.value = authStore.user.dateFormat;
aceEditorTheme.value = authStore.user.aceEditorTheme;
layoutStore.loading = false; layoutStore.loading = false;
return true; return true;
}); });
@@ -163,6 +173,7 @@ const updateSettings = async (event: Event) => {
hideDotfiles: hideDotfiles.value, hideDotfiles: hideDotfiles.value,
singleClick: singleClick.value, singleClick: singleClick.value,
dateFormat: dateFormat.value, dateFormat: dateFormat.value,
aceEditorTheme: aceEditorTheme.value,
}; };
await api.update(data, [ await api.update(data, [
@@ -170,6 +181,7 @@ const updateSettings = async (event: Event) => {
"hideDotfiles", "hideDotfiles",
"singleClick", "singleClick",
"dateFormat", "dateFormat",
"aceEditorTheme",
]); ]);
authStore.updateUser(data); authStore.updateUser(data);
$showSuccess(t("settings.settingsUpdated")); $showSuccess(t("settings.settingsUpdated"));

View File

@@ -21,16 +21,17 @@ const (
) )
type userInfo struct { type userInfo struct {
ID uint `json:"id"` ID uint `json:"id"`
Locale string `json:"locale"` Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"` ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"` SingleClick bool `json:"singleClick"`
Perm users.Permissions `json:"perm"` Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"` Commands []string `json:"commands"`
LockPassword bool `json:"lockPassword"` LockPassword bool `json:"lockPassword"`
HideDotfiles bool `json:"hideDotfiles"` HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"` DateFormat bool `json:"dateFormat"`
Username string `json:"username"` Username string `json:"username"`
AceEditorTheme string `json:"aceEditorTheme"`
} }
type authToken struct { type authToken struct {
@@ -50,11 +51,6 @@ func (e extractor) ExtractToken(r *http.Request) (string, error) {
return token, nil return token, nil
} }
auth := r.URL.Query().Get("auth")
if auth != "" && strings.Count(auth, ".") == 2 {
return auth, nil
}
if r.Method == http.MethodGet { if r.Method == http.MethodGet {
cookie, _ := r.Cookie("auth") cookie, _ := r.Cookie("auth")
if cookie != nil && strings.Count(cookie.Value, ".") == 2 { if cookie != nil && strings.Count(cookie.Value, ".") == 2 {
@@ -190,16 +186,17 @@ func renewHandler(tokenExpireTime time.Duration) handleFunc {
func printToken(w http.ResponseWriter, _ *http.Request, d *data, user *users.User, tokenExpirationTime time.Duration) (int, error) { func printToken(w http.ResponseWriter, _ *http.Request, d *data, user *users.User, tokenExpirationTime time.Duration) (int, error) {
claims := &authToken{ claims := &authToken{
User: userInfo{ User: userInfo{
ID: user.ID, ID: user.ID,
Locale: user.Locale, Locale: user.Locale,
ViewMode: user.ViewMode, ViewMode: user.ViewMode,
SingleClick: user.SingleClick, SingleClick: user.SingleClick,
Perm: user.Perm, Perm: user.Perm,
LockPassword: user.LockPassword, LockPassword: user.LockPassword,
Commands: user.Commands, Commands: user.Commands,
HideDotfiles: user.HideDotfiles, HideDotfiles: user.HideDotfiles,
DateFormat: user.DateFormat, DateFormat: user.DateFormat,
Username: user.Username, Username: user.Username,
AceEditorTheme: user.AceEditorTheme,
}, },
RegisteredClaims: jwt.RegisteredClaims{ RegisteredClaims: jwt.RegisteredClaims{
IssuedAt: jwt.NewNumericDate(time.Now()), IssuedAt: jwt.NewNumericDate(time.Now()),

View File

@@ -8,15 +8,16 @@ import (
// UserDefaults is a type that holds the default values // UserDefaults is a type that holds the default values
// for some fields on User. // for some fields on User.
type UserDefaults struct { type UserDefaults struct {
Scope string `json:"scope"` Scope string `json:"scope"`
Locale string `json:"locale"` Locale string `json:"locale"`
ViewMode users.ViewMode `json:"viewMode"` ViewMode users.ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"` SingleClick bool `json:"singleClick"`
Sorting files.Sorting `json:"sorting"` Sorting files.Sorting `json:"sorting"`
Perm users.Permissions `json:"perm"` Perm users.Permissions `json:"perm"`
Commands []string `json:"commands"` Commands []string `json:"commands"`
HideDotfiles bool `json:"hideDotfiles"` HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"` DateFormat bool `json:"dateFormat"`
AceEditorTheme string `json:"aceEditorTheme"`
} }
// Apply applies the default options to a user. // Apply applies the default options to a user.
@@ -30,4 +31,5 @@ func (d *UserDefaults) Apply(u *users.User) {
u.Commands = d.Commands u.Commands = d.Commands
u.HideDotfiles = d.HideDotfiles u.HideDotfiles = d.HideDotfiles
u.DateFormat = d.DateFormat u.DateFormat = d.DateFormat
u.AceEditorTheme = d.AceEditorTheme
} }

View File

@@ -3,5 +3,6 @@
"@commitlint/cli": "^15.0.0", "@commitlint/cli": "^15.0.0",
"@commitlint/config-conventional": "^15.0.0", "@commitlint/config-conventional": "^15.0.0",
"standard-version": "^9.3.2" "standard-version": "^9.3.2"
} },
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
} }

View File

@@ -20,21 +20,22 @@ const (
// User describes a user. // User describes a user.
type User struct { type User struct {
ID uint `storm:"id,increment" json:"id"` ID uint `storm:"id,increment" json:"id"`
Username string `storm:"unique" json:"username"` Username string `storm:"unique" json:"username"`
Password string `json:"password"` Password string `json:"password"`
Scope string `json:"scope"` Scope string `json:"scope"`
Locale string `json:"locale"` Locale string `json:"locale"`
LockPassword bool `json:"lockPassword"` LockPassword bool `json:"lockPassword"`
ViewMode ViewMode `json:"viewMode"` ViewMode ViewMode `json:"viewMode"`
SingleClick bool `json:"singleClick"` SingleClick bool `json:"singleClick"`
Perm Permissions `json:"perm"` Perm Permissions `json:"perm"`
Commands []string `json:"commands"` Commands []string `json:"commands"`
Sorting files.Sorting `json:"sorting"` Sorting files.Sorting `json:"sorting"`
Fs afero.Fs `json:"-" yaml:"-"` Fs afero.Fs `json:"-" yaml:"-"`
Rules []rules.Rule `json:"rules"` Rules []rules.Rule `json:"rules"`
HideDotfiles bool `json:"hideDotfiles"` HideDotfiles bool `json:"hideDotfiles"`
DateFormat bool `json:"dateFormat"` DateFormat bool `json:"dateFormat"`
AceEditorTheme string `json:"aceEditorTheme"`
} }
// GetRules implements rules.Provider. // GetRules implements rules.Provider.