From 5100e587d73831ecdb5e3bd35a78fef96ad248a4 Mon Sep 17 00:00:00 2001 From: kloon15 Date: Mon, 1 Apr 2024 17:18:22 +0200 Subject: [PATCH] feat: migrate to vue 3 (#2689) --------- Co-authored-by: Joep Co-authored-by: Omar Hussein Co-authored-by: Oleg Lobanov --- .gitignore | 9 + files/file.go | 48 +- frontend/.eslintrc.json | 13 +- frontend/index.html | 2 +- frontend/package-lock.json | 5616 +++++++++++------ frontend/package.json | 105 +- frontend/playwright.config.ts | 80 + frontend/public/index.html | 13 +- frontend/public/themes/dark.css | 217 - frontend/src/App.vue | 41 +- frontend/src/api/{commands.js => commands.ts} | 17 +- frontend/src/api/{files.js => files.ts} | 83 +- frontend/src/api/{index.js => index.ts} | 0 frontend/src/api/{pub.js => pub.ts} | 21 +- frontend/src/api/{search.js => search.ts} | 6 +- frontend/src/api/{settings.js => settings.ts} | 4 +- frontend/src/api/{share.js => share.ts} | 23 +- frontend/src/api/{tus.js => tus.ts} | 84 +- frontend/src/api/{users.js => users.ts} | 16 +- frontend/src/api/utils.js | 80 - frontend/src/api/utils.ts | 98 + frontend/src/components/Breadcrumbs.vue | 100 +- frontend/src/components/CustomToast.vue | 45 + frontend/src/components/ProgressBar.vue | 224 + frontend/src/components/Search.vue | 253 +- frontend/src/components/Shell.vue | 19 +- frontend/src/components/Sidebar.vue | 97 +- .../src/components/files/ExtendedImage.vue | 499 +- frontend/src/components/files/ListingItem.vue | 427 +- frontend/src/components/files/VideoPlayer.vue | 104 + frontend/src/components/header/Action.vue | 37 +- frontend/src/components/header/HeaderBar.vue | 65 +- frontend/src/components/prompts/BaseModal.vue | 21 + frontend/src/components/prompts/Copy.vue | 33 +- frontend/src/components/prompts/Delete.vue | 26 +- .../src/components/prompts/DeleteUser.vue | 40 + .../prompts/DiscardEditorChanges.vue | 14 +- frontend/src/components/prompts/Download.vue | 43 +- frontend/src/components/prompts/FileList.vue | 9 +- frontend/src/components/prompts/Help.vue | 14 +- frontend/src/components/prompts/Info.vue | 70 +- frontend/src/components/prompts/Move.vue | 28 +- frontend/src/components/prompts/NewDir.vue | 122 +- frontend/src/components/prompts/NewFile.vue | 89 +- frontend/src/components/prompts/Prompts.vue | 148 +- frontend/src/components/prompts/Rename.vue | 25 +- frontend/src/components/prompts/Replace.vue | 16 +- .../src/components/prompts/ReplaceRename.vue | 16 +- frontend/src/components/prompts/Share.vue | 86 +- .../src/components/prompts/ShareDelete.vue | 11 +- frontend/src/components/prompts/Upload.vue | 111 +- .../src/components/prompts/UploadFiles.vue | 19 +- .../src/components/settings/Languages.vue | 61 +- frontend/src/components/settings/Themes.vue | 31 +- frontend/src/components/settings/UserForm.vue | 121 +- frontend/src/css/_buttons.css | 14 +- frontend/src/css/_inputs.css | 20 +- frontend/src/css/_share.css | 17 +- frontend/src/css/_shell.css | 17 +- frontend/src/css/_variables.css | 46 +- frontend/src/css/base.css | 58 +- frontend/src/css/dashboard.css | 146 +- frontend/src/css/header.css | 98 +- frontend/src/css/listing-icons.css | 144 +- frontend/src/css/listing.css | 71 +- frontend/src/css/login.css | 12 +- frontend/src/css/mobile.css | 48 +- frontend/src/css/styles.css | 68 +- frontend/src/i18n/ar.json | 13 +- frontend/src/i18n/de.json | 8 +- frontend/src/i18n/el.json | 553 +- frontend/src/i18n/en.json | 9 +- frontend/src/i18n/es.json | 7 +- frontend/src/i18n/fr.json | 20 +- frontend/src/i18n/he.json | 4 +- frontend/src/i18n/hu.json | 5 +- frontend/src/i18n/index.js | 143 - frontend/src/i18n/index.ts | 164 + frontend/src/i18n/is.json | 15 +- frontend/src/i18n/it.json | 16 +- frontend/src/i18n/ja.json | 3 +- frontend/src/i18n/ko.json | 15 +- frontend/src/i18n/nl-be.json | 43 +- frontend/src/i18n/pl.json | 16 +- frontend/src/i18n/pt-br.json | 16 +- frontend/src/i18n/pt.json | 38 +- frontend/src/i18n/ro.json | 15 +- frontend/src/i18n/ru.json | 7 +- frontend/src/i18n/sk.json | 7 +- frontend/src/i18n/sv-se.json | 15 +- frontend/src/i18n/tr.json | 7 +- frontend/src/i18n/ua.json | 270 - frontend/src/i18n/uk.json | 271 + frontend/src/i18n/zh-cn.json | 14 +- frontend/src/i18n/zh-tw.json | 11 +- frontend/src/index.d.ts | 1 + frontend/src/main.js | 51 - frontend/src/main.ts | 109 + frontend/src/router/index.js | 194 - frontend/src/router/index.ts | 220 + frontend/src/store/getters.js | 56 - frontend/src/store/index.js | 33 - frontend/src/store/modules/upload.js | 112 - frontend/src/store/mutations.js | 118 - frontend/src/stores/auth.ts | 41 + frontend/src/stores/clipboard.ts | 24 + frontend/src/stores/file.ts | 63 + frontend/src/stores/index.ts | 12 + frontend/src/stores/layout.ts | 74 + frontend/src/stores/router.ts | 14 + frontend/src/stores/upload.ts | 187 + frontend/src/types/api.d.ts | 33 + frontend/src/types/file.d.ts | 58 + frontend/src/types/global.d.ts | 13 + frontend/src/types/layout.d.ts | 8 + frontend/src/types/settings.d.ts | 57 + frontend/src/types/toast.d.ts | 2 + frontend/src/types/upload.d.ts | 51 + frontend/src/types/user.d.ts | 66 + frontend/src/types/utif.d.ts | 1 + frontend/src/utils/auth.js | 92 - frontend/src/utils/auth.ts | 102 + frontend/src/utils/buttons.js | 70 - frontend/src/utils/buttons.ts | 83 + frontend/src/utils/clipboard.ts | 66 + frontend/src/utils/constants.js | 42 - frontend/src/utils/constants.ts | 42 + frontend/src/utils/{cookie.js => cookie.ts} | 4 +- frontend/src/utils/{css.js => css.ts} | 4 +- frontend/src/utils/{index.js => index.ts} | 0 frontend/src/utils/theme.ts | 34 + frontend/src/utils/upload.js | 138 - frontend/src/utils/upload.ts | 154 + frontend/src/utils/url.js | 36 - frontend/src/utils/url.ts | 42 + frontend/src/utils/vue.js | 68 - frontend/src/views/Errors.vue | 41 +- frontend/src/views/Files.vue | 258 +- frontend/src/views/Layout.vue | 56 +- frontend/src/views/Login.vue | 152 +- frontend/src/views/Settings.vue | 40 +- frontend/src/views/Share.vue | 619 +- frontend/src/views/files/Editor.vue | 199 +- frontend/src/views/files/FileListing.vue | 960 +++ frontend/src/views/files/Listing.vue | 897 --- frontend/src/views/files/Preview.vue | 447 +- frontend/src/views/settings/Global.vue | 395 +- frontend/src/views/settings/Profile.vue | 217 +- frontend/src/views/settings/Shares.vue | 170 +- frontend/src/views/settings/User.vue | 249 +- frontend/src/views/settings/Users.vue | 63 +- frontend/src/vite-env.d.ts | 1 + frontend/tests-examples/demo-todo-app.spec.ts | 489 ++ frontend/tests/auth.spec.ts | 32 + frontend/tests/fixtures/auth.ts | 40 + frontend/tests/fixtures/settings.ts | 61 + frontend/tests/fixtures/toast.ts | 20 + frontend/tests/settings.spec.ts | 46 + frontend/tsconfig.json | 24 + frontend/{vite.config.js => vite.config.ts} | 33 +- go.mod | 3 + go.sum | 10 + http/http.go | 1 + http/subtitle.go | 87 + 164 files changed, 12202 insertions(+), 8047 deletions(-) create mode 100644 frontend/playwright.config.ts delete mode 100644 frontend/public/themes/dark.css rename frontend/src/api/{commands.js => commands.ts} (55%) rename frontend/src/api/{files.js => files.ts} (65%) rename frontend/src/api/{index.js => index.ts} (100%) rename frontend/src/api/{pub.js => pub.ts} (68%) rename frontend/src/api/{search.js => search.ts} (68%) rename frontend/src/api/{settings.js => settings.ts} (62%) rename frontend/src/api/{share.js => share.ts} (53%) rename frontend/src/api/{tus.js => tus.ts} (68%) rename frontend/src/api/{users.js => users.ts} (55%) delete mode 100644 frontend/src/api/utils.js create mode 100644 frontend/src/api/utils.ts create mode 100644 frontend/src/components/CustomToast.vue create mode 100644 frontend/src/components/ProgressBar.vue create mode 100644 frontend/src/components/files/VideoPlayer.vue create mode 100644 frontend/src/components/prompts/BaseModal.vue create mode 100644 frontend/src/components/prompts/DeleteUser.vue delete mode 100644 frontend/src/i18n/index.js create mode 100644 frontend/src/i18n/index.ts delete mode 100644 frontend/src/i18n/ua.json create mode 100644 frontend/src/i18n/uk.json create mode 100644 frontend/src/index.d.ts delete mode 100644 frontend/src/main.js create mode 100644 frontend/src/main.ts delete mode 100644 frontend/src/router/index.js create mode 100644 frontend/src/router/index.ts delete mode 100644 frontend/src/store/getters.js delete mode 100644 frontend/src/store/index.js delete mode 100644 frontend/src/store/modules/upload.js delete mode 100644 frontend/src/store/mutations.js create mode 100644 frontend/src/stores/auth.ts create mode 100644 frontend/src/stores/clipboard.ts create mode 100644 frontend/src/stores/file.ts create mode 100644 frontend/src/stores/index.ts create mode 100644 frontend/src/stores/layout.ts create mode 100644 frontend/src/stores/router.ts create mode 100644 frontend/src/stores/upload.ts create mode 100644 frontend/src/types/api.d.ts create mode 100644 frontend/src/types/file.d.ts create mode 100644 frontend/src/types/global.d.ts create mode 100644 frontend/src/types/layout.d.ts create mode 100644 frontend/src/types/settings.d.ts create mode 100644 frontend/src/types/toast.d.ts create mode 100644 frontend/src/types/upload.d.ts create mode 100644 frontend/src/types/user.d.ts create mode 100644 frontend/src/types/utif.d.ts delete mode 100644 frontend/src/utils/auth.js create mode 100644 frontend/src/utils/auth.ts delete mode 100644 frontend/src/utils/buttons.js create mode 100644 frontend/src/utils/buttons.ts create mode 100644 frontend/src/utils/clipboard.ts delete mode 100644 frontend/src/utils/constants.js create mode 100644 frontend/src/utils/constants.ts rename frontend/src/utils/{cookie.js => cookie.ts} (63%) rename frontend/src/utils/{css.js => css.ts} (86%) rename frontend/src/utils/{index.js => index.ts} (100%) create mode 100644 frontend/src/utils/theme.ts delete mode 100644 frontend/src/utils/upload.js create mode 100644 frontend/src/utils/upload.ts delete mode 100644 frontend/src/utils/url.js create mode 100644 frontend/src/utils/url.ts delete mode 100644 frontend/src/utils/vue.js create mode 100644 frontend/src/views/files/FileListing.vue delete mode 100644 frontend/src/views/files/Listing.vue create mode 100644 frontend/src/vite-env.d.ts create mode 100644 frontend/tests-examples/demo-todo-app.spec.ts create mode 100644 frontend/tests/auth.spec.ts create mode 100644 frontend/tests/fixtures/auth.ts create mode 100644 frontend/tests/fixtures/settings.ts create mode 100644 frontend/tests/fixtures/toast.ts create mode 100644 frontend/tests/settings.spec.ts create mode 100644 frontend/tsconfig.json rename frontend/{vite.config.js => vite.config.ts} (62%) create mode 100644 http/subtitle.go diff --git a/.gitignore b/.gitignore index 5180999f..f229b066 100644 --- a/.gitignore +++ b/.gitignore @@ -30,5 +30,14 @@ yarn-error.log* bin/ build/ +# Vue distributable files /frontend/dist/* !/frontend/dist/.gitkeep + +# Playwright files +/frontend/test-results/ +/frontend/playwright-report/ +/frontend/playwright/.cache/ + +default.nix +Dockerfile.dev diff --git a/files/file.go b/files/file.go index 4d7c8f9f..cffccf66 100644 --- a/files/file.go +++ b/files/file.go @@ -9,12 +9,14 @@ import ( "hash" "image" "io" + "io/fs" "log" "mime" "net/http" "os" "path" "path/filepath" + "regexp" "strings" "time" @@ -27,6 +29,11 @@ import ( const PermFile = 0644 const PermDir = 0755 +var ( + reSubDirs = regexp.MustCompile("(?i)^sub(s|titles)$") + reSubExts = regexp.MustCompile("(?i)(.vtt|.srt|.ass|.ssa)$") +) + // FileInfo describes a file. type FileInfo struct { *Listing @@ -277,8 +284,8 @@ func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error { return nil } -func calculateImageResolution(fs afero.Fs, filePath string) (*ImageResolution, error) { - file, err := fs.Open(filePath) +func calculateImageResolution(fs_ afero.Fs, filePath string) (*ImageResolution, error) { + file, err := fs_.Open(filePath) if err != nil { return nil, err } @@ -343,12 +350,45 @@ func (i *FileInfo) detectSubtitles() { base := strings.TrimSuffix(i.Name, ext) for _, f := range dir { - if !f.IsDir() && strings.HasPrefix(f.Name(), base) && strings.HasSuffix(f.Name(), ".vtt") { - i.Subtitles = append(i.Subtitles, path.Join(parentDir, f.Name())) + // load all supported subtitles from subs directories + // should cover all instances of subtitle distributions + // like tv-shows with multiple episodes in single dir + if f.IsDir() && reSubDirs.MatchString(f.Name()) { + subsDir := path.Join(parentDir, f.Name()) + i.loadSubtitles(subsDir, base, true) + } else if isSubtitleMatch(f, base) { + i.addSubtitle(path.Join(parentDir, f.Name())) } } } +func (i *FileInfo) loadSubtitles(subsPath, baseName string, recursive bool) { + dir, err := afero.ReadDir(i.Fs, subsPath) + if err == nil { + for _, f := range dir { + if isSubtitleMatch(f, "") { + i.addSubtitle(path.Join(subsPath, f.Name())) + } else if f.IsDir() && recursive && strings.HasPrefix(f.Name(), baseName) { + subsDir := path.Join(subsPath, f.Name()) + i.loadSubtitles(subsDir, baseName, false) + } + } + } +} + +func IsSupportedSubtitle(fileName string) bool { + return reSubExts.MatchString(fileName) +} + +func isSubtitleMatch(f fs.FileInfo, baseName string) bool { + return !f.IsDir() && strings.HasPrefix(f.Name(), baseName) && + IsSupportedSubtitle(f.Name()) +} + +func (i *FileInfo) addSubtitle(path_ string) { + i.Subtitles = append(i.Subtitles, path_) +} + func (i *FileInfo) readListing(checker rules.Checker, readHeader bool) error { afs := &afero.Afero{Fs: i.Fs} dir, err := afs.ReadDir(i.Path) diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json index 743f1a01..db4f52bc 100644 --- a/frontend/.eslintrc.json +++ b/frontend/.eslintrc.json @@ -4,14 +4,21 @@ "node": true }, "extends": [ - "plugin:vue/essential", + "plugin:vue/vue3-essential", "eslint:recommended", + "@vue/eslint-config-typescript", "@vue/eslint-config-prettier" ], "rules": { "vue/multi-word-component-names": "off", - "vue/no-reserved-component-names": "warn", - "vue/no-mutating-props": "warn" + "vue/no-mutating-props": [ + "error", + { + "shallowOnly": true + } + ] + // no-undef is already included in + // @vue/eslint-config-typescript }, "parserOptions": { "ecmaVersion": "latest", diff --git a/frontend/index.html b/frontend/index.html index 7d0b8bc9..02c303ae 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -187,6 +187,6 @@ - + diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 0b3ec184..ce3dcc31 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,54 +1,66 @@ { "name": "filebrowser-frontend", - "version": "2.0.0", + "version": "3.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "filebrowser-frontend", - "version": "2.0.0", + "version": "3.0.0", "dependencies": { - "ace-builds": "^1.23.4", - "clipboard": "^2.0.11", - "core-js": "^3.32.0", - "css-vars-ponyfill": "^2.4.8", - "filesize": "^10.0.8", - "js-base64": "^3.7.5", - "lodash.clonedeep": "^4.5.0", - "lodash.throttle": "^4.1.1", - "material-icons": "^1.13.9", - "moment": "^2.29.4", + "@chenfengyuan/vue-number-input": "^2.0.1", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", + "ace-builds": "^1.32.9", + "core-js": "^3.36.1", + "dayjs": "^1.11.10", + "filesize": "^10.1.1", + "js-base64": "^3.7.7", + "jwt-decode": "^4.0.0", + "lodash-es": "^4.17.21", + "material-icons": "^1.13.12", "normalize.css": "^8.0.1", - "noty": "^3.2.0-beta", + "pinia": "^2.1.7", "pretty-bytes": "^6.1.1", - "qrcode.vue": "^1.7.0", - "tus-js-client": "^3.1.1", + "qrcode.vue": "^3.4.1", + "tus-js-client": "^4.1.0", "utif": "^3.1.0", - "vue": "^2.7.14", - "vue-async-computed": "^3.9.0", - "vue-i18n": "^8.28.2", - "vue-lazyload": "^1.3.5", - "vue-router": "^3.6.5", - "vue-simple-progress": "^1.1.1", - "vuex": "^3.6.2", - "vuex-router-sync": "^5.0.0", - "whatwg-fetch": "^3.6.17" + "video.js": "^8.10.0", + "videojs-hotkeys": "^0.2.28", + "videojs-mobile-ui": "^1.1.1", + "vue": "^3.4.21", + "vue-final-modal": "^4.5.4", + "vue-i18n": "^9.10.2", + "vue-lazyload": "^3.0.0", + "vue-router": "^4.3.0", + "vue-toastification": "^2.0.0-rc.5" }, "devDependencies": { - "@vitejs/plugin-legacy": "^4.1.1", - "@vitejs/plugin-vue2": "^2.2.0", - "@vue/eslint-config-prettier": "^8.0.0", - "autoprefixer": "^10.4.14", - "eslint": "^8.46.0", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-vue": "^9.16.1", - "jsdom": "^22.1.0", - "postcss": "^8.4.31", - "prettier": "^3.0.1", - "terser": "^5.19.2", - "vite": "^4.5.2", - "vite-plugin-compression2": "^0.10.3", - "vite-plugin-rewrite-all": "^1.0.1" + "@intlify/unplugin-vue-i18n": "^4.0.0", + "@playwright/test": "^1.42.1", + "@types/lodash-es": "^4.17.12", + "@types/node": "^20.12.2", + "@typescript-eslint/eslint-plugin": "^7.4.0", + "@vitejs/plugin-legacy": "^5.3.2", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/eslint-config-prettier": "^9.0.0", + "@vue/eslint-config-typescript": "^13.0.0", + "autoprefixer": "^10.4.19", + "concurrently": "^8.2.2", + "eslint": "^8.57.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-vue": "^9.24.0", + "jsdom": "^24.0.0", + "postcss": "^8.4.38", + "prettier": "^3.2.5", + "terser": "^5.30.0", + "vite": "^5.2.7", + "vite-plugin-compression2": "^1.0.0", + "vue-tsc": "^2.0.7" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=7.0.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -61,60 +73,60 @@ } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz", - "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.10", - "@babel/generator": "^7.22.10", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helpers": "^7.22.10", - "@babel/parser": "^7.22.10", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", + "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { @@ -125,15 +137,24 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -153,26 +174,26 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.10.tgz", - "integrity": "sha512-Av0qubwDQxC56DoUReVDeLfMEjYYSN1nZrTUrWkXd7hpU73ymRANkbuDm3yni9npkn+RXy9nNbEJZEzXr7xrfQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.10" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz", - "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -180,18 +201,27 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.10.tgz", - "integrity": "sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", + "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", "semver": "^6.3.1" @@ -203,10 +233,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz", - "integrity": "sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", @@ -220,10 +259,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", + "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -271,40 +319,40 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", - "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", - "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-simple-access": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -326,23 +374,23 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz", - "integrity": "sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -352,13 +400,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", - "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", + "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.23.0", "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { @@ -405,9 +453,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -423,60 +471,61 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz", - "integrity": "sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz", - "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", "dev": true, "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.10", - "@babel/types": "^7.22.10" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -485,12 +534,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", - "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", + "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -500,14 +549,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", - "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", + "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.5" + "@babel/plugin-transform-optional-chaining": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -516,6 +565,22 @@ "@babel/core": "^7.13.0" } }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", + "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0-placeholder-for-preset-env.2", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", @@ -592,12 +657,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", + "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -607,12 +672,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", + "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -764,12 +829,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", + "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -779,14 +844,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.10.tgz", - "integrity": "sha512-eueE8lvKVzq5wIObKK/7dvoeKJ+xc6TvRn6aysIjS6pSCeLy7S/eVi7pEQknZqyqvzaNKdDtem8nUNTBgDVR2g==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", + "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -797,14 +862,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", + "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" + "@babel/helper-module-imports": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -814,12 +879,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", + "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -829,12 +894,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.10.tgz", - "integrity": "sha512-1+kVpGAOOI1Albt6Vse7c8pHzcZQdQKW+wJH+g8mCaszOdDVwRXa/slHPqIw+oJAJANTKDMuM2cBdV0Dg618Vg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", + "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -844,13 +909,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", + "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -860,13 +925,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", - "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", + "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -877,18 +942,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", - "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", + "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, @@ -900,13 +964,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", + "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/template": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -916,12 +980,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.10.tgz", - "integrity": "sha512-dPJrL0VOyxqLM9sritNbMSGx/teueHF/htMKrPT7DNxccXxRDPYqlgPFFdr8u+F+qUZOkZoXue/6rL5O5GduEw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", + "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -931,13 +995,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", + "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -947,12 +1011,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", + "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -962,12 +1026,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", - "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", + "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -978,13 +1042,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", + "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -994,12 +1058,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", - "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", + "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1010,12 +1074,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", - "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", + "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1025,14 +1090,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", + "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1042,12 +1107,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", - "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", + "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1058,12 +1123,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", + "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1073,12 +1138,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", - "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", + "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1089,12 +1154,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", + "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1104,13 +1169,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", - "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", + "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1120,13 +1185,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", - "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", + "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-simple-access": "^7.22.5" }, "engines": { @@ -1137,15 +1202,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", - "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", + "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1155,13 +1220,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", + "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1187,12 +1252,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", + "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1202,12 +1267,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", - "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", + "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1218,12 +1283,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", - "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", + "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1234,16 +1299,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", - "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", + "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.5" + "@babel/plugin-transform-parameters": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1253,13 +1317,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", + "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-replace-supers": "^7.24.1" }, "engines": { "node": ">=6.9.0" @@ -1269,12 +1333,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", - "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", + "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1285,12 +1349,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.10.tgz", - "integrity": "sha512-MMkQqZAZ+MGj+jGTG3OTuhKeBpNcO+0oCEbrGNEaOmiEn+1MzRyQlYsruGiU8RTK3zV6XwrVJTmwiDOyYK6J9g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", + "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1302,12 +1366,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", - "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", + "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1317,13 +1381,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", + "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1333,14 +1397,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", - "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", + "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1351,12 +1415,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", + "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1366,12 +1430,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", + "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1382,12 +1446,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", + "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1397,12 +1461,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", + "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1412,12 +1476,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", + "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { @@ -1428,12 +1492,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", + "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1443,12 +1507,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", + "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1458,12 +1522,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", + "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1473,12 +1537,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", + "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1488,13 +1552,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", + "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1504,13 +1568,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", + "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1520,13 +1584,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", + "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -1536,25 +1600,26 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.10.tgz", - "integrity": "sha512-riHpLb1drNkpLlocmSyEg4oYJIQFeXAK/d7rI6mbD0XsvoTOOweXDmQPG/ErxsEhWk3rl3Q/3F6RFQlVFS8m0A==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", + "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.10", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/compat-data": "^7.24.1", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-assertions": "^7.24.1", + "@babel/plugin-syntax-import-attributes": "^7.24.1", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1566,59 +1631,58 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.10", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.10", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.5", - "@babel/plugin-transform-classes": "^7.22.6", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.10", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.5", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.5", - "@babel/plugin-transform-for-of": "^7.22.5", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.5", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.5", - "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-arrow-functions": "^7.24.1", + "@babel/plugin-transform-async-generator-functions": "^7.24.3", + "@babel/plugin-transform-async-to-generator": "^7.24.1", + "@babel/plugin-transform-block-scoped-functions": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.1", + "@babel/plugin-transform-class-properties": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.1", + "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-computed-properties": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-dotall-regex": "^7.24.1", + "@babel/plugin-transform-duplicate-keys": "^7.24.1", + "@babel/plugin-transform-dynamic-import": "^7.24.1", + "@babel/plugin-transform-exponentiation-operator": "^7.24.1", + "@babel/plugin-transform-export-namespace-from": "^7.24.1", + "@babel/plugin-transform-for-of": "^7.24.1", + "@babel/plugin-transform-function-name": "^7.24.1", + "@babel/plugin-transform-json-strings": "^7.24.1", + "@babel/plugin-transform-literals": "^7.24.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", + "@babel/plugin-transform-member-expression-literals": "^7.24.1", + "@babel/plugin-transform-modules-amd": "^7.24.1", + "@babel/plugin-transform-modules-commonjs": "^7.24.1", + "@babel/plugin-transform-modules-systemjs": "^7.24.1", + "@babel/plugin-transform-modules-umd": "^7.24.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", - "@babel/plugin-transform-numeric-separator": "^7.22.5", - "@babel/plugin-transform-object-rest-spread": "^7.22.5", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.10", - "@babel/plugin-transform-parameters": "^7.22.5", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.5", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.24.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", + "@babel/plugin-transform-numeric-separator": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-super": "^7.24.1", + "@babel/plugin-transform-optional-catch-binding": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.1", + "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-private-methods": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-property-literals": "^7.24.1", + "@babel/plugin-transform-regenerator": "^7.24.1", + "@babel/plugin-transform-reserved-words": "^7.24.1", + "@babel/plugin-transform-shorthand-properties": "^7.24.1", + "@babel/plugin-transform-spread": "^7.24.1", + "@babel/plugin-transform-sticky-regex": "^7.24.1", + "@babel/plugin-transform-template-literals": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-unicode-escapes": "^7.24.1", + "@babel/plugin-transform-unicode-property-regex": "^7.24.1", + "@babel/plugin-transform-unicode-regex": "^7.24.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.10", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1629,6 +1693,15 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -1650,10 +1723,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.10.tgz", - "integrity": "sha512-21t/fkKLMZI4pqP2wlmsQAWnYW1PDyKyyUV4vCi+B25ydmdaYTKXPwCj0BzSUnZf4seIiYvSA3jcZ3gdsMFkLQ==", - "dev": true, + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1661,41 +1733,35 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime/node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", + "@babel/parser": "^7.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -1703,12 +1769,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -1716,10 +1782,34 @@ "node": ">=6.9.0" } }, + "node_modules/@chenfengyuan/vue-number-input": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@chenfengyuan/vue-number-input/-/vue-number-input-2.0.1.tgz", + "integrity": "sha512-/jqmfmFulFOGlozts0Sf2GCESMRYVTfZZSz2Tf4n9O5DKjqMi5B/MfRzm5H5A57WuG3L80yXFWFN+XeACKaIhQ==", + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -1733,9 +1823,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -1749,9 +1839,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -1765,9 +1855,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -1781,9 +1871,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -1797,9 +1887,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -1813,9 +1903,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -1829,9 +1919,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -1845,9 +1935,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -1861,9 +1951,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -1877,9 +1967,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -1893,9 +1983,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -1909,9 +1999,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -1925,9 +2015,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -1941,9 +2031,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -1957,9 +2047,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -1973,9 +2063,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -1989,9 +2079,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -2005,9 +2095,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -2021,9 +2111,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -2037,9 +2127,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -2053,9 +2143,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -2083,31 +2173,19 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz", - "integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -2127,10 +2205,20 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2142,29 +2230,63 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.46.0.tgz", - "integrity": "sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -2179,63 +2301,170 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@intlify/bundle-utils": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-8.0.0.tgz", + "integrity": "sha512-1B++zykRnMwQ+20SpsZI1JCnV/YJt9Oq7AGlEurzkWJOFtFAVqaGc/oV36PBRYeiKnTbY9VYfjBimr2Vt42wLQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@intlify/message-compiler": "^9.4.0", + "@intlify/shared": "^9.4.0", + "acorn": "^8.8.2", + "escodegen": "^2.1.0", + "estree-walker": "^2.0.2", + "jsonc-eslint-parser": "^2.3.0", + "mlly": "^1.2.0", + "source-map-js": "^1.0.1", + "yaml-eslint-parser": "^1.2.2" + }, + "engines": { + "node": ">= 14.16" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + } + } + }, + "node_modules/@intlify/core-base": { + "version": "9.10.2", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.10.2.tgz", + "integrity": "sha512-HGStVnKobsJL0DoYIyRCGXBH63DMQqEZxDUGrkNI05FuTcruYUtOAxyL3zoAZu/uDGO6mcUvm3VXBaHG2GdZCg==", + "dependencies": { + "@intlify/message-compiler": "9.10.2", + "@intlify/shared": "9.10.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.10.2", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.10.2.tgz", + "integrity": "sha512-ntY/kfBwQRtX5Zh6wL8cSATujPzWW2ZQd1QwKyWwAy5fMqJyyixHMeovN4fmEyCqSu+hFfYOE63nU94evsy4YA==", + "dependencies": { + "@intlify/shared": "9.10.2", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.10.2", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.10.2.tgz", + "integrity": "sha512-ttHCAJkRy7R5W2S9RVnN9KYQYPIpV2+GiS79T4EE37nrPyH6/1SrOh3bmdCRC1T3ocL8qCDx7x2lBJ0xaITU7Q==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/unplugin-vue-i18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-4.0.0.tgz", + "integrity": "sha512-q2Mhqa/mLi0tulfLFO4fMXXvEbkSZpI5yGhNNsLTNJJ41icEGUuyDe+j5zRZIKSkOJRgX6YbCyibTDJdRsukmw==", + "dev": true, + "dependencies": { + "@intlify/bundle-utils": "^8.0.0", + "@intlify/shared": "^9.4.0", + "@rollup/pluginutils": "^5.1.0", + "@vue/compiler-sfc": "^3.2.47", + "debug": "^4.3.3", + "fast-glob": "^3.2.12", + "js-yaml": "^4.1.0", + "json5": "^2.2.3", + "pathe": "^1.0.0", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2", + "unplugin": "^1.1.0" + }, + "engines": { + "node": ">= 14.16" + }, + "peerDependencies": { + "petite-vue-i18n": "*", + "vue-i18n": "*", + "vue-i18n-bridge": "*" + }, + "peerDependenciesMeta": { + "petite-vue-i18n": { + "optional": true + }, + "vue-i18n": { + "optional": true + }, + "vue-i18n-bridge": { + "optional": true + } + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2277,19 +2506,11 @@ "node": ">= 8" } }, - "node_modules/@pkgr/utils": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.3.0", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.6.0" - }, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, @@ -2297,99 +2518,25 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/@pkgr/utils/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "node_modules/@playwright/test": { + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.42.1.tgz", + "integrity": "sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ==", "dev": true, "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@pkgr/utils/node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@pkgr/utils/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@pkgr/utils/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@pkgr/utils/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@pkgr/utils/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" + "playwright": "1.42.1" }, "bin": { - "node-which": "bin/node-which" + "playwright": "cli.js" }, "engines": { - "node": ">= 8" + "node": ">=16" } }, "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -2400,7 +2547,7 @@ "node": ">=14.0.0" }, "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { @@ -2408,94 +2555,631 @@ } } }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/eslint": { - "version": "8.44.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.1.tgz", - "integrity": "sha512-XpNDc4Z5Tb4x+SW1MriMVeIsMoONHCkWFMkR/aPJbzEsxqHy+4Glu/BqTdPrApfDeMaXbtNh6bseNgl5KaWrSg==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", + "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", + "cpu": [ + "arm" + ], "dev": true, "optional": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", + "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", + "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", + "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", + "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", + "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", + "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", + "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "cpu": [ + "ppc64le" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", + "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", + "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", + "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", + "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", + "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", + "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", + "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true, - "optional": true, - "peer": true + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true }, - "node_modules/@types/node": { - "version": "20.4.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.8.tgz", - "integrity": "sha512-0mHckf6D2DiIAzh8fM8f3HQCvMKDpK94YQ0DSVkfWTG9BZleYIWudw9cJxX8oCk9bM+vAkDyujDV6dmKHbvQpg==", - "dev": true, - "optional": true, - "peer": true + "node_modules/@types/lodash": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", + "dev": true }, - "node_modules/@vitejs/plugin-legacy": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-4.1.1.tgz", - "integrity": "sha512-um3gbVouD2Q/g19C0qpDfHwveXDCAHzs8OC3e9g6aXpKoD1H14himgs7wkMnhAynBJy7QqUoZNAXDuqN8zLR2g==", + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "dev": true, "dependencies": { - "@babel/core": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "browserslist": "^4.21.9", - "core-js": "^3.31.1", - "magic-string": "^0.30.1", - "regenerator-runtime": "^0.13.11", - "systemjs": "^6.14.1" + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "20.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz", + "integrity": "sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz", + "integrity": "sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.4.0", + "@typescript-eslint/type-utils": "7.4.0", + "@typescript-eslint/utils": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz", + "integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.4.0", + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/typescript-estree": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz", + "integrity": "sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz", + "integrity": "sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.4.0", + "@typescript-eslint/utils": "7.4.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.4.0.tgz", + "integrity": "sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz", + "integrity": "sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/visitor-keys": "7.4.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.4.0.tgz", + "integrity": "sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.4.0", + "@typescript-eslint/types": "7.4.0", + "@typescript-eslint/typescript-estree": "7.4.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz", + "integrity": "sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.4.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@videojs/http-streaming": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.10.0.tgz", + "integrity": "sha512-Lf1rmhTalV4Gw0bJqHmH4lfk/FlepUDs9smuMtorblAYnqDlE2tbUOb7sBXVYoXGdbWbdTW8jH2cnS+6HWYJ4Q==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "4.0.0", + "aes-decrypter": "4.0.1", + "global": "^4.4.0", + "m3u8-parser": "^7.1.0", + "mpd-parser": "^1.3.0", + "mux.js": "7.0.2", + "video.js": "^7 || ^8" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "video.js": "^7 || ^8" + } + }, + "node_modules/@videojs/http-streaming/node_modules/mux.js": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.0.2.tgz", + "integrity": "sha512-CM6+QuyDbc0qW1OfEjkd2+jVKzTXF+z5VOKH0eZxtZtnrG/ilkW/U7l7IXGtBNLASF9sKZMcK1u669cq50Qq0A==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + }, + "bin": { + "muxjs-transmux": "bin/transmux.js" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/@videojs/vhs-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz", + "integrity": "sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/@videojs/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "global": "~4.4.0", + "is-function": "^1.0.1" + } + }, + "node_modules/@vitejs/plugin-legacy": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-legacy/-/plugin-legacy-5.3.2.tgz", + "integrity": "sha512-8moCOrIMaZ/Rjln0Q6GsH6s8fAt1JOI3k8nmfX4tXUxE5KAExVctSyOBk+A25GClsdSWqIk2yaUthH3KJ2X4tg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/preset-env": "^7.23.9", + "browserslist": "^4.23.0", + "browserslist-to-esbuild": "^2.1.1", + "core-js": "^3.36.0", + "magic-string": "^0.30.7", + "regenerator-runtime": "^0.14.1", + "systemjs": "^6.14.3" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "peerDependencies": { "terser": "^5.4.0", - "vite": "^4.0.0" + "vite": "^5.0.0" } }, - "node_modules/@vitejs/plugin-vue2": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue2/-/plugin-vue2-2.2.0.tgz", - "integrity": "sha512-1km7zEuZ/9QRPvzXSjikbTYGQPG86Mq1baktpC4sXqsXlb02HQKfi+fl8qVS703JM7cgm24Ga9j+RwKmvFn90A==", + "node_modules/@vitejs/plugin-vue": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", + "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", "dev": true, "engines": { - "node": "^14.18.0 || >= 16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0", - "vue": "^2.7.0-0" + "vite": "^5.0.0", + "vue": "^3.2.25" } }, - "node_modules/@vue/eslint-config-prettier": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-8.0.0.tgz", - "integrity": "sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg==", + "node_modules/@volar/language-core": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.1.6.tgz", + "integrity": "sha512-pAlMCGX/HatBSiDFMdMyqUshkbwWbLxpN/RL7HCQDOo2gYBE+uS+nanosLc1qR6pTQ/U8q00xt8bdrrAFPSC0A==", "dev": true, "dependencies": { - "eslint-config-prettier": "^8.8.0", + "@volar/source-map": "2.1.6" + } + }, + "node_modules/@volar/source-map": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.1.6.tgz", + "integrity": "sha512-TeyH8pHHonRCHYI91J7fWUoxi0zWV8whZTVRlsWHSYfjm58Blalkf9LrZ+pj6OiverPTmrHRkBsG17ScQyWECw==", + "dev": true, + "dependencies": { + "muggle-string": "^0.4.0" + } + }, + "node_modules/@volar/typescript": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.1.6.tgz", + "integrity": "sha512-JgPGhORHqXuyC3r6skPmPHIZj4LoMmGlYErFTuPNBq9Nhc9VTv7ctHY7A3jMN3ngKEfRrfnUcwXHztvdSQqNfw==", + "dev": true, + "dependencies": { + "@volar/language-core": "2.1.6", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.21.tgz", + "integrity": "sha512-MjXawxZf2SbZszLPYxaFCjxfibYrzr3eYbKxwpLR9EQN+oaziSu3qKVbwBERj1IFIB8OLUewxB5m/BFzi613og==", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/shared": "3.4.21", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.21.tgz", + "integrity": "sha512-IZC6FKowtT1sl0CR5DpXSiEB5ayw75oT2bma1BEhV7RRR1+cfwLrxc2Z8Zq/RGFzJ8w5r9QtCOvTjQgdn0IKmA==", + "dependencies": { + "@vue/compiler-core": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.21.tgz", + "integrity": "sha512-me7epoTxYlY+2CUM7hy9PCDdpMPfIwrOvAXud2Upk10g4YLv9UBW7kL798TvMeDhPthkZ0CONNrK2GoeI1ODiQ==", + "dependencies": { + "@babel/parser": "^7.23.9", + "@vue/compiler-core": "3.4.21", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.7", + "postcss": "^8.4.35", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.21.tgz", + "integrity": "sha512-M5+9nI2lPpAsgXOGQobnIueVqc9sisBFexh5yMIMRAPYLa7+5wEJs8iqOZc1WAa9WQbx9GR2twgznU8LTIiZ4Q==", + "dependencies": { + "@vue/compiler-dom": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz", + "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==" + }, + "node_modules/@vue/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==", + "dev": true, + "dependencies": { + "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0" }, "peerDependencies": { @@ -2503,21 +3187,287 @@ "prettier": ">= 3.0.0" } }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", - "dev": true + "node_modules/@vue/eslint-config-typescript": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", + "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^7.1.1", + "@typescript-eslint/parser": "^7.1.1", + "vue-eslint-parser": "^9.3.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "peerDependencies": { + "eslint": "^8.56.0", + "eslint-plugin-vue": "^9.0.0", + "typescript": ">=4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.7.tgz", + "integrity": "sha512-Vh1yZX3XmYjn9yYLkjU8DN6L0ceBtEcapqiyclHne8guG84IaTzqtvizZB1Yfxm3h6m7EIvjerLO5fvOZO6IIQ==", + "dev": true, + "dependencies": { + "@volar/language-core": "~2.1.3", + "@vue/compiler-dom": "^3.4.0", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.21.tgz", + "integrity": "sha512-UhenImdc0L0/4ahGCyEzc/pZNwVgcglGy9HVzJ1Bq2Mm9qXOpP8RyNTjookw/gOCUlXSEtuZ2fUg5nrHcoqJcw==", + "dependencies": { + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.21.tgz", + "integrity": "sha512-pQthsuYzE1XcGZznTKn73G0s14eCJcjaLvp3/DKeYWoFacD9glJoqlNBxt3W2c5S40t6CCcpPf+jG01N3ULyrA==", + "dependencies": { + "@vue/reactivity": "3.4.21", + "@vue/shared": "3.4.21" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.21.tgz", + "integrity": "sha512-gvf+C9cFpevsQxbkRBS1NpU8CqxKw0ebqMvLwcGQrNpx6gqRDodqKqA+A2VZZpQ9RpK2f9yfg8VbW/EpdFUOJw==", + "dependencies": { + "@vue/runtime-core": "3.4.21", + "@vue/shared": "3.4.21", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.21.tgz", + "integrity": "sha512-aV1gXyKSN6Rz+6kZ6kr5+Ll14YzmIbeuWe7ryJl5muJ4uwSwY/aStXTixx76TwkZFJLm1aAlA/HSWEJ4EyiMkg==", + "dependencies": { + "@vue/compiler-ssr": "3.4.21", + "@vue/shared": "3.4.21" + }, + "peerDependencies": { + "vue": "3.4.21" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.21.tgz", + "integrity": "sha512-PuJe7vDIi6VYSinuEbUIQgMIRZGgM8e4R+G+/dQTk0X1NEdvgvvgv7m+rfmDH1gZzyA1OjjoWskvHlfRNfQf3g==" + }, + "node_modules/@vueuse/core": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.9.0.tgz", + "integrity": "sha512-/1vjTol8SXnx6xewDEKfS0Ra//ncg4Hb0DaZiwKf7drgfMsKFExQ+FnnENcN6efPen+1kIzhLQoGSy0eDUVOMg==", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.9.0.tgz", + "integrity": "sha512-acK+A01AYdWSvL4BZmCoJAcyHJ6EqhmkQEXbQLwev1MY7NBnS+hcEMx/BzVoR9zKI+UqEPMD9u6PsyAuiTRT4Q==", + "dependencies": { + "@vueuse/core": "10.9.0", + "@vueuse/shared": "10.9.0", + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "sortablejs": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.9.0.tgz", + "integrity": "sha512-iddNbg3yZM0X7qFY2sAotomgdHK7YJ6sKUvQqbvwnf7TmaVPxS4EJydcNsVejNdS8iWCtDk+fYXr7E32nyTnGA==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.9.0.tgz", + "integrity": "sha512-Uud2IWncmAfJvRaFYzv5OHDli+FbOzxiVEQdLCKQKLyhz94PIyFC3CHcH7EDMwIn8NPtD06+PNbC/PiO0LGLtw==", + "dependencies": { + "vue-demi": ">=0.14.7" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "engines": { + "node": ">=10.0.0" + } }, "node_modules/ace-builds": { - "version": "1.23.4", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.23.4.tgz", - "integrity": "sha512-a4hKAT2T7KNUQC4LQPW2peuoEsZmLYTn4Dwjkh26A3Z+fQ8/fA2JZNs3V6CqvivhbyMQXQJD1u/0qTCoSS6deA==" + "version": "1.32.9", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.9.tgz", + "integrity": "sha512-dqBLPj//Gq0b92YUtRIsdWsORf4J+4xW3r8/4Wr2Vqid7O1j7YBV/ZsVvWBjZFy+EnvMCRFCFOEIM1cbt4BQ/g==" }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2535,16 +3485,41 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, + "node_modules/aes-decrypter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.1.tgz", + "integrity": "sha512-H1nh/P9VZXUf17AA5NQfJML88CFjVBDuGkp5zDHa7oEhYN9TTpNLJknRY1ie0iSKWlDf6JRnJKaZVDSQdPy6Cg==", "dependencies": { - "debug": "4" + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "node_modules/aes-decrypter/node_modules/@videojs/vhs-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", + "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" }, "engines": { - "node": ">= 6.0.0" + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" } }, "node_modules/ajv": { @@ -2584,12 +3559,34 @@ "node": ">=4" } }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2597,9 +3594,9 @@ "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "dev": true, "funding": [ { @@ -2609,12 +3606,16 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -2629,40 +3630,55 @@ "postcss": "^8.1.0" } }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true + }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", + "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", + "@babel/helper-define-polyfill-provider": "^0.6.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", + "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" + "@babel/helper-define-polyfill-provider": "^0.6.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -2671,15 +3687,26 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "node_modules/bare-events": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz", + "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==", + "dev": true, + "optional": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { - "node": ">=0.6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/boolbase": { @@ -2688,26 +3715,13 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", "dev": true }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -2722,10 +3736,25 @@ "node": ">=8" } }, + "node_modules/browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", + "dev": true, + "dependencies": { + "pako": "~0.2.0" + } + }, + "node_modules/browserify-zlib/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "dev": true + }, "node_modules/browserslist": { - "version": "4.21.10", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", - "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -2742,10 +3771,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2754,30 +3783,42 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/browserslist-to-esbuild": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/browserslist-to-esbuild/-/browserslist-to-esbuild-2.1.1.tgz", + "integrity": "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw==", + "dev": true, + "dependencies": { + "meow": "^13.0.0" + }, + "bin": { + "browserslist-to-esbuild": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "browserslist": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "dependencies": { - "run-applescript": "^5.0.0" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001519", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001519.tgz", - "integrity": "sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==", + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", "dev": true, "funding": [ { @@ -2808,14 +3849,54 @@ "node": ">=4" } }, - "node_modules/clipboard": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", - "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "dependencies": { - "good-listener": "^1.2.2", - "select": "^1.1.2", - "tiny-emitter": "^2.0.0" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/color-convert": { @@ -2860,31 +3941,140 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/connect-history-api-fallback": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/concurrently/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concurrently/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=0.8" + "node": ">=8" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/core-js": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", - "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz", + "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -2892,25 +4082,36 @@ } }, "node_modules/core-js-compat": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", - "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", + "version": "3.36.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", + "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", "dev": true, "dependencies": { - "browserslist": "^4.21.9" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/css-vars-ponyfill": { - "version": "2.4.8", - "resolved": "https://registry.npmjs.org/css-vars-ponyfill/-/css-vars-ponyfill-2.4.8.tgz", - "integrity": "sha512-4/j4AX4htytYHWyHVZ2BFQ+NoCGZEcOH2h4/2mmgE4SkrFg4Xq6tGYR77DtvvUIDsaXuJN+sj41bbgauA0Gfmg==", + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.2", - "get-css-data": "^2.0.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, "node_modules/cssesc": { @@ -2926,21 +4127,21 @@ } }, "node_modules/cssstyle": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz", - "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-4.0.1.tgz", + "integrity": "sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==", "dev": true, "dependencies": { "rrweb-cssom": "^0.6.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/custom-error-instance": { "version": "2.1.1", @@ -2948,19 +4149,45 @@ "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==" }, "node_modules/data-urls": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz", - "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", "dev": true, "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.0" + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2990,221 +4217,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dev": true, - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/default-browser/node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/default-browser/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/default-browser/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-browser/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-browser/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/default-browser/node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3214,10 +4226,17 @@ "node": ">=0.4.0" } }, - "node_modules/delegate": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/doctrine": { "version": "3.0.0", @@ -3231,29 +4250,48 @@ "node": ">=6.0.0" } }, - "node_modules/domexception": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", - "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, "node_modules/electron-to-chromium": { - "version": "1.4.487", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.487.tgz", - "integrity": "sha512-XbCRs/34l31np/p33m+5tdBrdXu9jJkZxSbNxj5I0H1KtV2ZMSB+i/HYqDiRzHaFx2T5EdytjoBRe8QRJE2vQg==", + "version": "1.4.722", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.722.tgz", + "integrity": "sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ==", "dev": true }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, "engines": { "node": ">=0.12" }, @@ -3262,9 +4300,9 @@ } }, "node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, "bin": { @@ -3274,34 +4312,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -3316,19 +4355,41 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, "node_modules/eslint": { - "version": "8.46.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.46.0.tgz", - "integrity": "sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.1", - "@eslint/js": "^8.46.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -3336,7 +4397,7 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.2", + "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", @@ -3371,9 +4432,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -3383,23 +4444,24 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", - "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", "dev": true, "dependencies": { "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.5" + "synckit": "^0.8.6" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/prettier" + "url": "https://opencollective.com/eslint-plugin-prettier" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", + "eslint-config-prettier": "*", "prettier": ">=3.0.0" }, "peerDependenciesMeta": { @@ -3412,17 +4474,18 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.16.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.16.1.tgz", - "integrity": "sha512-2FtnTqazA6aYONfDuOZTk0QzwhAwi7Z4+uJ7+GHeGxcKapjqWlDsRWDenvyG/utyOfAS5bVRmAG3cEWiYEz2bA==", + "version": "9.24.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.24.0.tgz", + "integrity": "sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.13", - "semver": "^7.5.4", - "vue-eslint-parser": "^9.3.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.0", + "vue-eslint-parser": "^9.4.2", "xml-name-validator": "^4.0.0" }, "engines": { @@ -3432,38 +4495,48 @@ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/eslint-plugin-vue/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/eslint-plugin-vue/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { - "yallist": "^4.0.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=10" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-vue/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-vue/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", @@ -3480,6 +4553,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3514,20 +4597,6 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -3540,63 +4609,10 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3617,79 +4633,16 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" + "node": "*" } }, "node_modules/eslint/node_modules/supports-color": { @@ -3704,21 +4657,6 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -3736,16 +4674,17 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">=4" } }, "node_modules/esquery": { @@ -3760,15 +4699,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -3781,7 +4711,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -3793,8 +4723,7 @@ "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, "node_modules/esutils": { "version": "2.0.3", @@ -3817,10 +4746,16 @@ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3858,9 +4793,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -3879,9 +4814,9 @@ } }, "node_modules/filesize": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.0.8.tgz", - "integrity": "sha512-/ylBrxZ1GAjgh2CEemKKLwTtmXfWqTtN1jRl6iqLwnMEucUX5cmaCCUPGstQOHVCcK9uYL6o1cPNakLQU2sasQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.1.tgz", + "integrity": "sha512-L0cdwZrKlwZQkMSFnCflJ6J2Y+5egO/p3vgRSDQGxQt++QbUZe5gMbRO6kg6gzwQDPvq2Fk9AmoxUNfZ5gdqaQ==", "engines": { "node": ">= 10.4.0" } @@ -3898,13 +4833,30 @@ "node": ">=8" } }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -3912,11 +4864,19 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dependencies": { + "tabbable": "^6.2.0" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -3932,16 +4892,16 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fs.realpath": { @@ -3965,10 +4925,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gensync": { "version": "1.0.0-beta.2", @@ -3979,10 +4942,14 @@ "node": ">=6.9.0" } }, - "node_modules/get-css-data": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-css-data/-/get-css-data-2.1.0.tgz", - "integrity": "sha512-HtPrzGk8aBF9rLeQNuImcXci7YVqsMEKzVflEWaCJu25ehxyDNiZRWoSxqSFUBfma8LERqKo70t/TcaGjIsM9g==" + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, "node_modules/glob": { "version": "7.2.3", @@ -4016,6 +4983,37 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -4025,12 +5023,24 @@ "node": ">=4" } }, - "node_modules/good-listener": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", - "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { - "delegate": "^3.1.2" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/graceful-fs": { @@ -4044,16 +5054,21 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/gunzip-maybe": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", + "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", "dev": true, "dependencies": { - "function-bind": "^1.1.1" + "browserify-zlib": "^0.1.4", + "is-deflate": "^1.0.0", + "is-gzip": "^1.0.0", + "peek-stream": "^1.1.0", + "pumpify": "^1.3.3", + "through2": "^2.0.3" }, - "engines": { - "node": ">= 0.4.0" + "bin": { + "gunzip-maybe": "bin.js" } }, "node_modules/has-flag": { @@ -4065,52 +5080,63 @@ "node": ">=4" } }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", - "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { - "whatwg-encoding": "^2.0.0" + "function-bind": "^1.1.2" }, "engines": { - "node": ">=12" + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" + "node": ">= 14" } }, "node_modules/iconv-lite": { @@ -4126,9 +5152,9 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -4159,6 +5185,11 @@ "node": ">=0.8.19" } }, + "node_modules/individual": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/individual/-/individual-2.0.0.tgz", + "integrity": "sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==" + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4175,32 +5206,35 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/is-deflate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", + "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", + "dev": true }, "node_modules/is-extglob": { "version": "2.1.1", @@ -4211,6 +5245,20 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -4223,37 +5271,13 @@ "node": ">=0.10.0" } }, - "node_modules/is-inside-container": { + "node_modules/is-gzip": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", + "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/is-number": { @@ -4280,18 +5304,23 @@ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4299,9 +5328,9 @@ "dev": true }, "node_modules/js-base64": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", - "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==" + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -4322,40 +5351,38 @@ } }, "node_modules/jsdom": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz", - "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==", + "version": "24.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-24.0.0.tgz", + "integrity": "sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==", "dev": true, "dependencies": { - "abab": "^2.0.6", - "cssstyle": "^3.0.0", - "data-urls": "^4.0.0", + "cssstyle": "^4.0.1", + "data-urls": "^5.0.0", "decimal.js": "^10.4.3", - "domexception": "^4.0.0", "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.4", + "nwsapi": "^2.2.7", "parse5": "^7.1.2", "rrweb-cssom": "^0.6.0", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", + "tough-cookie": "^4.1.3", + "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^12.0.1", - "ws": "^8.13.0", - "xml-name-validator": "^4.0.0" + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0", + "ws": "^8.16.0", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" }, "peerDependencies": { - "canvas": "^2.5.0" + "canvas": "^2.11.2" }, "peerDependenciesMeta": { "canvas": { @@ -4363,6 +5390,15 @@ } } }, + "node_modules/jsdom/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "engines": { + "node": ">=18" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -4375,6 +5411,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4399,6 +5441,52 @@ "node": ">=6" } }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", + "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", + "dev": true, + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", + "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", + "dev": true + }, + "node_modules/jwt-decode": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", + "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha512-ps3I9jAdNtRpJrbBvQjpzyFbss/skHqzS+eu4RxKLaEAtFqkjZaB6TZMSivPbLxf4K7VI4SjR0P5mRCX5+Q25A==" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4412,12 +5500,32 @@ "node": ">= 0.8.0" } }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, "node_modules/lodash._baseiteratee": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz", @@ -4458,11 +5566,6 @@ "lodash._basetostring": "~4.12.0" } }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -4498,11 +5601,34 @@ "yallist": "^3.0.2" } }, + "node_modules/m3u8-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.1.0.tgz", + "integrity": "sha512-7N+pk79EH4oLKPEYdgRXgAsKDyA/VCo0qCHlUwacttQA0WqsjZQYmNfywMvjlY9MpEBVZEt0jKFd73Kv15EBYQ==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0" + } + }, + "node_modules/m3u8-parser/node_modules/@videojs/vhs-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", + "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, "node_modules/magic-string": { - "version": "0.30.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.2.tgz", - "integrity": "sha512-lNZdu7pewtq/ZvWUp9Wpf/x7WzMTsR26TWV03BRZrXFsv+BI6dy8RAiKgm1uM/kyR0rCfUcqvOlXKG66KhIGug==", - "dev": true, + "version": "0.30.8", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", + "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -4511,15 +5637,21 @@ } }, "node_modules/material-icons": { - "version": "1.13.9", - "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.9.tgz", - "integrity": "sha512-dwuf2C8LR07FcrjRDx0vWnDEcHiDuamXOmtAck8bdONUv5Fi6wR/ubQwPfG1NbcqgPg+y0fHN8Unj5DO+5fV4w==" + "version": "1.13.12", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.12.tgz", + "integrity": "sha512-/2YoaB79IjUK2B2JB+vIXXYGtBfHb/XG66LvoKVM5ykHW7yfrV5SP6d7KLX6iijY6/G9GqwgtPQ/sbhFnOURVA==" }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge2": { "version": "1.4.1", @@ -4564,33 +5696,53 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" + "node_modules/mlly": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", + "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, + "node_modules/mpd-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.3.0.tgz", + "integrity": "sha512-WgeIwxAqkmb9uTn4ClicXpEQYCEduDqRKfmUdp4X8vmghKfBNXZLYpREn9eqrDx/Tf5LhzRcJLSpi4ohfV742Q==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.0.0", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + }, + "bin": { + "mpd-to-m3u8-json": "bin/parse.js" } }, "node_modules/ms": { @@ -4599,10 +5751,32 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true + }, + "node_modules/mux.js": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.0.3.tgz", + "integrity": "sha512-gzlzJVEGFYPtl2vvEiJneSWAWD4nfYRHD5XgxmB2gWvXraMPOYk+sxfvexmNfjQUFpmk6hwLR5C6iSFmuwCHdQ==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + }, + "bin": { + "muxjs-transmux": "bin/transmux.js" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "funding": [ { "type": "github", @@ -4623,11 +5797,20 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/normalize-range": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", @@ -4642,12 +5825,6 @@ "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==" }, - "node_modules/noty": { - "version": "3.2.0-beta-deprecated", - "resolved": "https://registry.npmjs.org/noty/-/noty-3.2.0-beta-deprecated.tgz", - "integrity": "sha512-ntRbHuQ9SnnnVFZm/oq5L1DBCaHQUvsU24AwZH3PGjAWx2YqR/IhOadMk11vmJovYiQo00oqTj6Hp+D6PGtmLA==", - "deprecated": "no longer supported" - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -4675,21 +5852,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -4707,6 +5869,36 @@ "node": ">= 0.8.0" } }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -4724,15 +5916,6 @@ "node": ">=6" } }, - "node_modules/parent-module/node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -4745,6 +5928,12 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4763,12 +5952,47 @@ "node": ">=0.10.0" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/peek-stream": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", + "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "duplexify": "^3.5.0", + "through2": "^2.0.3" + } + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -4786,10 +6010,112 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz", + "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pkcs7": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz", + "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==", + "dependencies": { + "@babel/runtime": "^7.5.5" + }, + "bin": { + "pkcs7": "bin/cli.js" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/playwright": { + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz", + "integrity": "sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==", + "dev": true, + "dependencies": { + "playwright-core": "1.42.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz", + "integrity": "sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==", + "dev": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", @@ -4805,18 +6131,18 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -4842,9 +6168,9 @@ } }, "node_modules/prettier": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.1.tgz", - "integrity": "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -4879,6 +6205,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, "node_modules/proper-lockfile": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", @@ -4895,21 +6235,42 @@ "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/qrcode.vue": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-1.7.0.tgz", - "integrity": "sha512-R7t6Y3fDDtcU7L4rtqwGUDP9xD64gJhIwpfjhRCTKmBoYF6SS49PIJHRJ048cse6OI7iwTwgyy2C46N9Ygoc6g==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/qrcode.vue/-/qrcode.vue-3.4.1.tgz", + "integrity": "sha512-wq/zHsifH4FJ1GXQi8/wNxD1KfQkckIpjK1KPTc/qwYU5/Bkd4me0w4xZSg6EXk6xLBkVDE0zxVagewv5EMAVA==", "peerDependencies": { - "vue": "^2.0.0" + "vue": "^3.0.0" } }, "node_modules/querystringify": { @@ -4937,6 +6298,39 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -4944,9 +6338,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -4956,10 +6350,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -5008,15 +6401,24 @@ "jsesc": "bin/jsesc" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -5073,18 +6475,36 @@ } }, "node_modules/rollup": { - "version": "3.27.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.27.2.tgz", - "integrity": "sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", + "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.13.2", + "@rollup/rollup-android-arm64": "4.13.2", + "@rollup/rollup-darwin-arm64": "4.13.2", + "@rollup/rollup-darwin-x64": "4.13.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", + "@rollup/rollup-linux-arm64-gnu": "4.13.2", + "@rollup/rollup-linux-arm64-musl": "4.13.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", + "@rollup/rollup-linux-riscv64-gnu": "4.13.2", + "@rollup/rollup-linux-s390x-gnu": "4.13.2", + "@rollup/rollup-linux-x64-gnu": "4.13.2", + "@rollup/rollup-linux-x64-musl": "4.13.2", + "@rollup/rollup-win32-arm64-msvc": "4.13.2", + "@rollup/rollup-win32-ia32-msvc": "4.13.2", + "@rollup/rollup-win32-x64-msvc": "4.13.2", "fsevents": "~2.3.2" } }, @@ -5094,139 +6514,6 @@ "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==", "dev": true }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/run-applescript/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-applescript/node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-applescript/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-applescript/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-applescript/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5250,6 +6537,37 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rust-result": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rust-result/-/rust-result-1.0.0.tgz", + "integrity": "sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==", + "dependencies": { + "individual": "^2.0.0" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safe-json-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-4.0.0.tgz", + "integrity": "sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==", + "dependencies": { + "rust-result": "^1.0.0" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -5268,18 +6586,67 @@ "node": ">=v12.22.7" } }, - "node_modules/select": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" - }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { @@ -5287,18 +6654,28 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { "node": ">=0.10.0" } @@ -5313,6 +6690,54 @@ "source-map": "^0.6.0" } }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true + }, + "node_modules/streamx": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", + "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5325,15 +6750,6 @@ "node": ">=8" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -5377,13 +6793,13 @@ "dev": true }, "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", "dev": true, "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -5393,15 +6809,31 @@ } }, "node_modules/systemjs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.14.1.tgz", - "integrity": "sha512-8ftwWd+XnQtZ/aGbatrN4QFNGrKJzmbtixW+ODpci7pyoTajg4sonPP8aFLESAcuVxaC1FyDESt+SpfFCH9rZQ==", + "version": "6.14.3", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.14.3.tgz", + "integrity": "sha512-hQv45irdhXudAOr8r6SVSpJSGtogdGZUbJBRKCE5nsIS7tsxxvnIHqT4IOPWj+P+HcSzeWzHlGCGpmhPDIKe+w==", "dev": true }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.0.tgz", + "integrity": "sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -5422,21 +6854,14 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, "node_modules/to-fast-properties": { @@ -5476,27 +6901,48 @@ } }, "node_modules/tr46": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz", - "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.0.0.tgz", + "integrity": "sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==", "dev": true, "dependencies": { - "punycode": "^2.3.0" + "punycode": "^2.3.1" }, "engines": { - "node": ">=14" + "node": ">=18" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" } }, "node_modules/tslib": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", - "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/tus-js-client": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-3.1.1.tgz", - "integrity": "sha512-SZzWP62jEFLmROSRZx+uoGLKqsYWMGK/m+PiNehPVWbCm7/S9zRIMaDxiaOcKdMnFno4luaqP5E+Y1iXXPjP0A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-4.1.0.tgz", + "integrity": "sha512-e/nC/kJahvNYBcnwcqzuhFIvVELMMpbVXIoOOKdUn74SdQCvJd2JjqV2jZLv2EFOVbV4qLiO0lV7BxBXF21b6Q==", "dependencies": { "buffer-from": "^1.1.2", "combine-errors": "^3.0.3", @@ -5505,17 +6951,9 @@ "lodash.throttle": "^4.1.1", "proper-lockfile": "^4.1.2", "url-parse": "^1.5.7" - } - }, - "node_modules/tus-js-client/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18" } }, "node_modules/type-check": { @@ -5542,6 +6980,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typescript": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "devOptional": true, + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "dev": true + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -5591,19 +7055,25 @@ "node": ">= 4.0.0" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "node_modules/unplugin": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz", + "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==", "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "chokidar": "^3.6.0", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.6.1" + }, "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -5648,6 +7118,11 @@ "requires-port": "^1.0.0" } }, + "node_modules/url-toolkit": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz", + "integrity": "sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==" + }, "node_modules/utif": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/utif/-/utif-3.1.0.tgz", @@ -5662,30 +7137,99 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/video.js": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.10.0.tgz", + "integrity": "sha512-7UeG/flj/pp8tNGW8WKPP1VJb3x2FgLoqUWzpZqkoq5YIyf6MNzmIrKtxprl438T5RVkcj+OzV8IX4jYSAn4Sw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "3.10.0", + "@videojs/vhs-utils": "^4.0.0", + "@videojs/xhr": "2.6.0", + "aes-decrypter": "^4.0.1", + "global": "4.4.0", + "keycode": "2.2.0", + "m3u8-parser": "^7.1.0", + "mpd-parser": "^1.2.2", + "mux.js": "^7.0.1", + "safe-json-parse": "4.0.0", + "videojs-contrib-quality-levels": "4.0.0", + "videojs-font": "4.1.0", + "videojs-vtt.js": "0.15.5" + } + }, + "node_modules/videojs-contrib-quality-levels": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.0.0.tgz", + "integrity": "sha512-u5rmd8BjLwANp7XwuQ0Q/me34bMe6zg9PQdHfTS7aXgiVRbNTb4djcmfG7aeSrkpZjg+XCLezFNenlJaCjBHKw==", + "dependencies": { + "global": "^4.4.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6" + }, + "peerDependencies": { + "video.js": "^8" + } + }, + "node_modules/videojs-font": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.1.0.tgz", + "integrity": "sha512-X1LuPfLZPisPLrANIAKCknZbZu5obVM/ylfd1CN+SsCmPZQ3UMDPcvLTpPBJxcBuTpHQq2MO1QCFt7p8spnZ/w==" + }, + "node_modules/videojs-hotkeys": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/videojs-hotkeys/-/videojs-hotkeys-0.2.28.tgz", + "integrity": "sha512-M8rlD5OSB3EDRdbS4MRNlGKFpA2sSIStmUPvy5zfl/NigzWaN6r4wnb32rEN0v97GiQwmUfXSmqrPNrXhiFQmQ==" + }, + "node_modules/videojs-mobile-ui": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/videojs-mobile-ui/-/videojs-mobile-ui-1.1.1.tgz", + "integrity": "sha512-q7vx74++bqu2763Tc/GG4qFcMt42emC8uXe/z+zFVpBIiysgAf89AgorE6m30YHWtVJWgbRIyzFVYNOxCk9qow==", + "dependencies": { + "global": "^4.4.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6" + }, + "peerDependencies": { + "video.js": "^8" + } + }, + "node_modules/videojs-vtt.js": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz", + "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==", + "dependencies": { + "global": "^4.3.1" + } + }, "node_modules/vite": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", - "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.7.tgz", + "integrity": "sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==", "dev": true, "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": "^18.0.0 || >=20.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" }, "optionalDependencies": { - "fsevents": "~2.3.2" + "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": ">= 14", + "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", @@ -5718,50 +7262,58 @@ } }, "node_modules/vite-plugin-compression2": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/vite-plugin-compression2/-/vite-plugin-compression2-0.10.3.tgz", - "integrity": "sha512-QhEfkA8qoEekcclWJEyC+YLI5bI4pC4eLCjb254dXmKHScsrwHBOL1NiOielKFvrxdTMnoAFaiB72668VvAvlw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-compression2/-/vite-plugin-compression2-1.0.0.tgz", + "integrity": "sha512-42XNp6FjxE0JIecxj1fdi770pLhYm3MJhBUAod9EszTgDg9C4LDOgBzWcj/0K52KfJrpRXwUsWV6kqTDuoCfLA==", "dev": true, + "workspaces": [ + "example", + "e2e/*" + ], "dependencies": { - "@rollup/pluginutils": "^5.0.2" + "@rollup/pluginutils": "^5.0.2", + "gunzip-maybe": "^1.4.2", + "tar-stream": "^3.1.7" } }, - "node_modules/vite-plugin-rewrite-all": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vite-plugin-rewrite-all/-/vite-plugin-rewrite-all-1.0.1.tgz", - "integrity": "sha512-W0DAchC8ynuQH0lYLIu5/5+JGfYlUTRD8GGNtHFXRJX4FzzB9MajtqHBp26zq/ly9sDt5BqrfdT08rv3RbB0LQ==", + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "dependencies": { - "connect-history-api-fallback": "^1.6.0" - }, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/vue": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz", - "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==", + "version": "3.4.21", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", + "integrity": "sha512-5hjyV/jLEIKD/jYl4cavMcnzKwjMKohureP8ejn3hhEjwhWIhWeuzL2kJAjzl/WyVsgPY56Sy4Z40C3lVshxXA==", "dependencies": { - "@vue/compiler-sfc": "2.7.14", - "csstype": "^3.1.0" - } - }, - "node_modules/vue-async-computed": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/vue-async-computed/-/vue-async-computed-3.9.0.tgz", - "integrity": "sha512-ac6m/9zxHHNGGKNOU1en8qNk+fAmEbJLuWL7qyQTFuH3vjv3V4urv//QHcVzCobROM6btnaDG2b+XYMncF/ETA==", + "@vue/compiler-dom": "3.4.21", + "@vue/compiler-sfc": "3.4.21", + "@vue/runtime-dom": "3.4.21", + "@vue/server-renderer": "3.4.21", + "@vue/shared": "3.4.21" + }, "peerDependencies": { - "vue": "~2" + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/vue-eslint-parser": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", - "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", + "version": "9.4.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", + "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -5782,133 +7334,114 @@ "eslint": ">=6.0.0" } }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, + "node_modules/vue-final-modal": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/vue-final-modal/-/vue-final-modal-4.5.4.tgz", + "integrity": "sha512-wYunoN89Ago2d6p/hevyo4KSfar1HxScllS6FaHujCGyx69fsb40YPGzN17bk9K68daYAgrJ1inxv+fvhIGv5A==", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@vueuse/core": "^10.5.0", + "@vueuse/integrations": "^10.5.0", + "focus-trap": "^7.5.4" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@vueuse/core": ">=10.0.0", + "@vueuse/integrations": ">=10.0.0", + "focus-trap": ">=7.2.0", + "vue": ">=3.2.0" } }, - "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz", - "integrity": "sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/vue-eslint-parser/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vue-eslint-parser/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/vue-eslint-parser/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/vue-i18n": { - "version": "8.28.2", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.28.2.tgz", - "integrity": "sha512-C5GZjs1tYlAqjwymaaCPDjCyGo10ajUphiwA922jKt9n7KPpqR7oM1PCwYzhB/E7+nT3wfdG3oRre5raIT1rKA==" + "version": "9.10.2", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.10.2.tgz", + "integrity": "sha512-ECJ8RIFd+3c1d3m1pctQ6ywG5Yj8Efy1oYoAKQ9neRdkLbuKLVeW4gaY5HPkD/9ssf1pOnUrmIFjx2/gkGxmEw==", + "dependencies": { + "@intlify/core-base": "9.10.2", + "@intlify/shared": "9.10.2", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } }, "node_modules/vue-lazyload": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/vue-lazyload/-/vue-lazyload-1.3.5.tgz", - "integrity": "sha512-SCO/LWgCCbjaregHO4wg2buzITBdPBZRlIS104vERGpT88uxXsK26veuzZpgGAXMR8WpkaR+JDqz80OedpaLiA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vue-lazyload/-/vue-lazyload-3.0.0.tgz", + "integrity": "sha512-h2keL/Rj550dLgesgOtXJS9qOiSMmuJNeVlfNAYV1/IYwOQYaWk5mFJlwRxmZDK9YC5gECcFLYYj7z1lKSf9ug==" }, "node_modules/vue-router": { - "version": "3.6.5", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.6.5.tgz", - "integrity": "sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==" - }, - "node_modules/vue-simple-progress": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/vue-simple-progress/-/vue-simple-progress-1.1.1.tgz", - "integrity": "sha512-ltLWYBA5eVQHWyt1NwZeGeK0VQC69JVh1oqUdro0po7r8Hc8SEMEyEfuwyCO4s27h5I3jbD99BKKkyPSQZgoZA==" - }, - "node_modules/vue/node_modules/@vue/compiler-sfc": { - "version": "2.7.14", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz", - "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.0.tgz", + "integrity": "sha512-dqUcs8tUeG+ssgWhcPbjHvazML16Oga5w34uCUmsk7i0BcnskoLGwjpa15fqMr2Fa5JgVBrdL2MEgqz6XZ/6IQ==", "dependencies": { - "@babel/parser": "^7.18.4", - "postcss": "^8.4.14", - "source-map": "^0.6.1" + "@vue/devtools-api": "^6.5.1" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" } }, - "node_modules/vuex": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/vuex/-/vuex-3.6.2.tgz", - "integrity": "sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==", - "peerDependencies": { - "vue": "^2.0.0" + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" } }, - "node_modules/vuex-router-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/vuex-router-sync/-/vuex-router-sync-5.0.0.tgz", - "integrity": "sha512-Mry2sO4kiAG64714X1CFpTA/shUH1DmkZ26DFDtwoM/yyx6OtMrc+MxrU+7vvbNLO9LSpgwkiJ8W+rlmRtsM+w==", + "node_modules/vue-toastification": { + "version": "2.0.0-rc.5", + "resolved": "https://registry.npmjs.org/vue-toastification/-/vue-toastification-2.0.0-rc.5.tgz", + "integrity": "sha512-q73e5jy6gucEO/U+P48hqX+/qyXDozAGmaGgLFm5tXX4wJBcVsnGp4e/iJqlm9xzHETYOilUuwOUje2Qg1JdwA==", "peerDependencies": { - "vue-router": "^3.0.0", - "vuex": "^3.0.0" + "vue": "^3.0.2" + } + }, + "node_modules/vue-tsc": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.7.tgz", + "integrity": "sha512-LYa0nInkfcDBB7y8jQ9FQ4riJTRNTdh98zK/hzt4gEpBZQmf30dPhP+odzCa+cedGz6B/guvJEd0BavZaRptjg==", + "dev": true, + "dependencies": { + "@volar/typescript": "~2.1.3", + "@vue/language-core": "2.0.7", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" } }, "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", - "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", "dev": true, "dependencies": { - "xml-name-validator": "^4.0.0" + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" + } + }, + "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "engines": { + "node": ">=18" } }, "node_modules/webidl-conversions": { @@ -5920,45 +7453,120 @@ "node": ">=12" } }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", + "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", + "dev": true + }, "node_modules/whatwg-encoding": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", - "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", "dev": true, "dependencies": { "iconv-lite": "0.6.3" }, "engines": { - "node": ">=12" + "node": ">=18" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.17", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.17.tgz", - "integrity": "sha512-c4ghIvG6th0eudYwKZY5keb81wtFz9/WeAHAoy8+r18kcWlitUIrmGFQ2rWEl4UCKUilD3zCLHOIPheHx5ypRQ==" - }, "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", "dev": true, "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/whatwg-url": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz", - "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.0.0.tgz", + "integrity": "sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==", "dev": true, "dependencies": { - "tr46": "^4.1.1", + "tr46": "^5.0.0", "webidl-conversions": "^7.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -5966,9 +7574,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -6001,12 +7609,86 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, + "node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.2.tgz", + "integrity": "sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "lodash": "^4.17.21", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index b0ff7612..a5089c94 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,64 +1,71 @@ { "name": "filebrowser-frontend", - "version": "2.0.0", + "version": "3.0.0", "private": true, "type": "module", + "engines": { + "npm": ">=7.0.0", + "node": ">=18.0.0" + }, "scripts": { "dev": "vite dev", - "serve": "vite serve", - "build": "vite build", - "watch": "vite build --watch", + "build": "npm run typecheck && vite build", "clean": "find ./dist -maxdepth 1 -mindepth 1 ! -name '.gitkeep' -exec rm -r {} +", - "lint": "eslint --ext .vue,.js src/", - "lint:fix": "eslint --ext .vue,.js --fix src/", - "format": "prettier --write ." + "typecheck": "vue-tsc -p ./tsconfig.json --noEmit", + "lint": "npm run typecheck && eslint --ext .vue,.ts src/", + "lint:fix": "eslint --ext .vue,.ts --fix src/", + "format": "prettier --write .", + "test": "playwright test" }, "dependencies": { - "ace-builds": "^1.23.4", - "clipboard": "^2.0.11", - "core-js": "^3.32.0", - "css-vars-ponyfill": "^2.4.8", - "filesize": "^10.0.8", - "js-base64": "^3.7.5", - "lodash.clonedeep": "^4.5.0", - "lodash.throttle": "^4.1.1", - "material-icons": "^1.13.9", - "moment": "^2.29.4", + "@chenfengyuan/vue-number-input": "^2.0.1", + "@vueuse/core": "^10.9.0", + "@vueuse/integrations": "^10.9.0", + "ace-builds": "^1.32.9", + "core-js": "^3.36.1", + "dayjs": "^1.11.10", + "filesize": "^10.1.1", + "js-base64": "^3.7.7", + "jwt-decode": "^4.0.0", + "lodash-es": "^4.17.21", + "material-icons": "^1.13.12", "normalize.css": "^8.0.1", - "noty": "^3.2.0-beta", + "pinia": "^2.1.7", "pretty-bytes": "^6.1.1", - "qrcode.vue": "^1.7.0", - "tus-js-client": "^3.1.1", + "qrcode.vue": "^3.4.1", + "tus-js-client": "^4.1.0", "utif": "^3.1.0", - "vue": "^2.7.14", - "vue-async-computed": "^3.9.0", - "vue-i18n": "^8.28.2", - "vue-lazyload": "^1.3.5", - "vue-router": "^3.6.5", - "vue-simple-progress": "^1.1.1", - "vuex": "^3.6.2", - "vuex-router-sync": "^5.0.0", - "whatwg-fetch": "^3.6.17" + "video.js": "^8.10.0", + "videojs-hotkeys": "^0.2.28", + "videojs-mobile-ui": "^1.1.1", + "vue": "^3.4.21", + "vue-final-modal": "^4.5.4", + "vue-i18n": "^9.10.2", + "vue-lazyload": "^3.0.0", + "vue-router": "^4.3.0", + "vue-toastification": "^2.0.0-rc.5" }, "devDependencies": { - "@vitejs/plugin-legacy": "^4.1.1", - "@vitejs/plugin-vue2": "^2.2.0", - "@vue/eslint-config-prettier": "^8.0.0", - "autoprefixer": "^10.4.14", - "eslint": "^8.46.0", - "eslint-plugin-prettier": "^5.0.0", - "eslint-plugin-vue": "^9.16.1", - "jsdom": "^22.1.0", - "postcss": "^8.4.31", - "prettier": "^3.0.1", - "terser": "^5.19.2", - "vite": "^4.5.2", - "vite-plugin-compression2": "^0.10.3", - "vite-plugin-rewrite-all": "^1.0.1" - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not ie < 11" - ] + "@intlify/unplugin-vue-i18n": "^4.0.0", + "@playwright/test": "^1.42.1", + "@types/lodash-es": "^4.17.12", + "@types/node": "^20.12.2", + "@typescript-eslint/eslint-plugin": "^7.4.0", + "@vitejs/plugin-legacy": "^5.3.2", + "@vitejs/plugin-vue": "^5.0.4", + "@vue/eslint-config-prettier": "^9.0.0", + "@vue/eslint-config-typescript": "^13.0.0", + "autoprefixer": "^10.4.19", + "concurrently": "^8.2.2", + "eslint": "^8.57.0", + "eslint-plugin-prettier": "^5.1.3", + "eslint-plugin-vue": "^9.24.0", + "jsdom": "^24.0.0", + "postcss": "^8.4.38", + "prettier": "^3.2.5", + "terser": "^5.30.0", + "vite": "^5.2.7", + "vite-plugin-compression2": "^1.0.0", + "vue-tsc": "^2.0.7" + } } diff --git a/frontend/playwright.config.ts b/frontend/playwright.config.ts new file mode 100644 index 00000000..af335a17 --- /dev/null +++ b/frontend/playwright.config.ts @@ -0,0 +1,80 @@ +import { defineConfig, devices } from "@playwright/test"; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: "./tests", + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: "html", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + baseURL: "http://127.0.0.1:5173", + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "on-first-retry", + + /* Set default locale to English (US) */ + locale: "en-US", + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + + { + name: "firefox", + use: { ...devices["Desktop Firefox"] }, + }, + + // { + // name: "webkit", + // use: { ...devices["Desktop Safari"] }, + // }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: "npm run dev", + url: "http://127.0.0.1:5173", + reuseExistingServer: !process.env.CI, + }, +}); diff --git a/frontend/public/index.html b/frontend/public/index.html index 530da7cf..b6ed97b2 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -16,8 +16,8 @@ [{[ if .Name -]}][{[ .Name ]}][{[ else ]}]File Browser[{[ end ]}] - - + + - + - [{[ if .Theme -]}] - - [{[ end ]}] [{[ if .CSS -]}] + [{[ if .CSS -]}] [{[ end ]}] diff --git a/frontend/public/themes/dark.css b/frontend/public/themes/dark.css deleted file mode 100644 index eb887bfe..00000000 --- a/frontend/public/themes/dark.css +++ /dev/null @@ -1,217 +0,0 @@ -:root { - --background: #141D24; - --surfacePrimary: #20292F; - --surfaceSecondary: #3A4147; - --divider: rgba(255, 255, 255, 0.12); - --icon: #ffffff; - --textPrimary: rgba(255, 255, 255, 0.87); - --textSecondary: rgba(255, 255, 255, 0.6); -} - -body { - background: var(--background); - color: var(--textPrimary); -} - -#loading { - background: var(--background); -} -#loading .spinner div, main .spinner div { - background: var(--icon); -} - -#login { - background: var(--background); -} - -header { - background: var(--surfacePrimary); -} - -#search #input { - background: var(--surfaceSecondary); - border-color: var(--surfacePrimary); -} -#search #input input::placeholder { - color: var(--textSecondary); -} -#search.active #input { - background: var(--surfacePrimary); -} -#search.active input { - color: var(--textPrimary); -} -#search #result { - background: var(--background); - color: var(--textPrimary); -} -#search .boxes { - background: var(--surfaceSecondary); -} -#search .boxes h3 { - color: var(--textPrimary); -} - -.action { - color: var(--textPrimary) !important; -} -.action:hover { - background-color: rgba(255, 255, 255, .1); -} -.action i { - color: var(--icon) !important; -} -.action .counter { - border-color: var(--surfacePrimary); -} - -nav > div { - border-color: var(--divider); -} - -.breadcrumbs { - border-color: var(--divider); - color: var(--textPrimary) !important; -} -.breadcrumbs span { - color: var(--textPrimary) !important; -} -.breadcrumbs a:hover { - background-color: rgba(255, 255, 255, .1); -} - -#listing .item { - background: var(--surfacePrimary); - color: var(--textPrimary); - border-color: var(--divider) !important; -} -#listing .item i { - color: var(--icon); -} -#listing .item .modified { - color: var(--textSecondary); -} -#listing h2, -#listing.list .header span { - color: var(--textPrimary) !important; -} -#listing.list .header span { - color: var(--textPrimary); -} -#listing.list .header i { - color: var(--icon); -} -#listing.list .item.header { - background: var(--background); -} - -.message { - color: var(--textPrimary); -} - -.card { - background: var(--surfacePrimary); - color: var(--textPrimary); -} -.button--flat:hover { - background: var(--surfaceSecondary); -} - -.dashboard #nav ul li { - color: var(--textSecondary); -} -.dashboard #nav ul li:hover { - background: var(--surfaceSecondary); -} - -.card h3, -.dashboard #nav, -.dashboard p label { - color: var(--textPrimary); -} -.card#share input, -.card#share select, -.input { - background: var(--surfaceSecondary); - color: var(--textPrimary); - border: 1px solid rgba(255, 255, 255, 0.05); -} -.input:hover, -.input:focus { - border-color: rgba(255, 255, 255, 0.15); -} -.input--red { - background: #73302D; -} - -.input--green { - background: #147A41; -} - -.dashboard #nav .wrapper, -.collapsible { - border-color: var(--divider); -} -.collapsible > label * { - color: var(--textPrimary); -} - -table th { - color: var(--textSecondary); -} - -.file-list li:hover { - background: var(--surfaceSecondary); -} -.file-list li:before { - color: var(--textSecondary); -} -.file-list li[aria-selected=true]:before { - color: var(--icon); -} - -.shell { - background: var(--surfacePrimary); - color: var(--textPrimary); -} -.shell__divider { - background: rgba(255, 255, 255, 0.1); -} -.shell__divider:hover { - background: rgba(255, 255, 255, 0.4); -} -.shell__result { - border-top: 1px solid var(--divider); -} - -#editor-container { - background: var(--background); -} - -#editor-container .bar { - background: var(--surfacePrimary); -} - -@media (max-width: 736px) { - #file-selection { - background: var(--surfaceSecondary) !important; - } - #file-selection span { - color: var(--textPrimary) !important; - } - nav { - background: var(--surfaceSecondary) !important; - } - #dropdown { - background: var(--surfaceSecondary) !important; - } -} - -.share__box { - background: var(--surfacePrimary) !important; - color: var(--textPrimary); -} - -.share__box__element { - border-top-color: var(--divider); -} \ No newline at end of file diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 3bea6856..25917f7d 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -4,23 +4,30 @@ - - - diff --git a/frontend/src/api/commands.js b/frontend/src/api/commands.ts similarity index 55% rename from frontend/src/api/commands.js rename to frontend/src/api/commands.ts index 790c22a7..41749470 100644 --- a/frontend/src/api/commands.js +++ b/frontend/src/api/commands.ts @@ -1,15 +1,22 @@ import { removePrefix } from "./utils"; import { baseURL } from "@/utils/constants"; -import store from "@/store"; +import { useAuthStore } from "@/stores/auth"; const ssl = window.location.protocol === "https:"; const protocol = ssl ? "wss:" : "ws:"; -export default function command(url, command, onmessage, onclose) { - url = removePrefix(url); - url = `${protocol}//${window.location.host}${baseURL}/api/command${url}?auth=${store.state.jwt}`; +export default function command( + url: string, + command: string, + onmessage: WebSocket["onmessage"], + onclose: WebSocket["onclose"] +) { + const authStore = useAuthStore(); - let conn = new window.WebSocket(url); + url = removePrefix(url); + url = `${protocol}//${window.location.host}${baseURL}/api/command${url}?auth=${authStore.jwt}`; + + const conn = new window.WebSocket(url); conn.onopen = () => conn.send(command); conn.onmessage = onmessage; conn.onclose = onclose; diff --git a/frontend/src/api/files.js b/frontend/src/api/files.ts similarity index 65% rename from frontend/src/api/files.js rename to frontend/src/api/files.ts index 1c2ea80a..a36de03f 100644 --- a/frontend/src/api/files.js +++ b/frontend/src/api/files.ts @@ -1,19 +1,20 @@ import { createURL, fetchURL, removePrefix } from "./utils"; import { baseURL } from "@/utils/constants"; -import store from "@/store"; +import { useAuthStore } from "@/stores/auth"; import { upload as postTus, useTus } from "./tus"; -export async function fetch(url) { +export async function fetch(url: string) { url = removePrefix(url); const res = await fetchURL(`/api/resources${url}`, {}); - let data = await res.json(); + const data = (await res.json()) as Resource; data.url = `/files${url}`; if (data.isDir) { if (!data.url.endsWith("/")) data.url += "/"; - data.items = data.items.map((item, index) => { + // Perhaps change the any + data.items = data.items.map((item: any, index: any) => { item.index = index; item.url = `${data.url}${encodeURIComponent(item.name)}`; @@ -28,10 +29,12 @@ export async function fetch(url) { return data; } -async function resourceAction(url, method, content) { +async function resourceAction(url: string, method: ApiMethod, content?: any) { url = removePrefix(url); - let opts = { method }; + const opts: ApiOpts = { + method, + }; if (content) { opts.body = content; @@ -42,15 +45,15 @@ async function resourceAction(url, method, content) { return res; } -export async function remove(url) { +export async function remove(url: string) { return resourceAction(url, "DELETE"); } -export async function put(url, content = "") { +export async function put(url: string, content = "") { return resourceAction(url, "PUT", content); } -export function download(format, ...files) { +export function download(format: any, ...files: string[]) { let url = `${baseURL}/api/raw`; if (files.length === 1) { @@ -58,7 +61,7 @@ export function download(format, ...files) { } else { let arg = ""; - for (let file of files) { + for (const file of files) { arg += removePrefix(file) + ","; } @@ -71,14 +74,20 @@ export function download(format, ...files) { url += `algo=${format}&`; } - if (store.state.jwt) { - url += `auth=${store.state.jwt}&`; + const authStore = useAuthStore(); + if (authStore.jwt) { + url += `auth=${authStore.jwt}&`; } window.open(url); } -export async function post(url, content = "", overwrite = false, onupload) { +export async function post( + url: string, + content: ApiContent = "", + overwrite = false, + onupload: any = () => {} +) { // Use the pre-existing API if: const useResourcesApi = // a folder is being created @@ -93,10 +102,15 @@ export async function post(url, content = "", overwrite = false, onupload) { : postTus(url, content, overwrite, onupload); } -async function postResources(url, content = "", overwrite = false, onupload) { +async function postResources( + url: string, + content: ApiContent = "", + overwrite = false, + onupload: any +) { url = removePrefix(url); - let bufferContent; + let bufferContent: ArrayBuffer; if ( content instanceof Blob && !["http:", "https:"].includes(window.location.protocol) @@ -104,14 +118,15 @@ async function postResources(url, content = "", overwrite = false, onupload) { bufferContent = await new Response(content).arrayBuffer(); } + const authStore = useAuthStore(); return new Promise((resolve, reject) => { - let request = new XMLHttpRequest(); + const request = new XMLHttpRequest(); request.open( "POST", `${baseURL}/api/resources${url}?override=${overwrite}`, true ); - request.setRequestHeader("X-Auth", store.state.jwt); + request.setRequestHeader("X-Auth", authStore.jwt); if (typeof onupload === "function") { request.upload.onprogress = onupload; @@ -135,12 +150,17 @@ async function postResources(url, content = "", overwrite = false, onupload) { }); } -function moveCopy(items, copy = false, overwrite = false, rename = false) { - let promises = []; +function moveCopy( + items: any[], + copy = false, + overwrite = false, + rename = false +) { + const promises = []; - for (let item of items) { + for (const item of items) { const from = item.from; - const to = encodeURIComponent(removePrefix(item.to)); + const to = encodeURIComponent(removePrefix(item.to ?? "")); const url = `${from}?action=${ copy ? "copy" : "rename" }&destination=${to}&override=${overwrite}&rename=${rename}`; @@ -150,20 +170,20 @@ function moveCopy(items, copy = false, overwrite = false, rename = false) { return Promise.all(promises); } -export function move(items, overwrite = false, rename = false) { +export function move(items: any[], overwrite = false, rename = false) { return moveCopy(items, false, overwrite, rename); } -export function copy(items, overwrite = false, rename = false) { +export function copy(items: any[], overwrite = false, rename = false) { return moveCopy(items, true, overwrite, rename); } -export async function checksum(url, algo) { +export async function checksum(url: string, algo: ChecksumAlg) { const data = await resourceAction(`${url}?checksum=${algo}`, "GET"); return (await data.json()).checksums[algo]; } -export function getDownloadURL(file, inline) { +export function getDownloadURL(file: ResourceItem, inline: any) { const params = { ...(inline && { inline: "true" }), }; @@ -171,7 +191,7 @@ export function getDownloadURL(file, inline) { return createURL("api/raw" + file.path, params); } -export function getPreviewURL(file, size) { +export function getPreviewURL(file: ResourceItem, size: string) { const params = { inline: "true", key: Date.parse(file.modified), @@ -180,20 +200,15 @@ export function getPreviewURL(file, size) { return createURL("api/preview/" + size + file.path, params); } -export function getSubtitlesURL(file) { +export function getSubtitlesURL(file: ResourceItem) { const params = { inline: "true", }; - const subtitles = []; - for (const sub of file.subtitles) { - subtitles.push(createURL("api/raw" + sub, params)); - } - - return subtitles; + return file.subtitles?.map((d) => createURL("api/subtitle" + d, params)); } -export async function usage(url) { +export async function usage(url: string) { url = removePrefix(url); const res = await fetchURL(`/api/usage${url}`, {}); diff --git a/frontend/src/api/index.js b/frontend/src/api/index.ts similarity index 100% rename from frontend/src/api/index.js rename to frontend/src/api/index.ts diff --git a/frontend/src/api/pub.js b/frontend/src/api/pub.ts similarity index 68% rename from frontend/src/api/pub.js rename to frontend/src/api/pub.ts index 1511143d..4328f64c 100644 --- a/frontend/src/api/pub.js +++ b/frontend/src/api/pub.ts @@ -1,7 +1,7 @@ import { fetchURL, removePrefix, createURL } from "./utils"; import { baseURL } from "@/utils/constants"; -export async function fetch(url, password = "") { +export async function fetch(url: string, password: string = "") { url = removePrefix(url); const res = await fetchURL( @@ -12,12 +12,12 @@ export async function fetch(url, password = "") { false ); - let data = await res.json(); + const data = (await res.json()) as Resource; data.url = `/share${url}`; if (data.isDir) { if (!data.url.endsWith("/")) data.url += "/"; - data.items = data.items.map((item, index) => { + data.items = data.items.map((item: any, index: any) => { item.index = index; item.url = `${data.url}${encodeURIComponent(item.name)}`; @@ -32,7 +32,12 @@ export async function fetch(url, password = "") { return data; } -export function download(format, hash, token, ...files) { +export function download( + format: DownloadFormat, + hash: string, + token: string, + ...files: string[] +) { let url = `${baseURL}/api/public/dl/${hash}`; if (files.length === 1) { @@ -40,7 +45,7 @@ export function download(format, hash, token, ...files) { } else { let arg = ""; - for (let file of files) { + for (const file of files) { arg += encodeURIComponent(file) + ","; } @@ -60,11 +65,11 @@ export function download(format, hash, token, ...files) { window.open(url); } -export function getDownloadURL(share, inline = false) { +export function getDownloadURL(res: Resource, inline = false) { const params = { ...(inline && { inline: "true" }), - ...(share.token && { token: share.token }), + ...(res.token && { token: res.token }), }; - return createURL("api/public/dl/" + share.hash + share.path, params, false); + return createURL("api/public/dl/" + res.hash + res.path, params, false); } diff --git a/frontend/src/api/search.js b/frontend/src/api/search.ts similarity index 68% rename from frontend/src/api/search.js rename to frontend/src/api/search.ts index 42846880..871f0aed 100644 --- a/frontend/src/api/search.js +++ b/frontend/src/api/search.ts @@ -1,7 +1,7 @@ import { fetchURL, removePrefix } from "./utils"; import url from "../utils/url"; -export default async function search(base, query) { +export default async function search(base: string, query: string) { base = removePrefix(base); query = encodeURIComponent(query); @@ -9,11 +9,11 @@ export default async function search(base, query) { base += "/"; } - let res = await fetchURL(`/api/search${base}?query=${query}`, {}); + const res = await fetchURL(`/api/search${base}?query=${query}`, {}); let data = await res.json(); - data = data.map((item) => { + data = data.map((item: UploadItem) => { item.url = `/files${base}` + url.encodePath(item.path); if (item.dir) { diff --git a/frontend/src/api/settings.js b/frontend/src/api/settings.ts similarity index 62% rename from frontend/src/api/settings.js rename to frontend/src/api/settings.ts index e03b0db1..6f806279 100644 --- a/frontend/src/api/settings.js +++ b/frontend/src/api/settings.ts @@ -1,10 +1,10 @@ import { fetchURL, fetchJSON } from "./utils"; export function get() { - return fetchJSON(`/api/settings`, {}); + return fetchJSON(`/api/settings`, {}); } -export async function update(settings) { +export async function update(settings: ISettings) { await fetchURL(`/api/settings`, { method: "PUT", body: JSON.stringify(settings), diff --git a/frontend/src/api/share.js b/frontend/src/api/share.ts similarity index 53% rename from frontend/src/api/share.js rename to frontend/src/api/share.ts index 1ac4473a..3748da4e 100644 --- a/frontend/src/api/share.js +++ b/frontend/src/api/share.ts @@ -1,21 +1,26 @@ import { fetchURL, fetchJSON, removePrefix, createURL } from "./utils"; export async function list() { - return fetchJSON("/api/shares"); + return fetchJSON("/api/shares"); } -export async function get(url) { +export async function get(url: string) { url = removePrefix(url); - return fetchJSON(`/api/share${url}`); + return fetchJSON(`/api/share${url}`); } -export async function remove(hash) { +export async function remove(hash: string) { await fetchURL(`/api/share/${hash}`, { method: "DELETE", }); } -export async function create(url, password = "", expires = "", unit = "hours") { +export async function create( + url: string, + password = "", + expires = "", + unit = "hours" +) { url = removePrefix(url); url = `/api/share${url}`; if (expires !== "") { @@ -23,7 +28,11 @@ export async function create(url, password = "", expires = "", unit = "hours") { } let body = "{}"; if (password != "" || expires !== "" || unit !== "hours") { - body = JSON.stringify({ password: password, expires: expires, unit: unit }); + body = JSON.stringify({ + password: password, + expires: expires.toString(), // backend expects string not number + unit: unit, + }); } return fetchJSON(url, { method: "POST", @@ -31,6 +40,6 @@ export async function create(url, password = "", expires = "", unit = "hours") { }); } -export function getShareURL(share) { +export function getShareURL(share: Share) { return createURL("share/" + share.hash, {}, false); } diff --git a/frontend/src/api/tus.js b/frontend/src/api/tus.ts similarity index 68% rename from frontend/src/api/tus.js rename to frontend/src/api/tus.ts index 94a3b377..dd824357 100644 --- a/frontend/src/api/tus.js +++ b/frontend/src/api/tus.ts @@ -1,6 +1,7 @@ import * as tus from "tus-js-client"; import { baseURL, tusEndpoint, tusSettings } from "@/utils/constants"; -import store from "@/store"; +import { useAuthStore } from "@/stores/auth"; +import { useUploadStore } from "@/stores/upload"; import { removePrefix } from "@/api/utils"; import { fetchURL } from "./utils"; @@ -11,13 +12,13 @@ const ALPHA = 0.2; const ONE_MINUS_ALPHA = 1 - ALPHA; const RECENT_SPEEDS_LIMIT = 5; const MB_DIVISOR = 1024 * 1024; -const CURRENT_UPLOAD_LIST = {}; +const CURRENT_UPLOAD_LIST: CurrentUploadList = {}; export async function upload( - filePath, - content = "", + filePath: string, + content: ApiContent = "", overwrite = false, - onupload + onupload: any ) { if (!tusSettings) { // Shouldn't happen as we check for tus support before calling this function @@ -25,29 +26,35 @@ export async function upload( } filePath = removePrefix(filePath); - let resourcePath = `${tusEndpoint}${filePath}?override=${overwrite}`; + const resourcePath = `${tusEndpoint}${filePath}?override=${overwrite}`; await createUpload(resourcePath); - return new Promise((resolve, reject) => { - let upload = new tus.Upload(content, { + const authStore = useAuthStore(); + + // Exit early because of typescript, tus content can't be a string + if (content === "") { + return false; + } + return new Promise((resolve, reject) => { + const upload = new tus.Upload(content, { uploadUrl: `${baseURL}${resourcePath}`, chunkSize: tusSettings.chunkSize, retryDelays: computeRetryDelays(tusSettings), parallelUploads: 1, storeFingerprintForResuming: false, headers: { - "X-Auth": store.state.jwt, + "X-Auth": authStore.jwt, }, onError: function (error) { if (CURRENT_UPLOAD_LIST[filePath].interval) { clearInterval(CURRENT_UPLOAD_LIST[filePath].interval); } delete CURRENT_UPLOAD_LIST[filePath]; - reject("Upload failed: " + error); + reject(new Error(`Upload failed: ${error.message}`)); }, onProgress: function (bytesUploaded) { - let fileData = CURRENT_UPLOAD_LIST[filePath]; + const fileData = CURRENT_UPLOAD_LIST[filePath]; fileData.currentBytesUploaded = bytesUploaded; if (!fileData.hasStarted) { @@ -79,14 +86,14 @@ export async function upload( lastProgressTimestamp: null, sumOfRecentSpeeds: 0, hasStarted: false, - interval: null, + interval: undefined, }; upload.start(); }); } -async function createUpload(resourcePath) { - let headResp = await fetchURL(resourcePath, { +async function createUpload(resourcePath: string) { + const headResp = await fetchURL(resourcePath, { method: "POST", }); if (headResp.status !== 201) { @@ -96,10 +103,10 @@ async function createUpload(resourcePath) { } } -function computeRetryDelays(tusSettings) { +function computeRetryDelays(tusSettings: TusSettings): number[] | undefined { if (!tusSettings.retryCount || tusSettings.retryCount < 1) { // Disable retries altogether - return null; + return undefined; } // The tus client expects our retries as an array with computed backoffs // E.g.: [0, 3000, 5000, 10000, 20000] @@ -115,7 +122,7 @@ function computeRetryDelays(tusSettings) { return retryDelays; } -export async function useTus(content) { +export async function useTus(content: ApiContent) { return isTusSupported() && content instanceof Blob; } @@ -123,25 +130,34 @@ function isTusSupported() { return tus.isSupported === true; } -function computeETA(state) { +function computeETA(state: ETAState, speed?: number) { if (state.speedMbyte === 0) { return Infinity; } - const totalSize = state.sizes.reduce((acc, size) => acc + size, 0); + const totalSize = state.sizes.reduce( + (acc: number, size: number) => acc + size, + 0 + ); const uploadedSize = state.progress.reduce( - (acc, progress) => acc + progress, + (acc: number, progress: Progress) => { + if (typeof progress === "number") { + return acc + progress; + } + return acc; + }, 0 ); const remainingSize = totalSize - uploadedSize; - const speedBytesPerSecond = state.speedMbyte * 1024 * 1024; + const speedBytesPerSecond = (speed ?? state.speedMbyte) * 1024 * 1024; return remainingSize / speedBytesPerSecond; } function computeGlobalSpeedAndETA() { + const uploadStore = useUploadStore(); let totalSpeed = 0; let totalCount = 0; - for (let filePath in CURRENT_UPLOAD_LIST) { + for (const filePath in CURRENT_UPLOAD_LIST) { totalSpeed += CURRENT_UPLOAD_LIST[filePath].currentAverageSpeed; totalCount++; } @@ -149,41 +165,43 @@ function computeGlobalSpeedAndETA() { if (totalCount === 0) return { speed: 0, eta: Infinity }; const averageSpeed = totalSpeed / totalCount; - const averageETA = computeETA(store.state.upload, averageSpeed); + const averageETA = computeETA(uploadStore, averageSpeed); return { speed: averageSpeed, eta: averageETA }; } -function calcProgress(filePath) { - let fileData = CURRENT_UPLOAD_LIST[filePath]; +function calcProgress(filePath: string) { + const uploadStore = useUploadStore(); + const fileData = CURRENT_UPLOAD_LIST[filePath]; - let elapsedTime = (Date.now() - fileData.lastProgressTimestamp) / 1000; - let bytesSinceLastUpdate = + const elapsedTime = + (Date.now() - (fileData.lastProgressTimestamp ?? 0)) / 1000; + const bytesSinceLastUpdate = fileData.currentBytesUploaded - fileData.initialBytesUploaded; - let currentSpeed = bytesSinceLastUpdate / MB_DIVISOR / elapsedTime; + const currentSpeed = bytesSinceLastUpdate / MB_DIVISOR / elapsedTime; if (fileData.recentSpeeds.length >= RECENT_SPEEDS_LIMIT) { - fileData.sumOfRecentSpeeds -= fileData.recentSpeeds.shift(); + fileData.sumOfRecentSpeeds -= fileData.recentSpeeds.shift() ?? 0; } fileData.recentSpeeds.push(currentSpeed); fileData.sumOfRecentSpeeds += currentSpeed; - let avgRecentSpeed = + const avgRecentSpeed = fileData.sumOfRecentSpeeds / fileData.recentSpeeds.length; fileData.currentAverageSpeed = ALPHA * avgRecentSpeed + ONE_MINUS_ALPHA * fileData.currentAverageSpeed; const { speed, eta } = computeGlobalSpeedAndETA(); - store.commit("setUploadSpeed", speed); - store.commit("setETA", eta); + uploadStore.setUploadSpeed(speed); + uploadStore.setETA(eta); fileData.initialBytesUploaded = fileData.currentBytesUploaded; fileData.lastProgressTimestamp = Date.now(); } export function abortAllUploads() { - for (let filePath in CURRENT_UPLOAD_LIST) { + for (const filePath in CURRENT_UPLOAD_LIST) { if (CURRENT_UPLOAD_LIST[filePath].interval) { clearInterval(CURRENT_UPLOAD_LIST[filePath].interval); } diff --git a/frontend/src/api/users.js b/frontend/src/api/users.ts similarity index 55% rename from frontend/src/api/users.js rename to frontend/src/api/users.ts index 105d6cc0..a44254fb 100644 --- a/frontend/src/api/users.js +++ b/frontend/src/api/users.ts @@ -1,14 +1,14 @@ -import { fetchURL, fetchJSON } from "./utils"; +import { fetchURL, fetchJSON, StatusError } from "./utils"; export async function getAll() { - return fetchJSON(`/api/users`, {}); + return fetchJSON(`/api/users`, {}); } -export async function get(id) { - return fetchJSON(`/api/users/${id}`, {}); +export async function get(id: number) { + return fetchJSON(`/api/users/${id}`, {}); } -export async function create(user) { +export async function create(user: IUser) { const res = await fetchURL(`/api/users`, { method: "POST", body: JSON.stringify({ @@ -21,9 +21,11 @@ export async function create(user) { if (res.status === 201) { return res.headers.get("Location"); } + + throw new StatusError(await res.text(), res.status); } -export async function update(user, which = ["all"]) { +export async function update(user: IUser, which = ["all"]) { await fetchURL(`/api/users/${user.id}`, { method: "PUT", body: JSON.stringify({ @@ -34,7 +36,7 @@ export async function update(user, which = ["all"]) { }); } -export async function remove(id) { +export async function remove(id: number) { await fetchURL(`/api/users/${id}`, { method: "DELETE", }); diff --git a/frontend/src/api/utils.js b/frontend/src/api/utils.js deleted file mode 100644 index 7883c4ce..00000000 --- a/frontend/src/api/utils.js +++ /dev/null @@ -1,80 +0,0 @@ -import store from "@/store"; -import { renew, logout } from "@/utils/auth"; -import { baseURL } from "@/utils/constants"; -import { encodePath } from "@/utils/url"; - -export async function fetchURL(url, opts, auth = true) { - opts = opts || {}; - opts.headers = opts.headers || {}; - - let { headers, ...rest } = opts; - let res; - try { - res = await fetch(`${baseURL}${url}`, { - headers: { - "X-Auth": store.state.jwt, - ...headers, - }, - ...rest, - }); - } catch { - const error = new Error("000 No connection"); - error.status = 0; - - throw error; - } - - if (auth && res.headers.get("X-Renew-Token") === "true") { - await renew(store.state.jwt); - } - - if (res.status < 200 || res.status > 299) { - const error = new Error(await res.text()); - error.status = res.status; - - if (auth && res.status == 401) { - logout(); - } - - throw error; - } - - return res; -} - -export async function fetchJSON(url, opts) { - const res = await fetchURL(url, opts); - - if (res.status === 200) { - return res.json(); - } else { - throw new Error(res.status); - } -} - -export function removePrefix(url) { - url = url.split("/").splice(2).join("/"); - - if (url === "") url = "/"; - if (url[0] !== "/") url = "/" + url; - return url; -} - -export function createURL(endpoint, params = {}, auth = true) { - let prefix = baseURL; - if (!prefix.endsWith("/")) { - prefix = prefix + "/"; - } - const url = new URL(prefix + encodePath(endpoint), origin); - - const searchParams = { - ...(auth && { auth: store.state.jwt }), - ...params, - }; - - for (const key in searchParams) { - url.searchParams.set(key, searchParams[key]); - } - - return url.toString(); -} diff --git a/frontend/src/api/utils.ts b/frontend/src/api/utils.ts new file mode 100644 index 00000000..7008e28a --- /dev/null +++ b/frontend/src/api/utils.ts @@ -0,0 +1,98 @@ +import { useAuthStore } from "@/stores/auth"; +import { renew, logout } from "@/utils/auth"; +import { baseURL } from "@/utils/constants"; +import { encodePath } from "@/utils/url"; + +export class StatusError extends Error { + constructor( + message: any, + public status?: number + ) { + super(message); + this.name = "StatusError"; + } +} + +export async function fetchURL( + url: string, + opts: ApiOpts, + auth = true +): Promise { + const authStore = useAuthStore(); + + opts = opts || {}; + opts.headers = opts.headers || {}; + + const { headers, ...rest } = opts; + let res; + try { + res = await fetch(`${baseURL}${url}`, { + headers: { + "X-Auth": authStore.jwt, + ...headers, + }, + ...rest, + }); + } catch { + throw new StatusError("000 No connection", 0); + } + + if (auth && res.headers.get("X-Renew-Token") === "true") { + await renew(authStore.jwt); + } + + if (res.status < 200 || res.status > 299) { + const body = await res.text(); + const error = new StatusError( + body || `${res.status} ${res.statusText}`, + res.status + ); + + if (auth && res.status == 401) { + logout(); + } + + throw error; + } + + return res; +} + +export async function fetchJSON(url: string, opts?: any): Promise { + const res = await fetchURL(url, opts); + + if (res.status === 200) { + return res.json() as Promise; + } + + throw new StatusError(`${res.status} ${res.statusText}`, res.status); +} + +export function removePrefix(url: string): string { + url = url.split("/").splice(2).join("/"); + + if (url === "") url = "/"; + if (url[0] !== "/") url = "/" + url; + return url; +} + +export function createURL(endpoint: string, params = {}, auth = true): string { + const authStore = useAuthStore(); + + let prefix = baseURL; + if (!prefix.endsWith("/")) { + prefix = prefix + "/"; + } + const url = new URL(prefix + encodePath(endpoint), origin); + + const searchParams: SearchParams = { + ...(auth && { auth: authStore.jwt }), + ...params, + }; + + for (const key in searchParams) { + url.searchParams.set(key, searchParams[key]); + } + + return url.toString(); +} diff --git a/frontend/src/components/Breadcrumbs.vue b/frontend/src/components/Breadcrumbs.vue index f0de33ea..6da88053 100644 --- a/frontend/src/components/Breadcrumbs.vue +++ b/frontend/src/components/Breadcrumbs.vue @@ -3,8 +3,8 @@ home @@ -18,58 +18,66 @@ - diff --git a/frontend/src/components/CustomToast.vue b/frontend/src/components/CustomToast.vue new file mode 100644 index 00000000..7ef8007d --- /dev/null +++ b/frontend/src/components/CustomToast.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/frontend/src/components/ProgressBar.vue b/frontend/src/components/ProgressBar.vue new file mode 100644 index 00000000..a31192b3 --- /dev/null +++ b/frontend/src/components/ProgressBar.vue @@ -0,0 +1,224 @@ + + + + diff --git a/frontend/src/components/Search.vue b/frontend/src/components/Search.vue index fc8f976f..08b40e3e 100644 --- a/frontend/src/components/Search.vue +++ b/frontend/src/components/Search.vue @@ -17,7 +17,7 @@ @keyup.enter="submit" ref="input" :autofocus="active" - v-model.trim="value" + v-model.trim="prompt" :aria-label="$t('search.search')" :placeholder="$t('search.search')" /> @@ -28,7 +28,7 @@ diff --git a/frontend/src/components/files/ExtendedImage.vue b/frontend/src/components/files/ExtendedImage.vue index dbb36172..e7540570 100644 --- a/frontend/src/components/files/ExtendedImage.vue +++ b/frontend/src/components/files/ExtendedImage.vue @@ -13,261 +13,290 @@ - diff --git a/frontend/src/components/header/Action.vue b/frontend/src/components/header/Action.vue index 516b56d3..1df137e3 100644 --- a/frontend/src/components/header/Action.vue +++ b/frontend/src/components/header/Action.vue @@ -2,24 +2,31 @@ - - - diff --git a/frontend/src/components/header/HeaderBar.vue b/frontend/src/components/header/HeaderBar.vue index a0aab314..d15ec060 100644 --- a/frontend/src/components/header/HeaderBar.vue +++ b/frontend/src/components/header/HeaderBar.vue @@ -1,62 +1,59 @@ - diff --git a/frontend/src/components/prompts/BaseModal.vue b/frontend/src/components/prompts/BaseModal.vue new file mode 100644 index 00000000..1385a3ad --- /dev/null +++ b/frontend/src/components/prompts/BaseModal.vue @@ -0,0 +1,21 @@ + + + diff --git a/frontend/src/components/prompts/Copy.vue b/frontend/src/components/prompts/Copy.vue index 6e3d6805..2672b394 100644 --- a/frontend/src/components/prompts/Copy.vue +++ b/frontend/src/components/prompts/Copy.vue @@ -6,8 +6,11 @@

{{ $t("prompts.copyMessage") }}

- - +
@@ -48,7 +54,10 @@ diff --git a/frontend/src/components/prompts/DiscardEditorChanges.vue b/frontend/src/components/prompts/DiscardEditorChanges.vue index a870708d..362d25a1 100644 --- a/frontend/src/components/prompts/DiscardEditorChanges.vue +++ b/frontend/src/components/prompts/DiscardEditorChanges.vue @@ -7,18 +7,21 @@
@@ -27,15 +30,18 @@ diff --git a/frontend/src/components/prompts/FileList.vue b/frontend/src/components/prompts/FileList.vue index 653752a0..b276ce62 100644 --- a/frontend/src/components/prompts/FileList.vue +++ b/frontend/src/components/prompts/FileList.vue @@ -25,7 +25,10 @@ diff --git a/frontend/src/components/prompts/Info.vue b/frontend/src/components/prompts/Info.vue index a67f21a3..687b49fb 100644 --- a/frontend/src/components/prompts/Info.vue +++ b/frontend/src/components/prompts/Info.vue @@ -40,33 +40,45 @@

MD5: {{ - $t("prompts.show") - }}{{ $t("prompts.show") }}

SHA1: {{ - $t("prompts.show") - }}{{ $t("prompts.show") }}

SHA256: {{ - $t("prompts.show") - }}{{ $t("prompts.show") }}

SHA512: {{ - $t("prompts.show") - }}{{ $t("prompts.show") }}

@@ -74,8 +86,9 @@
@@ -22,14 +23,17 @@ @click="(event) => currentPrompt.confirm(event, 'rename')" :aria-label="$t('buttons.rename')" :title="$t('buttons.rename')" + tabindex="2" > {{ $t("buttons.rename") }} @@ -38,10 +42,16 @@ diff --git a/frontend/src/components/prompts/Share.vue b/frontend/src/components/prompts/Share.vue index e5d6c97d..6b15ffcd 100644 --- a/frontend/src/components/prompts/Share.vue +++ b/frontend/src/components/prompts/Share.vue @@ -1,5 +1,5 @@ diff --git a/frontend/src/components/prompts/UploadFiles.vue b/frontend/src/components/prompts/UploadFiles.vue index 866853e8..d3a96bc5 100644 --- a/frontend/src/components/prompts/UploadFiles.vue +++ b/frontend/src/components/prompts/UploadFiles.vue @@ -53,7 +53,9 @@ diff --git a/frontend/src/components/settings/UserForm.vue b/frontend/src/components/settings/UserForm.vue index c9337504..0f3b06e0 100644 --- a/frontend/src/components/settings/UserForm.vue +++ b/frontend/src/components/settings/UserForm.vue @@ -1,7 +1,7 @@ - diff --git a/frontend/src/css/_buttons.css b/frontend/src/css/_buttons.css index 087c6286..cbfc92ae 100644 --- a/frontend/src/css/_buttons.css +++ b/frontend/src/css/_buttons.css @@ -1,14 +1,14 @@ .button { outline: 0; border: 0; - padding: .5em 1em; - border-radius: .1em; + padding: 0.5em 1em; + border-radius: 0.1em; cursor: pointer; background: var(--blue); color: white; - border: 1px solid rgba(0, 0, 0, 0.05); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.05); - transition: .1s ease all; + border: 1px solid var(--divider); + box-shadow: 0 0 5px var(--divider); + transition: 0.1s ease all; } .button:hover { @@ -38,7 +38,7 @@ } .button--flat:hover { - background: var(--moon-grey); + background: var(--surfaceSecondary); } .button--flat.button--red { @@ -50,6 +50,6 @@ } .button[disabled] { - opacity: .5; + opacity: 0.5; cursor: not-allowed; } diff --git a/frontend/src/css/_inputs.css b/frontend/src/css/_inputs.css index 670bb426..a0063f83 100644 --- a/frontend/src/css/_inputs.css +++ b/frontend/src/css/_inputs.css @@ -1,20 +1,20 @@ .input { - border-radius: .1em; - padding: .5em 1em; - background: white; - border: 1px solid rgba(0, 0, 0, 0.1); - transition: .2s ease all; - color: #333; + background: var(--surfacePrimary); + color: var(--textSecondary); + border: 1px solid var(--borderPrimary); + border-radius: 0.1em; + padding: 0.5em 1em; + transition: 0.2s ease all; margin: 0; } .input:hover, .input:focus { - border-color: rgba(0, 0, 0, 0.2); + border-color: var(--borderSecondary); } .input--block { - margin-bottom: .5em; + margin-bottom: 0.5em; display: block; width: 100%; } @@ -27,9 +27,9 @@ } .input--red { - background: #fcd0cd; + background: var(--input-red) !important; } .input--green { - background: #c9f2da; + background: var(--input-green) !important; } diff --git a/frontend/src/css/_share.css b/frontend/src/css/_share.css index eb8aacb7..04034a32 100644 --- a/frontend/src/css/_share.css +++ b/frontend/src/css/_share.css @@ -12,8 +12,11 @@ } .share__box { - box-shadow: rgba(0, 0, 0, 0.06) 0px 1px 3px, rgba(0, 0, 0, 0.12) 0px 1px 2px; - background: #fff; + box-shadow: + rgba(0, 0, 0, 0.06) 0px 1px 3px, + rgba(0, 0, 0, 0.12) 0px 1px 2px; + background: var(--surfacePrimary); + color: var(--textPrimary); border-radius: 0.2em; margin: 5px; overflow: hidden; @@ -39,7 +42,7 @@ .share__box__element { padding: 1em; - border-top: 1px solid rgba(0, 0, 0, 0.1); + border-top: 1px solid var(--borderPrimary); word-break: break-all; } @@ -62,7 +65,7 @@ border-left: 0; border-right: 0; border-bottom: 0; - border-top: 1px solid rgba(0, 0, 0, 0.1); + border-top: 1px solid var(--borderPrimary); } .share__box__items #listing.list .item .name { @@ -76,7 +79,7 @@ .share__wrong__password { background: var(--red); color: #fff; - padding: .5em; + padding: 0.5em; text-align: center; - animation: .2s opac forwards; -} \ No newline at end of file + animation: 0.2s opac forwards; +} diff --git a/frontend/src/css/_shell.css b/frontend/src/css/_shell.css index 37956526..3fca2d7d 100644 --- a/frontend/src/css/_shell.css +++ b/frontend/src/css/_shell.css @@ -3,17 +3,8 @@ bottom: 0; left: 0; max-height: calc(100% - 4em); - background: white; - color: #212121; - z-index: 9997; - width: 100%; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - transition: .2s ease transform; -} - -.shell__divider { - position: relative; - height: 8px; + background: var(--surfacePrimary); + color: var(--textPrimary); z-index: 9999; background: rgba(127, 127, 127, 0.1); transition: 0.2s ease background; @@ -32,6 +23,8 @@ overflow: auto; font-size: 1rem; cursor: text; + box-shadow: 0 0 5px var(--borderPrimary); + transition: 0.2s ease transform; } .shell__overlay { @@ -52,7 +45,7 @@ body.rtl .shell-content { display: flex; padding: 0.5em; align-items: flex-start; - border-top: 1px solid rgba(0, 0, 0, 0.05); + border-top: 1px solid var(--divider); } .shell--hidden { diff --git a/frontend/src/css/_variables.css b/frontend/src/css/_variables.css index 94e59664..468b08dd 100644 --- a/frontend/src/css/_variables.css +++ b/frontend/src/css/_variables.css @@ -1,8 +1,8 @@ :root { --blue: #2196f3; - --dark-blue: #1E88E5; - --red: #F44336; - --dark-red: #D32F2F; + --dark-blue: #1e88e5; + --red: #f44336; + --dark-red: #d32f2f; --moon-grey: #f2f2f2; --icon-red: #da4453; @@ -11,4 +11,44 @@ --icon-green: #2ecc71; --icon-blue: #1d99f3; --icon-violet: #9b59b6; + + --input-red: rgb(252, 208, 205); + --input-green: rgb(201, 242, 218); + + --item-selected: white; + + --action: rgb(84, 110, 122); + + --background: rgb(250, 250, 250); + --surfacePrimary: rgb(255, 255, 255); + --surfaceSecondary: rgb(230, 230, 230); + --divider: rgba(0, 0, 0, 0.05); + --iconPrimary: var(--icon-blue); + --iconSecondary: rgb(255, 255, 255); + --iconTertiary: rgb(204, 204, 204); + --textPrimary: rgb(111, 111, 111); + --textSecondary: rgb(51, 51, 51); + --hover: rgba(0, 0, 0, 0.1); + --borderPrimary: rgba(0, 0, 0, 0.1); + --borderSecondary: rgba(0, 0, 0, 0.2); +} + +:root.dark { + --input-red: rgb(115, 48, 45); + --input-green: rgb(20, 122, 65); + + --action: rgb(255, 255, 255); + + --background: rgb(20, 29, 36); + --surfacePrimary: rgb(32, 41, 47); + --surfaceSecondary: rgb(58, 65, 71); + --textPrimary: rgba(255, 255, 255, 0.6); + --textSecondary: rgba(255, 255, 255, 0.87); + --divider: rgba(255, 255, 255, 0.12); + --iconPrimary: rgb(255, 255, 255); + --iconSecondary: rgb(255, 255, 255); + --iconTertiary: rgb(255, 255, 255); + --hover: rgba(255, 255, 255, 0.1); + --borderPrimary: rgba(255, 255, 255, 0.05); + --borderSecondary: rgba(255, 255, 255, 0.15); } diff --git a/frontend/src/css/base.css b/frontend/src/css/base.css index 58ce9aec..7d90468e 100644 --- a/frontend/src/css/base.css +++ b/frontend/src/css/base.css @@ -1,12 +1,8 @@ body { font-family: "Roboto", sans-serif; padding-top: 4em; - background-color: #fafafa; - color: #333333; -} - -body.rtl { - direction: rtl; + background: var(--background); + color: var(--textSecondary); } * { @@ -62,8 +58,8 @@ nav { left: 0; } -body.rtl nav { - left: unset; +html[dir="rtl"] nav { + left: initial; right: 0; } @@ -78,13 +74,12 @@ nav .action { text-overflow: ellipsis; } -body.rtl .action { - direction: rtl; +html[dir="rtl"] nav .action { text-align: right; } nav > div { - border-top: 1px solid rgba(0, 0, 0, 0.05); + border-top: 1px solid var(--divider); } nav .action > * { @@ -99,14 +94,15 @@ main { .breadcrumbs { height: 3em; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); + background: var(--background); + border-bottom: 1px solid var(--divider); } .breadcrumbs span, .breadcrumbs { display: flex; align-items: center; - color: #6f6f6f; + color: var(--textPrimary); } .breadcrumbs a { @@ -115,12 +111,12 @@ main { border-radius: 0.125em; } -body.rtl .breadcrumbs a { +html[dir="rtl"] .breadcrumbs a { transform: translateX(-16em); } .breadcrumbs a:hover { - background-color: rgba(0, 0, 0, 0.05); + background-color: var(--divider); } .breadcrumbs span a { @@ -151,4 +147,34 @@ body.rtl .breadcrumbs a { .break-word { word-break: break-all; -} \ No newline at end of file +} + +.vue-number-input > input { + background: var(--surfacePrimary) !important; + border-color: var(--surfaceSecondary) !important; + color: var(--textSecondary) !important; +} + +.vue-number-input--small > input { + height: 1rem !important; + font-size: 1rem !important; +} + +.vue-number-input :hover, +.vue-number-input :focus { + border-color: var(--borderSecondary) !important; +} + +.vue-number-input__button { + background: var(--surfacePrimary) !important; +} + +.vue-number-input__button--minus, +.vue-number-input__button--plus { + border-color: var(--surfaceSecondary) !important; +} + +.vue-number-input__button::before, +.vue-number-input__button::after { + background: var(--textSecondary) !important; +} diff --git a/frontend/src/css/dashboard.css b/frontend/src/css/dashboard.css index 62a6bcca..48be3ee0 100644 --- a/frontend/src/css/dashboard.css +++ b/frontend/src/css/dashboard.css @@ -4,17 +4,17 @@ .dashboard .row { display: flex; - margin: 0 -.5em; + margin: 0 -0.5em; flex-wrap: wrap; } -body.rtl .dashboard .row { +html[dir="rtl"] .dashboard .row { margin-right: 16em; } .dashboard .row .column { display: flex; - padding: 0 .5em; + padding: 0 0.5em; width: 50%; } @@ -22,33 +22,33 @@ body.rtl .dashboard .row { flex-grow: 1; } -@media(max-width: 1200px) { +@media (max-width: 1200px) { .dashboard .row .column { width: 100%; } } a { - color: inherit + color: inherit; } .dashboard p label { - margin-bottom: .2em; + margin-bottom: 0.2em; display: block; - font-size: .8em; + font-size: 0.8em; font-weight: 500; - color: rgba(0, 0, 0, 0.57); + color: var(--textPrimary); } li code, p code { - background: rgba(0, 0, 0, 0.05); - padding: .1em; - border-radius: .2em; + background: var(--divider); + padding: 0.1em; + border-radius: 0.2em; } .small { - font-size: .8em; + font-size: 0.8em; line-height: 1.5; } @@ -61,21 +61,21 @@ p code { .dashboard #nav .wrapper { display: flex; flex-grow: 1; - border-bottom: 2px solid rgba(0, 0, 0, 0.05); + border-bottom: 2px solid var(--divider); } -body.rtl #nav .wrapper { +html[dir="rtl"] .dashboard #nav .wrapper { margin-right: 16em; } .dashboard #nav ul { list-style: none; display: flex; - color: rgb(84, 110, 122); + color: var(--action); font-weight: 500; padding: 0; margin: 0 0 -2px 0; - font-size: .8em; + font-size: 0.8em; text-align: center; justify-content: left; } @@ -85,12 +85,11 @@ body.rtl #nav .wrapper { padding: 1.5em 2em; white-space: nowrap; border-bottom: 2px solid transparent; - transition: .1s ease-in-out all; - + transition: 0.1s ease-in-out all; } .dashboard #nav ul li:hover { - background: var(--moon-grey); + background: var(--surfaceSecondary); } .dashboard #nav ul li.active { @@ -120,7 +119,7 @@ table { } table tr { - border-bottom: 1px solid #ccc; + border-bottom: 1px solid var(--iconTertiary); } table tr:last-child { @@ -129,40 +128,44 @@ table tr:last-child { table th { font-weight: 500; - color: #757575; + color: var(--textSecondary); text-align: left; } table th, table td { - padding: .5em 0; + padding: 0.5em 0; } table td.small { width: 1em; } -table tr>*:first-child { +table tr > *:first-child { padding-left: 1em; } -body.rtl table tr>* { +html[dir="rtl"] table tr > * { padding-left: unset; padding-right: 1em; text-align: right; direction: ltr; } -table tr>*:last-child { +table tr > *:last-child { padding-right: 1em; } .card { position: relative; margin: 0 0 1rem 0; - background-color: #fff; + background: var(--surfacePrimary); + color: var(--textSecondary); border-radius: 2px; - box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 0 3px 1px -2px rgba(0, 0, 0, 0.2); + box-shadow: + 0 2px 2px 0 rgba(0, 0, 0, 0.14), + 0 1px 5px 0 rgba(0, 0, 0, 0.12), + 0 3px 1px -2px rgba(0, 0, 0, 0.2); overflow: auto; } @@ -171,18 +174,18 @@ table tr>*:last-child { top: 50%; left: 50%; transform: translate(-50%, -50%); - z-index: 99999; max-width: 25em; width: 90%; max-height: 95%; - animation: .1s show forwards; + /* animation-duration: 0.3s; + animation-fill-mode: forwards; */ } -.card>*>*:first-child { +.card > * > *:first-child { margin-top: 0; } -.card>*>*:last-child { +.card > * > *:last-child { margin-bottom: 0; } @@ -191,24 +194,24 @@ table tr>*:last-child { display: flex; } -.card .card-title>*:first-child { +.card .card-title > *:first-child { margin-right: auto; } -body.rtl .card .card-title>*:first-child { +html[dir="rtl"] .card .card-title > *:first-child { margin-right: 0; text-align: right; } -.card>div { +.card > div { padding: 1em 1em; } -.card>div:first-child { +.card > div:first-child { padding-top: 1.5em; } -.card>div:last-child { +.card > div:last-child { padding-bottom: 1.5em; } @@ -234,7 +237,7 @@ body.rtl .card .card-action { } .card h3 { - color: rgba(0, 0, 0, 0.53); + color: var(--textPrimary); font-size: 1em; font-weight: 500; margin: 2em 0 1em; @@ -253,6 +256,14 @@ body.rtl .card .card-action { max-width: 15em; } +.card#share input, +.card#share select, +.card#share input::-webkit-inner-spin-button, +.card#share input::-webkit-outer-spin-button { + background: var(--surfacePrimary); + color: var(--textSecondary); +} + .card#share ul { list-style: none; padding: 0; @@ -277,24 +288,24 @@ body.rtl .card .card-action { .card#share ul li input, .card#share ul li select { - padding: .2em; - margin-right: .5em; - border: 1px solid #dadada; + padding: 0.2em; + margin-right: 0.5em; + border: 1px solid var(--borderPrimary); } .card#share .action.copy-clipboard::after { - content: 'Copied!'; + content: "Copied!"; position: absolute; left: -25%; width: 150%; - font-size: .6em; + font-size: 0.6em; text-align: center; background: #44a6f5; color: #fff; - padding: .5em .2em; - border-radius: .4em; + padding: 0.5em 0.2em; + border-radius: 0.4em; top: -2em; - transition: .1s ease opacity; + transition: 0.1s ease opacity; opacity: 0; } @@ -324,10 +335,9 @@ body.rtl .card .card-action { z-index: 9999; visibility: hidden; opacity: 0; - animation: .1s show forwards; + animation: 0.1s show forwards; } - /* * * * * * * * * * * * * * * * * PROMPT - MOVE * * * * * * * * * * * * * * * * */ @@ -344,33 +354,33 @@ body.rtl .card .card-action { .file-list li { width: 100%; user-select: none; - border-radius: .2em; - padding: .3em; + border-radius: 0.2em; + padding: 0.3em; } -.file-list li[aria-selected=true] { +.file-list li[aria-selected="true"] { background: var(--blue) !important; - color: #fff !important; - transition: .1s ease all; + color: var(--iconSecondary) !important; + transition: 0.1s ease all; } .file-list li:hover { - background-color: #e9eaeb; + background: var(--surfaceSecondary); cursor: pointer; } .file-list li:before { content: "folder"; - color: #6f6f6f; + color: var(--textPrimary); vertical-align: middle; line-height: 1.4; - font-family: 'Material Icons'; + font-family: "Material Icons"; font-size: 1.75em; - margin-right: .25em; + margin-right: 0.25em; } -.file-list li[aria-selected=true]:before { - color: white; +.file-list li[aria-selected="true"]:before { + color: var(--iconSecondary); } .help { @@ -399,11 +409,11 @@ body.rtl .card .card-action { } .collapsible { - border-top: 1px solid rgba(0,0,0,0.1); + border-top: 1px solid var(--borderPrimary); } .collapsible:last-of-type { - border-bottom: 1px solid rgba(0,0,0,0.1); + border-bottom: 1px solid var(--borderPrimary); } .collapsible > input { @@ -421,18 +431,18 @@ body.rtl .card .card-action { .collapsible > label * { margin: 0; - color: rgba(0,0,0,0.57); + color: var(--textPrimary); } .collapsible > label i { - transition: .2s ease transform; + transition: 0.2s ease transform; user-select: none; } .collapsible .collapse { max-height: 0; overflow: hidden; - transition: .2s ease all; + transition: 0.2s ease all; } .collapsible > input:checked ~ .collapse { @@ -442,7 +452,7 @@ body.rtl .card .card-action { } .collapsible > input:checked ~ label i { - transform: rotate(180deg) + transform: rotate(180deg); } .card .collapsible { @@ -468,12 +478,12 @@ body.rtl .card .card-action { flex: 1; padding: 2em; border-radius: 0.2em; - border: 1px solid rgba(0, 0, 0, 0.1); + border: 1px solid var(--borderPrimary); text-align: center; } .card .card-action.full .action { - margin: 0 0.25em 0.50em; + margin: 0 0.25em 0.5em; } .card .card-action.full .action i { @@ -489,7 +499,7 @@ body.rtl .card .card-action { } /*** RTL - Fix disk usage information (in english) ***/ -body.rtl .credits { +html[dir="rtl"] .credits { text-align: right; direction: ltr; -} \ No newline at end of file +} diff --git a/frontend/src/css/header.css b/frontend/src/css/header.css index 3dc8bd51..7a427b0a 100644 --- a/frontend/src/css/header.css +++ b/frontend/src/css/header.css @@ -1,8 +1,8 @@ header { z-index: 1000; - background-color: #fff; - border-bottom: 1px solid rgba(0, 0, 0, 0.075); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + background: var(--surfacePrimary); + border-bottom: 1px solid var(--divider); + box-shadow: 0 0 5px var(--borderPrimary); position: fixed; top: 0; left: 0; @@ -37,7 +37,7 @@ header a:hover { color: inherit; } -header>div:first-child>.action, +header > div:first-child > .action, header img { margin-right: 1em; } @@ -50,7 +50,7 @@ header .action span { display: none; } -header>div div { +header > div div { vertical-align: middle; position: relative; } @@ -82,34 +82,39 @@ header .menu-button { } #search #input { - background-color: #f5f5f5; + background: var(--surfaceSecondary); + border-color: var(--surfacePrimary); display: flex; height: 100%; padding: 0em 0.75em; border-radius: 0.3em; - transition: .1s ease all; + transition: 0.1s ease all; align-items: center; z-index: 2; } +#search #input input::placeholder { + color: var(--textSecondary); +} + #search.active #input { - border-bottom: 1px solid rgba(0, 0, 0, 0.075); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - background-color: #fff; + border-bottom: 1px solid var(--borderPrimary); + box-shadow: 0 0 5px var(--borderPrimary); + background: var(--surfacePrimary); height: 4em; } -#search.active>div { +#search.active > div { border-radius: 0 !important; } #search.active i, #search.active input { - color: #212121; + color: var(--textPrimary); } -#search #input>.action, -#search #input>i { +#search #input > .action, +#search #input > i { margin-right: 0.3em; user-select: none; } @@ -124,38 +129,39 @@ header .menu-button { #search #result { visibility: visible; max-height: none; - background-color: #f8f8f8; + background: var(--background); text-align: left; padding: 0; - color: rgba(0, 0, 0, 0.6); + color: var(--textPrimary); height: 0; - transition: .1s ease height, .1s ease padding; + transition: + 0.1s ease height, + 0.1s ease padding; overflow-x: hidden; overflow-y: auto; z-index: 1; } -body.rtl #search #result { +html[dir="rtl"] #search #result { direction: ltr; } -#search #result>div>*:first-child { +#search #result > div > *:first-child { margin-top: 0; } -body.rtl #search #result { - direction: rtl; +html[dir="rtl"] #search #result { text-align: right; } /*** RTL - Keep search result LTR because it has paths (in english) ***/ -body.rtl #search #result ul>* { +html[dir="rtl"] #search #result ul > * { direction: ltr; text-align: left; } #search.active #result { - padding: .5em; + padding: 0.5em; height: calc(100% - 4em); } @@ -166,10 +172,10 @@ body.rtl #search #result ul>* { } #search li { - margin-bottom: .5em; + margin-bottom: 0.5em; } -#search #result>div { +#search #result > div { max-width: 45em; margin: 0 auto; } @@ -187,10 +193,10 @@ body.rtl #search #result ul>* { } #search.active #result i { - color: #ccc; + color: var(--iconTertiary); } -#search.active #result>p>i { +#search.active #result > p > i { text-align: center; margin: 0 auto; display: table; @@ -199,35 +205,35 @@ body.rtl #search #result ul>* { #search.active #result ul li a { display: flex; align-items: center; - padding: .3em 0; + padding: 0.3em 0; } #search.active #result ul li a i { - margin-right: .3em; + margin-right: 0.3em; } -#search::-webkit-input-placeholder { - color: rgba(255, 255, 255, .5); -} - -#search:-moz-placeholder { - opacity: 1; - color: rgba(255, 255, 255, .5); +/* I dont think we need these anymore */ +/* #search::-webkit-input-placeholder { + color: var(--textPrimary); } #search::-moz-placeholder { opacity: 1; - color: rgba(255, 255, 255, .5); + color: var(--textPrimary); } #search:-ms-input-placeholder { - color: rgba(255, 255, 255, .5); + color: var(--textPrimary); } +#search #input input::placeholder { + color: var(--textPrimary); +} */ + #search .boxes { - border: 1px solid rgba(0, 0, 0, 0.075); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - background: #fff; + border: 1px solid var(--borderPrimary); + box-shadow: 0 0 5px var(--borderPrimary); + background: var(--surfacePrimary); margin: 1em 0; } @@ -235,15 +241,15 @@ body.rtl #search #result ul>* { margin: 0; font-weight: 500; font-size: 1em; - color: #212121; - padding: .5em; + color: var(--textSecondary); + padding: 0.5em; } -body.rtl #search .boxes h3 { +html[dir="rtl"] #search .boxes h3 { text-align: right; } -#search .boxes>div { +#search .boxes > div { display: flex; flex-wrap: wrap; justify-content: space-between; @@ -251,7 +257,7 @@ body.rtl #search .boxes h3 { margin-bottom: -1em; } -#search .boxes>div>div { +#search .boxes > div > div { background: var(--blue); color: #fff; text-align: center; diff --git a/frontend/src/css/listing-icons.css b/frontend/src/css/listing-icons.css index 32c87755..49db1acb 100644 --- a/frontend/src/css/listing-icons.css +++ b/frontend/src/css/listing-icons.css @@ -2,30 +2,50 @@ /* General */ -.file-icons [aria-label^="."] { opacity: 0.33 } -.file-icons [aria-label$=".bak"] { opacity: 0.33 } +.file-icons [aria-label^="."] { + opacity: 0.33; +} +.file-icons [aria-label$=".bak"] { + opacity: 0.33; +} -.file-icons [data-type=audio] i::before { content: 'volume_up' } -.file-icons [data-type=blob] i::before { content: 'insert_drive_file' } -.file-icons [data-type=image] i::before { content: 'image' } -.file-icons [data-type=pdf] i::before { content: 'description' } -.file-icons [data-type=text] i::before { content: 'description' } -.file-icons [data-type=video] i::before { content: 'movie' } -.file-icons [data-type=invalid_link] i::before { content: 'link_off' } +.file-icons [data-type="audio"] i::before { + content: "volume_up"; +} +.file-icons [data-type="blob"] i::before { + content: "insert_drive_file"; +} +.file-icons [data-type="image"] i::before { + content: "image"; +} +.file-icons [data-type="pdf"] i::before { + content: "description"; +} +.file-icons [data-type="text"] i::before { + content: "description"; +} +.file-icons [data-type="video"] i::before { + content: "movie"; +} +.file-icons [data-type="invalid_link"] i::before { + content: "link_off"; +} /* #f90 - Image */ .file-icons [aria-label$=".ai"] i::before, .file-icons [aria-label$=".odg"] i::before, -.file-icons [aria-label$=".xcf"] i::before -{ content: 'image' } +.file-icons [aria-label$=".xcf"] i::before { + content: "image"; +} /* #f90 - Presentation */ .file-icons [aria-label$=".odp"] i::before, .file-icons [aria-label$=".ppt"] i::before, -.file-icons [aria-label$=".pptx"] i::before -{ content: 'slideshow' } +.file-icons [aria-label$=".pptx"] i::before { + content: "slideshow"; +} /* #0f0 - Spreadsheet/Database */ @@ -34,8 +54,9 @@ .file-icons [aria-label$=".odb"] i::before, .file-icons [aria-label$=".ods"] i::before, .file-icons [aria-label$=".xls"] i::before, -.file-icons [aria-label$=".xlsx"] i::before -{ content: 'border_all' } +.file-icons [aria-label$=".xlsx"] i::before { + content: "border_all"; +} /* #00f - Document */ @@ -43,8 +64,9 @@ .file-icons [aria-label$=".docx"] i::before, .file-icons [aria-label$=".log"] i::before, .file-icons [aria-label$=".odt"] i::before, -.file-icons [aria-label$=".rtf"] i::before -{ content: 'description' } +.file-icons [aria-label$=".rtf"] i::before { + content: "description"; +} /* #999 - Code */ @@ -65,8 +87,9 @@ .file-icons [aria-label$=".rs"] i::before, .file-icons [aria-label$=".vue"] i::before, .file-icons [aria-label$=".xml"] i::before, -.file-icons [aria-label$=".yml"] i::before -{ content: 'code' } +.file-icons [aria-label$=".yml"] i::before { + content: "code"; +} /* #999 - Executable */ @@ -75,16 +98,18 @@ .file-icons [aria-label$=".exe"] i::before, .file-icons [aria-label$=".jar"] i::before, .file-icons [aria-label$=".ps1"] i::before, -.file-icons [aria-label$=".sh"] i::before -{ content: 'web_asset' } +.file-icons [aria-label$=".sh"] i::before { + content: "web_asset"; +} /* #999 - Installer */ .file-icons [aria-label$=".deb"] i::before, .file-icons [aria-label$=".msi"] i::before, .file-icons [aria-label$=".pkg"] i::before, -.file-icons [aria-label$=".rpm"] i::before -{ content: 'archive' } +.file-icons [aria-label$=".rpm"] i::before { + content: "archive"; +} /* #999 - Compressed */ @@ -96,8 +121,9 @@ .file-icons [aria-label$=".tar"] i::before, .file-icons [aria-label$=".xz"] i::before, .file-icons [aria-label$=".zip"] i::before, -.file-icons [aria-label$=".zst"] i::before -{ content: 'folder_zip' } +.file-icons [aria-label$=".zst"] i::before { + content: "folder_zip"; +} /* #999 - Disk */ @@ -108,25 +134,35 @@ .file-icons [aria-label$=".vdi"] i::before, .file-icons [aria-label$=".vhd"] i::before, .file-icons [aria-label$=".vmdk"] i::before, -.file-icons [aria-label$=".wim"] i::before -{ content: 'album' } +.file-icons [aria-label$=".wim"] i::before { + content: "album"; +} /* #999 - Font */ .file-icons [aria-label$=".otf"] i::before, .file-icons [aria-label$=".ttf"] i::before, .file-icons [aria-label$=".woff"] i::before, -.file-icons [aria-label$=".woff2"] i::before -{ content: 'font_download' } +.file-icons [aria-label$=".woff2"] i::before { + content: "font_download"; +} /* Colors */ /* General */ -.file-icons [data-type=audio] i { color: var(--icon-yellow) } -.file-icons [data-type=image] i { color: var(--icon-orange) } -.file-icons [data-type=video] i { color: var(--icon-violet) } -.file-icons [data-type=invalid_link] i { color: var(--icon-red) } +.file-icons [data-type="audio"] i { + color: var(--icon-yellow); +} +.file-icons [data-type="image"] i { + color: var(--icon-orange); +} +.file-icons [data-type="video"] i { + color: var(--icon-violet); +} +.file-icons [data-type="invalid_link"] i { + color: var(--icon-red); +} /* #f00 - Adobe/Oracle */ @@ -135,8 +171,9 @@ .file-icons [aria-label$=".jar"] i, .file-icons [aria-label$=".psd"] i, .file-icons [aria-label$=".rb"] i, -.file-icons [data-type=pdf] i -{ color: var(--icon-red) } +.file-icons [data-type="pdf"] i { + color: var(--icon-red); +} /* #f90 - Image/Presentation */ @@ -146,16 +183,18 @@ .file-icons [aria-label$=".ppt"] i, .file-icons [aria-label$=".pptx"] i, .file-icons [aria-label$=".vue"] i, -.file-icons [aria-label$=".xcf"] i -{ color: var(--icon-orange) } +.file-icons [aria-label$=".xcf"] i { + color: var(--icon-orange); +} /* #ff0 - Various */ .file-icons [aria-label$=".css"] i, .file-icons [aria-label$=".js"] i, .file-icons [aria-label$=".json"] i, -.file-icons [aria-label$=".zip"] i -{ color: var(--icon-yellow) } +.file-icons [aria-label$=".zip"] i { + color: var(--icon-yellow); +} /* #0f0 - Spreadsheet/Google */ @@ -164,8 +203,9 @@ .file-icons [aria-label$=".go"] i, .file-icons [aria-label$=".ods"] i, .file-icons [aria-label$=".xls"] i, -.file-icons [aria-label$=".xlsx"] i -{ color: var(--icon-green) } +.file-icons [aria-label$=".xlsx"] i { + color: var(--icon-green); +} /* #00f - Document/Microsoft/Apple/Closed */ @@ -188,18 +228,26 @@ .file-icons [aria-label$=".ps1"] i, .file-icons [aria-label$=".rtf"] i, .file-icons [aria-label$=".vob"] i, -.file-icons [aria-label$=".wim"] i -{ color: var(--icon-blue) } +.file-icons [aria-label$=".wim"] i { + color: var(--icon-blue); +} /* #60f - Various */ .file-icons [aria-label$=".iso"] i, .file-icons [aria-label$=".php"] i, -.file-icons [aria-label$=".rar"] i -{ color: var(--icon-violet) } +.file-icons [aria-label$=".rar"] i { + color: var(--icon-violet); +} /* Overrides */ -.file-icons [data-dir=true] i { color: var(--icon-blue) } -.file-icons [data-dir=true] i::before { content: 'folder' } -.file-icons [aria-selected=true] i { color: var(--item-selected) } +.file-icons [data-dir="true"] i { + color: var(--icon-blue); +} +.file-icons [data-dir="true"] i::before { + content: "folder"; +} +.file-icons [aria-selected="true"] i { + color: var(--iconSecondary); +} diff --git a/frontend/src/css/listing.css b/frontend/src/css/listing.css index 528311fe..565815a4 100644 --- a/frontend/src/css/listing.css +++ b/frontend/src/css/listing.css @@ -1,15 +1,11 @@ -#listing { - --item-selected: white; -} - -body.rtl #listing { +html[dir="rtl"] #listing { margin-right: 16em; } #listing h2 { margin: 0 0 0 0.5em; - font-size: .9em; - color: rgba(0, 0, 0, 0.38); + font-size: 0.9em; + color: var(--textPrimary); font-weight: 500; } @@ -18,19 +14,22 @@ body.rtl #listing { overflow: hidden; } -#listing>div { +#listing > div { display: flex; flex-wrap: wrap; justify-content: flex-start; } #listing .item { - background-color: #fff; + background: var(--surfacePrimary); + border-color: var(--divider); position: relative; display: flex; flex-wrap: nowrap; - color: #6f6f6f; - transition: .1s ease background, .1s ease opacity; + color: var(--textPrimary); + transition: + 0.1s ease background, + 0.1s ease opacity; align-items: center; cursor: pointer; user-select: none; @@ -75,13 +74,13 @@ body.rtl #listing { margin: 1em auto; display: block !important; width: 95%; - color: rgba(0, 0, 0, 0.3); + color: var(--textPrimary); font-weight: 500; } .message i { font-size: 2.5em; - margin-bottom: .2em; + margin-bottom: 0.2em; display: block; } @@ -92,14 +91,18 @@ body.rtl #listing { #listing.mosaic .item { width: calc(33% - 1em); - margin: .5em; + margin: 0.5em; padding: 0.5em; border-radius: 0.2em; - box-shadow: 0 1px 3px rgba(0, 0, 0, .06), 0 1px 2px rgba(0, 0, 0, .12); + box-shadow: + 0 1px 3px rgba(0, 0, 0, 0.06), + 0 1px 2px rgba(0, 0, 0, 0.12); } #listing.mosaic .item:hover { - box-shadow: 0 1px 3px rgba(0, 0, 0, .12), 0 1px 2px rgba(0, 0, 0, .24) !important; + box-shadow: + 0 1px 3px rgba(0, 0, 0, 0.12), + 0 1px 2px rgba(0, 0, 0, 0.24) !important; } #listing.mosaic .header { @@ -127,16 +130,16 @@ body.rtl #listing { text-align: center; } -#listing.mosaic.gallery .item[data-type=image] div:last-of-type { +#listing.mosaic.gallery .item[data-type="image"] div:last-of-type { color: white; background: linear-gradient(#0000, #0009); } #listing.mosaic.gallery .item i { - width: 100%; - margin-right: 0; - font-size: 8em; - text-align: center; + width: 100%; + margin-right: 0; + font-size: 8em; + text-align: center; } #listing.mosaic.gallery .item img { @@ -159,7 +162,7 @@ body.rtl #listing { #listing.list .item { width: 100%; margin: 0; - border: 1px solid rgba(0, 0, 0, 0.1); + border: 1px solid var(--borderPrimary); padding: 1em; border-top: 0; } @@ -168,9 +171,9 @@ body.rtl #listing { display: none; } -#listing .item[aria-selected=true] { +#listing .item[aria-selected="true"] { background: var(--blue) !important; - color: var(--item-selected) !important; + color: var(--iconSecondary) !important; } #listing.list .item div:first-of-type { @@ -202,25 +205,25 @@ body.rtl #listing { #listing .item.header { display: none !important; - background-color: #ccc; + background-color: var(--iconTertiary); } #listing.list .header i { font-size: 1.5em; vertical-align: middle; - margin-left: .2em; + margin-left: 0.2em; } #listing.list .item.header { display: flex !important; - background: #fafafa; + background: var(--background); z-index: 999; - padding: .85em; + padding: 0.85em; border: 0; - border-bottom: 1px solid rgba(0, 0, 0, 0.1); + border-bottom: 1px solid var(--borderPrimary); } -#listing.list .item.header>div:first-child { +#listing.list .item.header > div:first-child { width: 0; } @@ -232,7 +235,7 @@ body.rtl #listing { color: inherit; } -#listing.list .item.header>div:first-child { +#listing.list .item.header > div:first-child { width: 0; } @@ -250,7 +253,7 @@ body.rtl #listing { #listing.list .header i { opacity: 0; - transition: .1s ease all; + transition: 0.1s ease all; } #listing.list .header p:hover i, @@ -272,7 +275,7 @@ body.rtl #listing { height: 4em; padding: 0.5em 0.5em 0.5em 1em; justify-content: space-between; - transition: .2s ease bottom; + transition: 0.2s ease bottom; } #listing #multiple-selection.active { @@ -281,5 +284,5 @@ body.rtl #listing { #listing #multiple-selection p, #listing #multiple-selection i { - color: var(--item-selected); + color: var(--iconSecondary); } diff --git a/frontend/src/css/login.css b/frontend/src/css/login.css index b97ae7cd..14bfd1a5 100644 --- a/frontend/src/css/login.css +++ b/frontend/src/css/login.css @@ -1,5 +1,5 @@ #login { - background: #fff; + background: var(--surfacePrimary); position: fixed; top: 0; left: 0; @@ -17,7 +17,7 @@ #login h1 { text-align: center; font-size: 2.5em; - margin: .4em 0 .67em; + margin: 0.4em 0 0.67em; } #login form { @@ -34,15 +34,15 @@ } #login #recaptcha { - margin: .5em 0 0; + margin: 0.5em 0 0; } #login .wrong { background: var(--red); color: #fff; - padding: .5em; + padding: 0.5em; text-align: center; - animation: .2s opac forwards; + animation: 0.2s opac forwards; } @keyframes opac { @@ -61,5 +61,5 @@ text-transform: lowercase; font-weight: 500; font-size: 0.9rem; - margin: .5rem 0; + margin: 0.5rem 0; } diff --git a/frontend/src/css/mobile.css b/frontend/src/css/mobile.css index 8047a5b6..f8b2a45b 100644 --- a/frontend/src/css/mobile.css +++ b/frontend/src/css/mobile.css @@ -1,12 +1,12 @@ @media (max-width: 1024px) { nav { - width: 10em + width: 10em; } } @media (max-width: 1024px) { main { - width: calc(100% - 13em) + width: calc(100% - 13em); } } @@ -21,27 +21,27 @@ width: 60%; } #more { - display: inherit + display: inherit; } header .overlay { width: 100%; height: 100%; - background-color: rgba(0, 0, 0, 0.1); + background-color: var(--borderPrimary); } #dropdown { position: fixed; top: 1em; right: 1em; display: block; - background-color: #fff; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); + background: var(--surfaceSecondary); + box-shadow: 0 0 5px var(--borderPrimary); transform: scale(0); - transition: .1s ease-in-out transform; + transition: 0.1s ease-in-out transform; transform-origin: top right; z-index: 99999; } - body.rtl #dropdown { + html[dir="rtl"] #dropdown { right: unset; left: 1em; transform-origin: top left; @@ -61,7 +61,7 @@ } #dropdown .action span:not(.counter) { display: inline-block; - padding: .4em; + padding: 0.4em; } #dropdown .counter { left: 2.25em; @@ -73,8 +73,10 @@ transform: translateX(-50%); display: flex; align-items: center; - background: #fff; - box-shadow: rgba(0, 0, 0, 0.06) 0px 1px 3px, rgba(0, 0, 0, 0.12) 0px 1px 2px; + background: var(--surfaceSecondary); + box-shadow: + rgba(0, 0, 0, 0.06) 0px 1px 3px, + rgba(0, 0, 0, 0.12) 0px 1px 2px; width: 95%; max-width: 20em; z-index: 1; @@ -86,7 +88,7 @@ #file-selection > span { display: inline-block; margin-left: 1em; - color: #6f6f6f; + color: var(--textPrimary); margin-right: auto; } #file-selection .action span { @@ -95,15 +97,15 @@ nav { top: 0; z-index: 99999; - background: #fff; + background: var(--surfaceSecondary); height: 100%; width: 16em; - box-shadow: 0 0 5px rgba(0, 0, 0, 0.1); - transition: .1s ease left; + box-shadow: 0 0 5px var(--borderPrimary); + transition: 0.1s ease left; left: -17em; } - body.rtl nav { + html[dir="rtl"] nav { left: unset; right: -17em; } @@ -111,7 +113,7 @@ left: 0; } - body.rtl nav.active { + html[dir="rtl"] nav.active { left: unset; right: 0; } @@ -131,19 +133,19 @@ margin-bottom: 5em; } - body.rtl #listing { + html[dir="rtl"] #listing { margin-right: unset; } - body.rtl .breadcrumbs { + html[dir="rtl"] .breadcrumbs { transform: translateX(16em); } - body.rtl #nav .wrapper { + html[dir="rtl"] #nav .wrapper { margin-right: unset; } - - body.rtl .dashboard .row { + + html[dir="rtl"] .dashboard .row { margin-right: unset; } @@ -166,4 +168,4 @@ #listing.list .item .name { width: 100%; } -} \ No newline at end of file +} diff --git a/frontend/src/css/styles.css b/frontend/src/css/styles.css index bac14c6d..ac95cf43 100644 --- a/frontend/src/css/styles.css +++ b/frontend/src/css/styles.css @@ -1,6 +1,6 @@ @import "normalize.css/normalize.css"; -@import "noty/lib/noty.css"; -@import "noty/lib/themes/mint.css"; +@import "vue-toastification/dist/index.css"; +@import "vue-final-modal/style.css"; @import "./_variables.css"; @import "./_buttons.css"; @import "./_inputs.css"; @@ -16,10 +16,23 @@ @import "./login.css"; @import "./mobile.css"; +/* For testing only + :focus { + outline: 2px solid crimson !important; + border-radius: 3px !important; +} */ + .link { color: var(--blue); } +#loading { + background: var(--background); +} +#loading .spinner > div { + background: var(--iconPrimary); +} + main .spinner { display: block; text-align: center; @@ -32,7 +45,7 @@ main .spinner > div { height: 0.8em; margin: 0 0.1em; font-size: 1em; - background-color: rgba(0, 0, 0, 0.3); + background: var(--iconPrimary); border-radius: 100%; display: inline-block; animation: sk-bouncedelay 1.4s infinite ease-in-out both; @@ -72,7 +85,7 @@ main .spinner .bounce2 { transition: 0.2s ease all; border: 0; margin: 0; - color: #546e7a; + color: var(--action); border-radius: 50%; background: transparent; padding: 0; @@ -94,7 +107,7 @@ main .spinner .bounce2 { } .action:hover { - background-color: rgba(0, 0, 0, 0.1); + background-color: var(--hover); } .action ul { @@ -115,7 +128,7 @@ main .spinner .bounce2 { } .action ul li:hover { - background-color: rgba(0, 0, 0, 0.04); + background-color: var(--divider); } #click-overlay { @@ -138,7 +151,7 @@ main .spinner .bounce2 { bottom: 0; right: 0; background: var(--blue); - color: #fff; + color: var(--iconSecondary); border-radius: 50%; font-size: 0.75em; width: 1.8em; @@ -146,7 +159,7 @@ main .spinner .bounce2 { text-align: center; line-height: 1.55em; font-weight: bold; - border: 2px solid white; + border: 2px solid var(--borderPrimary); } /* PREVIEWER */ @@ -176,14 +189,14 @@ main .spinner .bounce2 { } #previewer header > title { - white-space: nowrap; + white-space: nowrap; text-shadow: 1px 1px 1px #000000; } @media (min-width: 738px) { #previewer header #dropdown .action i { color: #fff; - text-shadow: 1px 1px 1px #000000; + text-shadow: 1px 1px 1px #000000; } } @@ -217,7 +230,6 @@ main .spinner .bounce2 { height: 88%; } - #previewer .preview video { height: 100%; } @@ -302,7 +314,7 @@ main .spinner .bounce2 { #previewer .spinner > div { width: 18px; height: 18px; - background-color: white; + background: var(--iconPrimary); } /* EDITOR */ @@ -310,17 +322,21 @@ main .spinner .bounce2 { #editor-container { display: flex; flex-direction: column; - background-color: #fafafa; + background-color: var(--background); position: fixed; padding-top: 4em; top: 0; left: 0; height: 100%; width: 100%; - z-index: 9999; + z-index: 9998; overflow: hidden; } +#editor-container .bar { + background: var(--surfacePrimary); +} + #editor-container #editor { flex: 1; } @@ -331,7 +347,7 @@ main .spinner .bounce2 { } /*** RTL - flip and position arrow of path ***/ -body.rtl .breadcrumbs .chevron { +html[dir="rtl"] .breadcrumbs .chevron { transform: scaleX(-1) translateX(16em); } @@ -343,22 +359,6 @@ body.rtl .breadcrumbs .chevron { font-size: 1rem; } -/* * * * * * * * * * * * * * * * - * PROMPT * - * * * * * * * * * * * * * * * */ - -.noty_buttons { - text-align: right; - padding: 0 10px 10px !important; -} - -.noty_buttons button { - background: rgba(0, 0, 0, 0.05); - border: 1px solid rgba(0, 0, 0, 0.1); - box-shadow: 0 0 0 0; - font-size: 1rem; -} - /* * * * * * * * * * * * * * * * * FOOTER * * * * * * * * * * * * * * * * */ @@ -436,17 +436,17 @@ body.rtl .breadcrumbs .chevron { * RTL overrides * * * * * * * * * * * * * * * * */ -body.rtl .card-content textarea { +html[dir="rtl"] .card-content textarea { direction: ltr; text-align: left; } -body.rtl .card-content .small + input { +html[dir="rtl"] .card-content .small + input { direction: ltr; text-align: left; } -body.rtl .card.floating .card-content .file-list { +html[dir="rtl"] .card.floating .card-content .file-list { direction: ltr; text-align: left; } diff --git a/frontend/src/i18n/ar.json b/frontend/src/i18n/ar.json index 2fd3b880..5014eb52 100644 --- a/frontend/src/i18n/ar.json +++ b/frontend/src/i18n/ar.json @@ -1,7 +1,9 @@ { "buttons": { "cancel": "إلغاء", + "clear": "مسح", "close": "إغلاق", + "continue": "متابعة", "copy": "نسخ", "copyFile": "نسخ الملف", "copyToClipboard": "نسخ الى الحافظة", @@ -11,6 +13,7 @@ "download": "تحميل", "file": "ملف", "folder": "مجلد", + "fullScreen": "تكبير/تصغير الشاشة", "hideDotfiles": "إخفاء ملفات النقطة", "info": "معلومات", "more": "المزيد", @@ -38,7 +41,7 @@ "update": "تحديث", "upload": "رفع", "openFile": "فتح الملف", - "continue": "متابعة" + "discardChanges": "إلغاء التغييرات" }, "download": { "downloadFile": "تحميل الملف", @@ -56,7 +59,6 @@ }, "files": { "body": "الصفحة", - "clear": "مسح", "closePreview": "إغلاق العرض", "files": "الملفات", "folders": "المجلدات", @@ -133,6 +135,7 @@ "deleteMessageMultiple": "هل تريد بالتأكيد حذف {count} ملف؟", "deleteMessageSingle": "هل تريد بالتأكيد حذف هذا الملف/المجلد؟", "deleteMessageShare": "هل تريد بالتأكيد إلغاء مشاركة هذا الملف/المجلد ({path})؟", + "deleteUser": "هل تريد بالتأكيد حذف هذا المستخدم؟", "deleteTitle": "حذف الملفات", "displayName": "عرض اﻹسم:", "download": "تحميل الملفات", @@ -161,7 +164,9 @@ "upload": "رفع", "uploadFiles": "يتم رفع {files} ملفات.", "uploadMessage": "إختر الملفات التي تريد رفعها.", - "optionalPassword": "كلمة مرور إختيارية" + "optionalPassword": "كلمة مرور إختيارية", + "resolution": "الدقة", + "discardEditorChanges": "هل تريد بالتأكيد إلغاء التغييرات؟" }, "search": { "images": "الصور", @@ -243,6 +248,7 @@ "shareDeleted": "تم حذف المشاركة!", "singleClick": "استخدم النقرة الواحدة لفتح الملفات", "themes": { + "default": "افتراضي (نظام التشغيل)", "dark": "غامق", "light": "فاتح", "title": "موضوع" @@ -282,4 +288,3 @@ "unit": "وحدة الوقت" } } - diff --git a/frontend/src/i18n/de.json b/frontend/src/i18n/de.json index 579143dd..602dfdcc 100644 --- a/frontend/src/i18n/de.json +++ b/frontend/src/i18n/de.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "Abbrechen", + "clear": "Schließen", "close": "Schließen", "copy": "Kopieren", "copyFile": "Kopiere Datei", @@ -36,8 +37,7 @@ "toggleSidebar": "Seitenleiste anzeigen", "update": "Update", "upload": "Upload", - "openFile": "Datei öffnen", - "continue": "Fortfahren" + "openFile": "Datei öffnen" }, "download": { "downloadFile": "Download Datei", @@ -52,7 +52,6 @@ }, "files": { "body": "Body", - "clear": "Schließen", "closePreview": "Vorschau schließen", "files": "Dateien", "folders": "Ordner", @@ -88,6 +87,7 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", @@ -104,7 +104,7 @@ "sk": "Slovenčina", "svSE": "Swedish (Sweden)", "tr": "Türkçe", - "ua": "Українська", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/el.json b/frontend/src/i18n/el.json index f0085b33..8d79d924 100644 --- a/frontend/src/i18n/el.json +++ b/frontend/src/i18n/el.json @@ -1,282 +1,281 @@ { - "buttons": { - "cancel": "Ακύρωση", - "close": "Κλείσιμο", - "copy": "Αντιγραφή", - "copyFile": "Αντιγραφή αρχείου", - "copyToClipboard": "Αντιγραφή στο πρόχειρο", - "copyDownloadLinkToClipboard": "Αντιγραφή συνδέσμου λήψης στο πρόχειρο", - "create": "Δημιουργία", - "delete": "Διαγραφή", - "download": "Λήψη", - "file": "Αρχείο", - "folder": "Φάκελος", - "hideDotfiles": "Απόκρυψη κρυφών αρχείων", - "info": "Πληροφορίες", - "more": "Περισσότερα", - "move": "Μετακίνηση", - "moveFile": "Μετακίνηση αρχείου", - "new": "Νέο", - "next": "Επόμενο", - "ok": "Εντάξει", - "permalink": "Λήψη μόνιμου συνδέσμου", - "previous": "Προηγούμενο", - "publish": "Δημοσίευση", - "rename": "Μετονομασία", - "replace": "Αντικατάσταση", - "reportIssue": "Αναφορά προβλήματος", - "save": "Αποθήκευση", - "schedule": "Προγραμματισμός", - "search": "Αναζήτηση", - "select": "Επιλογή", - "selectMultiple": "Επιλογή πολλαπλών", - "share": "Κοινοποίηση", - "submit": "Υποβολή", - "switchView": "Εναλλαγή προβολής", - "toggleSidebar": "(Απ-)ενεργοποίησης της πλευρικής μπάρας", - "update": "Ενημέρωση", - "upload": "Μεταφόρτωση", - "openFile": "Άνοιγμα αρχείου", - "continue": "Συνέχεια" + "buttons": { + "cancel": "Ακύρωση", + "clear": "Καθαρισμός", + "close": "Κλείσιμο", + "copy": "Αντιγραφή", + "copyFile": "Αντιγραφή αρχείου", + "copyToClipboard": "Αντιγραφή στο πρόχειρο", + "copyDownloadLinkToClipboard": "Αντιγραφή συνδέσμου λήψης στο πρόχειρο", + "create": "Δημιουργία", + "delete": "Διαγραφή", + "download": "Λήψη", + "file": "Αρχείο", + "folder": "Φάκελος", + "hideDotfiles": "Απόκρυψη κρυφών αρχείων", + "info": "Πληροφορίες", + "more": "Περισσότερα", + "move": "Μετακίνηση", + "moveFile": "Μετακίνηση αρχείου", + "new": "Νέο", + "next": "Επόμενο", + "ok": "Εντάξει", + "permalink": "Λήψη μόνιμου συνδέσμου", + "previous": "Προηγούμενο", + "publish": "Δημοσίευση", + "rename": "Μετονομασία", + "replace": "Αντικατάσταση", + "reportIssue": "Αναφορά προβλήματος", + "save": "Αποθήκευση", + "schedule": "Προγραμματισμός", + "search": "Αναζήτηση", + "select": "Επιλογή", + "selectMultiple": "Επιλογή πολλαπλών", + "share": "Κοινοποίηση", + "submit": "Υποβολή", + "switchView": "Εναλλαγή προβολής", + "toggleSidebar": "(Απ-)ενεργοποίησης της πλευρικής μπάρας", + "update": "Ενημέρωση", + "upload": "Μεταφόρτωση", + "openFile": "Άνοιγμα αρχείου" + }, + "download": { + "downloadFile": "Λήψη αρχείου", + "downloadFolder": "Λήψη φακέλου", + "downloadSelected": "Λήψη επιλεγμένων" + }, + "upload": { + "abortUpload": "Είστε σίγουροι ότι θέλετε να διακόψετε τη μεταφόρτωση;" + }, + "errors": { + "forbidden": "Δεν έχετε άδεια πρόσβασης σε αυτό.", + "internal": "Προέκυψε εσωτερικό σφάλμα.", + "notFound": "Αυτή η τοποθεσία δεν μπορεί να βρεθεί.", + "connection": "Ο διακομιστής δεν είναι διαθέσιμος." + }, + "files": { + "body": "Περιεχόμενο", + "closePreview": "Κλείσιμο προεπισκόπησης", + "files": "Αρχεία", + "folders": "Φάκελοι", + "home": "Αρχική", + "lastModified": "Τελευταία τροποποίηση", + "loading": "Φορτώνει…", + "lonely": "Δεν υπάρχει τίποτα εδώ (ακόμη)…", + "metadata": "Μεταδεδομένα", + "multipleSelectionEnabled": "Ενεργοποιημένη επιλογή πολλαπλών", + "name": "Όνομα", + "size": "Μέγεθος", + "sortByLastModified": "Ταξινόμηση κατά πρόσφατη τροποποίηση", + "sortByName": "Ταξινόμηση κατά όνομα", + "sortBySize": "Ταξινόμηση κατά μέγεθος", + "noPreview": "Η προεπισκόπηση δεν είναι διαθέσιμη για αυτό το αρχείο." + }, + "help": { + "click": "επιλέξτε αρχείο ή φάκελο", + "ctrl": { + "click": "επιλογή πολλαπλών αρχείων ή φακέλων", + "f": "ανοίγει την αναζήτηση", + "s": "αποθηκεύει ένα αρχείο ή εκκινεί λήψη του φακέλου στον οποίο βρίσκεστε" }, - "download": { - "downloadFile": "Λήψη αρχείου", - "downloadFolder": "Λήψη φακέλου", - "downloadSelected": "Λήψη επιλεγμένων" + "del": "διαγραφή επιλεγμένων στοιχείων", + "doubleClick": "ανοίγει ένα αρχείο ή φάκελο", + "esc": "καθαρίζει την επιλογή ή/και κλείνει το παράθυρο", + "f1": "αυτή η πληροφορία", + "f2": "μετονομασία αρχείου", + "help": "Βοήθεια" + }, + "languages": { + "he": "עברית", + "hu": "Magyar", + "ar": "العربية", + "de": "Deutsch", + "en": "English", + "es": "Español", + "el": "Ελληνικά", + "fr": "Français", + "is": "Icelandic", + "it": "Italiano", + "ja": "日本語", + "ko": "한국어", + "nlBE": "Dutch (Belgium)", + "pl": "Polski", + "pt": "Português", + "ptBR": "Português (Brasil)", + "ro": "Romanian", + "ru": "Русский", + "sk": "Slovenčina", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "ua": "Українська", + "zhCN": "中文 (简体)", + "zhTW": "中文 (繁體)" + }, + "login": { + "createAnAccount": "Δημιουργία λογαριασμού", + "loginInstead": "Έχετε ήδη λογαριασμό", + "password": "Κωδικός πρόσβασης", + "passwordConfirm": "Επιβεβαίωση κωδικού πρόσβασης", + "passwordsDontMatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν", + "signup": "Εγγραφή", + "submit": "Είσοδος", + "username": "Όνομα χρήστη", + "usernameTaken": "Το όνομα χρήστη χρησιμοποιείται ήδη", + "wrongCredentials": "Λάθος όνομα ή/και κωδικός πρόσβασης" + }, + "permanent": "Μόνιμο", + "prompts": { + "copy": "Αντιγραφή", + "copyMessage": "Επιλέξτε τοποθεσία για αντιγραφή των αρχείων σας:", + "deleteMessageMultiple": "Είστε σίγουροι ότι θέλετε να διαγράψετε {count} αρχεία;", + "deleteMessageSingle": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αρχείο/φάκελο;", + "deleteMessageShare": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την κοινοποίηση ({path});", + "deleteTitle": "Διαγραφή αρχείων", + "displayName": "Εμφάνιση ονόματος:", + "download": "Λήψη αρχείων", + "downloadMessage": "Επιλέξτε τη μορφή που θέλετε να λάβετε.", + "error": "Προέκυψε κάποιο σφάλμα", + "fileInfo": "Πληροφορίες αρχείου", + "filesSelected": "Επιλέχθηκαν {count} αρχεία.", + "lastModified": "Τελευταία τροποποίηση", + "move": "Μετακίνηση", + "moveMessage": "Επιλέξτε νέα τοποθεσία για τα αρχεία / τους φακέλους σας:", + "newArchetype": "Δημιουργία νέας ανάρτησης με βάση έναν αρχέτυπο. Το αρχείο σας θα δημιουργηθεί στο φάκελο περιεχομένου.", + "newDir": "Νέος φάκελος", + "newDirMessage": "Γράψτε το όνομα του νέου φακέλου.", + "newFile": "Νέο αρχείο", + "newFileMessage": "Γράψτε το όνομα του νέου αρχείου.", + "numberDirs": "Αριθμός φακέλων", + "numberFiles": "Αριθμός αρχείων", + "rename": "Μετονομασία", + "renameMessage": "Εισαγάγετε ένα νέο όνομα για το", + "replace": "Αντικατάσταση", + "replaceMessage": "Ένα από τα αρχεία που προσπαθείτε να μεταφορτώσετε δημιουργεί σύγκρουση με υπάρχον αρχείο λόγω του ονόματός του. Θέλετε να συνεχίσετε τη μεταφόρτωση ή να αντικαταστήσετε το υπάρχον;\n", + "schedule": "Προγραμματισμός", + "scheduleMessage": "Επιλέξτε μια ημερομηνία και ώρα για τον προγραμματισμό της δημοσίευσης αυτής της ανάρτησης.", + "show": "Εμφάνιση", + "size": "Μέγεθος", + "upload": "Μεταφόρτωση", + "uploadFiles": "Μεταφόρτωση {files} αρχείων…", + "uploadMessage": "Επιλέξτε μια επιλογή για τη μεταφόρτωση.", + "optionalPassword": "Προαιρετικός κωδικός πρόσβασης" + }, + "search": { + "images": "Εικόνες", + "music": "Μουσική", + "pdf": "PDF", + "pressToSearch": "Πατήστε Enter για αναζήτηση…", + "search": "Αναζήτηση…", + "typeToSearch": "Πληκτρολογήστε για αναζήτηση…", + "types": "Τύποι", + "video": "Βίντεο" + }, + "settings": { + "admin": "Διαχειριστής", + "administrator": "Διαχειριστής", + "allowCommands": "Εκτέλεση εντολών", + "allowEdit": "Επεξεργασία, μετονομασία και διαγραφή αρχείων ή φακέλων", + "allowNew": "Δημιουργία νέων αρχείων και φακέλων", + "allowPublish": "Δημοσίευση νέων αναρτήσεων και σελίδων", + "allowSignup": "Να επιτρέπεται η εγγραφή νέων χρηστών", + "avoidChanges": "(αφήστε το κενό για αποφυγή αλλαγών)", + "branding": "Εξατομίκευση", + "brandingDirectoryPath": "Διαδρομή φακέλου εξατομίκευσης", + "brandingHelp": "Μπορείτε να προσαρμόσετε την εμφάνισης της εφαρμογής File Browser αλλάζοντας το όνομά της, αντικαθιστώντας το λογότυπό της, προσθέτοντας προσαρμοσμένα στυλ και ακόμα και απενεργοποιώντας εξωτερικούς συνδέσμους προς το GitHub.\nΓια περισσότερες πληροφορίες σχετικά με αυτές τις προσαρμογές, ελέγξτε το {0}.", + "changePassword": "Αλλαγή κωδικού πρόσβασης", + "commandRunner": "Εκτέλεση εντολών", + "commandRunnerHelp": "Εδώ μπορείτε να ορίσετε εντολές που εκτελούνται στα ονομασμένα γεγονότα και δραστηριότητες. Πρέπει να γράψετε μία εντολή ανά γραμμή. Οι μεταβλητές περιβάλλοντος {0} και {1} θα είναι διαθέσιμες, και θα είναι {0} σχετικές με το {1}. Για περισσότερες πληροφορίες σχετικά με αυτή τη λειτουργία και τις διαθέσιμες μεταβλητές περιβάλλοντος, παρακαλώ διαβάστε το {2}.", + "commandsUpdated": "Οι εντολές ενημερώθηκαν!", + "createUserDir": "Αυτόματη δημιουργία φακέλου χρήστη κατά την προσθήκη νέου χρήστη", + "tusUploads": "Τμηματικές μεταφορές αρχείων", + "tusUploadsHelp": "Η εφαρμογή File Browser υποστηρίζει τμηματικές μεταφορτώσεις αρχείων, επιτρέποντας την αποδοτική, αξιόπιστη και συνεχιζόμενη μεταφόρτωση αρχείων ακόμα και σε ασταθείς συνδέσεις δικτύου.", + "tusUploadsChunkSize": "Υποδεικνύει το μέγιστο μέγεθος ενός αιτήματος μεταφόρτωσης (για μικρότερες μεταφορές αρχείων θα χρησιμοποιηθούν απευθείας και όχι τμηματικές μεταφορτώσεις). Μπορείτε να εισάγετε έναν ακέραιο αριθμό που υποδηλώνει το μέγεθος σε bytes, ή κείμενο με αριθμό και μονάδα μέτρησης μεγέθους δεδομένων, όπως 10MB, 1GB κλπ.", + "tusUploadsRetryCount": "Αριθμός επαναληπτικών δοκιμών που θα πραγματοποιηθούν αν αποτύχει η μεταφόρτωση ενός τμήματος.", + "userHomeBasePath": "Βασική διαδρομή αρχείων για τους φακέλους των χρηστών", + "userScopeGenerationPlaceholder": "Η εμβέλεια εφαρμογής θα δημιουργηθεί αυτόματα", + "createUserHomeDirectory": "Δημιουργία φακέλου χρήστη", + "customStylesheet": "Προσαρμοσμένο στυλ εμφάνισης (stylesheet)", + "defaultUserDescription": "Αυτές είναι οι προεπιλεγμένες ρυθμίσεις για νέους χρήστες.", + "disableExternalLinks": "Απενεργοποίηση εξωτερικών συνδέσμων (εκτός από συνδέσμους προς τις οδηγίες χρήσης)", + "disableUsedDiskPercentage": "Απενεργοποίηση γραφήματος ποσοστού χρήσης χώρου αποθήκευσης", + "documentation": "οδηγίες χρήσης", + "examples": "Παραδείγματα", + "executeOnShell": "Εκτέλεση στο κέλυφος", + "executeOnShellDescription": "Από προεπιλογή, η εφαρμογή File Browser εκτελεί τις εντολές καλώντας τα προγράμματα των εντολών απευθείας. Αν θέλετε να τις εκτελέσετε σε ένα κέλυφος (όπως το Bash ή το PowerShell), μπορείτε να το καθορίσετε εδώ με τις απαιτούμενες παραμέτρους. Εάν οριστεί, η εντολή που εκτελείτε θα προστίθεται ως παράμετρος. Αυτό ισχύει τόσο για τις εντολές χρήστη όσο και για τους αγκίστρους συμβάντων (event hooks).", + "globalRules": "Πρόκειται για ένα γενικό σύνολο κανόνων που επιτρέπουν και απαγορεύουν διάφορες λειτουργίες και ισχύουν για κάθε χρήστη. Μπορείτε να καθορίσετε συγκεκριμένους κανόνες στις ρυθμίσεις κάθε χρήστη για να παρακάμψετε τους γενικούς κανόνες.", + "globalSettings": "Γενικές ρυθμίσεις", + "hideDotfiles": "Απόκρυψη κρυφών αρχείων (dotfiles)", + "insertPath": "Εισάγετε διαδρομή", + "insertRegex": "Εισάγετε έκφραση regex", + "instanceName": "Όνομα περιβάλλοντος", + "language": "Γλώσσα", + "lockPassword": "Αποτρέψτε τον χρήστη από την αλλαγή του κωδικού πρόσβασης", + "newPassword": "Νέος κωδικός πρόσβασης", + "newPasswordConfirm": "Επιβεβαιώστε τον νέο κωδικό πρόσβασης", + "newUser": "Νέος χρήστης", + "password": "Κωδικός πρόσβασης", + "passwordUpdated": "Ο κωδικός πρόσβασης ενημερώθηκε!", + "path": "Διαδρομή", + "perm": { + "create": "Δημιουργία αρχείων και φακέλων", + "delete": "Διαγραφή αρχείων και φακέλων", + "download": "Λήψη", + "execute": "Εκτέλεση εντολών", + "modify": "Επεξεργασία αρχείων", + "rename": "Μετονομασία ή μετακίνηση αρχείων και φακέλων", + "share": "Κοινοποίηση αρχείων" }, - "upload": { - "abortUpload": "Είστε σίγουροι ότι θέλετε να διακόψετε τη μεταφόρτωση;" + "permissions": "Δικαιώματα", + "permissionsHelp": "Μπορείτε να ορίσετε τον χρήστη ως διαχειριστή ή να επιλέξετε τα δικαιώματα μεμονωμένα. Αν επιλέξετε \"Διαχειριστής\", όλες οι υπόλοιπες επιλογές θα είναι αυτόματα επιλεγμένες. Η διαχείριση χρηστών παραμένει προνόμιο ενός χρήστη με τον ρόλο του διαχειριστή.\n", + "profileSettings": "Ρυθμίσεις προφίλ", + "ruleExample1": "αποκλείει την πρόσβαση σε οποιοδήποτε κρυφό αρχείο (όπως .git, .gitignore) σε κάθε φάκελο.\n", + "ruleExample2": "αποκλείει την πρόσβαση στο αρχείο με το όνομα Caddyfile στον ριζικό φάκελο της εμβέλειας του κανόνα.", + "rules": "Κανόνες", + "rulesHelp": "Εδώ μπορείτε να ορίσετε ένα σύνολο κανόνων που επιτρέπουν και απαγορεύουν διάφορες λειτουργίες για τον συγκεκριμένο χρήστη. Τα αποκλεισμένα αρχεία δεν θα εμφανίζονται στα περιεχόμενα των αντίστοιχων φακέλων και δεν θα είναι προσβάσιμα από τον χρήστη. Υποστηρίζονται εκφράσεις regex και διαδρομές σχετικές με την εμβέλεια αρχείων των χρηστών.\n", + "scope": "Εμβέλεια", + "setDateFormat": "Ορισμός ακριβούς μορφής ημερομηνίας", + "settingsUpdated": "Οι ρυθμίσεις ενημερώθηκαν!", + "shareDuration": "Διάρκεια κοινοποίησης", + "shareManagement": "Διαχείριση κοινοποίησης", + "shareDeleted": "Η κοινοποίηση διαγράφηκε!", + "singleClick": "Χρήση μονού κλικ για να ανοίξετε αρχεία και φακέλους", + "themes": { + "dark": "Σκοτεινό", + "light": "Φωτεινό", + "title": "Μοτίβο" }, - "errors": { - "forbidden": "Δεν έχετε άδεια πρόσβασης σε αυτό.", - "internal": "Προέκυψε εσωτερικό σφάλμα.", - "notFound": "Αυτή η τοποθεσία δεν μπορεί να βρεθεί.", - "connection": "Ο διακομιστής δεν είναι διαθέσιμος." - }, - "files": { - "body": "Περιεχόμενο", - "clear": "Καθαρισμός", - "closePreview": "Κλείσιμο προεπισκόπησης", - "files": "Αρχεία", - "folders": "Φάκελοι", - "home": "Αρχική", - "lastModified": "Τελευταία τροποποίηση", - "loading": "Φορτώνει…", - "lonely": "Δεν υπάρχει τίποτα εδώ (ακόμη)…", - "metadata": "Μεταδεδομένα", - "multipleSelectionEnabled": "Ενεργοποιημένη επιλογή πολλαπλών", - "name": "Όνομα", - "size": "Μέγεθος", - "sortByLastModified": "Ταξινόμηση κατά πρόσφατη τροποποίηση", - "sortByName": "Ταξινόμηση κατά όνομα", - "sortBySize": "Ταξινόμηση κατά μέγεθος", - "noPreview": "Η προεπισκόπηση δεν είναι διαθέσιμη για αυτό το αρχείο." - }, - "help": { - "click": "επιλέξτε αρχείο ή φάκελο", - "ctrl": { - "click": "επιλογή πολλαπλών αρχείων ή φακέλων", - "f": "ανοίγει την αναζήτηση", - "s": "αποθηκεύει ένα αρχείο ή εκκινεί λήψη του φακέλου στον οποίο βρίσκεστε" - }, - "del": "διαγραφή επιλεγμένων στοιχείων", - "doubleClick": "ανοίγει ένα αρχείο ή φάκελο", - "esc": "καθαρίζει την επιλογή ή/και κλείνει το παράθυρο", - "f1": "αυτή η πληροφορία", - "f2": "μετονομασία αρχείου", - "help": "Βοήθεια" - }, - "languages": { - "he": "עברית", - "hu": "Magyar", - "ar": "العربية", - "de": "Deutsch", - "en": "English", - "es": "Español", - "el": "Ελληνικά", - "fr": "Français", - "is": "Icelandic", - "it": "Italiano", - "ja": "日本語", - "ko": "한국어", - "nlBE": "Dutch (Belgium)", - "pl": "Polski", - "pt": "Português", - "ptBR": "Português (Brasil)", - "ro": "Romanian", - "ru": "Русский", - "sk": "Slovenčina", - "svSE": "Swedish (Sweden)", - "tr": "Türkçe", - "ua": "Українська", - "zhCN": "中文 (简体)", - "zhTW": "中文 (繁體)" - }, - "login": { - "createAnAccount": "Δημιουργία λογαριασμού", - "loginInstead": "Έχετε ήδη λογαριασμό", - "password": "Κωδικός πρόσβασης", - "passwordConfirm": "Επιβεβαίωση κωδικού πρόσβασης", - "passwordsDontMatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν", - "signup": "Εγγραφή", - "submit": "Είσοδος", - "username": "Όνομα χρήστη", - "usernameTaken": "Το όνομα χρήστη χρησιμοποιείται ήδη", - "wrongCredentials": "Λάθος όνομα ή/και κωδικός πρόσβασης" - }, - "permanent": "Μόνιμο", - "prompts": { - "copy": "Αντιγραφή", - "copyMessage": "Επιλέξτε τοποθεσία για αντιγραφή των αρχείων σας:", - "deleteMessageMultiple": "Είστε σίγουροι ότι θέλετε να διαγράψετε {count} αρχεία;", - "deleteMessageSingle": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αρχείο/φάκελο;", - "deleteMessageShare": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την κοινοποίηση ({path});", - "deleteTitle": "Διαγραφή αρχείων", - "displayName": "Εμφάνιση ονόματος:", - "download": "Λήψη αρχείων", - "downloadMessage": "Επιλέξτε τη μορφή που θέλετε να λάβετε.", - "error": "Προέκυψε κάποιο σφάλμα", - "fileInfo": "Πληροφορίες αρχείου", - "filesSelected": "Επιλέχθηκαν {count} αρχεία.", - "lastModified": "Τελευταία τροποποίηση", - "move": "Μετακίνηση", - "moveMessage": "Επιλέξτε νέα τοποθεσία για τα αρχεία / τους φακέλους σας:", - "newArchetype": "Δημιουργία νέας ανάρτησης με βάση έναν αρχέτυπο. Το αρχείο σας θα δημιουργηθεί στο φάκελο περιεχομένου.", - "newDir": "Νέος φάκελος", - "newDirMessage": "Γράψτε το όνομα του νέου φακέλου.", - "newFile": "Νέο αρχείο", - "newFileMessage": "Γράψτε το όνομα του νέου αρχείου.", - "numberDirs": "Αριθμός φακέλων", - "numberFiles": "Αριθμός αρχείων", - "rename": "Μετονομασία", - "renameMessage": "Εισαγάγετε ένα νέο όνομα για το", - "replace": "Αντικατάσταση", - "replaceMessage": "Ένα από τα αρχεία που προσπαθείτε να μεταφορτώσετε δημιουργεί σύγκρουση με υπάρχον αρχείο λόγω του ονόματός του. Θέλετε να συνεχίσετε τη μεταφόρτωση ή να αντικαταστήσετε το υπάρχον;\n", - "schedule": "Προγραμματισμός", - "scheduleMessage": "Επιλέξτε μια ημερομηνία και ώρα για τον προγραμματισμό της δημοσίευσης αυτής της ανάρτησης.", - "show": "Εμφάνιση", - "size": "Μέγεθος", - "upload": "Μεταφόρτωση", - "uploadFiles": "Μεταφόρτωση {files} αρχείων…", - "uploadMessage": "Επιλέξτε μια επιλογή για τη μεταφόρτωση.", - "optionalPassword": "Προαιρετικός κωδικός πρόσβασης" - }, - "search": { - "images": "Εικόνες", - "music": "Μουσική", - "pdf": "PDF", - "pressToSearch": "Πατήστε Enter για αναζήτηση…", - "search": "Αναζήτηση…", - "typeToSearch": "Πληκτρολογήστε για αναζήτηση…", - "types": "Τύποι", - "video": "Βίντεο" - }, - "settings": { - "admin": "Διαχειριστής", - "administrator": "Διαχειριστής", - "allowCommands": "Εκτέλεση εντολών", - "allowEdit": "Επεξεργασία, μετονομασία και διαγραφή αρχείων ή φακέλων", - "allowNew": "Δημιουργία νέων αρχείων και φακέλων", - "allowPublish": "Δημοσίευση νέων αναρτήσεων και σελίδων", - "allowSignup": "Να επιτρέπεται η εγγραφή νέων χρηστών", - "avoidChanges": "(αφήστε το κενό για αποφυγή αλλαγών)", - "branding": "Εξατομίκευση", - "brandingDirectoryPath": "Διαδρομή φακέλου εξατομίκευσης", - "brandingHelp": "Μπορείτε να προσαρμόσετε την εμφάνισης της εφαρμογής File Browser αλλάζοντας το όνομά της, αντικαθιστώντας το λογότυπό της, προσθέτοντας προσαρμοσμένα στυλ και ακόμα και απενεργοποιώντας εξωτερικούς συνδέσμους προς το GitHub.\nΓια περισσότερες πληροφορίες σχετικά με αυτές τις προσαρμογές, ελέγξτε το {0}.", - "changePassword": "Αλλαγή κωδικού πρόσβασης", - "commandRunner": "Εκτέλεση εντολών", - "commandRunnerHelp": "Εδώ μπορείτε να ορίσετε εντολές που εκτελούνται στα ονομασμένα γεγονότα και δραστηριότητες. Πρέπει να γράψετε μία εντολή ανά γραμμή. Οι μεταβλητές περιβάλλοντος {0} και {1} θα είναι διαθέσιμες, και θα είναι {0} σχετικές με το {1}. Για περισσότερες πληροφορίες σχετικά με αυτή τη λειτουργία και τις διαθέσιμες μεταβλητές περιβάλλοντος, παρακαλώ διαβάστε το {2}.", - "commandsUpdated": "Οι εντολές ενημερώθηκαν!", - "createUserDir": "Αυτόματη δημιουργία φακέλου χρήστη κατά την προσθήκη νέου χρήστη", - "tusUploads": "Τμηματικές μεταφορές αρχείων", - "tusUploadsHelp": "Η εφαρμογή File Browser υποστηρίζει τμηματικές μεταφορτώσεις αρχείων, επιτρέποντας την αποδοτική, αξιόπιστη και συνεχιζόμενη μεταφόρτωση αρχείων ακόμα και σε ασταθείς συνδέσεις δικτύου.", - "tusUploadsChunkSize": "Υποδεικνύει το μέγιστο μέγεθος ενός αιτήματος μεταφόρτωσης (για μικρότερες μεταφορές αρχείων θα χρησιμοποιηθούν απευθείας και όχι τμηματικές μεταφορτώσεις). Μπορείτε να εισάγετε έναν ακέραιο αριθμό που υποδηλώνει το μέγεθος σε bytes, ή κείμενο με αριθμό και μονάδα μέτρησης μεγέθους δεδομένων, όπως 10MB, 1GB κλπ.", - "tusUploadsRetryCount": "Αριθμός επαναληπτικών δοκιμών που θα πραγματοποιηθούν αν αποτύχει η μεταφόρτωση ενός τμήματος.", - "userHomeBasePath": "Βασική διαδρομή αρχείων για τους φακέλους των χρηστών", - "userScopeGenerationPlaceholder": "Η εμβέλεια εφαρμογής θα δημιουργηθεί αυτόματα", - "createUserHomeDirectory": "Δημιουργία φακέλου χρήστη", - "customStylesheet": "Προσαρμοσμένο στυλ εμφάνισης (stylesheet)", - "defaultUserDescription": "Αυτές είναι οι προεπιλεγμένες ρυθμίσεις για νέους χρήστες.", - "disableExternalLinks": "Απενεργοποίηση εξωτερικών συνδέσμων (εκτός από συνδέσμους προς τις οδηγίες χρήσης)", - "disableUsedDiskPercentage": "Απενεργοποίηση γραφήματος ποσοστού χρήσης χώρου αποθήκευσης", - "documentation": "οδηγίες χρήσης", - "examples": "Παραδείγματα", - "executeOnShell": "Εκτέλεση στο κέλυφος", - "executeOnShellDescription": "Από προεπιλογή, η εφαρμογή File Browser εκτελεί τις εντολές καλώντας τα προγράμματα των εντολών απευθείας. Αν θέλετε να τις εκτελέσετε σε ένα κέλυφος (όπως το Bash ή το PowerShell), μπορείτε να το καθορίσετε εδώ με τις απαιτούμενες παραμέτρους. Εάν οριστεί, η εντολή που εκτελείτε θα προστίθεται ως παράμετρος. Αυτό ισχύει τόσο για τις εντολές χρήστη όσο και για τους αγκίστρους συμβάντων (event hooks).", - "globalRules": "Πρόκειται για ένα γενικό σύνολο κανόνων που επιτρέπουν και απαγορεύουν διάφορες λειτουργίες και ισχύουν για κάθε χρήστη. Μπορείτε να καθορίσετε συγκεκριμένους κανόνες στις ρυθμίσεις κάθε χρήστη για να παρακάμψετε τους γενικούς κανόνες.", - "globalSettings": "Γενικές ρυθμίσεις", - "hideDotfiles": "Απόκρυψη κρυφών αρχείων (dotfiles)", - "insertPath": "Εισάγετε διαδρομή", - "insertRegex": "Εισάγετε έκφραση regex", - "instanceName": "Όνομα περιβάλλοντος", - "language": "Γλώσσα", - "lockPassword": "Αποτρέψτε τον χρήστη από την αλλαγή του κωδικού πρόσβασης", - "newPassword": "Νέος κωδικός πρόσβασης", - "newPasswordConfirm": "Επιβεβαιώστε τον νέο κωδικό πρόσβασης", - "newUser": "Νέος χρήστης", - "password": "Κωδικός πρόσβασης", - "passwordUpdated": "Ο κωδικός πρόσβασης ενημερώθηκε!", - "path": "Διαδρομή", - "perm": { - "create": "Δημιουργία αρχείων και φακέλων", - "delete": "Διαγραφή αρχείων και φακέλων", - "download": "Λήψη", - "execute": "Εκτέλεση εντολών", - "modify": "Επεξεργασία αρχείων", - "rename": "Μετονομασία ή μετακίνηση αρχείων και φακέλων", - "share": "Κοινοποίηση αρχείων" - }, - "permissions": "Δικαιώματα", - "permissionsHelp": "Μπορείτε να ορίσετε τον χρήστη ως διαχειριστή ή να επιλέξετε τα δικαιώματα μεμονωμένα. Αν επιλέξετε \"Διαχειριστής\", όλες οι υπόλοιπες επιλογές θα είναι αυτόματα επιλεγμένες. Η διαχείριση χρηστών παραμένει προνόμιο ενός χρήστη με τον ρόλο του διαχειριστή.\n", - "profileSettings": "Ρυθμίσεις προφίλ", - "ruleExample1": "αποκλείει την πρόσβαση σε οποιοδήποτε κρυφό αρχείο (όπως .git, .gitignore) σε κάθε φάκελο.\n", - "ruleExample2": "αποκλείει την πρόσβαση στο αρχείο με το όνομα Caddyfile στον ριζικό φάκελο της εμβέλειας του κανόνα.", - "rules": "Κανόνες", - "rulesHelp": "Εδώ μπορείτε να ορίσετε ένα σύνολο κανόνων που επιτρέπουν και απαγορεύουν διάφορες λειτουργίες για τον συγκεκριμένο χρήστη. Τα αποκλεισμένα αρχεία δεν θα εμφανίζονται στα περιεχόμενα των αντίστοιχων φακέλων και δεν θα είναι προσβάσιμα από τον χρήστη. Υποστηρίζονται εκφράσεις regex και διαδρομές σχετικές με την εμβέλεια αρχείων των χρηστών.\n", - "scope": "Εμβέλεια", - "setDateFormat": "Ορισμός ακριβούς μορφής ημερομηνίας", - "settingsUpdated": "Οι ρυθμίσεις ενημερώθηκαν!", - "shareDuration": "Διάρκεια κοινοποίησης", - "shareManagement": "Διαχείριση κοινοποίησης", - "shareDeleted": "Η κοινοποίηση διαγράφηκε!", - "singleClick": "Χρήση μονού κλικ για να ανοίξετε αρχεία και φακέλους", - "themes": { - "dark": "Σκοτεινό", - "light": "Φωτεινό", - "title": "Μοτίβο" - }, - "user": "Χρήστης", - "userCommands": "Εντολές χρήστη", - "userCommandsHelp": "Μια λίστα με τις διαθέσιμες εντολές για αυτόν το χρήστη, χωρισμένες μεταξύ τους με κενά. Παράδειγμα:\n", - "userCreated": "Ο χρήστης δημιουργήθηκε!", - "userDefaults": "Προεπιλεγμένες ρυθμίσεις χρήστη", - "userDeleted": "Ο χρήστης διαγράφηκε!", - "userManagement": "Διαχείριση χρηστών", - "userUpdated": "Ο χρήστης ενημερώθηκε!", - "username": "Όνομα χρήστη", - "users": "Χρήστες" - }, - "sidebar": { - "help": "Βοήθεια", - "hugoNew": "Νέο Hugo", - "login": "Σύνδεση", - "logout": "Αποσύνδεση", - "myFiles": "Τα αρχεία μου", - "newFile": "Νέο αρχείο", - "newFolder": "Νέος φάκελος", - "preview": "Προεπισκόπηση", - "settings": "Ρυθμίσεις", - "signup": "Εγγραφή", - "siteSettings": "Ρυθμίσεις ιστότοπου" - }, - "success": { - "linkCopied": "Ο σύνδεσμος αντιγράφηκε!" - }, - "time": { - "days": "Ημέρες", - "hours": "Ώρες", - "minutes": "Λεπτά", - "seconds": "Δευτερόλεπτα", - "unit": "Μονάδα χρόνου" - } + "user": "Χρήστης", + "userCommands": "Εντολές χρήστη", + "userCommandsHelp": "Μια λίστα με τις διαθέσιμες εντολές για αυτόν το χρήστη, χωρισμένες μεταξύ τους με κενά. Παράδειγμα:\n", + "userCreated": "Ο χρήστης δημιουργήθηκε!", + "userDefaults": "Προεπιλεγμένες ρυθμίσεις χρήστη", + "userDeleted": "Ο χρήστης διαγράφηκε!", + "userManagement": "Διαχείριση χρηστών", + "userUpdated": "Ο χρήστης ενημερώθηκε!", + "username": "Όνομα χρήστη", + "users": "Χρήστες" + }, + "sidebar": { + "help": "Βοήθεια", + "hugoNew": "Νέο Hugo", + "login": "Σύνδεση", + "logout": "Αποσύνδεση", + "myFiles": "Τα αρχεία μου", + "newFile": "Νέο αρχείο", + "newFolder": "Νέος φάκελος", + "preview": "Προεπισκόπηση", + "settings": "Ρυθμίσεις", + "signup": "Εγγραφή", + "siteSettings": "Ρυθμίσεις ιστότοπου" + }, + "success": { + "linkCopied": "Ο σύνδεσμος αντιγράφηκε!" + }, + "time": { + "days": "Ημέρες", + "hours": "Ώρες", + "minutes": "Λεπτά", + "seconds": "Δευτερόλεπτα", + "unit": "Μονάδα χρόνου" + } } diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index 33977e4e..499e474c 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -1,7 +1,9 @@ { "buttons": { "cancel": "Cancel", + "clear": "Clear", "close": "Close", + "continue": "Continue", "copy": "Copy", "copyFile": "Copy file", "copyToClipboard": "Copy to clipboard", @@ -11,6 +13,7 @@ "download": "Download", "file": "File", "folder": "Folder", + "fullScreen": "Toggle full screen", "hideDotfiles": "Hide dotfiles", "info": "Info", "more": "More", @@ -38,7 +41,6 @@ "update": "Update", "upload": "Upload", "openFile": "Open file", - "continue": "Continue", "discardChanges": "Discard" }, "download": { @@ -57,7 +59,6 @@ }, "files": { "body": "Body", - "clear": "Clear", "closePreview": "Close preview", "files": "Files", "folders": "Folders", @@ -110,7 +111,7 @@ "sk": "Slovenčina", "svSE": "Swedish (Sweden)", "tr": "Türkçe", - "ua": "Українська", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, @@ -134,6 +135,7 @@ "deleteMessageMultiple": "Are you sure you wish to delete {count} file(s)?", "deleteMessageSingle": "Are you sure you wish to delete this file/folder?", "deleteMessageShare": "Are you sure you wish to delete this share({path})?", + "deleteUser": "Are you sure you want to delete this user?", "deleteTitle": "Delete files", "displayName": "Display Name:", "download": "Download files", @@ -246,6 +248,7 @@ "shareDeleted": "Share deleted!", "singleClick": "Use single clicks to open files and directories", "themes": { + "default": "System default", "dark": "Dark", "light": "Light", "title": "Theme" diff --git a/frontend/src/i18n/es.json b/frontend/src/i18n/es.json index bd247627..a0015ced 100644 --- a/frontend/src/i18n/es.json +++ b/frontend/src/i18n/es.json @@ -1,7 +1,9 @@ { "buttons": { "cancel": "Cancelar", + "clear": "Limpiar", "close": "Cerrar", + "continue": "Continuar", "copy": "Copiar", "copyFile": "Copiar archivo", "copyToClipboard": "Copiar al portapapeles", @@ -51,7 +53,6 @@ }, "files": { "body": "Cuerpo", - "clear": "Limpiar", "closePreview": "Cerrar vista previa", "files": "Archivos", "folders": "Carpetas", @@ -102,8 +103,8 @@ "ru": "Русский", "sk": "Slovenčina", "svSE": "Swedish (Sweden)", - "tr" : "Türkçe", - "ua": "Українська", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/fr.json b/frontend/src/i18n/fr.json index 0be93f1a..0578c7fc 100644 --- a/frontend/src/i18n/fr.json +++ b/frontend/src/i18n/fr.json @@ -1,15 +1,19 @@ { "buttons": { "cancel": "Annuler", + "clear": "Effacer", "close": "Fermer", + "continue": "Continuer", "copy": "Copier", "copyFile": "Copier le fichier", "copyToClipboard": "Copier dans le presse-papier", + "copyDownloadLinkToClipboard": "Copier le lien de téléchargement dans le presse-papier", "create": "Créer", "delete": "Supprimer", "download": "Télécharger", "file": "Fichier", "folder": "Dossier", + "fullScreen": "Plein écran", "hideDotfiles": "Masquer les dotfiles", "info": "Info", "more": "Plus", @@ -51,7 +55,6 @@ }, "files": { "body": "Corps", - "clear": "Fermer", "closePreview": "Fermer la prévisualisation", "files": "Fichiers", "folders": "Dossiers", @@ -87,23 +90,24 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", - "is": "", + "is": "Icelandic", "it": "Italiano", "ja": "日本語", "ko": "한국어", - "nlBE": "", + "nlBE": "Dutch (Belgium)", "pl": "Polski", "pt": "Português", "ptBR": "Português (Brasil)", - "ro": "", + "ro": "Romanian", "ru": "Русский", "sk": "Slovenčina", - "svSE": "", - "tr" : "Türkçe", - "ua": "Українська", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, @@ -181,7 +185,7 @@ "brandingHelp": "Vous pouvez personnaliser l'apparence de votre instance de File Browser en changeant son nom, en remplaçant le logo, en ajoutant des styles personnalisés et même en désactivant les liens externes vers GitHub.\nPour plus d'informations sur la personnalisation de l'image de marque, veuillez consulter la {0}.", "changePassword": "Modifier le mot de passe", "commandRunner": "Command runner", - "commandRunnerHelp" : "Ici, vous pouvez définir les commandes qui sont exécutées pour les événements nommés précédemments. Vous devez en écrire une par ligne. Les variables d'environnement {0} et {1} seront disponibles, {0} étant relatif à {1}. Pour plus d'informations sur cette fonctionnalité et les variables d'environnement disponibles, veuillez lire la {2}.", + "commandRunnerHelp": "Ici, vous pouvez définir les commandes qui sont exécutées pour les événements nommés précédemments. Vous devez en écrire une par ligne. Les variables d'environnement {0} et {1} seront disponibles, {0} étant relatif à {1}. Pour plus d'informations sur cette fonctionnalité et les variables d'environnement disponibles, veuillez lire la {2}.", "commandsUpdated": "Commandes mises à jour !", "createUserDir": "Créer automatiquement un dossier pour l'utilisateur", "customStylesheet": "Feuille de style personnalisée", diff --git a/frontend/src/i18n/he.json b/frontend/src/i18n/he.json index dbac2871..98c768f0 100644 --- a/frontend/src/i18n/he.json +++ b/frontend/src/i18n/he.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "ביטול", + "clear": "נקה", "close": "סגירה", "copy": "העתקה", "copyFile": "העתק קובץ", @@ -93,6 +94,7 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", @@ -109,7 +111,7 @@ "sk": "Slovenčina", "svSE": "Swedish (Sweden)", "tr": "Türkçe", - "ua": "Українська", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/hu.json b/frontend/src/i18n/hu.json index 7674e337..34bbe862 100644 --- a/frontend/src/i18n/hu.json +++ b/frontend/src/i18n/hu.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "Mégse", + "clear": "Törlése", "close": "Bezárás", "copy": "Másolás", "copyFile": "Fájl másolása", @@ -51,7 +52,6 @@ }, "files": { "body": "Törzs", - "clear": "Törlése", "closePreview": "Előnézet bezárása", "files": "Fájlok", "folders": "Mappák", @@ -87,6 +87,7 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", @@ -103,7 +104,7 @@ "sk": "Slovenčina", "svSE": "Swedish (Sweden)", "tr": "Türkçe", - "ua": "Українська", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/index.js b/frontend/src/i18n/index.js deleted file mode 100644 index 70640de8..00000000 --- a/frontend/src/i18n/index.js +++ /dev/null @@ -1,143 +0,0 @@ -import Vue from "vue"; -import VueI18n from "vue-i18n"; - -import he from "./he.json"; -import hu from "./hu.json"; -import ar from "./ar.json"; -import de from "./de.json"; -import el from "./el.json"; -import en from "./en.json"; -import es from "./es.json"; -import fr from "./fr.json"; -import is from "./is.json"; -import it from "./it.json"; -import ja from "./ja.json"; -import ko from "./ko.json"; -import nlBE from "./nl-be.json"; -import pl from "./pl.json"; -import pt from "./pt.json"; -import ptBR from "./pt-br.json"; -import ro from "./ro.json"; -import ru from "./ru.json"; -import sk from "./sk.json"; -import ua from "./ua.json"; -import svSE from "./sv-se.json"; -import zhCN from "./zh-cn.json"; -import zhTW from "./zh-tw.json"; - -Vue.use(VueI18n); - -export function detectLocale() { - let locale = (navigator.language || navigator.browserLangugae).toLowerCase(); - switch (true) { - case /^he.*/i.test(locale): - locale = "he"; - break; - case /^hu.*/i.test(locale): - locale = "hu"; - break; - case /^ar.*/i.test(locale): - locale = "ar"; - break; - case /^el.*/i.test(locale): - locale = "el"; - break; - case /^es.*/i.test(locale): - locale = "es"; - break; - case /^en.*/i.test(locale): - locale = "en"; - break; - case /^it.*/i.test(locale): - locale = "it"; - break; - case /^fr.*/i.test(locale): - locale = "fr"; - break; - case /^pt.*/i.test(locale): - locale = "pt"; - break; - case /^pt-BR.*/i.test(locale): - locale = "pt-br"; - break; - case /^ja.*/i.test(locale): - locale = "ja"; - break; - case /^zh-CN/i.test(locale): - locale = "zh-cn"; - break; - case /^zh-TW/i.test(locale): - locale = "zh-tw"; - break; - case /^zh.*/i.test(locale): - locale = "zh-cn"; - break; - case /^de.*/i.test(locale): - locale = "de"; - break; - case /^ru.*/i.test(locale): - locale = "ru"; - break; - case /^pl.*/i.test(locale): - locale = "pl"; - break; - case /^ko.*/i.test(locale): - locale = "ko"; - break; - case /^sk.*/i.test(locale): - locale = "sk"; - break; - case /^ua.*/i.test(locale): - locale = "ua"; - break; - default: - locale = "en"; - } - - return locale; -} - -const removeEmpty = (obj) => - Object.keys(obj) - .filter((k) => obj[k] !== null && obj[k] !== undefined && obj[k] !== "") // Remove undef. and null and empty.string. - .reduce( - (newObj, k) => - typeof obj[k] === "object" - ? Object.assign(newObj, { [k]: removeEmpty(obj[k]) }) // Recurse. - : Object.assign(newObj, { [k]: obj[k] }), // Copy value. - {} - ); - -export const rtlLanguages = ["he", "ar"]; - -const i18n = new VueI18n({ - locale: detectLocale(), - fallbackLocale: "en", - messages: { - he: removeEmpty(he), - hu: removeEmpty(hu), - ar: removeEmpty(ar), - de: removeEmpty(de), - el: removeEmpty(el), - en: en, - es: removeEmpty(es), - fr: removeEmpty(fr), - is: removeEmpty(is), - it: removeEmpty(it), - ja: removeEmpty(ja), - ko: removeEmpty(ko), - "nl-be": removeEmpty(nlBE), - pl: removeEmpty(pl), - "pt-br": removeEmpty(ptBR), - pt: removeEmpty(pt), - ru: removeEmpty(ru), - ro: removeEmpty(ro), - sk: removeEmpty(sk), - "sv-se": removeEmpty(svSE), - ua: removeEmpty(ua), - "zh-cn": removeEmpty(zhCN), - "zh-tw": removeEmpty(zhTW), - }, -}); - -export default i18n; diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts new file mode 100644 index 00000000..a16a0a6a --- /dev/null +++ b/frontend/src/i18n/index.ts @@ -0,0 +1,164 @@ +import dayjs from "dayjs"; +import { createI18n } from "vue-i18n"; + +import("dayjs/locale/ar"); +import("dayjs/locale/de"); +import("dayjs/locale/el"); +import("dayjs/locale/en"); +import("dayjs/locale/es"); +import("dayjs/locale/fr"); +import("dayjs/locale/he"); +import("dayjs/locale/hu"); +import("dayjs/locale/is"); +import("dayjs/locale/it"); +import("dayjs/locale/ja"); +import("dayjs/locale/ko"); +import("dayjs/locale/nl-be"); +import("dayjs/locale/pl"); +import("dayjs/locale/pt-br"); +import("dayjs/locale/pt"); +import("dayjs/locale/ro"); +import("dayjs/locale/ru"); +import("dayjs/locale/sk"); +import("dayjs/locale/sv"); +import("dayjs/locale/tr"); +import("dayjs/locale/uk"); +import("dayjs/locale/zh-cn"); +import("dayjs/locale/zh-tw"); + +// All i18n resources specified in the plugin `include` option can be loaded +// at once using the import syntax +import messages from "@intlify/unplugin-vue-i18n/messages"; + +export function detectLocale() { + // locale is an RFC 5646 language tag + // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/language + let locale = navigator.language.toLowerCase(); + switch (true) { + case /^he\b/.test(locale): + locale = "he"; + break; + case /^hu\b/.test(locale): + locale = "hu"; + break; + case /^ar\b/.test(locale): + locale = "ar"; + break; + case /^el.*/i.test(locale): + locale = "el"; + break; + case /^es\b/.test(locale): + locale = "es"; + break; + case /^en\b/.test(locale): + locale = "en"; + break; + case /^is\b/.test(locale): + locale = "is"; + break; + case /^it\b/.test(locale): + locale = "it"; + break; + case /^fr\b/.test(locale): + locale = "fr"; + break; + case /^pt-br\b/.test(locale): + locale = "pt-br"; + break; + case /^pt\b/.test(locale): + locale = "pt"; + break; + case /^ja\b/.test(locale): + locale = "ja"; + break; + case /^zh-tw\b/.test(locale): + locale = "zh-tw"; + break; + case /^zh-cn\b/.test(locale): + case /^zh\b/.test(locale): + locale = "zh-cn"; + break; + case /^de\b/.test(locale): + locale = "de"; + break; + case /^ro\b/.test(locale): + locale = "ro"; + break; + case /^ru\b/.test(locale): + locale = "ru"; + break; + case /^pl\b/.test(locale): + locale = "pl"; + break; + case /^ko\b/.test(locale): + locale = "ko"; + break; + case /^sk\b/.test(locale): + locale = "sk"; + break; + case /^tr\b/.test(locale): + locale = "tr"; + break; + // ua wasnt a valid locale for ukraine + case /^uk\b/.test(locale): + locale = "uk"; + break; + case /^sv-se\b/.test(locale): + case /^sv\b/.test(locale): + locale = "sv"; + break; + case /^nl-be\b/.test(locale): + locale = "nl-be"; + break; + default: + locale = "en"; + } + + return locale; +} + +// TODO: was this really necessary? +// function removeEmpty(obj: Record): void { +// Object.keys(obj) +// .filter((k) => obj[k] !== null && obj[k] !== undefined && obj[k] !== "") // Remove undef. and null and empty.string. +// .reduce( +// (newObj, k) => +// typeof obj[k] === "object" +// ? Object.assign(newObj, { [k]: removeEmpty(obj[k]) }) // Recurse. +// : Object.assign(newObj, { [k]: obj[k] }), // Copy value. +// {} +// ); +// } + +export const rtlLanguages = ["he", "ar"]; + +export const i18n = createI18n({ + locale: detectLocale(), + fallbackLocale: "en", + messages, + // expose i18n.global for outside components + legacy: true, +}); + +export const isRtl = (locale?: string) => { + // see below + // @ts-ignore + return rtlLanguages.includes(locale || i18n.global.locale.value); +}; + +export function setLocale(locale: string) { + dayjs.locale(locale); + // according to doc u only need .value if legacy: false but they lied + // https://vue-i18n.intlify.dev/guide/essentials/scope.html#local-scope-1 + //@ts-ignore + i18n.global.locale.value = locale; +} + +export function setHtmlLocale(locale: string) { + const html = document.documentElement; + html.lang = locale; + if (isRtl(locale)) html.dir = "rtl"; + else html.dir = "ltr"; +} + +export default i18n; diff --git a/frontend/src/i18n/is.json b/frontend/src/i18n/is.json index 24d51b02..6cc6af1d 100644 --- a/frontend/src/i18n/is.json +++ b/frontend/src/i18n/is.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "Hætta við", + "clear": "Hreinsa", "close": "Loka", "copy": "Afrita", "copyFile": "Afrita skjal", @@ -46,7 +47,6 @@ }, "files": { "body": "Meginmál", - "clear": "Hreinsa", "closePreview": "Loka forskoðun", "files": "Skjöl", "folders": "Möppur", @@ -81,23 +81,24 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", - "is": "", + "is": "Icelandic", "it": "Italiano", "ja": "日本語", "ko": "한국어", - "nlBE": "", + "nlBE": "Dutch (Belgium)", "pl": "Polski", "pt": "Português", "ptBR": "Português (Brasil)", - "ro": "", + "ro": "Romanian", "ru": "Русский", "sk": "Slovenčina", - "svSE": "", - "tr" : "Türkçe", - "ua": "Українська", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/it.json b/frontend/src/i18n/it.json index 85360980..5e5291a7 100644 --- a/frontend/src/i18n/it.json +++ b/frontend/src/i18n/it.json @@ -1,7 +1,9 @@ { "buttons": { "cancel": "Annulla", + "clear": "Cancella", "close": "Chiudi", + "continue": "Continua", "copy": "Copia", "copyFile": "Copia file", "copyToClipboard": "Copia negli appunti", @@ -46,7 +48,6 @@ }, "files": { "body": "Contenuto", - "clear": "Cancella", "closePreview": "Chiudi anteprima", "files": "File", "folders": "Cartelle", @@ -81,23 +82,24 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", - "is": "", + "is": "Icelandic", "it": "Italiano", "ja": "日本語", "ko": "한국어", - "nlBE": "", + "nlBE": "Dutch (Belgium)", "pl": "Polski", "pt": "Português", "ptBR": "Português (Brasil)", - "ro": "", + "ro": "Romanian", "ru": "Русский", "sk": "Slovenčina", - "svSE": "", - "tr" : "Türkçe", - "ua": "Українська", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/ja.json b/frontend/src/i18n/ja.json index 911c09b4..d69e9334 100644 --- a/frontend/src/i18n/ja.json +++ b/frontend/src/i18n/ja.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "キャンセル", + "clear": "クリアー", "close": "閉じる", "copy": "コピー", "copyFile": "ファイルのコピー", @@ -109,7 +110,7 @@ "sk": "Slovenčina", "svSE": "Swedish (Sweden)", "tr": "Türkçe", - "ua": "Українська", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/ko.json b/frontend/src/i18n/ko.json index 64a6eab9..4924d8ca 100644 --- a/frontend/src/i18n/ko.json +++ b/frontend/src/i18n/ko.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "취소", + "clear": "지우기", "close": "닫기", "copy": "복사", "copyFile": "파일 복사", @@ -46,7 +47,6 @@ }, "files": { "body": "본문", - "clear": "지우기", "closePreview": "미리보기 닫기", "files": "파일", "folders": "폴더", @@ -81,23 +81,24 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", - "is": "", + "is": "Icelandic", "it": "Italiano", "ja": "日本語", "ko": "한국어", - "nlBE": "", + "nlBE": "Dutch (Belgium)", "pl": "Polski", "pt": "Português", "ptBR": "Português (Brasil)", - "ro": "", + "ro": "Romanian", "ru": "Русский", "sk": "Slovenčina", - "svSE": "", - "tr" : "Türkçe", - "ua": "Українська", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/nl-be.json b/frontend/src/i18n/nl-be.json index dec8d302..9147acac 100644 --- a/frontend/src/i18n/nl-be.json +++ b/frontend/src/i18n/nl-be.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "Annuleren", + "clear": "Wissen", "close": "Sluiten", "copy": "Kopiëren", "copyFile": "Bestand kopiëren", @@ -46,7 +47,6 @@ }, "files": { "body": "Body", - "clear": "Wissen", "closePreview": "Voorvertoon sluiten", "files": "Bestanden", "folders": "Mappen", @@ -79,27 +79,28 @@ "languages": { "he": "עברית", "hu": "Magyar", - "ar": "Arabisch", - "de": "Duits", - "en": "Engels", - "es": "Spaans", - "fr": "Frans", - "is": "", - "it": "Italiaans", - "ja": "Japans", - "ko": "Koreaans", - "nlBE": "", - "pl": "Pools", - "pt": "Portugees", - "ptBR": "Portugees (Brazilië)", - "ro": "", - "ru": "Russisch", + "ar": "العربية", + "de": "Deutsch", + "el": "Ελληνικά", + "en": "English", + "es": "Español", + "fr": "Français", + "is": "Icelandic", + "it": "Italiano", + "ja": "日本語", + "ko": "한국어", + "nlBE": "Dutch (Belgium)", + "pl": "Polski", + "pt": "Português", + "ptBR": "Português (Brasil)", + "ro": "Romanian", + "ru": "Русский", "sk": "Slovenčina", - "svSE": "", - "tr" : "Türkçe", - "ua": "Українська", - "zhCN": "Chinees (vereenvoudigd)", - "zhTW": "Chinees (traditioneel)" + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", + "zhCN": "中文 (简体)", + "zhTW": "中文 (繁體)" }, "login": { "createAnAccount": "Account aanmaken", diff --git a/frontend/src/i18n/pl.json b/frontend/src/i18n/pl.json index a66facb2..8f7eb72d 100644 --- a/frontend/src/i18n/pl.json +++ b/frontend/src/i18n/pl.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "Anuluj", + "clear": "Wyczyść", "close": "Zamknij", "copy": "Kopiuj", "copyFile": "Kopiuj plik", @@ -46,7 +47,6 @@ }, "files": { "body": "Body", - "clear": "Wyczyść", "closePreview": "Zamknij poprzednie", "files": "Pliki", "folders": "Foldery", @@ -81,23 +81,24 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", - "is": "Íslenska", + "is": "Icelandic", "it": "Italiano", "ja": "日本語", "ko": "한국어", - "nlBE": "Nederlands (België)", + "nlBE": "Dutch (Belgium)", "pl": "Polski", "pt": "Português", "ptBR": "Português (Brasil)", - "ro": "Română", + "ro": "Romanian", "ru": "Русский", "sk": "Slovenčina", - "svSE": "Svenska (Sverige)", - "tr" : "Türkçe", - "ua": "Українська", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, @@ -147,7 +148,6 @@ "size": "Rozmiar", "upload": "Prześlij", "uploadMessage": "Proszę wybrać metodę przesyłania" - }, "search": { "images": "Zdjęcia", diff --git a/frontend/src/i18n/pt-br.json b/frontend/src/i18n/pt-br.json index 51355a9c..ae9c7bdb 100644 --- a/frontend/src/i18n/pt-br.json +++ b/frontend/src/i18n/pt-br.json @@ -1,7 +1,9 @@ { "buttons": { "cancel": "Cancelar", + "clear": "Limpar", "close": "Fechar", + "continue": "Continuar", "copy": "Copiar", "copyFile": "Copiar arquivo", "copyToClipboard": "Copiar", @@ -51,7 +53,6 @@ }, "files": { "body": "Corpo", - "clear": "Limpar", "closePreview": "Fechar pré-visualização", "files": "Arquivos", "folders": "Pastas", @@ -87,23 +88,24 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", - "is": "", + "is": "Icelandic", "it": "Italiano", "ja": "日本語", "ko": "한국어", - "nlBE": "", + "nlBE": "Dutch (Belgium)", "pl": "Polski", "pt": "Português", "ptBR": "Português (Brasil)", - "ro": "", + "ro": "Romanian", "ru": "Русский", "sk": "Slovenčina", - "svSE": "", - "tr" : "Türkçe", - "ua": "Українська", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/pt.json b/frontend/src/i18n/pt.json index 93ac94f6..7b7d14e4 100644 --- a/frontend/src/i18n/pt.json +++ b/frontend/src/i18n/pt.json @@ -1,7 +1,9 @@ { "buttons": { "cancel": "Cancelar", + "clear": "Limpar", "close": "Fechar", + "continue": "Continuar", "copy": "Copiar", "copyFile": "Copiar ficheiro", "copyToClipboard": "Copiar", @@ -46,7 +48,6 @@ }, "files": { "body": "Corpo", - "clear": "Limpar", "closePreview": "Fechar pré-visualização", "files": "Ficheiros", "folders": "Pastas", @@ -79,27 +80,28 @@ "languages": { "he": "עברית", "hu": "Magyar", - "ar": "Árabe", - "de": "Alemão", - "en": "Inglês", - "es": "Espanhol", - "fr": "Francês", - "is": "", + "ar": "العربية", + "de": "Deutsch", + "el": "Ελληνικά", + "en": "English", + "es": "Español", + "fr": "Français", + "is": "Icelandic", "it": "Italiano", - "ja": "Japonês", - "ko": "Coreano", - "nlBE": "", - "pl": "Polaco", + "ja": "日本語", + "ko": "한국어", + "nlBE": "Dutch (Belgium)", + "pl": "Polski", "pt": "Português", "ptBR": "Português (Brasil)", - "ro": "", - "ru": "Russo", + "ro": "Romanian", + "ru": "Русский", "sk": "Slovenčina", - "svSE": "", - "tr" : "Türkçe", - "ua": "Українська", - "zhCN": "Chinês simplificado", - "zhTW": "Chinês tradicional" + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", + "zhCN": "中文 (简体)", + "zhTW": "中文 (繁體)" }, "login": { "createAnAccount": "Criar uma conta", diff --git a/frontend/src/i18n/ro.json b/frontend/src/i18n/ro.json index f2168a46..f580eec2 100644 --- a/frontend/src/i18n/ro.json +++ b/frontend/src/i18n/ro.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "Anulează", + "clear": "Curăță", "close": "Închide", "copy": "Copiază", "copyFile": "Copiază fișier", @@ -46,7 +47,6 @@ }, "files": { "body": "Corp", - "clear": "Curăță", "closePreview": "Închide previzualizarea", "files": "Fișiere", "folders": "Directoare", @@ -81,23 +81,24 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", - "is": "", + "is": "Icelandic", "it": "Italiano", "ja": "日本語", "ko": "한국어", - "nlBE": "", + "nlBE": "Dutch (Belgium)", "pl": "Polski", "pt": "Português", "ptBR": "Português (Brasil)", - "ro": "", + "ro": "Romanian", "ru": "Русский", "sk": "Slovenčina", - "svSE": "", - "tr" : "Türkçe", - "ua": "Українська", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/ru.json b/frontend/src/i18n/ru.json index 5cf40b93..35c06a39 100644 --- a/frontend/src/i18n/ru.json +++ b/frontend/src/i18n/ru.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "Отмена", + "clear": "Очистить", "close": "Закрыть", "copy": "Копировать", "copyFile": "Скопировать файл", @@ -51,7 +52,6 @@ }, "files": { "body": "Тело", - "clear": "Очистить", "closePreview": "Закрыть", "files": "Файлы", "folders": "Папки", @@ -87,6 +87,7 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", @@ -102,8 +103,8 @@ "ru": "Русский", "sk": "Slovenčina", "svSE": "Swedish (Sweden)", - "tr" : "Türkçe", - "ua": "Українська", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/sk.json b/frontend/src/i18n/sk.json index 414a8b4d..8243b40c 100644 --- a/frontend/src/i18n/sk.json +++ b/frontend/src/i18n/sk.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "Zrušiť", + "clear": "Zrušiť výber", "close": "Zavrieť", "copy": "Kopírovať", "copyFile": "Kopírovať súbor", @@ -51,7 +52,6 @@ }, "files": { "body": "Telo", - "clear": "Zrušiť výber", "closePreview": "Zavrieť náhľad", "files": "Súbory", "folders": "Priečinky", @@ -87,6 +87,7 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", @@ -102,8 +103,8 @@ "ru": "Русский", "sk": "Slovenčina", "svSE": "Swedish (Sweden)", - "tr" : "Türkçe", - "ua": "Українська", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/sv-se.json b/frontend/src/i18n/sv-se.json index df0537ec..4a7bd5fc 100644 --- a/frontend/src/i18n/sv-se.json +++ b/frontend/src/i18n/sv-se.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "Avbryt", + "clear": "Rensa", "close": "Stäng", "copy": "Kopiera", "copyFile": "Kopiera fil", @@ -46,7 +47,6 @@ }, "files": { "body": "Huvud", - "clear": "Rensa", "closePreview": "Stäng förhands granskningen", "files": "Filer", "folders": "Mappar", @@ -81,23 +81,24 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", - "is": "", + "is": "Icelandic", "it": "Italiano", "ja": "日本語", "ko": "한국어", - "nlBE": "", + "nlBE": "Dutch (Belgium)", "pl": "Polski", "pt": "Português", "ptBR": "Português (Brasil)", - "ro": "", + "ro": "Romanian", "ru": "Русский", "sk": "Slovenčina", - "svSE": "", - "tr" : "Türkçe", - "ua": "Українська", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/tr.json b/frontend/src/i18n/tr.json index 77ebb3f6..b8cd6446 100644 --- a/frontend/src/i18n/tr.json +++ b/frontend/src/i18n/tr.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "Vazgeç", + "clear": "Temizle", "close": "Kapat", "copy": "Kopyala", "copyFile": "Dosyayı kopyala", @@ -49,7 +50,6 @@ }, "files": { "body": "Sayfa", - "clear": "Temizle", "closePreview": "Önizlemeyi kapat", "files": "Dosyalar", "folders": "Klasörler", @@ -85,6 +85,7 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", @@ -100,8 +101,8 @@ "ru": "Русский", "sk": "Slovenčina", "svSE": "Swedish (Sweden)", - "tr" : "Türkçe", - "ua": "Українська", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/i18n/ua.json b/frontend/src/i18n/ua.json deleted file mode 100644 index cfc42ca2..00000000 --- a/frontend/src/i18n/ua.json +++ /dev/null @@ -1,270 +0,0 @@ -{ - "buttons": { - "cancel": "Відмінити", - "close": "Закрити", - "copy": "Копіювати", - "copyFile": "Копіювати файл", - "copyToClipboard": "Копіювати в буфер обміну", - "create": "Створити", - "delete": "Видалити", - "download": "Завантажити", - "file": "Файл", - "folder": "Папка", - "hideDotfiles": "Приховати точкові файли", - "info": "Інфо", - "more": "Більше", - "move": "Перемістити", - "moveFile": "Перемістити файл", - "new": "Новий", - "next": "Далі", - "ok": "ОК", - "permalink": "Отримати постійне посилання", - "previous": "Назад", - "publish": "Опублікувати", - "rename": "Перейменувати", - "replace": "Замінити", - "reportIssue": "Повідомити про помилку", - "save": "Зберегти", - "schedule": "Планування", - "search": "Пошук", - "select": "Вибрати", - "selectMultiple": "Мультивибір", - "share": "Поділитися", - "shell": "Командний рядок", - "submit": "Відправити", - "switchView": "Вид", - "toggleSidebar": "Бічна панель", - "update": "Оновити", - "upload": "Завантажити", - "openFile": "Відкрити файл" - }, - "download": { - "downloadFile": "Завантажити файл", - "downloadFolder": "Завантажити папку", - "downloadSelected": "Завантажити вибране" - }, - "errors": { - "forbidden": "У вас немає прав доступу до цього.", - "internal": "Щось пішло не так.", - "notFound": "Неправильне посилання.", - "connection": "Немає підключення до сервера." - }, - "files": { - "body": "Тіло", - "clear": "Очистити", - "closePreview": "Закрити", - "files": "Файли", - "folders": "Папки", - "home": "Домівка", - "lastModified": "Останній раз змінено", - "loading": "Завантаження...", - "lonely": "Тут пусто...", - "metadata": "Метадані", - "multipleSelectionEnabled": "Мультивибір включений", - "name": "Ім'я", - "size": "Розмір", - "sortByLastModified": "Сортувати за останнім зміненням", - "sortByName": "Сортувати за іменем", - "sortBySize": "Сортувати за розміром", - "noPreview": "Попередній перегляд для цього файлу недоступний." - }, - "help": { - "click": "вибрати файл чи каталог", - "ctrl": { - "click": "вибрати кілька файлів чи каталогів", - "f": "відкрити пошук", - "s": "скачати файл або поточний каталог" - }, - "del": "видалити вибрані елементи", - "doubleClick": "відкрити файл чи каталог", - "esc": "очистити виділення та/або закрити вікно", - "f1": "допомога", - "f2": "перейменувати файл", - "help": "Допомога" - }, - "languages": { - "he": "עברית", - "hu": "Magyar", - "ar": "العربية", - "de": "Deutsch", - "en": "English", - "es": "Español", - "fr": "Français", - "is": "Icelandic", - "it": "Italiano", - "ja": "日本語", - "ko": "한국어", - "nlBE": "Dutch (Belgium)", - "pl": "Polski", - "pt": "Português", - "ptBR": "Português (Brasil)", - "ro": "Romanian", - "ru": "Русский", - "sk": "Slovenčina", - "svSE": "Swedish (Sweden)", - "tr": "Türkçe", - "ua": "Українська", - "zhCN": "中文 (简体)", - "zhTW": "中文 (繁體)" - }, - "login": { - "createAnAccount": "Створити обліковий запис", - "loginInstead": "Вже є обліковий запис", - "password": "Пароль", - "passwordConfirm": "Підтвердження паролю", - "passwordsDontMatch": "Паролі не співпадають", - "signup": "Зареєструватися", - "submit": "Увійти", - "username": "Ім'я користувача", - "usernameTaken": "Ім'я користувача вже використовується", - "wrongCredentials": "Невірне ім'я користувача або пароль" - }, - "permanent": "Постійний", - "prompts": { - "copy": "Копіювати", - "copyMessage": "Копіювати в:", - "currentlyNavigating": "Поточний каталог:", - "deleteMessageMultiple": "Видалити ці файли ({count})?", - "deleteMessageSingle": "Видалити цей файл/каталог?", - "deleteMessageShare": "Видалити цей спільний файл/каталог ({path})?", - "deleteTitle": "Видалити файлы", - "displayName": "Відображене ім'я:", - "download": "Завантажити файлы", - "downloadMessage": "Виберіть формат, в якому хочете завантажити.", - "error": "Помилка", - "fileInfo": "Інформація про файл", - "filesSelected": "Файлів вибрано: {count}.", - "lastModified": "Останній раз змінено", - "move": "Перемістити", - "moveMessage": "Перемістити в:", - "newArchetype": "Створіть новий запис на основі архетипу. Файл буде створено у каталозі.", - "newDir": "Новий каталог", - "newDirMessage": "Ім'я нового каталогу.", - "newFile": "Новий файл", - "newFileMessage": "Ім'я нового файлу.", - "numberDirs": "Кількість каталогів", - "numberFiles": "Кількість файлів", - "rename": "Перейменувати", - "renameMessage": "Нове ім'я", - "replace": "Замінити", - "replaceMessage": "Ім'я одного з файлів, що завантажуються, збігається з вже існуючим файлом. Ви бажаєте замінити існуючий?\n", - "schedule": "Планування", - "scheduleMessage": "Запланувати дату та час публікації.", - "show": "Показати", - "size": "Розмір", - "upload": "Завантажити", - "uploadMessage": "Виберіть варіант для завантаження.", - "optionalPassword": "Необов'язковий пароль" - }, - "search": { - "images": "Зображення", - "music": "Музика", - "pdf": "PDF", - "pressToSearch": "Натисніть ENTER для пошуку", - "search": "Пошук...", - "typeToSearch": "Введіть ім'я файлу...", - "types": "Типи", - "video": "Відео" - }, - "settings": { - "admin": "Адмін", - "administrator": "Адміністратор", - "allowCommands": "Запуск команд", - "allowEdit": "Редагування, перейменування та видалення файлів чи каталогів", - "allowNew": "Створення нових файлів або каталогів", - "allowPublish": "Публікація нових записів та сторінок", - "allowSignup": "Дозволити користувачам реєструватися", - "avoidChanges": "(залишіть поле порожнім, щоб уникнути змін)", - "branding": "Брендинг", - "brandingDirectoryPath": "Шлях до каталогу брендів", - "brandingHelp": "Ви можете налаштувати зовнішній вигляд файлового браузера, змінивши його ім'я, замінивши логотип, додавши власні стилі та навіть відключивши зовнішні посилання на GitHub.\nДодаткову інформацію про персоналізований брендинг можна знайти на сторінці {0}.", - "changePassword": "Зміна пароля", - "commandRunner": "Запуск команд", - "commandRunnerHelp": "Тут ви можете встановити команди, які будуть виконуватися у зазначених подіях. Ви повинні вказати по одній команді в кожному рядку. Змінні середовища {0} та {1} будуть доступні, будучи {0} щодо {1}. Додаткові відомості про цю функцію та доступні змінні середовища див. у {2}.", - "commandsUpdated": "Команди оновлені!", - "createUserDir": "Автоматичне створення домашнього каталогу користувача при додаванні нового користувача", - "customStylesheet": "Свій стиль", - "defaultUserDescription": "Це налаштування за замовчуванням для нових користувачів.", - "disableExternalLinks": "Вимкнути зовнішні посилання (крім документації)", - "disableUsedDiskPercentage": "Disable used disk percentage graph", - "documentation": "документація", - "examples": "Приклади", - "executeOnShell": "Виконати в командному рядку", - "executeOnShellDescription": "За замовчуванням File Browser виконує команди, безпосередньо викликаючи їх бінарні файли. Якщо ви хочете замість цього запускати їх в оболонці (наприклад, Bash або PowerShell), ви можете визначити їх тут з необхідними аргументами та прапорами. Якщо встановлено, виконуєма вами команда буде додана як аргумент. Це стосується як користувацьких команд, так і обробників подій.", - "globalRules": "Це глобальний набір дозволяючих та забороняючих правил. Вони застосовні до кожного користувача. Ви можете визначити певні правила для налаштувань кожного користувача, щоб перевизначити їх.", - "globalSettings": "Глобальні налаштування", - "hideDotfiles": "Приховати точкові файли", - "insertPath": "Вставте шлях", - "insertRegex": "Вставити регулярний вираз", - "instanceName": "Поточна назва програми", - "language": "Мова", - "lockPassword": "Заборонити користувачеві змінювати пароль", - "newPassword": "Новий пароль", - "newPasswordConfirm": "Підтвердження нового пароля", - "newUser": "Новий користувач", - "password": "Пароль", - "passwordUpdated": "Пароль оновлено!", - "path": "Шлях", - "perm": { - "create": "Створювати файли та каталоги", - "delete": "Видаляти файли та каталоги", - "download": "Завантажувати", - "execute": "Виконувати команди", - "modify": "Редагувати файли", - "rename": "Перейменовувати або переміщувати файли та каталоги", - "share": "Ділітися файлами" - }, - "permissions": "Дозволи", - "permissionsHelp": "Можна настроїти користувача як адміністратора або вибрати індивідуальні дозволи. При виборі \"Адміністратор\" всі інші параметри будуть автоматично вибрані. Керування користувачами - привілей адміністратора.\n", - "profileSettings": "Налаштування профілю", - "ruleExample1": "запобігти доступу до будь-якого прихованого файлу (наприклад: .git, .gitignore) у кожній папці.\n", - "ruleExample2": "блокує доступ до файлу з ім'ям Caddyfile у кореневій області.", - "rules": "Права", - "rulesHelp": "Тут ви можете визначити набір дозволяючих та забороняючих правил для цього конкретного користувача. Блоковані файли не відображатимуться у списках, і не будуть доступні для користувача. Є підтримка регулярних виразів та відносних шляхів.\n", - "scope": "Корінь", - "setDateFormat": "Встановити точний формат дати", - "settingsUpdated": "Налаштування застосовані!", - "shareDuration": "Тривалість спільного посилання", - "shareManagement": "Управління спільними посиланнями", - "shareDeleted": "Спільне посилання видалено!", - "singleClick": "Відкриття файлів та каталогів одним кліком", - "themes": { - "dark": "Темна", - "light": "Світла", - "title": "Тема" - }, - "user": "Користувач", - "userCommands": "Команди", - "userCommandsHelp": "Список команд, доступних користувачу, розділений пробілами. Приклад:\n", - "userCreated": "Користувач створений!", - "userDefaults": "Налаштування користувача за замовчуванням", - "userDeleted": "Користувач видалений!", - "userManagement": "Керування користувачами", - "userUpdated": "Користувач змінений!", - "username": "Ім'я користувача", - "users": "Користувачі" - }, - "sidebar": { - "help": "Допомога", - "hugoNew": "Hugo New", - "login": "Увійти", - "logout": "Вийти", - "myFiles": "Файли", - "newFile": "Новий файл", - "newFolder": "Новий каталог", - "preview": "Перегляд", - "settings": "Налаштування", - "signup": "Зареєструватися", - "siteSettings": "Налаштування сайту" - }, - "success": { - "linkCopied": "Посилання скопійоване!" - }, - "time": { - "days": "Дні", - "hours": "Години", - "minutes": "Хвилини", - "seconds": "Секунди", - "unit": "Одиниця часу" - } -} diff --git a/frontend/src/i18n/uk.json b/frontend/src/i18n/uk.json new file mode 100644 index 00000000..dceac2a2 --- /dev/null +++ b/frontend/src/i18n/uk.json @@ -0,0 +1,271 @@ +{ + "buttons": { + "cancel": "Відмінити", + "clear": "Очистити", + "close": "Закрити", + "copy": "Копіювати", + "copyFile": "Копіювати файл", + "copyToClipboard": "Копіювати в буфер обміну", + "create": "Створити", + "delete": "Видалити", + "download": "Завантажити", + "file": "Файл", + "folder": "Папка", + "hideDotfiles": "Приховати точкові файли", + "info": "Інфо", + "more": "Більше", + "move": "Перемістити", + "moveFile": "Перемістити файл", + "new": "Новий", + "next": "Далі", + "ok": "ОК", + "permalink": "Отримати постійне посилання", + "previous": "Назад", + "publish": "Опублікувати", + "rename": "Перейменувати", + "replace": "Замінити", + "reportIssue": "Повідомити про помилку", + "save": "Зберегти", + "schedule": "Планування", + "search": "Пошук", + "select": "Вибрати", + "selectMultiple": "Мультивибір", + "share": "Поділитися", + "shell": "Командний рядок", + "submit": "Відправити", + "switchView": "Вид", + "toggleSidebar": "Бічна панель", + "update": "Оновити", + "upload": "Завантажити", + "openFile": "Відкрити файл" + }, + "download": { + "downloadFile": "Завантажити файл", + "downloadFolder": "Завантажити папку", + "downloadSelected": "Завантажити вибране" + }, + "errors": { + "forbidden": "У вас немає прав доступу до цього.", + "internal": "Щось пішло не так.", + "notFound": "Неправильне посилання.", + "connection": "Немає підключення до сервера." + }, + "files": { + "body": "Тіло", + "closePreview": "Закрити", + "files": "Файли", + "folders": "Папки", + "home": "Домівка", + "lastModified": "Останній раз змінено", + "loading": "Завантаження...", + "lonely": "Тут пусто...", + "metadata": "Метадані", + "multipleSelectionEnabled": "Мультивибір включений", + "name": "Ім'я", + "size": "Розмір", + "sortByLastModified": "Сортувати за останнім зміненням", + "sortByName": "Сортувати за іменем", + "sortBySize": "Сортувати за розміром", + "noPreview": "Попередній перегляд для цього файлу недоступний." + }, + "help": { + "click": "вибрати файл чи каталог", + "ctrl": { + "click": "вибрати кілька файлів чи каталогів", + "f": "відкрити пошук", + "s": "скачати файл або поточний каталог" + }, + "del": "видалити вибрані елементи", + "doubleClick": "відкрити файл чи каталог", + "esc": "очистити виділення та/або закрити вікно", + "f1": "допомога", + "f2": "перейменувати файл", + "help": "Допомога" + }, + "languages": { + "he": "עברית", + "hu": "Magyar", + "ar": "العربية", + "de": "Deutsch", + "el": "Ελληνικά", + "en": "English", + "es": "Español", + "fr": "Français", + "is": "Icelandic", + "it": "Italiano", + "ja": "日本語", + "ko": "한국어", + "nlBE": "Dutch (Belgium)", + "pl": "Polski", + "pt": "Português", + "ptBR": "Português (Brasil)", + "ro": "Romanian", + "ru": "Русский", + "sk": "Slovenčina", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", + "zhCN": "中文 (简体)", + "zhTW": "中文 (繁體)" + }, + "login": { + "createAnAccount": "Створити обліковий запис", + "loginInstead": "Вже є обліковий запис", + "password": "Пароль", + "passwordConfirm": "Підтвердження паролю", + "passwordsDontMatch": "Паролі не співпадають", + "signup": "Зареєструватися", + "submit": "Увійти", + "username": "Ім'я користувача", + "usernameTaken": "Ім'я користувача вже використовується", + "wrongCredentials": "Невірне ім'я користувача або пароль" + }, + "permanent": "Постійний", + "prompts": { + "copy": "Копіювати", + "copyMessage": "Копіювати в:", + "currentlyNavigating": "Поточний каталог:", + "deleteMessageMultiple": "Видалити ці файли ({count})?", + "deleteMessageSingle": "Видалити цей файл/каталог?", + "deleteMessageShare": "Видалити цей спільний файл/каталог ({path})?", + "deleteTitle": "Видалити файлы", + "displayName": "Відображене ім'я:", + "download": "Завантажити файлы", + "downloadMessage": "Виберіть формат, в якому хочете завантажити.", + "error": "Помилка", + "fileInfo": "Інформація про файл", + "filesSelected": "Файлів вибрано: {count}.", + "lastModified": "Останній раз змінено", + "move": "Перемістити", + "moveMessage": "Перемістити в:", + "newArchetype": "Створіть новий запис на основі архетипу. Файл буде створено у каталозі.", + "newDir": "Новий каталог", + "newDirMessage": "Ім'я нового каталогу.", + "newFile": "Новий файл", + "newFileMessage": "Ім'я нового файлу.", + "numberDirs": "Кількість каталогів", + "numberFiles": "Кількість файлів", + "rename": "Перейменувати", + "renameMessage": "Нове ім'я", + "replace": "Замінити", + "replaceMessage": "Ім'я одного з файлів, що завантажуються, збігається з вже існуючим файлом. Ви бажаєте замінити існуючий?\n", + "schedule": "Планування", + "scheduleMessage": "Запланувати дату та час публікації.", + "show": "Показати", + "size": "Розмір", + "upload": "Завантажити", + "uploadMessage": "Виберіть варіант для завантаження.", + "optionalPassword": "Необов'язковий пароль" + }, + "search": { + "images": "Зображення", + "music": "Музика", + "pdf": "PDF", + "pressToSearch": "Натисніть ENTER для пошуку", + "search": "Пошук...", + "typeToSearch": "Введіть ім'я файлу...", + "types": "Типи", + "video": "Відео" + }, + "settings": { + "admin": "Адмін", + "administrator": "Адміністратор", + "allowCommands": "Запуск команд", + "allowEdit": "Редагування, перейменування та видалення файлів чи каталогів", + "allowNew": "Створення нових файлів або каталогів", + "allowPublish": "Публікація нових записів та сторінок", + "allowSignup": "Дозволити користувачам реєструватися", + "avoidChanges": "(залишіть поле порожнім, щоб уникнути змін)", + "branding": "Брендинг", + "brandingDirectoryPath": "Шлях до каталогу брендів", + "brandingHelp": "Ви можете налаштувати зовнішній вигляд файлового браузера, змінивши його ім'я, замінивши логотип, додавши власні стилі та навіть відключивши зовнішні посилання на GitHub.\nДодаткову інформацію про персоналізований брендинг можна знайти на сторінці {0}.", + "changePassword": "Зміна пароля", + "commandRunner": "Запуск команд", + "commandRunnerHelp": "Тут ви можете встановити команди, які будуть виконуватися у зазначених подіях. Ви повинні вказати по одній команді в кожному рядку. Змінні середовища {0} та {1} будуть доступні, будучи {0} щодо {1}. Додаткові відомості про цю функцію та доступні змінні середовища див. у {2}.", + "commandsUpdated": "Команди оновлені!", + "createUserDir": "Автоматичне створення домашнього каталогу користувача при додаванні нового користувача", + "customStylesheet": "Свій стиль", + "defaultUserDescription": "Це налаштування за замовчуванням для нових користувачів.", + "disableExternalLinks": "Вимкнути зовнішні посилання (крім документації)", + "disableUsedDiskPercentage": "Disable used disk percentage graph", + "documentation": "документація", + "examples": "Приклади", + "executeOnShell": "Виконати в командному рядку", + "executeOnShellDescription": "За замовчуванням File Browser виконує команди, безпосередньо викликаючи їх бінарні файли. Якщо ви хочете замість цього запускати їх в оболонці (наприклад, Bash або PowerShell), ви можете визначити їх тут з необхідними аргументами та прапорами. Якщо встановлено, виконуєма вами команда буде додана як аргумент. Це стосується як користувацьких команд, так і обробників подій.", + "globalRules": "Це глобальний набір дозволяючих та забороняючих правил. Вони застосовні до кожного користувача. Ви можете визначити певні правила для налаштувань кожного користувача, щоб перевизначити їх.", + "globalSettings": "Глобальні налаштування", + "hideDotfiles": "Приховати точкові файли", + "insertPath": "Вставте шлях", + "insertRegex": "Вставити регулярний вираз", + "instanceName": "Поточна назва програми", + "language": "Мова", + "lockPassword": "Заборонити користувачеві змінювати пароль", + "newPassword": "Новий пароль", + "newPasswordConfirm": "Підтвердження нового пароля", + "newUser": "Новий користувач", + "password": "Пароль", + "passwordUpdated": "Пароль оновлено!", + "path": "Шлях", + "perm": { + "create": "Створювати файли та каталоги", + "delete": "Видаляти файли та каталоги", + "download": "Завантажувати", + "execute": "Виконувати команди", + "modify": "Редагувати файли", + "rename": "Перейменовувати або переміщувати файли та каталоги", + "share": "Ділітися файлами" + }, + "permissions": "Дозволи", + "permissionsHelp": "Можна настроїти користувача як адміністратора або вибрати індивідуальні дозволи. При виборі \"Адміністратор\" всі інші параметри будуть автоматично вибрані. Керування користувачами - привілей адміністратора.\n", + "profileSettings": "Налаштування профілю", + "ruleExample1": "запобігти доступу до будь-якого прихованого файлу (наприклад: .git, .gitignore) у кожній папці.\n", + "ruleExample2": "блокує доступ до файлу з ім'ям Caddyfile у кореневій області.", + "rules": "Права", + "rulesHelp": "Тут ви можете визначити набір дозволяючих та забороняючих правил для цього конкретного користувача. Блоковані файли не відображатимуться у списках, і не будуть доступні для користувача. Є підтримка регулярних виразів та відносних шляхів.\n", + "scope": "Корінь", + "setDateFormat": "Встановити точний формат дати", + "settingsUpdated": "Налаштування застосовані!", + "shareDuration": "Тривалість спільного посилання", + "shareManagement": "Управління спільними посиланнями", + "shareDeleted": "Спільне посилання видалено!", + "singleClick": "Відкриття файлів та каталогів одним кліком", + "themes": { + "dark": "Темна", + "light": "Світла", + "title": "Тема" + }, + "user": "Користувач", + "userCommands": "Команди", + "userCommandsHelp": "Список команд, доступних користувачу, розділений пробілами. Приклад:\n", + "userCreated": "Користувач створений!", + "userDefaults": "Налаштування користувача за замовчуванням", + "userDeleted": "Користувач видалений!", + "userManagement": "Керування користувачами", + "userUpdated": "Користувач змінений!", + "username": "Ім'я користувача", + "users": "Користувачі" + }, + "sidebar": { + "help": "Допомога", + "hugoNew": "Hugo New", + "login": "Увійти", + "logout": "Вийти", + "myFiles": "Файли", + "newFile": "Новий файл", + "newFolder": "Новий каталог", + "preview": "Перегляд", + "settings": "Налаштування", + "signup": "Зареєструватися", + "siteSettings": "Налаштування сайту" + }, + "success": { + "linkCopied": "Посилання скопійоване!" + }, + "time": { + "days": "Дні", + "hours": "Години", + "minutes": "Хвилини", + "seconds": "Секунди", + "unit": "Одиниця часу" + } +} diff --git a/frontend/src/i18n/zh-cn.json b/frontend/src/i18n/zh-cn.json index 7e197202..c0397b0f 100644 --- a/frontend/src/i18n/zh-cn.json +++ b/frontend/src/i18n/zh-cn.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "取消", + "clear": "清空", "close": "关闭", "copy": "复制", "copyFile": "复制文件", @@ -56,7 +57,6 @@ }, "files": { "body": "内容", - "clear": "清空", "closePreview": "关闭预览", "files": "文件", "folders": "文件夹", @@ -103,15 +103,15 @@ "nlBE": "Dutch (Belgium)", "pl": "Polski", "pt": "Português", - "ptBR": "Português(Brasil)", + "ptBR": "Português (Brasil)", "ro": "Romanian", "ru": "Русский", "sk": "Slovenčina", - "svSE": "Swedish(Sweden)", - "tr" : "Türkçe", - "ua": "Українська", - "zhCN": "中文(简体)", - "zhTW": "中文(繁體)" + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", + "zhCN": "中文 (简体)", + "zhTW": "中文 (繁體)" }, "login": { "createAnAccount": "创建用户", diff --git a/frontend/src/i18n/zh-tw.json b/frontend/src/i18n/zh-tw.json index 096a9fbc..43ad20ee 100644 --- a/frontend/src/i18n/zh-tw.json +++ b/frontend/src/i18n/zh-tw.json @@ -1,6 +1,7 @@ { "buttons": { "cancel": "取消", + "clear": "清空", "close": "關閉", "copy": "複製", "copyFile": "複製檔案", @@ -46,7 +47,6 @@ }, "files": { "body": "内容", - "clear": "清空", "closePreview": "關閉預覽", "files": "檔案", "folders": "資料夾", @@ -81,6 +81,7 @@ "hu": "Magyar", "ar": "العربية", "de": "Deutsch", + "el": "Ελληνικά", "en": "English", "es": "Español", "fr": "Français", @@ -88,16 +89,16 @@ "it": "Italiano", "ja": "日本語", "ko": "한국어", - "nlBE": "Dutch(Belgium)", + "nlBE": "Dutch (Belgium)", "pl": "Polski", "pt": "Português", "ptBR": "Português (Brasil)", "ro": "Romanian", "ru": "Русский", "sk": "Slovenčina", - "svSE": "Swedish(Sweden)", - "tr" : "Türkçe", - "ua": "Українська", + "svSE": "Swedish (Sweden)", + "tr": "Türkçe", + "uk": "Українська", "zhCN": "中文 (简体)", "zhTW": "中文 (繁體)" }, diff --git a/frontend/src/index.d.ts b/frontend/src/index.d.ts new file mode 100644 index 00000000..11a8c6e2 --- /dev/null +++ b/frontend/src/index.d.ts @@ -0,0 +1 @@ +declare module "*.vue"; diff --git a/frontend/src/main.js b/frontend/src/main.js deleted file mode 100644 index f9291588..00000000 --- a/frontend/src/main.js +++ /dev/null @@ -1,51 +0,0 @@ -import "whatwg-fetch"; -import cssVars from "css-vars-ponyfill"; -import { sync } from "vuex-router-sync"; -import store from "@/store"; -import router from "@/router"; -import i18n from "@/i18n"; -import Vue from "@/utils/vue"; -import { recaptcha, loginPage } from "@/utils/constants"; -import { login, validateLogin } from "@/utils/auth"; -import App from "@/App.vue"; - -cssVars(); - -sync(store, router); - -async function start() { - try { - if (loginPage) { - await validateLogin(); - } else { - await login("", "", ""); - } - } catch (e) { - console.log(e); - } - - if (recaptcha) { - await new Promise((resolve) => { - const check = () => { - if (typeof window.grecaptcha === "undefined") { - setTimeout(check, 100); - } else { - resolve(); - } - }; - - check(); - }); - } - - new Vue({ - el: "#app", - store, - router, - i18n, - template: "", - components: { App }, - }); -} - -start(); diff --git a/frontend/src/main.ts b/frontend/src/main.ts new file mode 100644 index 00000000..303bae9c --- /dev/null +++ b/frontend/src/main.ts @@ -0,0 +1,109 @@ +import { disableExternal } from "@/utils/constants"; +import { createApp } from "vue"; +import VueNumberInput from "@chenfengyuan/vue-number-input"; +import VueLazyload from "vue-lazyload"; +import { createVfm } from "vue-final-modal"; +import Toast, { POSITION, useToast } from "vue-toastification"; +import { + ToastOptions, + PluginOptions, +} from "vue-toastification/dist/types/types"; +import createPinia from "@/stores"; +import router from "@/router"; +import i18n, { isRtl } from "@/i18n"; +import App from "@/App.vue"; +import CustomToast from "@/components/CustomToast.vue"; + +import dayjs from "dayjs"; +import localizedFormat from "dayjs/plugin/localizedFormat"; +import relativeTime from "dayjs/plugin/relativeTime"; +import duration from "dayjs/plugin/duration"; + +import "./css/styles.css"; + +// register dayjs plugins globally +dayjs.extend(localizedFormat); +dayjs.extend(relativeTime); +dayjs.extend(duration); + +const pinia = createPinia(router); +const vfm = createVfm(); + +const app = createApp(App); + +app.component(VueNumberInput.name || "vue-number-input", VueNumberInput); +app.use(VueLazyload); +app.use(Toast, { + transition: "Vue-Toastification__bounce", + maxToasts: 10, + newestOnTop: true, +} satisfies PluginOptions); + +app.use(vfm); +app.use(i18n); +app.use(pinia); +app.use(router); + +app.mixin({ + mounted() { + // expose vue instance to components + this.$el.__vue__ = this; + }, +}); + +// provide v-focus for components +app.directive("focus", { + mounted: async (el) => { + // initiate focus for the element + el.focus(); + }, +}); + +const toastConfig = { + position: POSITION.BOTTOM_CENTER, + timeout: 4000, + closeOnClick: true, + pauseOnFocusLoss: true, + pauseOnHover: true, + draggable: true, + draggablePercent: 0.6, + showCloseButtonOnHover: false, + hideProgressBar: false, + closeButton: "button", + icon: true, +} satisfies ToastOptions; + +app.provide("$showSuccess", (message: string) => { + const $toast = useToast(); + $toast.success( + { + component: CustomToast, + props: { + message: message, + }, + }, + { ...toastConfig, rtl: isRtl() } + ); +}); + +app.provide("$showError", (error: Error | string, displayReport = true) => { + const $toast = useToast(); + $toast.error( + { + component: CustomToast, + props: { + message: (error as Error).message || error, + isReport: !disableExternal && displayReport, + // TODO: could you add this to the component itself? + reportText: i18n.global.t("buttons.reportIssue"), + }, + }, + { + ...toastConfig, + timeout: 0, + rtl: isRtl(), + } + ); +}); + +router.isReady().then(() => app.mount("#app")); diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js deleted file mode 100644 index be30026a..00000000 --- a/frontend/src/router/index.js +++ /dev/null @@ -1,194 +0,0 @@ -import Vue from "vue"; -import Router from "vue-router"; -import Login from "@/views/Login.vue"; -import Layout from "@/views/Layout.vue"; -import Files from "@/views/Files.vue"; -import Share from "@/views/Share.vue"; -import Users from "@/views/settings/Users.vue"; -import User from "@/views/settings/User.vue"; -import Settings from "@/views/Settings.vue"; -import GlobalSettings from "@/views/settings/Global.vue"; -import ProfileSettings from "@/views/settings/Profile.vue"; -import Shares from "@/views/settings/Shares.vue"; -import Errors from "@/views/Errors.vue"; -import store from "@/store"; -import { baseURL, name } from "@/utils/constants"; -import i18n, { rtlLanguages } from "@/i18n"; - -Vue.use(Router); - -const titles = { - Login: "sidebar.login", - Share: "buttons.share", - Files: "files.files", - Settings: "sidebar.settings", - ProfileSettings: "settings.profileSettings", - Shares: "settings.shareManagement", - GlobalSettings: "settings.globalSettings", - Users: "settings.users", - User: "settings.user", - Forbidden: "errors.forbidden", - NotFound: "errors.notFound", - InternalServerError: "errors.internal", -}; - -const router = new Router({ - base: import.meta.env.PROD ? baseURL : "", - mode: "history", - routes: [ - { - path: "/login", - name: "Login", - component: Login, - beforeEnter: (to, from, next) => { - if (store.getters.isLogged) { - return next({ path: "/files" }); - } - - next(); - }, - }, - { - path: "/*", - component: Layout, - children: [ - { - path: "/share/*", - name: "Share", - component: Share, - }, - { - path: "/files/*", - name: "Files", - component: Files, - meta: { - requiresAuth: true, - }, - }, - { - path: "/settings", - name: "Settings", - component: Settings, - redirect: { - path: "/settings/profile", - }, - meta: { - requiresAuth: true, - }, - children: [ - { - path: "/settings/profile", - name: "ProfileSettings", - component: ProfileSettings, - }, - { - path: "/settings/shares", - name: "Shares", - component: Shares, - }, - { - path: "/settings/global", - name: "GlobalSettings", - component: GlobalSettings, - meta: { - requiresAdmin: true, - }, - }, - { - path: "/settings/users", - name: "Users", - component: Users, - meta: { - requiresAdmin: true, - }, - }, - { - path: "/settings/users/*", - name: "User", - component: User, - meta: { - requiresAdmin: true, - }, - }, - ], - }, - { - path: "/403", - name: "Forbidden", - component: Errors, - props: { - errorCode: 403, - showHeader: true, - }, - }, - { - path: "/404", - name: "NotFound", - component: Errors, - props: { - errorCode: 404, - showHeader: true, - }, - }, - { - path: "/500", - name: "InternalServerError", - component: Errors, - props: { - errorCode: 500, - showHeader: true, - }, - }, - { - path: "/files", - redirect: { - path: "/files/", - }, - }, - { - path: "/*", - redirect: (to) => `/files${to.path}`, - }, - ], - }, - ], -}); - -router.beforeEach((to, from, next) => { - const title = i18n.t(titles[to.name]); - document.title = title + " - " + name; - - /*** RTL related settings per route ****/ - const rtlSet = document.querySelector("body").classList.contains("rtl"); - const shouldSetRtl = rtlLanguages.includes(i18n.locale); - switch (true) { - case shouldSetRtl && !rtlSet: - document.querySelector("body").classList.add("rtl"); - break; - case !shouldSetRtl && rtlSet: - document.querySelector("body").classList.remove("rtl"); - break; - } - - if (to.matched.some((record) => record.meta.requiresAuth)) { - if (!store.getters.isLogged) { - next({ - path: "/login", - query: { redirect: to.fullPath }, - }); - - return; - } - - if (to.matched.some((record) => record.meta.requiresAdmin)) { - if (!store.state.user.perm.admin) { - next({ path: "/403" }); - return; - } - } - } - - next(); -}); - -export default router; diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts new file mode 100644 index 00000000..4766b1b1 --- /dev/null +++ b/frontend/src/router/index.ts @@ -0,0 +1,220 @@ +import { RouteLocation, createRouter, createWebHistory } from "vue-router"; +import Login from "@/views/Login.vue"; +import Layout from "@/views/Layout.vue"; +import Files from "@/views/Files.vue"; +import Share from "@/views/Share.vue"; +import Users from "@/views/settings/Users.vue"; +import User from "@/views/settings/User.vue"; +import Settings from "@/views/Settings.vue"; +import GlobalSettings from "@/views/settings/Global.vue"; +import ProfileSettings from "@/views/settings/Profile.vue"; +import Shares from "@/views/settings/Shares.vue"; +import Errors from "@/views/Errors.vue"; +import { useAuthStore } from "@/stores/auth"; +import { baseURL, name } from "@/utils/constants"; +import i18n from "@/i18n"; +import { recaptcha, loginPage } from "@/utils/constants"; +import { login, validateLogin } from "@/utils/auth"; + +const titles = { + Login: "sidebar.login", + Share: "buttons.share", + Files: "files.files", + Settings: "sidebar.settings", + ProfileSettings: "settings.profileSettings", + Shares: "settings.shareManagement", + GlobalSettings: "settings.globalSettings", + Users: "settings.users", + User: "settings.user", + Forbidden: "errors.forbidden", + NotFound: "errors.notFound", + InternalServerError: "errors.internal", +}; + +const routes = [ + { + path: "/login", + name: "Login", + component: Login, + }, + { + path: "/share", + component: Layout, + children: [ + { + path: ":path*", + name: "Share", + component: Share, + }, + ], + }, + { + path: "/files", + component: Layout, + meta: { + requiresAuth: true, + }, + children: [ + { + path: ":path*", + name: "Files", + component: Files, + }, + ], + }, + { + path: "/settings", + component: Layout, + meta: { + requiresAuth: true, + }, + children: [ + { + path: "", + name: "Settings", + component: Settings, + redirect: { + path: "/settings/profile", + }, + children: [ + { + path: "profile", + name: "ProfileSettings", + component: ProfileSettings, + }, + { + path: "shares", + name: "Shares", + component: Shares, + }, + { + path: "global", + name: "GlobalSettings", + component: GlobalSettings, + meta: { + requiresAdmin: true, + }, + }, + { + path: "users", + name: "Users", + component: Users, + meta: { + requiresAdmin: true, + }, + }, + { + path: "users/:id", + name: "User", + component: User, + meta: { + requiresAdmin: true, + }, + }, + ], + }, + ], + }, + { + path: "/403", + name: "Forbidden", + component: Errors, + props: { + errorCode: 403, + showHeader: true, + }, + }, + { + path: "/404", + name: "NotFound", + component: Errors, + props: { + errorCode: 404, + showHeader: true, + }, + }, + { + path: "/500", + name: "InternalServerError", + component: Errors, + props: { + errorCode: 500, + showHeader: true, + }, + }, + { + path: "/:catchAll(.*)*", + redirect: (to: RouteLocation) => + `/files/${[...to.params.catchAll].join("/")}`, + }, +]; + +async function initAuth() { + if (loginPage) { + await validateLogin(); + } else { + await login("", "", ""); + } + + if (recaptcha) { + await new Promise((resolve) => { + const check = () => { + if (typeof window.grecaptcha === "undefined") { + setTimeout(check, 100); + } else { + resolve(); + } + }; + + check(); + }); + } +} + +const router = createRouter({ + history: createWebHistory(baseURL), + routes, +}); + +router.beforeResolve(async (to, from, next) => { + const title = i18n.global.t(titles[to.name as keyof typeof titles]); + document.title = title + " - " + name; + + const authStore = useAuthStore(); + + // this will only be null on first route + if (from.name == null) { + try { + await initAuth(); + } catch (error) { + console.error(error); + } + } + + if (to.path.endsWith("/login") && authStore.isLoggedIn) { + next({ path: "/files/" }); + return; + } + + if (to.matched.some((record) => record.meta.requiresAuth)) { + if (!authStore.isLoggedIn) { + next({ + path: "/login", + query: { redirect: to.fullPath }, + }); + + return; + } + + if (to.matched.some((record) => record.meta.requiresAdmin)) { + if (authStore.user === null || !authStore.user.perm.admin) { + next({ path: "/403" }); + return; + } + } + } + + next(); +}); + +export { router, router as default }; diff --git a/frontend/src/store/getters.js b/frontend/src/store/getters.js deleted file mode 100644 index 01607c09..00000000 --- a/frontend/src/store/getters.js +++ /dev/null @@ -1,56 +0,0 @@ -const getters = { - isLogged: (state) => state.user !== null, - isFiles: (state) => !state.loading && state.route.name === "Files", - isListing: (state, getters) => getters.isFiles && state.req.isDir, - selectedCount: (state) => state.selected.length, - progress: (state) => { - if (state.upload.progress.length === 0) { - return 0; - } - - let totalSize = state.upload.sizes.reduce((a, b) => a + b, 0); - - let sum = state.upload.progress.reduce((acc, val) => acc + val); - return Math.ceil((sum / totalSize) * 100); - }, - filesInUploadCount: (state) => { - return Object.keys(state.upload.uploads).length + state.upload.queue.length; - }, - filesInUpload: (state) => { - let files = []; - - for (let index in state.upload.uploads) { - let upload = state.upload.uploads[index]; - let id = upload.id; - let type = upload.type; - let name = upload.file.name; - let size = state.upload.sizes[id]; - let isDir = upload.file.isDir; - let progress = isDir - ? 100 - : Math.ceil((state.upload.progress[id] / size) * 100); - - files.push({ - id, - name, - progress, - type, - isDir, - }); - } - - return files.sort((a, b) => a.progress - b.progress); - }, - currentPrompt: (state) => { - return state.prompts.length > 0 - ? state.prompts[state.prompts.length - 1] - : null; - }, - currentPromptName: (_, getters) => { - return getters.currentPrompt?.prompt; - }, - uploadSpeed: (state) => state.upload.speedMbyte, - eta: (state) => state.upload.eta, -}; - -export default getters; diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js deleted file mode 100644 index 0a0b9713..00000000 --- a/frontend/src/store/index.js +++ /dev/null @@ -1,33 +0,0 @@ -import Vue from "vue"; -import Vuex from "vuex"; -import mutations from "./mutations"; -import getters from "./getters"; -import upload from "./modules/upload"; - -Vue.use(Vuex); - -const state = { - user: null, - req: {}, - oldReq: {}, - clipboard: { - key: "", - items: [], - }, - jwt: "", - progress: 0, - loading: false, - reload: false, - selected: [], - multiple: false, - prompts: [], - showShell: false, -}; - -export default new Vuex.Store({ - strict: true, - state, - getters, - mutations, - modules: { upload }, -}); diff --git a/frontend/src/store/modules/upload.js b/frontend/src/store/modules/upload.js deleted file mode 100644 index 836b59ab..00000000 --- a/frontend/src/store/modules/upload.js +++ /dev/null @@ -1,112 +0,0 @@ -import Vue from "vue"; -import { files as api } from "@/api"; -import throttle from "lodash.throttle"; -import buttons from "@/utils/buttons"; - -const UPLOADS_LIMIT = 5; - -const state = { - id: 0, - sizes: [], - progress: [], - queue: [], - uploads: {}, - speedMbyte: 0, - eta: 0, -}; - -const mutations = { - setProgress(state, { id, loaded }) { - Vue.set(state.progress, id, loaded); - }, - reset: (state) => { - state.id = 0; - state.sizes = []; - state.progress = []; - }, - addJob: (state, item) => { - state.queue.push(item); - state.sizes[state.id] = item.file.size; - state.id++; - }, - moveJob(state) { - const item = state.queue[0]; - state.queue.shift(); - Vue.set(state.uploads, item.id, item); - }, - removeJob(state, id) { - Vue.delete(state.uploads, id); - delete state.uploads[id]; - }, -}; - -const beforeUnload = (event) => { - event.preventDefault(); - event.returnValue = ""; -}; - -const actions = { - upload: (context, item) => { - let uploadsCount = Object.keys(context.state.uploads).length; - - let isQueueEmpty = context.state.queue.length == 0; - let isUploadsEmpty = uploadsCount == 0; - - if (isQueueEmpty && isUploadsEmpty) { - window.addEventListener("beforeunload", beforeUnload); - buttons.loading("upload"); - } - - context.commit("addJob", item); - context.dispatch("processUploads"); - }, - finishUpload: (context, item) => { - context.commit("setProgress", { id: item.id, loaded: item.file.size }); - context.commit("removeJob", item.id); - context.dispatch("processUploads"); - }, - processUploads: async (context) => { - let uploadsCount = Object.keys(context.state.uploads).length; - - let isBellowLimit = uploadsCount < UPLOADS_LIMIT; - let isQueueEmpty = context.state.queue.length == 0; - let isUploadsEmpty = uploadsCount == 0; - - let isFinished = isQueueEmpty && isUploadsEmpty; - let canProcess = isBellowLimit && !isQueueEmpty; - - if (isFinished) { - window.removeEventListener("beforeunload", beforeUnload); - buttons.success("upload"); - context.commit("reset"); - context.commit("setReload", true, { root: true }); - } - - if (canProcess) { - const item = context.state.queue[0]; - context.commit("moveJob"); - - if (item.file.isDir) { - await api.post(item.path).catch(Vue.prototype.$showError); - } else { - let onUpload = throttle( - (event) => - context.commit("setProgress", { - id: item.id, - loaded: event.loaded, - }), - 100, - { leading: true, trailing: false } - ); - - await api - .post(item.path, item.file, item.overwrite, onUpload) - .catch(Vue.prototype.$showError); - } - - context.dispatch("finishUpload", item); - } - }, -}; - -export default { state, mutations, actions, namespaced: true }; diff --git a/frontend/src/store/mutations.js b/frontend/src/store/mutations.js deleted file mode 100644 index 1f9912c5..00000000 --- a/frontend/src/store/mutations.js +++ /dev/null @@ -1,118 +0,0 @@ -import * as i18n from "@/i18n"; -import moment from "moment/min/moment-with-locales"; - -const mutations = { - closeHovers: (state) => { - state.prompts.pop(); - }, - toggleShell: (state) => { - state.show = null; - state.showShell = !state.showShell; - }, - showHover: (state, value) => { - if (typeof value !== "object") { - state.prompts.push({ - prompt: value, - confirm: null, - action: null, - props: null, - }); - return; - } - - state.prompts.push({ - prompt: value.prompt, // Should not be null - confirm: value?.confirm, - action: value?.action, - props: value?.props, - }); - }, - showError: (state) => { - state.prompts.push("error"); - }, - showSuccess: (state) => { - state.prompts.push("success"); - }, - setLoading: (state, value) => { - state.loading = value; - }, - setReload: (state, value) => { - state.reload = value; - }, - setUser: (state, value) => { - if (value === null) { - state.user = null; - return; - } - - let locale = value.locale; - - if (locale === "") { - locale = i18n.detectLocale(); - } - - moment.locale(locale); - i18n.default.locale = locale; - state.user = value; - }, - setJWT: (state, value) => (state.jwt = value), - multiple: (state, value) => (state.multiple = value), - addSelected: (state, value) => state.selected.push(value), - removeSelected: (state, value) => { - let i = state.selected.indexOf(value); - if (i === -1) return; - state.selected.splice(i, 1); - }, - resetSelected: (state) => { - state.selected = []; - }, - updateUser: (state, value) => { - if (typeof value !== "object") return; - - for (let field in value) { - if (field === "locale") { - moment.locale(value[field]); - i18n.default.locale = value[field]; - } - - state.user[field] = value[field]; - } - }, - updateRequest: (state, value) => { - const selectedItems = state.selected.map((i) => state.req.items[i]); - state.oldReq = state.req; - state.req = value; - state.selected = []; - - if (!state.req?.items) return; - state.selected = state.req.items - .filter((item) => selectedItems.some((rItem) => rItem.url === item.url)) - .map((item) => item.index); - }, - updateClipboard: (state, value) => { - state.clipboard.key = value.key; - state.clipboard.items = value.items; - state.clipboard.path = value.path; - }, - resetClipboard: (state) => { - state.clipboard.key = ""; - state.clipboard.items = []; - }, - setUploadSpeed: (state, value) => { - state.upload.speedMbyte = value; - }, - setETA(state, value) { - state.upload.eta = value; - }, - resetUpload(state) { - state.upload.uploads = {}; - state.upload.queue = []; - state.upload.progress = []; - state.upload.sizes = []; - state.upload.id = 0; - state.upload.speedMbyte = 0; - state.upload.eta = 0; - }, -}; - -export default mutations; diff --git a/frontend/src/stores/auth.ts b/frontend/src/stores/auth.ts new file mode 100644 index 00000000..459141ad --- /dev/null +++ b/frontend/src/stores/auth.ts @@ -0,0 +1,41 @@ +import { defineStore } from "pinia"; +import { detectLocale, setLocale } from "@/i18n"; +import { cloneDeep } from "lodash-es"; + +export const useAuthStore = defineStore("auth", { + // convert to a function + state: (): { + user: IUser | null; + jwt: string; + } => ({ + user: null, + jwt: "", + }), + getters: { + // user and jwt getter removed, no longer needed + isLoggedIn: (state) => state.user !== null, + }, + actions: { + // no context as first argument, use `this` instead + setUser(user: IUser) { + if (user === null) { + this.user = null; + return; + } + + setLocale(user.locale || detectLocale()); + this.user = user; + }, + updateUser(user: Partial) { + if (user.locale) { + setLocale(user.locale); + } + + this.user = { ...this.user, ...cloneDeep(user) } as IUser; + }, + // easily reset state using `$reset` + clearUser() { + this.$reset(); + }, + }, +}); diff --git a/frontend/src/stores/clipboard.ts b/frontend/src/stores/clipboard.ts new file mode 100644 index 00000000..5ad8a775 --- /dev/null +++ b/frontend/src/stores/clipboard.ts @@ -0,0 +1,24 @@ +import { defineStore } from "pinia"; + +export const useClipboardStore = defineStore("clipboard", { + // convert to a function + state: (): { + key: string; + items: ClipItem[]; + path?: string; + } => ({ + key: "", + items: [], + path: undefined, + }), + getters: { + // user and jwt getter removed, no longer needed + }, + actions: { + // no context as first argument, use `this` instead + // easily reset state using `$reset` + resetClipboard() { + this.$reset(); + }, + }, +}); diff --git a/frontend/src/stores/file.ts b/frontend/src/stores/file.ts new file mode 100644 index 00000000..425bb315 --- /dev/null +++ b/frontend/src/stores/file.ts @@ -0,0 +1,63 @@ +import { defineStore } from "pinia"; + +export const useFileStore = defineStore("file", { + // convert to a function + state: (): { + req: Resource | null; + oldReq: Resource | null; + reload: boolean; + selected: number[]; + multiple: boolean; + isFiles: boolean; + } => ({ + req: null, + oldReq: null, + reload: false, + selected: [], + multiple: false, + isFiles: false, + }), + getters: { + selectedCount: (state) => state.selected.length, + // route: () => { + // const routerStore = useRouterStore(); + // return routerStore.router.currentRoute; + // }, + // isFiles: (state) => { + // const layoutStore = useLayoutStore(); + // return !layoutStore.loading && state.route._value.name === "Files"; + // }, + isListing: (state) => { + return state.isFiles && state?.req?.isDir; + }, + }, + actions: { + // no context as first argument, use `this` instead + toggleMultiple() { + this.multiple = !this.multiple; + }, + updateRequest(value: Resource | null) { + const selectedItems = this.selected.map((i) => this.req?.items[i]); + this.oldReq = this.req; + this.req = value; + + this.selected = []; + + if (!this.req?.items) return; + this.selected = this.req.items + .filter((item) => + selectedItems.some((rItem) => rItem?.url === item.url) + ) + .map((item) => item.index); + }, + removeSelected(value: any) { + const i = this.selected.indexOf(value); + if (i === -1) return; + this.selected.splice(i, 1); + }, + // easily reset state using `$reset` + clearFile() { + this.$reset(); + }, + }, +}); diff --git a/frontend/src/stores/index.ts b/frontend/src/stores/index.ts new file mode 100644 index 00000000..7f52aa28 --- /dev/null +++ b/frontend/src/stores/index.ts @@ -0,0 +1,12 @@ +import { createPinia as _createPinia } from "pinia"; +import { markRaw } from "vue"; +import { Router } from "vue-router"; + +export default function createPinia(router: Router) { + const pinia = _createPinia(); + pinia.use(({ store }) => { + store.router = markRaw(router); + }); + + return pinia; +} diff --git a/frontend/src/stores/layout.ts b/frontend/src/stores/layout.ts new file mode 100644 index 00000000..1911643a --- /dev/null +++ b/frontend/src/stores/layout.ts @@ -0,0 +1,74 @@ +import { defineStore } from "pinia"; +// import { useAuthPreferencesStore } from "./auth-preferences"; +// import { useAuthEmailStore } from "./auth-email"; + +export const useLayoutStore = defineStore("layout", { + // convert to a function + state: (): { + loading: boolean; + prompts: PopupProps[]; + showShell: boolean | null; + } => ({ + loading: false, + prompts: [], + showShell: false, + }), + getters: { + currentPrompt(state) { + return state.prompts.length > 0 + ? state.prompts[state.prompts.length - 1] + : null; + }, + currentPromptName(): string | null | undefined { + return this.currentPrompt?.prompt; + }, + // user and jwt getter removed, no longer needed + }, + actions: { + // no context as first argument, use `this` instead + toggleShell() { + this.showShell = !this.showShell; + }, + showHover(value: PopupProps | string) { + if (typeof value !== "object") { + this.prompts.push({ + prompt: value, + confirm: null, + action: undefined, + props: null, + }); + return; + } + + this.prompts.push({ + prompt: value.prompt, + confirm: value?.confirm, + action: value?.action, + props: value?.props, + }); + }, + showError() { + this.prompts.push({ + prompt: "error", + confirm: null, + action: undefined, + props: null, + }); + }, + showSuccess() { + this.prompts.push({ + prompt: "success", + confirm: null, + action: undefined, + props: null, + }); + }, + closeHovers() { + this.prompts.pop(); + }, + // easily reset state using `$reset` + clearLayout() { + this.$reset(); + }, + }, +}); diff --git a/frontend/src/stores/router.ts b/frontend/src/stores/router.ts new file mode 100644 index 00000000..e598824c --- /dev/null +++ b/frontend/src/stores/router.ts @@ -0,0 +1,14 @@ +import { defineStore } from "pinia"; + +/** + * Dummy store for exposing router to be used in other stores + * @example + * // route: () => { + * // const routerStore = useRouterStore(); + * // return routerStore.router.currentRoute; + * // }, + */ +export const useRouterStore = defineStore("routerStore", () => { + // can be an empty definition + return {}; +}); diff --git a/frontend/src/stores/upload.ts b/frontend/src/stores/upload.ts new file mode 100644 index 00000000..7a7686a6 --- /dev/null +++ b/frontend/src/stores/upload.ts @@ -0,0 +1,187 @@ +import { defineStore } from "pinia"; +import { useFileStore } from "./file"; +import { files as api } from "@/api"; +import throttle from "lodash/throttle"; +import buttons from "@/utils/buttons"; + +// TODO: make this into a user setting +const UPLOADS_LIMIT = 5; + +const beforeUnload = (event: Event) => { + event.preventDefault(); + // To remove >> is deprecated + // event.returnValue = ""; +}; + +export const useUploadStore = defineStore("upload", { + // convert to a function + state: (): { + id: number; + sizes: number[]; + progress: Progress[]; + queue: UploadItem[]; + uploads: Uploads; + speedMbyte: number; + eta: number; + error: Error | null; + } => ({ + id: 0, + sizes: [], + progress: [], + queue: [], + uploads: {}, + speedMbyte: 0, + eta: 0, + error: null, + }), + getters: { + // user and jwt getter removed, no longer needed + getProgress: (state) => { + if (state.progress.length === 0) { + return 0; + } + + const totalSize = state.sizes.reduce((a, b) => a + b, 0); + + // TODO: this looks ugly but it works with ts now + const sum = state.progress.reduce((acc, val) => +acc + +val) as number; + return Math.ceil((sum / totalSize) * 100); + }, + filesInUploadCount: (state) => { + return Object.keys(state.uploads).length + state.queue.length; + }, + filesInUpload: (state) => { + const files = []; + + for (const index in state.uploads) { + const upload = state.uploads[index]; + const id = upload.id; + const type = upload.type; + const name = upload.file.name; + const size = state.sizes[id]; + const isDir = upload.file.isDir; + const progress = isDir + ? 100 + : Math.ceil(((state.progress[id] as number) / size) * 100); + + files.push({ + id, + name, + progress, + type, + isDir, + }); + } + + return files.sort((a, b) => a.progress - b.progress); + }, + uploadSpeed: (state) => { + return state.speedMbyte; + }, + getETA: (state) => state.eta, + }, + actions: { + // no context as first argument, use `this` instead + setProgress({ id, loaded }: { id: number; loaded: Progress }) { + this.progress[id] = loaded; + }, + setError(error: Error) { + this.error = error; + }, + reset() { + this.id = 0; + this.sizes = []; + this.progress = []; + this.queue = []; + this.uploads = {}; + this.speedMbyte = 0; + this.eta = 0; + this.error = null; + }, + addJob(item: UploadItem) { + this.queue.push(item); + this.sizes[this.id] = item.file.size; + this.id++; + }, + moveJob() { + const item = this.queue[0]; + this.queue.shift(); + this.uploads[item.id] = item; + }, + removeJob(id: number) { + delete this.uploads[id]; + }, + upload(item: UploadItem) { + const uploadsCount = Object.keys(this.uploads).length; + + const isQueueEmpty = this.queue.length == 0; + const isUploadsEmpty = uploadsCount == 0; + + if (isQueueEmpty && isUploadsEmpty) { + window.addEventListener("beforeunload", beforeUnload); + buttons.loading("upload"); + } + + this.addJob(item); + this.processUploads(); + }, + finishUpload(item: UploadItem) { + this.setProgress({ id: item.id, loaded: item.file.size > 0 }); + this.removeJob(item.id); + this.processUploads(); + }, + async processUploads() { + const uploadsCount = Object.keys(this.uploads).length; + + const isBellowLimit = uploadsCount < UPLOADS_LIMIT; + const isQueueEmpty = this.queue.length == 0; + const isUploadsEmpty = uploadsCount == 0; + + const isFinished = isQueueEmpty && isUploadsEmpty; + const canProcess = isBellowLimit && !isQueueEmpty; + + if (isFinished) { + const fileStore = useFileStore(); + window.removeEventListener("beforeunload", beforeUnload); + buttons.success("upload"); + this.reset(); + fileStore.reload = true; + } + + if (canProcess) { + const item = this.queue[0]; + this.moveJob(); + + if (item.file.isDir) { + await api.post(item.path).catch(this.setError); + } else { + const onUpload = throttle( + (event: ProgressEvent) => + this.setProgress({ + id: item.id, + loaded: event.loaded, + }), + 100, + { leading: true, trailing: false } + ); + + await api + .post(item.path, item.file.file as File, item.overwrite, onUpload) + .catch(this.setError); + } + + this.finishUpload(item); + } + }, + setUploadSpeed(value: number) { + this.speedMbyte = value; + }, + setETA(value: number) { + this.eta = value; + }, + // easily reset state using `$reset` + clearUpload() { + this.$reset(); + }, + }, +}); diff --git a/frontend/src/types/api.d.ts b/frontend/src/types/api.d.ts new file mode 100644 index 00000000..66685e5e --- /dev/null +++ b/frontend/src/types/api.d.ts @@ -0,0 +1,33 @@ +type ApiMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH"; + +type ApiContent = + | Blob + | File + | Pick, "read"> + | ""; + +interface ApiOpts { + method?: ApiMethod; + headers?: object; + body?: any; +} + +interface TusSettings { + retryCount: number; + chunkSize: number; +} + +type ChecksumAlg = "md5" | "sha1" | "sha256" | "sha512"; + +interface Share { + hash: string; + path: string; + expire?: any; + userID?: number; + token?: string; + username?: string; +} + +interface SearchParams { + [key: string]: string; +} diff --git a/frontend/src/types/file.d.ts b/frontend/src/types/file.d.ts new file mode 100644 index 00000000..db2aa5fe --- /dev/null +++ b/frontend/src/types/file.d.ts @@ -0,0 +1,58 @@ +interface ResourceBase { + path: string; + name: string; + size: number; + extension: string; + modified: string; // ISO 8601 datetime + mode: number; + isDir: boolean; + isSymlink: boolean; + type: ResourceType; + url: string; +} + +interface Resource extends ResourceBase { + items: ResourceItem[]; + numDirs: number; + numFiles: number; + sorting: Sorting; + hash?: string; + token?: string; + index: number; + subtitles?: string[]; + content?: string; +} + +interface ResourceItem extends ResourceBase { + index: number; + subtitles?: string[]; +} + +type ResourceType = + | "video" + | "audio" + | "image" + | "pdf" + | "text" + | "blob" + | "textImmutable"; + +type DownloadFormat = + | "zip" + | "tar" + | "targz" + | "tarbz2" + | "tarxz" + | "tarlz4" + | "tarsz" + | null; + +interface ClipItem { + from: string; + name: string; +} + +interface BreadCrumb { + name: string; + url: string; +} diff --git a/frontend/src/types/global.d.ts b/frontend/src/types/global.d.ts new file mode 100644 index 00000000..5475c908 --- /dev/null +++ b/frontend/src/types/global.d.ts @@ -0,0 +1,13 @@ +export {}; + +declare global { + interface Window { + FileBrowser: any; + grecaptcha: any; + } + + interface HTMLElement { + // TODO: no idea what the exact type is + __vue__: any; + } +} diff --git a/frontend/src/types/layout.d.ts b/frontend/src/types/layout.d.ts new file mode 100644 index 00000000..fa05a484 --- /dev/null +++ b/frontend/src/types/layout.d.ts @@ -0,0 +1,8 @@ +interface PopupProps { + prompt: string; + confirm?: any; + action?: PopupAction; + props?: any; +} + +type PopupAction = (e: Event) => void; diff --git a/frontend/src/types/settings.d.ts b/frontend/src/types/settings.d.ts new file mode 100644 index 00000000..a2c19f76 --- /dev/null +++ b/frontend/src/types/settings.d.ts @@ -0,0 +1,57 @@ +interface ISettings { + signup: boolean; + createUserDir: boolean; + userHomeBasePath: string; + defaults: SettingsDefaults; + rules: any[]; + branding: SettingsBranding; + tus: SettingsTus; + shell: string[]; + commands: SettingsCommand; +} + +interface SettingsDefaults { + scope: string; + locale: string; + viewMode: ViewModeType; + singleClick: boolean; + sorting: Sorting; + perm: Permissions; + commands: any[]; + hideDotfiles: boolean; + dateFormat: boolean; +} + +interface SettingsBranding { + name: string; + disableExternal: boolean; + disableUsedPercentage: boolean; + files: string; + theme: UserTheme; + color: string; +} + +interface SettingsTus { + chunkSize: number; + retryCount: number; +} + +interface SettingsCommand { + after_copy?: string[]; + after_delete?: string[]; + after_rename?: string[]; + after_save?: string[]; + after_upload?: string[]; + before_copy?: string[]; + before_delete?: string[]; + before_rename?: string[]; + before_save?: string[]; + before_upload?: string[]; +} + +interface SettingsUnit { + KB: number; + MB: number; + GB: number; + TB: number; +} diff --git a/frontend/src/types/toast.d.ts b/frontend/src/types/toast.d.ts new file mode 100644 index 00000000..5a691ed4 --- /dev/null +++ b/frontend/src/types/toast.d.ts @@ -0,0 +1,2 @@ +type IToastSuccess = (message: string) => void; +type IToastError = (error: Error | string, displayReport?: boolean) => void; diff --git a/frontend/src/types/upload.d.ts b/frontend/src/types/upload.d.ts new file mode 100644 index 00000000..263b6bf5 --- /dev/null +++ b/frontend/src/types/upload.d.ts @@ -0,0 +1,51 @@ +interface Uploads { + [key: number]: Upload; +} + +interface Upload { + id: number; + file: UploadEntry; + type?: ResourceType; +} + +interface UploadItem { + id: number; + url?: string; + path: string; + file: UploadEntry; + dir?: boolean; + overwrite?: boolean; + type?: ResourceType; +} + +interface UploadEntry { + name: string; + size: number; + isDir: boolean; + fullPath?: string; + file?: File; +} + +type UploadList = UploadEntry[]; + +type Progress = number | boolean; + +type CurrentUploadList = { + [key: string]: { + upload: import("tus-js-client").Upload; + recentSpeeds: number[]; + initialBytesUploaded: number; + currentBytesUploaded: number; + currentAverageSpeed: number; + lastProgressTimestamp: number | null; + sumOfRecentSpeeds: number; + hasStarted: boolean; + interval: number | undefined; + }; +}; + +interface ETAState { + sizes: number[]; + progress: Progress[]; + speedMbyte: number; +} diff --git a/frontend/src/types/user.d.ts b/frontend/src/types/user.d.ts new file mode 100644 index 00000000..b81806fc --- /dev/null +++ b/frontend/src/types/user.d.ts @@ -0,0 +1,66 @@ +interface IUser { + id: number; + username: string; + password: string; + scope: string; + locale: string; + perm: Permissions; + commands: string[]; + rules: IRule[]; + lockPassword: boolean; + hideDotfiles: boolean; + singleClick: boolean; + dateFormat: boolean; + viewMode: ViewModeType; + sorting?: Sorting; +} + +type ViewModeType = "list" | "mosaic" | "mosaic gallery"; + +interface IUserForm { + id?: number; + username?: string; + password?: string; + scope?: string; + locale?: string; + perm?: Permissions; + commands?: string[]; + rules?: IRule[]; + lockPassword?: boolean; + hideDotfiles?: boolean; + singleClick?: boolean; + dateFormat?: boolean; +} + +interface Permissions { + admin: boolean; + copy: boolean; + create: boolean; + delete: boolean; + download: boolean; + execute: boolean; + modify: boolean; + move: boolean; + rename: boolean; + share: boolean; + shell: boolean; + upload: boolean; +} + +interface Sorting { + by: string; + asc: boolean; +} + +interface IRule { + allow: boolean; + path: string; + regex: boolean; + regexp: IRegexp; +} + +interface IRegexp { + raw: string; +} + +type UserTheme = "light" | "dark" | ""; diff --git a/frontend/src/types/utif.d.ts b/frontend/src/types/utif.d.ts new file mode 100644 index 00000000..1919070b --- /dev/null +++ b/frontend/src/types/utif.d.ts @@ -0,0 +1 @@ +declare module "utif"; diff --git a/frontend/src/utils/auth.js b/frontend/src/utils/auth.js deleted file mode 100644 index 03d35d74..00000000 --- a/frontend/src/utils/auth.js +++ /dev/null @@ -1,92 +0,0 @@ -import store from "@/store"; -import router from "@/router"; -import { Base64 } from "js-base64"; -import { baseURL } from "@/utils/constants"; - -export function parseToken(token) { - const parts = token.split("."); - - if (parts.length !== 3) { - throw new Error("token malformed"); - } - - const data = JSON.parse(Base64.decode(parts[1])); - - document.cookie = `auth=${token}; path=/`; - - localStorage.setItem("jwt", token); - store.commit("setJWT", token); - store.commit("setUser", data.user); -} - -export async function validateLogin() { - try { - if (localStorage.getItem("jwt")) { - await renew(localStorage.getItem("jwt")); - } - } catch (_) { - console.warn("Invalid JWT token in storage"); // eslint-disable-line - } -} - -export async function login(username, password, recaptcha) { - const data = { username, password, recaptcha }; - - const res = await fetch(`${baseURL}/api/login`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(data), - }); - - const body = await res.text(); - - if (res.status === 200) { - parseToken(body); - } else { - throw new Error(body); - } -} - -export async function renew(jwt) { - const res = await fetch(`${baseURL}/api/renew`, { - method: "POST", - headers: { - "X-Auth": jwt, - }, - }); - - const body = await res.text(); - - if (res.status === 200) { - parseToken(body); - } else { - throw new Error(body); - } -} - -export async function signup(username, password) { - const data = { username, password }; - - const res = await fetch(`${baseURL}/api/signup`, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(data), - }); - - if (res.status !== 200) { - throw new Error(res.status); - } -} - -export function logout() { - document.cookie = "auth=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/"; - - store.commit("setJWT", ""); - store.commit("setUser", null); - localStorage.setItem("jwt", null); - router.push({ path: "/login" }); -} diff --git a/frontend/src/utils/auth.ts b/frontend/src/utils/auth.ts new file mode 100644 index 00000000..5fe8ce31 --- /dev/null +++ b/frontend/src/utils/auth.ts @@ -0,0 +1,102 @@ +import { useAuthStore } from "@/stores/auth"; +import router from "@/router"; +import { JwtPayload, jwtDecode } from "jwt-decode"; +import { baseURL } from "./constants"; +import { StatusError } from "@/api/utils"; + +export function parseToken(token: string) { + // falsy or malformed jwt will throw InvalidTokenError + const data = jwtDecode(token); + + document.cookie = `auth=${token}; Path=/; SameSite=Strict;`; + + localStorage.setItem("jwt", token); + + const authStore = useAuthStore(); + authStore.jwt = token; + authStore.setUser(data.user); +} + +export async function validateLogin() { + try { + if (localStorage.getItem("jwt")) { + await renew(localStorage.getItem("jwt")); + } + } catch (error) { + console.warn("Invalid JWT token in storage"); // eslint-disable-line + throw error; + } +} + +export async function login( + username: string, + password: string, + recaptcha: string +) { + const data = { username, password, recaptcha }; + + const res = await fetch(`${baseURL}/api/login`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + + const body = await res.text(); + + if (res.status === 200) { + parseToken(body); + } else { + throw new StatusError( + body || `${res.status} ${res.statusText}`, + res.status + ); + } +} + +export async function renew(jwt: string) { + const res = await fetch(`${baseURL}/api/renew`, { + method: "POST", + headers: { + "X-Auth": jwt, + }, + }); + + const body = await res.text(); + + if (res.status === 200) { + parseToken(body); + } else { + throw new StatusError( + body || `${res.status} ${res.statusText}`, + res.status + ); + } +} + +export async function signup(username: string, password: string) { + const data = { username, password }; + + const res = await fetch(`${baseURL}/api/signup`, { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + + if (res.status !== 200) { + throw new StatusError(`${res.status} ${res.statusText}`, res.status); + } +} + +export function logout() { + document.cookie = "auth=; Max-Age=0; Path=/; SameSite=Strict;"; + + const authStore = useAuthStore(); + authStore.clearUser(); + + localStorage.setItem("jwt", ""); + router.push({ path: "/login" }); +} diff --git a/frontend/src/utils/buttons.js b/frontend/src/utils/buttons.js deleted file mode 100644 index bf123878..00000000 --- a/frontend/src/utils/buttons.js +++ /dev/null @@ -1,70 +0,0 @@ -function loading(button) { - let el = document.querySelector(`#${button}-button > i`); - - if (el === undefined || el === null) { - console.log('Error getting button ' + button) // eslint-disable-line - return; - } - - if (el.innerHTML == "autorenew" || el.innerHTML == "done") { - return; - } - - el.dataset.icon = el.innerHTML; - el.style.opacity = 0; - - setTimeout(() => { - el.classList.add("spin"); - el.innerHTML = "autorenew"; - el.style.opacity = 1; - }, 100); -} - -function done(button) { - let el = document.querySelector(`#${button}-button > i`); - - if (el === undefined || el === null) { - console.log('Error getting button ' + button) // eslint-disable-line - return; - } - - el.style.opacity = 0; - - setTimeout(() => { - el.classList.remove("spin"); - el.innerHTML = el.dataset.icon; - el.style.opacity = 1; - }, 100); -} - -function success(button) { - let el = document.querySelector(`#${button}-button > i`); - - if (el === undefined || el === null) { - console.log('Error getting button ' + button) // eslint-disable-line - return; - } - - el.style.opacity = 0; - - setTimeout(() => { - el.classList.remove("spin"); - el.innerHTML = "done"; - el.style.opacity = 1; - - setTimeout(() => { - el.style.opacity = 0; - - setTimeout(() => { - el.innerHTML = el.dataset.icon; - el.style.opacity = 1; - }, 100); - }, 500); - }, 100); -} - -export default { - loading, - done, - success, -}; diff --git a/frontend/src/utils/buttons.ts b/frontend/src/utils/buttons.ts new file mode 100644 index 00000000..6a8ac249 --- /dev/null +++ b/frontend/src/utils/buttons.ts @@ -0,0 +1,83 @@ +function loading(button: string) { + const el: HTMLButtonElement | null = document.querySelector( + `#${button}-button > i` + ); + + if (el === undefined || el === null) { + console.log("Error getting button " + button); // eslint-disable-line + return; + } + + if (el.innerHTML == "autorenew" || el.innerHTML == "done") { + return; + } + + el.dataset.icon = el.innerHTML; + el.style.opacity = "0"; + + setTimeout(() => { + if (el) { + el.classList.add("spin"); + el.innerHTML = "autorenew"; + el.style.opacity = "1"; + } + }, 100); +} + +function done(button: string) { + const el: HTMLButtonElement | null = document.querySelector( + `#${button}-button > i` + ); + + if (el === undefined || el === null) { + console.log("Error getting button " + button); // eslint-disable-line + return; + } + + el.style.opacity = "0"; + + setTimeout(() => { + if (el !== null) { + el.classList.remove("spin"); + el.innerHTML = el?.dataset?.icon || ""; + el.style.opacity = "1"; + } + }, 100); +} + +function success(button: string) { + const el: HTMLButtonElement | null = document.querySelector( + `#${button}-button > i` + ); + + if (el === undefined || el === null) { + console.log("Error getting button " + button); // eslint-disable-line + return; + } + + el.style.opacity = "0"; + + setTimeout(() => { + if (el !== null) { + el.classList.remove("spin"); + el.innerHTML = "done"; + el.style.opacity = "1"; + } + setTimeout(() => { + if (el) el.style.opacity = "0"; + + setTimeout(() => { + if (el !== null) { + el.innerHTML = el?.dataset?.icon || ""; + el.style.opacity = "1"; + } + }, 100); + }, 500); + }, 100); +} + +export default { + loading, + done, + success, +}; diff --git a/frontend/src/utils/clipboard.ts b/frontend/src/utils/clipboard.ts new file mode 100644 index 00000000..352d9ae7 --- /dev/null +++ b/frontend/src/utils/clipboard.ts @@ -0,0 +1,66 @@ +// Based on code provided by Amir Fo +// https://stackoverflow.com/a/74528564 +export function copy(text: string) { + return new Promise((resolve, reject) => { + if ( + typeof navigator !== "undefined" && + typeof navigator.clipboard !== "undefined" && + // @ts-ignore + navigator.permissions !== "undefined" + ) { + navigator.permissions + // @ts-ignore + .query({ name: "clipboard-write" }) + .then((permission) => { + if (permission.state === "granted" || permission.state === "prompt") { + const type = "text/plain"; + const blob = new Blob([text], { type }); + const data = [new ClipboardItem({ [type]: blob })]; + navigator.clipboard.write(data).then(resolve).catch(reject); + } else { + reject(new Error("Permission not granted!")); + } + }) + .catch((e) => { + // Firefox doesnt support clipboard-write permission + if (navigator.userAgent.indexOf("Firefox") != -1) { + navigator.clipboard.writeText(text).then(resolve).catch(reject); + } else { + reject(e); + } + }); + } else if ( + document.queryCommandSupported && + document.queryCommandSupported("copy") + ) { + const textarea = document.createElement("textarea"); + textarea.textContent = text; + textarea.setAttribute("readonly", ""); + textarea.style.fontSize = "12pt"; + textarea.style.position = "fixed"; + textarea.style.width = "2em"; + textarea.style.height = "2em"; + textarea.style.padding = "0"; + textarea.style.margin = "0"; + textarea.style.border = "none"; + textarea.style.outline = "none"; + textarea.style.boxShadow = "none"; + textarea.style.background = "transparent"; + document.body.appendChild(textarea); + textarea.focus(); + textarea.select(); + try { + document.execCommand("copy"); + document.body.removeChild(textarea); + resolve(); + } catch (e) { + document.body.removeChild(textarea); + reject(e); + } + } else { + reject( + new Error("None of copying methods are supported by this browser!") + ); + } + }); +} diff --git a/frontend/src/utils/constants.js b/frontend/src/utils/constants.js deleted file mode 100644 index 2dbe44a1..00000000 --- a/frontend/src/utils/constants.js +++ /dev/null @@ -1,42 +0,0 @@ -const name = window.FileBrowser.Name || "File Browser"; -const disableExternal = window.FileBrowser.DisableExternal; -const disableUsedPercentage = window.FileBrowser.DisableUsedPercentage; -const baseURL = window.FileBrowser.BaseURL; -const staticURL = window.FileBrowser.StaticURL; -const recaptcha = window.FileBrowser.ReCaptcha; -const recaptchaKey = window.FileBrowser.ReCaptchaKey; -const signup = window.FileBrowser.Signup; -const version = window.FileBrowser.Version; -const logoURL = `${staticURL}/img/logo.svg`; -const noAuth = window.FileBrowser.NoAuth; -const authMethod = window.FileBrowser.AuthMethod; -const loginPage = window.FileBrowser.LoginPage; -const theme = window.FileBrowser.Theme; -const enableThumbs = window.FileBrowser.EnableThumbs; -const resizePreview = window.FileBrowser.ResizePreview; -const enableExec = window.FileBrowser.EnableExec; -const tusSettings = window.FileBrowser.TusSettings; -const origin = window.location.origin; -const tusEndpoint = `/api/tus`; - -export { - name, - disableExternal, - disableUsedPercentage, - baseURL, - logoURL, - recaptcha, - recaptchaKey, - signup, - version, - noAuth, - authMethod, - loginPage, - theme, - enableThumbs, - resizePreview, - enableExec, - tusSettings, - origin, - tusEndpoint, -}; diff --git a/frontend/src/utils/constants.ts b/frontend/src/utils/constants.ts new file mode 100644 index 00000000..3f131b1a --- /dev/null +++ b/frontend/src/utils/constants.ts @@ -0,0 +1,42 @@ +const name: string = window.FileBrowser.Name || "File Browser"; +const disableExternal: boolean = window.FileBrowser.DisableExternal; +const disableUsedPercentage: boolean = window.FileBrowser.DisableUsedPercentage; +const baseURL: string = window.FileBrowser.BaseURL; +const staticURL: string = window.FileBrowser.StaticURL; +const recaptcha: string = window.FileBrowser.ReCaptcha; +const recaptchaKey: string = window.FileBrowser.ReCaptchaKey; +const signup: boolean = window.FileBrowser.Signup; +const version: string = window.FileBrowser.Version; +const logoURL = `${staticURL}/img/logo.svg`; +const noAuth: boolean = window.FileBrowser.NoAuth; +const authMethod = window.FileBrowser.AuthMethod; +const loginPage: boolean = window.FileBrowser.LoginPage; +const theme: UserTheme = window.FileBrowser.Theme; +const enableThumbs: boolean = window.FileBrowser.EnableThumbs; +const resizePreview: boolean = window.FileBrowser.ResizePreview; +const enableExec: boolean = window.FileBrowser.EnableExec; +const tusSettings = window.FileBrowser.TusSettings; +const origin = window.location.origin; +const tusEndpoint = `/api/tus`; + +export { + name, + disableExternal, + disableUsedPercentage, + baseURL, + logoURL, + recaptcha, + recaptchaKey, + signup, + version, + noAuth, + authMethod, + loginPage, + theme, + enableThumbs, + resizePreview, + enableExec, + tusSettings, + origin, + tusEndpoint, +}; diff --git a/frontend/src/utils/cookie.js b/frontend/src/utils/cookie.ts similarity index 63% rename from frontend/src/utils/cookie.js rename to frontend/src/utils/cookie.ts index 72d59be4..bdebf4f0 100644 --- a/frontend/src/utils/cookie.js +++ b/frontend/src/utils/cookie.ts @@ -1,5 +1,5 @@ -export default function (name) { - let re = new RegExp( +export default function (name: string) { + const re = new RegExp( "(?:(?:^|.*;\\s*)" + name + "\\s*\\=\\s*([^;]*).*$)|^.*$" ); return document.cookie.replace(re, "$1"); diff --git a/frontend/src/utils/css.js b/frontend/src/utils/css.ts similarity index 86% rename from frontend/src/utils/css.js rename to frontend/src/utils/css.ts index 405c0dd2..d727786b 100644 --- a/frontend/src/utils/css.js +++ b/frontend/src/utils/css.ts @@ -1,10 +1,10 @@ -export default function getRule(rules) { +export default function getRule(rules: string[]) { for (let i = 0; i < rules.length; i++) { rules[i] = rules[i].toLowerCase(); } let result = null; - let find = Array.prototype.find; + const find = Array.prototype.find; find.call(document.styleSheets, (styleSheet) => { result = find.call(styleSheet.cssRules, (cssRule) => { diff --git a/frontend/src/utils/index.js b/frontend/src/utils/index.ts similarity index 100% rename from frontend/src/utils/index.js rename to frontend/src/utils/index.ts diff --git a/frontend/src/utils/theme.ts b/frontend/src/utils/theme.ts new file mode 100644 index 00000000..8058356a --- /dev/null +++ b/frontend/src/utils/theme.ts @@ -0,0 +1,34 @@ +import { theme } from "./constants"; + +export const getTheme = (): UserTheme => { + return (document.documentElement.className as UserTheme) || theme; +}; + +export const setTheme = (theme: UserTheme) => { + const html = document.documentElement; + if (!theme) { + html.className = getMediaPreference(); + } else { + html.className = theme; + } +}; + +export const toggleTheme = (): void => { + const activeTheme = getTheme(); + if (activeTheme === "light") { + setTheme("dark"); + } else { + setTheme("light"); + } +}; + +export const getMediaPreference = (): UserTheme => { + const hasDarkPreference = window.matchMedia( + "(prefers-color-scheme: dark)" + ).matches; + if (hasDarkPreference) { + return "dark"; + } else { + return "light"; + } +}; diff --git a/frontend/src/utils/upload.js b/frontend/src/utils/upload.js deleted file mode 100644 index 2184072f..00000000 --- a/frontend/src/utils/upload.js +++ /dev/null @@ -1,138 +0,0 @@ -import store from "@/store"; -import url from "@/utils/url"; - -export function checkConflict(files, items) { - if (typeof items === "undefined" || items === null) { - items = []; - } - - let folder_upload = files[0].fullPath !== undefined; - - let conflict = false; - for (let i = 0; i < files.length; i++) { - let file = files[i]; - let name = file.name; - - if (folder_upload) { - let dirs = file.fullPath.split("/"); - if (dirs.length > 1) { - name = dirs[0]; - } - } - - let res = items.findIndex(function hasConflict(element) { - return element.name === this; - }, name); - - if (res >= 0) { - conflict = true; - break; - } - } - - return conflict; -} - -export function scanFiles(dt) { - return new Promise((resolve) => { - let reading = 0; - const contents = []; - - if (dt.items !== undefined) { - for (let item of dt.items) { - if ( - item.kind === "file" && - typeof item.webkitGetAsEntry === "function" - ) { - const entry = item.webkitGetAsEntry(); - readEntry(entry); - } - } - } else { - resolve(dt.files); - } - - function readEntry(entry, directory = "") { - if (entry.isFile) { - reading++; - entry.file((file) => { - reading--; - - file.fullPath = `${directory}${file.name}`; - contents.push(file); - - if (reading === 0) { - resolve(contents); - } - }); - } else if (entry.isDirectory) { - const dir = { - isDir: true, - size: 0, - fullPath: `${directory}${entry.name}`, - name: entry.name, - }; - - contents.push(dir); - - readReaderContent(entry.createReader(), `${directory}${entry.name}`); - } - } - - function readReaderContent(reader, directory) { - reading++; - - reader.readEntries(function (entries) { - reading--; - if (entries.length > 0) { - for (const entry of entries) { - readEntry(entry, `${directory}/`); - } - - readReaderContent(reader, `${directory}/`); - } - - if (reading === 0) { - resolve(contents); - } - }); - } - }); -} - -function detectType(mimetype) { - if (mimetype.startsWith("video")) return "video"; - if (mimetype.startsWith("audio")) return "audio"; - if (mimetype.startsWith("image")) return "image"; - if (mimetype.startsWith("pdf")) return "pdf"; - if (mimetype.startsWith("text")) return "text"; - return "blob"; -} - -export function handleFiles(files, base, overwrite = false) { - for (let i = 0; i < files.length; i++) { - let id = store.state.upload.id; - let path = base; - let file = files[i]; - - if (file.fullPath !== undefined) { - path += url.encodePath(file.fullPath); - } else { - path += url.encodeRFC5987ValueChars(file.name); - } - - if (file.isDir) { - path += "/"; - } - - const item = { - id, - path, - file, - overwrite, - ...(!file.isDir && { type: detectType(file.type) }), - }; - - store.dispatch("upload/upload", item); - } -} diff --git a/frontend/src/utils/upload.ts b/frontend/src/utils/upload.ts new file mode 100644 index 00000000..806bc78f --- /dev/null +++ b/frontend/src/utils/upload.ts @@ -0,0 +1,154 @@ +import { useUploadStore } from "@/stores/upload"; +import url from "@/utils/url"; + +export function checkConflict( + files: UploadList, + dest: ResourceItem[] +): boolean { + if (typeof dest === "undefined" || dest === null) { + dest = []; + } + + const folder_upload = files[0].fullPath !== undefined; + + const names = new Set(); + for (let i = 0; i < files.length; i++) { + const file = files[i]; + let name = file.name; + + if (folder_upload) { + const dirs = file.fullPath?.split("/"); + if (dirs && dirs.length > 1) { + name = dirs[0]; + } + } + + names.add(name); + } + + return dest.some((d) => names.has(d.name)); +} + +export function scanFiles(dt: DataTransfer): Promise { + return new Promise((resolve) => { + let reading = 0; + const contents: UploadList = []; + + if (dt.items) { + // ts didnt like the for of loop even tho + // it is the official example on MDN + // for (const item of dt.items) { + for (let i = 0; i < dt.items.length; i++) { + const item = dt.items[i]; + if ( + item.kind === "file" && + typeof item.webkitGetAsEntry === "function" + ) { + const entry = item.webkitGetAsEntry(); + entry && readEntry(entry); + } + } + } else { + resolve(dt.files); + } + + function readEntry(entry: FileSystemEntry, directory = ""): void { + if (entry.isFile) { + reading++; + (entry as FileSystemFileEntry).file((file) => { + reading--; + + contents.push({ + file, + name: file.name, + size: file.size, + isDir: false, + fullPath: `${directory}${file.name}`, + }); + + if (reading === 0) { + resolve(contents); + } + }); + } else if (entry.isDirectory) { + const dir = { + isDir: true, + size: 0, + fullPath: `${directory}${entry.name}`, + name: entry.name, + }; + + contents.push(dir); + + readReaderContent( + (entry as FileSystemDirectoryEntry).createReader(), + `${directory}${entry.name}` + ); + } + } + + function readReaderContent( + reader: FileSystemDirectoryReader, + directory: string + ): void { + reading++; + + reader.readEntries((entries) => { + reading--; + if (entries.length > 0) { + for (const entry of entries) { + readEntry(entry, `${directory}/`); + } + + readReaderContent(reader, `${directory}/`); + } + + if (reading === 0) { + resolve(contents); + } + }); + } + }); +} + +function detectType(mimetype: string): ResourceType { + if (mimetype.startsWith("video")) return "video"; + if (mimetype.startsWith("audio")) return "audio"; + if (mimetype.startsWith("image")) return "image"; + if (mimetype.startsWith("pdf")) return "pdf"; + if (mimetype.startsWith("text")) return "text"; + return "blob"; +} + +export function handleFiles( + files: UploadList, + base: string, + overwrite = false +) { + const uploadStore = useUploadStore(); + + for (const file of files) { + const id = uploadStore.id; + let path = base; + + if (file.fullPath !== undefined) { + path += url.encodePath(file.fullPath); + } else { + path += url.encodeRFC5987ValueChars(file.name); + } + + if (file.isDir) { + path += "/"; + } + + const item: UploadItem = { + id, + path, + file, + overwrite, + ...(!file.isDir && { type: detectType((file.file as File).type) }), + }; + + uploadStore.upload(item); + } +} diff --git a/frontend/src/utils/url.js b/frontend/src/utils/url.js deleted file mode 100644 index 33d124a2..00000000 --- a/frontend/src/utils/url.js +++ /dev/null @@ -1,36 +0,0 @@ -export function removeLastDir(url) { - var arr = url.split("/"); - if (arr.pop() === "") { - arr.pop(); - } - - return arr.join("/"); -} - -// this code borrow from mozilla -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent#Examples -export function encodeRFC5987ValueChars(str) { - return ( - encodeURIComponent(str) - // Note that although RFC3986 reserves "!", RFC5987 does not, - // so we do not need to escape it - .replace(/['()]/g, escape) // i.e., %27 %28 %29 - .replace(/\*/g, "%2A") - // The following are not required for percent-encoding per RFC5987, - // so we can allow for a little better readability over the wire: |`^ - .replace(/%(?:7C|60|5E)/g, unescape) - ); -} - -export function encodePath(str) { - return str - .split("/") - .map((v) => encodeURIComponent(v)) - .join("/"); -} - -export default { - encodeRFC5987ValueChars, - removeLastDir, - encodePath, -}; diff --git a/frontend/src/utils/url.ts b/frontend/src/utils/url.ts new file mode 100644 index 00000000..063fa6d2 --- /dev/null +++ b/frontend/src/utils/url.ts @@ -0,0 +1,42 @@ +export function removeLastDir(url: string) { + const arr = url.split("/"); + if (arr.pop() === "") { + arr.pop(); + } + + return arr.join("/"); +} + +// this function is taken from mozilla +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent#Examples +export function encodeRFC5987ValueChars(str: string) { + return ( + encodeURIComponent(str) + // The following creates the sequences %27 %28 %29 %2A (Note that + // the valid encoding of "*" is %2A, which necessitates calling + // toUpperCase() to properly encode). Although RFC3986 reserves "!", + // RFC5987 does not, so we do not need to escape it. + .replace( + /['()*]/g, + (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}` + ) + // The following are not required for percent-encoding per RFC5987, + // so we can allow for a little better readability over the wire: |`^ + .replace(/%(7C|60|5E)/g, (str, hex) => + String.fromCharCode(parseInt(hex, 16)) + ) + ); +} + +export function encodePath(str: string) { + return str + .split("/") + .map((v) => encodeURIComponent(v)) + .join("/"); +} + +export default { + encodeRFC5987ValueChars, + removeLastDir, + encodePath, +}; diff --git a/frontend/src/utils/vue.js b/frontend/src/utils/vue.js deleted file mode 100644 index 962a7f9d..00000000 --- a/frontend/src/utils/vue.js +++ /dev/null @@ -1,68 +0,0 @@ -import Vue from "vue"; -import Noty from "noty"; -import VueLazyload from "vue-lazyload"; -import i18n from "@/i18n"; -import { disableExternal } from "@/utils/constants"; -import AsyncComputed from "vue-async-computed"; - -Vue.use(VueLazyload); -Vue.use(AsyncComputed); - -Vue.config.productionTip = true; - -const notyDefault = { - type: "info", - layout: "bottomRight", - timeout: 1000, - progressBar: true, -}; - -Vue.prototype.$noty = (opts) => { - new Noty(Object.assign({}, notyDefault, opts)).show(); -}; - -Vue.prototype.$showSuccess = (message) => { - new Noty( - Object.assign({}, notyDefault, { - text: message, - type: "success", - }) - ).show(); -}; - -Vue.prototype.$showError = (error, displayReport = true) => { - let btns = [ - Noty.button(i18n.t("buttons.close"), "", function () { - n.close(); - }), - ]; - - if (!disableExternal && displayReport) { - btns.unshift( - Noty.button(i18n.t("buttons.reportIssue"), "", function () { - window.open( - "https://github.com/filebrowser/filebrowser/issues/new/choose" - ); - }) - ); - } - - let n = new Noty( - Object.assign({}, notyDefault, { - text: error.message || error, - type: "error", - timeout: null, - buttons: btns, - }) - ); - - n.show(); -}; - -Vue.directive("focus", { - inserted: function (el) { - el.focus(); - }, -}); - -export default Vue; diff --git a/frontend/src/views/Errors.vue b/frontend/src/views/Errors.vue index 4b9c58e8..a895ea9e 100644 --- a/frontend/src/views/Errors.vue +++ b/frontend/src/views/Errors.vue @@ -4,15 +4,24 @@

{{ info.icon }} - {{ $t(info.message) }} + {{ t(info.message) }}

- diff --git a/frontend/src/views/Files.vue b/frontend/src/views/Files.vue index 29a7afd9..2e82fc6b 100644 --- a/frontend/src/views/Files.vue +++ b/frontend/src/views/Files.vue @@ -1,9 +1,12 @@ - diff --git a/frontend/src/views/Layout.vue b/frontend/src/views/Layout.vue index c9eb4217..597a680e 100644 --- a/frontend/src/views/Layout.vue +++ b/frontend/src/views/Layout.vue @@ -1,46 +1,46 @@ - diff --git a/frontend/src/views/Login.vue b/frontend/src/views/Login.vue index 51e5d1cb..5804789a 100644 --- a/frontend/src/views/Login.vue +++ b/frontend/src/views/Login.vue @@ -11,39 +11,38 @@ type="text" autocapitalize="off" v-model="username" - :placeholder="$t('login.username')" + :placeholder="t('login.username')" />

- {{ - createMode ? $t("login.loginInstead") : $t("login.createAnAccount") - }} + {{ createMode ? t("login.loginInstead") : t("login.createAnAccount") }}

- diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue index 15c62fab..271715b2 100644 --- a/frontend/src/views/Settings.vue +++ b/frontend/src/views/Settings.vue @@ -7,27 +7,27 @@
  • - {{ $t("settings.profileSettings") }} + {{ t("settings.profileSettings") }}
  • -
  • - {{ $t("settings.shareManagement") }} + {{ t("settings.shareManagement") }}
  • -
  • - {{ $t("settings.globalSettings") }} + {{ t("settings.globalSettings") }}
  • -
  • - {{ $t("settings.userManagement") }} + {{ t("settings.userManagement") }}
@@ -41,7 +41,7 @@
- {{ $t("files.loading") }} + {{ t("files.loading") }} @@ -49,18 +49,18 @@ - diff --git a/frontend/src/views/Share.vue b/frontend/src/views/Share.vue index 0bbf6436..53f0cfb1 100644 --- a/frontend/src/views/Share.vue +++ b/frontend/src/views/Share.vue @@ -4,55 +4,56 @@ <action - v-if="selectedCount" + v-if="fileStore.selectedCount" icon="file_download" - :label="$t('buttons.download')" + :label="t('buttons.download')" @action="download" - :counter="selectedCount" + :counter="fileStore.selectedCount" /> <button v-if="isSingleFile()" class="action copy-clipboard" - :data-clipboard-text="linkSelected()" - :aria-label="$t('buttons.copyDownloadLinkToClipboard')" - :title="$t('buttons.copyDownloadLinkToClipboard')" + :aria-label="t('buttons.copyDownloadLinkToClipboard')" + :data-title="t('buttons.copyDownloadLinkToClipboard')" + @click="copyToClipboard(linkSelected())" > <i class="material-icons">content_paste</i> </button> <action icon="check_circle" - :label="$t('buttons.selectMultiple')" + :label="t('buttons.selectMultiple')" @action="toggleMultipleSelection" /> </header-bar> <breadcrumbs :base="'/share/' + hash" /> - <div v-if="loading"> - <h2 class="message delayed" style="padding-top: 3em !important;"> + <div v-if="layoutStore.loading"> + <h2 class="message delayed" style="padding-top: 3em !important"> <div class="spinner"> <div class="bounce1"></div> <div class="bounce2"></div> <div class="bounce3"></div> </div> - <span>{{ $t("files.loading") }}</span> + <span>{{ t("files.loading") }}</span> </h2> </div> <div v-else-if="error"> <div v-if="error.status === 401"> - <div class="card floating" id="password"> + <div class="card floating" id="password" style="z-index: 9999999"> <div v-if="attemptedPasswordLogin" class="share__wrong__password"> - {{ $t("login.wrongCredentials") }} + {{ t("login.wrongCredentials") }} </div> <div class="card-title"> - <h2>{{ $t("login.password") }}</h2> + <h2>{{ t("login.password") }}</h2> </div> <div class="card-content"> <input v-focus + class="input input--block" type="password" - :placeholder="$t('login.password')" + :placeholder="t('login.password')" v-model="password" @keyup.enter="fetchData" /> @@ -61,49 +62,60 @@ <button class="button button--flat" @click="fetchData" - :aria-label="$t('buttons.submit')" - :title="$t('buttons.submit')" + :aria-label="t('buttons.submit')" + :data-title="t('buttons.submit')" > - {{ $t("buttons.submit") }} + {{ t("buttons.submit") }} </button> </div> </div> + <div class="overlay" /> </div> <errors v-else :errorCode="error.status" /> </div> - <div v-else> + <div v-else-if="req !== null"> <div class="share"> - <div class="share__box share__box__info" + <div + class="share__box share__box__info" style=" position: -webkit-sticky; position: sticky; - top:-20.6em; - z-index:999;" + top: -20.6em; + z-index: 999; + " > - <div class="share__box__header" style="height:3em"> + <div class="share__box__header" style="height: 3em"> {{ req.isDir - ? $t("download.downloadFolder") - : $t("download.downloadFile") + ? t("download.downloadFolder") + : t("download.downloadFile") }} </div> - <div v-if="!this.req.isDir" class="share__box__element share__box__center share__box__icon"> + <div + v-if="!req.isDir" + class="share__box__element share__box__center share__box__icon" + > <i class="material-icons">{{ icon }}</i> </div> - <div class="share__box__element" style="height:3em"> + <div class="share__box__element" style="height: 3em"> <strong>{{ $t("prompts.displayName") }}</strong> {{ req.name }} </div> - <div v-if="!this.req.isDir" class="share__box__element" :title="modTime"> + <div v-if="!req.isDir" class="share__box__element" :title="modTime"> <strong>{{ $t("prompts.lastModified") }}:</strong> {{ humanTime }} </div> - <div class="share__box__element" style="height:3em"> + <div class="share__box__element" style="height: 3em"> <strong>{{ $t("prompts.size") }}:</strong> {{ humanSize }} </div> <div class="share__box__element share__box__center"> - <a target="_blank" :href="link" class="button button--flat" style="height:4em"> + <a + target="_blank" + :href="link" + class="button button--flat" + style="height: 4em" + > <div> <i class="material-icons">file_download</i - >{{ $t("buttons.download") }} + >{{ t("buttons.download") }} </div> </a> <a @@ -114,85 +126,123 @@ > <div> <i class="material-icons">open_in_new</i - >{{ $t("buttons.openFile") }} + >{{ t("buttons.openFile") }} </div> </a> - <qrcode-vue v-if="this.req.isDir" :value="fullLink" size="100" level="M"></qrcode-vue> + <qrcode-vue + v-if="req.isDir" + :value="link" + :size="100" + level="M" + ></qrcode-vue> </div> - <div v-if="!this.req.isDir" class="share__box__element share__box__center"> - <qrcode-vue :value="link" size="200" level="M"></qrcode-vue> + <div v-if="!req.isDir" class="share__box__element share__box__center"> + <qrcode-vue :value="link" :size="200" level="M"></qrcode-vue> </div> - <div v-if="this.req.isDir" class="share__box__element share__box__header" style="height:3em"> + <div + v-if="req.isDir" + class="share__box__element share__box__header" + style="height: 3em" + > {{ $t("sidebar.preview") }} </div> <div - v-if="this.req.isDir" - class="share__box__element share__box__center share__box__icon" - style="padding:0em !important;height:12em !important;" - > - <a + v-if="req.isDir" + class="share__box__element share__box__center share__box__icon" + style="padding: 0em !important; height: 12em !important" + > + <a target="_blank" :href="raw" class="button button--flat" - v-if= "!this.$store.state.multiple && - selectedCount === 1 && - req.items[this.selected[0]].type === 'image'" - style="height: 12em; padding:0; margin:0;" + v-if=" + !fileStore.multiple && + fileStore.selectedCount === 1 && + req.items[fileStore.selected[0]].type === 'image' + " + style="height: 12em; padding: 0; margin: 0" > - <img - style="height: 12em;" - :src="raw" - > + <img style="height: 12em" :src="raw" /> </a> <div - v-else-if= " - !this.$store.state.multiple && - selectedCount === 1 && - req.items[this.selected[0]].type === 'audio'" - style="height: 12em; paddingTop:1em; margin:0;" - > - <button @click="play" v-if="!this.tag" style="fontSize:6em !important; border:0px;outline:none; background: white;" class="material-icons">play_circle_filled</button> - <button @click="play" v-if="this.tag" style="fontSize:6em !important; border:0px;outline:none; background: white;" class="material-icons">pause_circle_filled</button> - <audio id="myaudio" - :src="raw" - controls="controls" + v-else-if=" + fileStore.multiple && + fileStore.selectedCount === 1 && + req.items[fileStore.selected[0]].type === 'audio' + " + style="height: 12em; padding-top: 1em; margin: 0" + > + <button + @click="play" + v-if="!tag" + style=" + font-size: 6em !important; + border: 0px; + outline: none; + background: white; + " + class="material-icons" + > + play_circle_filled + </button> + <button + @click="play" + v-if="tag" + style=" + font-size: 6em !important; + border: 0px; + outline: none; + background: white; + " + class="material-icons" + > + pause_circle_filled + </button> + <audio + id="myaudio" + ref="audio" + :src="raw" + controls :autoplay="tag" - > - </audio> + ></audio> </div> - <video - v-else-if= " - !this.$store.state.multiple && - selectedCount === 1 && - req.items[this.selected[0]].type === 'video'" - style="height: 12em; padding:0; margin:0;" - :src="raw" - controls="controls" - > - Sorry, your browser doesn't support embedded videos, but don't worry, - you can <a :href="raw">download it</a> - and watch it with your favorite video player! - </video> - <i - v-else-if= " - !this.$store.state.multiple && - selectedCount === 1 && - req.items[this.selected[0]].isDir" - class="material-icons">folder + <video + v-else-if=" + !fileStore.multiple && + fileStore.selectedCount === 1 && + req.items[fileStore.selected[0]].type === 'video' + " + style="height: 12em; padding: 0; margin: 0" + :src="raw" + controls + > + Sorry, your browser doesn't support embedded videos, but don't + worry, you can <a :href="raw">download it</a> + and watch it with your favorite video player! + </video> + <i + v-else-if=" + !fileStore.multiple && + fileStore.selectedCount === 1 && + req.items[fileStore.selected[0]].isDir + " + class="material-icons" + >folder </i> <i v-else class="material-icons">call_to_action</i> </div> </div> - <div id="shareList" + <div + id="shareList" v-if="req.isDir && req.items.length > 0" class="share__box share__box__items" > <div class="share__box__header" v-if="req.isDir"> - {{ $t("files.files") }} + {{ t("files.files") }} </div> <div id="listing" class="list file-icons"> <item - v-for="item in req.items.slice(0, this.showLimit)" + v-for="item in req.items.slice(0, showLimit)" :key="base64(item.name)" v-bind:index="item.index" v-bind:name="item.name" @@ -215,16 +265,16 @@ </div> <div - :class="{ active: $store.state.multiple }" + :class="{ active: fileStore.multiple }" id="multiple-selection" > - <p>{{ $t("files.multipleSelectionEnabled") }}</p> + <p>{{ t("files.multipleSelectionEnabled") }}</p> <div - @click="$store.commit('multiple', false)" + @click="() => (fileStore.multiple = false)" tabindex="0" role="button" - :title="$t('files.clear')" - :aria-label="$t('files.clear')" + :data-title="t('buttons.clear')" + :aria-label="t('buttons.clear')" class="action" > <i class="material-icons">clear</i> @@ -238,7 +288,7 @@ > <h2 class="message"> <i class="material-icons">sentiment_dissatisfied</i> - <span>{{ $t("files.lonely") }}</span> + <span>{{ t("files.lonely") }}</span> </h2> </div> </div> @@ -246,11 +296,11 @@ </div> </template> -<script> -import { mapState, mapMutations, mapGetters } from "vuex"; +<script setup lang="ts"> import { pub as api } from "@/api"; import { filesize } from "@/utils"; -import moment from "moment/min/moment-with-locales"; +import dayjs from "dayjs"; +import { Base64 } from "js-base64"; import HeaderBar from "@/components/header/HeaderBar.vue"; import Action from "@/components/header/Action.vue"; @@ -258,198 +308,223 @@ import Breadcrumbs from "@/components/Breadcrumbs.vue"; import Errors from "@/views/Errors.vue"; import QrcodeVue from "qrcode.vue"; import Item from "@/components/files/ListingItem.vue"; -import Clipboard from "clipboard"; +import { useFileStore } from "@/stores/file"; +import { useLayoutStore } from "@/stores/layout"; +import { computed, inject, onMounted, onBeforeUnmount, ref, watch } from "vue"; +import { useRoute } from "vue-router"; +import { useI18n } from "vue-i18n"; +import { StatusError } from "@/api/utils"; +import { copy } from "@/utils/clipboard"; -export default { - name: "share", - components: { - HeaderBar, - Action, - Breadcrumbs, - Item, - QrcodeVue, - Errors, - }, - data: () => ({ - error: null, - showLimit: 100, - password: "", - attemptedPasswordLogin: false, - hash: null, - token: null, - clip: null, - tag: false, - }), - watch: { - $route: function () { - this.showLimit = 100; +const error = ref<StatusError | null>(null); +const showLimit = ref<number>(100); +const password = ref<string>(""); +const attemptedPasswordLogin = ref<boolean>(false); +const hash = ref<string>(""); +const token = ref<string>(""); +const audio = ref<HTMLAudioElement>(); +const tag = ref<boolean>(false); - this.fetchData(); - }, - }, - created: async function () { - const hash = this.$route.params.pathMatch.split("/")[0]; - this.hash = hash; - await this.fetchData(); - }, - mounted() { - window.addEventListener("keydown", this.keyEvent); - this.clip = new Clipboard(".copy-clipboard"); - this.clip.on("success", () => { - this.$showSuccess(this.$t("success.linkCopied")); - }); - }, - beforeDestroy() { - window.removeEventListener("keydown", this.keyEvent); - this.clip.destroy(); - }, - computed: { - ...mapState(["req", "loading", "multiple", "selected"]), - ...mapGetters(["selectedCount"]), - icon: function () { - if (this.req.isDir) return "folder"; - if (this.req.type === "image") return "insert_photo"; - if (this.req.type === "audio") return "volume_up"; - if (this.req.type === "video") return "movie"; - return "insert_drive_file"; - }, - link: function () { - return api.getDownloadURL(this.req); - }, - raw: function () { - return this.req.items[this.selected[0]].url.replace(/share/, 'api/public/dl')+'?token='+this.token; - }, - inlineLink: function () { - return api.getDownloadURL(this.req, true); - }, - humanSize: function () { - if (this.req.isDir) { - return this.req.items.length; - } +const $showSuccess = inject<IToastSuccess>("$showSuccess")!; - return filesize(this.req.size); - }, - humanTime: function () { - return moment(this.req.modified).fromNow(); - }, - modTime: function () { - return new Date(Date.parse(this.req.modified)).toLocaleString(); - }, - }, - methods: { - ...mapMutations(["resetSelected", "updateRequest", "setLoading"]), - base64: function (name) { - return window.btoa(unescape(encodeURIComponent(name))); - }, - play() { - var audio = document.getElementById('myaudio'); - if(this.tag){ - audio.pause(); - this.tag = false; - } else { - audio.play(); - this.tag = true; - } - }, - fetchData: async function () { - // Reset view information. - this.$store.commit("setReload", false); - this.$store.commit("resetSelected"); - this.$store.commit("multiple", false); - this.$store.commit("closeHovers"); +const { t } = useI18n({}); - // Set loading to true and reset the error. - this.setLoading(true); - this.error = null; +const route = useRoute(); +const fileStore = useFileStore(); +const layoutStore = useLayoutStore(); - if (this.password !== "") { - this.attemptedPasswordLogin = true; - } +watch(route, () => { + showLimit.value = 100; + fetchData(); +}); - let url = this.$route.path; - if (url === "") url = "/"; - if (url[0] !== "/") url = "/" + url; +const req = computed(() => fileStore.req); - try { - let file = await api.fetch(url, this.password); - file.hash = this.hash; +// Define computes - this.token = file.token || ""; +const icon = computed(() => { + if (req.value === null) return "insert_drive_file"; + if (req.value.isDir) return "folder"; + if (req.value.type === "image") return "insert_photo"; + if (req.value.type === "audio") return "volume_up"; + if (req.value.type === "video") return "movie"; + return "insert_drive_file"; +}); - this.updateRequest(file); - document.title = `${file.name} - ${document.title}`; - } catch (e) { - this.error = e; - } finally { - this.setLoading(false); - } - }, - keyEvent(event) { - // Esc! - if (event.keyCode === 27) { - // If we're on a listing, unselect all - // files and folders. - if (this.selectedCount > 0) { - this.resetSelected(); - } - } - }, - toggleMultipleSelection() { - this.$store.commit("multiple", !this.multiple); - }, - isSingleFile: function () { - return ( - this.selectedCount === 1 && !this.req.items[this.selected[0]].isDir - ); - }, - download() { - if (this.isSingleFile()) { - api.download( - null, - this.hash, - this.token, - this.req.items[this.selected[0]].path - ); - return; - } +const link = computed(() => (req.value ? api.getDownloadURL(req.value) : "")); +const raw = computed(() => { + return req.value + ? req.value.items[fileStore.selected[0]].url.replace( + /share/, + "api/public/dl" + ) + + "?token=" + + token.value + : ""; +}); +const inlineLink = computed(() => + req.value ? api.getDownloadURL(req.value, true) : "" +); +const humanSize = computed(() => { + if (req.value) { + return req.value.isDir + ? req.value.items.length + : filesize(req.value.size ?? 0); + } else { + return ""; + } +}); +const humanTime = computed(() => dayjs(req.value?.modified).fromNow()); +const modTime = computed(() => + req.value + ? new Date(Date.parse(req.value.modified)).toLocaleString() + : new Date().toLocaleString() +); - this.$store.commit("showHover", { - prompt: "download", - confirm: (format) => { - this.$store.commit("closeHovers"); - - let files = []; - - for (let i of this.selected) { - files.push(this.req.items[i].path); - } - - api.download(format, this.hash, this.token, ...files); - }, - }); - }, - linkSelected: function () { - return this.isSingleFile() - ? api.getDownloadURL({ - hash: this.hash, - path: this.req.items[this.selected[0]].path, - }) - : ""; - }, - }, +// Functions +const base64 = (name: any) => Base64.encodeURI(name); +const play = () => { + if (tag.value) { + audio.value?.pause(); + tag.value = false; + } else { + audio.value?.play(); + tag.value = true; + } }; -</script> -<style scoped> - #listing.list{ - height: auto; +const fetchData = async () => { + fileStore.reload = false; + fileStore.selected = []; + fileStore.multiple = false; + layoutStore.closeHovers(); + + // Set loading to true and reset the error. + layoutStore.loading = true; + error.value = null; + if (password.value !== "") { + attemptedPasswordLogin.value = true; } - #shareList{ - overflow-y: scroll; + + let url = route.path; + if (url === "") url = "/"; + if (url[0] !== "/") url = "/" + url; + + try { + const file = await api.fetch(url, password.value); + file.hash = hash.value; + + token.value = file.token || ""; + + fileStore.updateRequest(file); + document.title = `${file.name} - ${document.title}`; + } catch (err) { + if (err instanceof Error) { + error.value = err; + } + } finally { + layoutStore.loading = false; } - @media (min-width: 930px) { - #shareList{ - height: calc(100vh - 9.8em); - overflow-y: auto; +}; + +const keyEvent = (event: KeyboardEvent) => { + if (event.key === "Escape") { + // If we're on a listing, unselect all + // files and folders. + if (fileStore.selectedCount > 0) { + fileStore.selected = []; } } -</style> \ No newline at end of file +}; + +const toggleMultipleSelection = () => { + fileStore.toggleMultiple(); +}; + +const isSingleFile = () => + fileStore.selectedCount === 1 && + !req.value?.items[fileStore.selected[0]].isDir; + +const download = () => { + if (!req.value) return false; + + if (isSingleFile()) { + api.download( + null, + hash.value, + token.value, + req.value.items[fileStore.selected[0]].path + ); + return true; + } + + layoutStore.showHover({ + prompt: "download", + confirm: (format: DownloadFormat) => { + if (req.value === null) return false; + layoutStore.closeHovers(); + + let files: string[] = []; + + for (let i of fileStore.selected) { + files.push(req.value.items[i].path); + } + + api.download(format, hash.value, token.value, ...files); + return true; + }, + }); + + return true; +}; + +const linkSelected = () => { + return isSingleFile() && req.value + ? api.getDownloadURL({ + ...req.value, + hash: hash.value, + path: req.value.items[fileStore.selected[0]].path, + }) + : ""; +}; + +const copyToClipboard = (text: string) => { + copy(text).then( + () => { + // clipboard successfully set + $showSuccess(t("success.linkCopied")); + }, + () => { + // clipboard write failed + } + ); +}; + +onMounted(async () => { + // Created + hash.value = route.params.path[0]; + window.addEventListener("keydown", keyEvent); + await fetchData(); +}); + +onBeforeUnmount(() => { + // Destroyed + window.removeEventListener("keydown", keyEvent); +}); +</script> + +<style scoped> +#listing.list { + height: auto; +} + +#shareList { + overflow-y: scroll; +} + +@media (min-width: 930px) { + #shareList { + height: calc(100vh - 9.8em); + overflow-y: auto; + } +} +</style> diff --git a/frontend/src/views/files/Editor.vue b/frontend/src/views/files/Editor.vue index f4871615..1654937e 100644 --- a/frontend/src/views/files/Editor.vue +++ b/frontend/src/views/files/Editor.vue @@ -1,156 +1,129 @@ <template> - <div - id="editor-container" - @touchmove.prevent.stop - @wheel.prevent.stop - > + <div id="editor-container" @touchmove.prevent.stop @wheel.prevent.stop> <header-bar> - <action icon="close" :label="$t('buttons.close')" @action="close()" /> - <title>{{ req.name }} + + {{ fileStore.req?.name ?? "" }} - +
- diff --git a/frontend/src/views/files/FileListing.vue b/frontend/src/views/files/FileListing.vue new file mode 100644 index 00000000..a26ac67e --- /dev/null +++ b/frontend/src/views/files/FileListing.vue @@ -0,0 +1,960 @@ +