diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 4d27f15a..ec0fdf20 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -13,50 +13,47 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 with: go-version: 1.21.1 - run: cd backend && go test -race -v ./... lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-go@v4 with: go-version: 1.21.1 - run: cd backend && go fmt ./... - -# release - release: - runs-on: ubuntu-latest + push_to_registry: needs: [lint, test] - if: startsWith(github.event.ref, 'refs/tags/v') + name: Push Docker image to Docker Hub + runs-on: ubuntu-latest + if: contains(github.ref, 'main') || startsWith(github.ref,'v0.') steps: - - uses: actions/checkout@v2 - with: - fetch-depth: 0 - - uses: actions/setup-go@v2 - with: - go-version: 1.20.1 - - uses: actions/setup-node@v2 - with: - node-version: '16' + - name: Check out the repo + uses: actions/checkout@v4 - name: Set up QEMU - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - name: Build frontend - run: make build-frontend - - name: Login to Docker Hub - uses: docker/login-action@v1 + uses: docker/setup-buildx-action@v3 + - name: Log in to Docker Hub + uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Run GoReleaser - uses: goreleaser/goreleaser-action@v2 + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 with: - version: latest - args: release --rm-dist - env: - GITHUB_TOKEN: ${{ secrets.GH_PAT }} + images: gtstef/filebrowser + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + platforms: linux/amd64,linux/arm64,linux/arm/v7 + file: ./Dockerfile + push: true + tags: ${{ contains(github.ref, 'main') && 'latest' || steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} \ No newline at end of file diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yaml similarity index 88% rename from .github/workflows/stale.yml rename to .github/workflows/stale.yaml index 60c6ae5e..c7b8f58f 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yaml @@ -16,9 +16,9 @@ jobs: stale-pr-message: 'This PR is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.' close-pr-message: 'This PR was closed because it has been stalled for 5 days with no activity.' stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.' - close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.' + close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity.' days-before-stale: 30 - days-before-close: 5 + days-before-close: 30 exempt-issue-labels: 'feature ☘,enhancement ⚙,bug 🐞' exempt-pr-labels: 'need-help,wip' operations-per-run: 100 \ No newline at end of file diff --git a/README.md b/README.md index 1b0a8af6..d872efd2 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,13 @@ -## Filebrowser +

+ License: Apache-2.0 +

+

+ +

+

Filebrowser - A modern file manager for the web

+

+ +

> **NOTE** Intended for docker use only @@ -9,23 +18,11 @@ Starting with v0.2.0, *ALL* configuration is done via `filebrowser.yaml` configu This fork makes the following significant changes to filebrowser for origin: 1. [x] Improves search to use index instead of filesystem. - - [x] Lightning fast - - [x] Realtime results as you type - - [x] Works with file type filter - - [x] better desktop search view - 1. [x] Preview enhancements - - Preview default view is constrained to files subwindow, - which can be toggled to fullscreen. - 1. [x] Improved and simplified GUI - - Moved all action buttons to file action bar except for switch-view - - Simplified navbar to 3 main actions: settings,search, and switch-view - - New search view on desktop - 1. [x] Updated version and dependencies - - [x] Uses latest npm and node version - - [x] Removes deprecated npm packages - - [x] Updates golang dependencies - - [x] Remove all unnecessary packages, replaces with generic functions. - 1. [x] **IMPORTANT** Moved all configurations to `filebrowser.yaml`. no more flags or binary operations to db + - Lightning fast, realtime results as you type + - Works with more type filters + 1. [x] Improved and simplified GUI navbar and sidebar menu. + 1. [x] Updated version and dependencies. + 1. [x] **IMPORTANT** Moved all configurations to `filebrowser.yaml`. ## About @@ -39,50 +36,43 @@ work better in terms of asthetics and performance. Improved search, simplified ui (without removing features) and more secure and up-to-date build are just a few examples. -There are a few more changes needed to get it to a stable status where it -will only recieve security updates. These changes are mentioned above. -Once this is fully complete, the only updates to th - ## Look +

+ + + + +

-This is how desktop search looks in 0.2.0 -![darkmode-capture1](https://github.com/gtsteffaniak/filebrowser/assets/42989099/35cdeb3b-ab79-4b04-8001-8f51f6ea06bb) +## Search Performance -![darkmode2](https://github.com/gtsteffaniak/filebrowser/assets/42989099/8d426356-26cf-407b-b078-bf58f198e799) - -However [mobile search](https://github.com/gtsteffaniak/filebrowser/assets/42989099/37e8f03b-4f5a-4689-aa6c-5cd858a858e9) still appears very similar to filebrowser/filebrowsers original implementation. - -[Mobile web also looks similar](https://github.com/gtsteffaniak/filebrowser/assets/42989099/b04d3c1f-154b-45ba-927c-2112926ad3a9) - -## Performance - -Search Performance - 100x faster search. However, this will be at expense of RAM. if you have < 1 million +100x faster search. However, this will be at expense of RAM. if you have < 1 million files and folders in the given scope, the RAM usage should be less than 200MB total. RAM requirements should scale based on the number of directories. Also , the approx. time to fully index will vary widely based on performance. A sufficiently performant system should fully index within the first 5 minutes, potentially within the first few seconds. -For example, a low end 11th gen i5 with SSD indexes 86K files within 1 second: +For example, a low end 11th gen i5 with SSD indexes 128K files within 1 second: ``` -2023/08/01 00:08:29 Using config file: /.filebrowser.json -2023/08/01 00:08:29 Indexing files... -2023/08/01 00:08:29 Listening on [::]:8080 -2023/08/01 00:08:30 Successfully indexed files. -2023/08/01 00:08:30 Files found : 85310 -2023/08/01 00:08:30 Directories found : 1711 -2023/08/01 00:08:30 Indexing scheduler will run every 5 minutes +2023/09/09 21:38:50 Initializing with config file: filebrowser.yaml +2023/09/09 21:38:50 Indexing files... +2023/09/09 21:38:50 Listening on [::]:8080 +2023/09/09 21:38:51 Successfully indexed files. +2023/09/09 21:38:51 Files found : 123452 +2023/09/09 21:38:51 Directories found : 1768 +2023/09/09 21:38:51 Indexing scheduler will run every 5 minutes ``` ## Install Using docker: -1. docker run: +1. docker run (no persistent db): ``` -docker run -it -v /path/to/folder:/srv -p 8080:8080 gtstef/filebrowser +docker run -it -v /path/to/folder:/srv -p 80:8080 gtstef/filebrowser ``` 1. docker-compose: @@ -94,12 +84,13 @@ version: '3.7' services: filebrowser: volumes: - - '/path/to/folder:/srv' - #- './database/:/database/' - - './config.json:/.filebrowser.json' + - '/path/to/folder:/srv' # required (for now not configurable) + - './database:/database' # optional if you want db to persist - configure a path under "database" dir in config file. + - './filebrowser.yaml:/filebrowser.yaml' # required ports: - - '8080:8080' + - '80:8080' image: gtstef/filebrowser + restart: always ``` - with network share @@ -109,25 +100,39 @@ version: '3.7' services: filebrowser: volumes: - - 'nas:/srv' - #- './database/:/database/' - #- './config.json:/.filebrowser.json' + - 'storage:/srv' # required (for now not configurable) + - './database:/database' # optional if you want db to persist - configure a path under "database" dir in config file. + - './filebrowser.yaml:/filebrowser.yaml' # required ports: - - '8080:80' + - '80:8080' image: gtstef/filebrowser + restart: always volumes: - nas: + storage: driver_opts: type: cifs - o: "username=myusername,password=mypassword,rw" - device: "//fileshare/" + o: "username=admin,password=password,rw" # enter valid info here + device: "//192.168.1.100/share/" # enter valid hinfo here + ``` ## Configuration -All configuration is now done via a single configuration file: `filebrowser.yaml`, here is an example [configuration file](./backend/filebrowser.yaml). -### background +All configuration is now done via a single configuration file: `filebrowser.yaml`, here is an example minimal [configuration file](./backend/filebrowser.yaml). + +View the [Configuration Help Page](./configuration.md) for available configuration options and other help. + +### background & help The original project filebrowser/filebrowser used multiple different ways to configure the server. This was confusing and difficult to work with from a user and from a developer's perspective. So I completely redesigned the program to use one single human-readable config file. + +I understand many coming from the original fork may notice differences which make using this improved version more difficult. If you notice issues that you believe should be fixed, please open an issue here and it will very likely be addressed with a PR within a few weeks. + +This version of filebrowser is going through a configuration overhaul as mentioned above. Certain features related to rules and commands may not work as they do on the original filebrowser. The purpose of this is to create a more consistent experience where configuration is done via files rather than running commands, so that it's very clear what the current state of the configuration is. When running commands its not clear what the configuration is. + +## Roadmap + +see [Roadmap Page](./roadmap.md) + diff --git a/backend/benchmark_results.txt b/backend/benchmark_results.txt index 655b1f9c..962ad6ff 100644 --- a/backend/benchmark_results.txt +++ b/backend/benchmark_results.txt @@ -5,38 +5,38 @@ ? github.com/gtsteffaniak/filebrowser/auth [no test files] ? github.com/gtsteffaniak/filebrowser/cmd [no test files] PASS -ok github.com/gtsteffaniak/filebrowser/diskcache 0.004s +ok github.com/gtsteffaniak/filebrowser/diskcache 0.003s ? github.com/gtsteffaniak/filebrowser/errors [no test files] ? github.com/gtsteffaniak/filebrowser/files [no test files] PASS -ok github.com/gtsteffaniak/filebrowser/fileutils 0.004s -2023/09/02 19:15:20 h: 401 -2023/09/02 19:15:20 h: 401 -2023/09/02 19:15:20 h: 401 -2023/09/02 19:15:20 h: 401 -2023/09/02 19:15:20 h: 401 -2023/09/02 19:15:20 h: 401 +ok github.com/gtsteffaniak/filebrowser/fileutils 0.003s +2023/09/10 09:17:55 h: 401 +2023/09/10 09:17:55 h: 401 +2023/09/10 09:17:55 h: 401 +2023/09/10 09:17:56 h: 401 +2023/09/10 09:17:56 h: 401 +2023/09/10 09:17:56 h: 401 PASS -ok github.com/gtsteffaniak/filebrowser/http 0.094s +ok github.com/gtsteffaniak/filebrowser/http 0.082s PASS -ok github.com/gtsteffaniak/filebrowser/img 0.122s +ok github.com/gtsteffaniak/filebrowser/img 0.118s PASS ok github.com/gtsteffaniak/filebrowser/rules 0.002s PASS -ok github.com/gtsteffaniak/filebrowser/runner 0.004s +ok github.com/gtsteffaniak/filebrowser/runner 0.003s goos: linux goarch: amd64 pkg: github.com/gtsteffaniak/filebrowser/search cpu: 11th Gen Intel(R) Core(TM) i5-11320H @ 3.20GHz -BenchmarkSearchAllIndexes-8 10 5176084 ns/op 2743632 B/op 42785 allocs/op -BenchmarkFillIndex-8 10 3263308 ns/op 18485 B/op 453 allocs/op +BenchmarkSearchAllIndexes-8 10 5311144 ns/op 2934075 B/op 44569 allocs/op +BenchmarkFillIndex-8 10 3142607 ns/op 18473 B/op 452 allocs/op PASS -ok github.com/gtsteffaniak/filebrowser/search 0.109s +ok github.com/gtsteffaniak/filebrowser/search 0.110s PASS -ok github.com/gtsteffaniak/filebrowser/settings 0.004s +ok github.com/gtsteffaniak/filebrowser/settings 0.005s ? github.com/gtsteffaniak/filebrowser/share [no test files] ? github.com/gtsteffaniak/filebrowser/storage [no test files] ? github.com/gtsteffaniak/filebrowser/storage/bolt [no test files] PASS -ok github.com/gtsteffaniak/filebrowser/users 0.004s +ok github.com/gtsteffaniak/filebrowser/users 0.003s ? github.com/gtsteffaniak/filebrowser/version [no test files] diff --git a/backend/http/static.go b/backend/http/static.go index b0e1685e..aef7bd0d 100644 --- a/backend/http/static.go +++ b/backend/http/static.go @@ -139,7 +139,7 @@ func getStaticHandlers(store *storage.Storage, server *settings.Server, assetsFs } w.Header().Set("Content-Encoding", "gzip") - w.Header().Set("Content-Type", "application/javascript; charset=utf-8") + w.Header().Set("Content-Type", "application/javascript; charset=utf-8") // Set the correct MIME type for JavaScript files if _, err := w.Write(fileContents); err != nil { return http.StatusInternalServerError, err diff --git a/configuration.md b/configuration.md new file mode 100644 index 00000000..dc5b5762 --- /dev/null +++ b/configuration.md @@ -0,0 +1,216 @@ +# Configuration Help + +This document covers the available configuration options, their defaults, and how they affect the functionality of filebrowser. + +## All possible configurations + +Here is an expanded config file which includes all possible configurations: + +``` +server: + indexingInterval: 5 + numImageProcessors: 4 + socket: "" + tlsKey: "" + tlsCert: "" + enableThumbnails: false + resizePreview: true + typeDetectionByHeader: true + port: 8080 + baseURL: "/" + address: "" + log: "stdout" + database: "/database/database.db" + root: "/srv" +auth: + recaptcha: + host: "" + key: "" + secret: "" + header: "" + method: json + command: "" + signup: false + shell: "" +frontend: + name: "" + disableExternal: false + disableUsedPercentage: true + files: "" + theme: "" + color: "" +userDefaults: + scope: "" + locale: "" + viewMode: "" + singleClick: true + sorting: + by: "" + asc: true + permissions: + admin: true + execute: true + create: true + rename: true + modify: true + delete: true + share: true + download: true + commands: [] + hideDotfiles: false + dateFormat: false +``` + +Here are the defaults if nothing is set: + +``` +Signup: true +AdminUsername: admin +AdminPassword: admin +Server: + EnableThumbnails: true + EnableExec: false + IndexingInterval: 5 + Port: 8080 + NumImageProcessors: 4 + BaseURL: "" + Database: database.db + Log: stdout + Root: /srv +Auth: + Method: password + Recaptcha: + Host: "" +UserDefaults: + Scope: "." + LockPassword: false + HideDotfiles: true + Permissions: + Create: true + Rename: true + Modify: true + Delete: true + Share: true + Download: true +``` + +## About each configuration + +# Configuration Settings Documentation + +## About each configuration + +- `Signup`: This boolean value indicates whether user signup is enabled. + +- `AdminUsername`: This is the username of the admin user. + +- `AdminPassword`: This is the password of the admin user. + +### Server configuration settings + +- `indexingInterval`: This is the time in minutes the system waits before checking for filesystem changes (used in search only). + +- `numImageProcessors`: This is the number of image processors available. + +- `socket`: This is the socket configuration. + +- `tlsKey`: This is the TLS key configuration. + +- `tlsCert`: This is the TLS certificate configuration. + +- `enableThumbnails`: This boolean value determines whether thumbnails are enabled. + +- `resizePreview`: This boolean value determines whether preview resizing is enabled. + +- `typeDetectionByHeader`: This boolean value determines whether type detection is based on headers. + +- `port`: This is the port number on which the server is running. + +- `baseURL`: This is the base URL for the server. + +- `address`: This is the server address configuration. + +- `log`: This specifies the log destination (e.g., "stdout" for standard output). + +- `database`: This is the database file path + filename that will be created if it does not already exist. If it exists, it will use the existing file. + +- `root`: This is the root directory path. + +### Auth configuration settings + +- `recaptcha`: + + - `host`: This is the host for reCAPTCHA. + + - `key`: This is the reCAPTCHA key. + + - `secret`: This is the reCAPTCHA secret. + +- `header`: This is the authentication header. + +- `method`: This is the authentication method used (e.g., "json"). Possible values: + - password - username and password + - hook - hook authentication + - proxy - proxy authentication + - oath - oath authentication + +- `command`: This is the authentication command. + +- `signup`: This boolean value indicates whether user signup is enabled. + +- `shell`: This is the shell configuration. + +### Frontend configuration settings + +- `name`: This is the name of the frontend. + +- `disableExternal`: This boolean value determines whether external access is disabled. + +- `disableUsedPercentage`: This boolean value determines whether used percentage is disabled. + +- `files`: This is the files configuration. + +- `theme`: This is the theme configuration. + +- `color`: This is the color configuration. + +### UserDefaults configuration settings + +- `scope`: This is a scope of the permissions, "." or "./" means all directories, "./downloads" would mean only the downloads folder. + +- `locale`: This is the locale configuration. + +- `viewMode`: This is the view mode configuration. + +- `singleClick`: This boolean value determines whether single-click is enabled. + +- `sorting`: + + - `by`: This is the sorting method used (e.g., "asc"). + + - `asc`: This boolean value determines the sorting order. + +- `permissions`: + + - `admin`: This boolean value determines whether admin permissions are granted. + + - `execute`: This boolean value determines whether execute permissions are granted. + + - `create`: This boolean value determines whether create permissions are granted. + + - `rename`: This boolean value determines whether rename permissions are granted. + + - `modify`: This boolean value determines whether modify permissions are granted. + + - `delete`: This boolean value determines whether delete permissions are granted. + + - `share`: This boolean value determines whether share permissions are granted. + + - `download`: This boolean value determines whether download permissions are granted. + +- `commands`: This is a list of commands. + +- `hideDotfiles`: This boolean value determines whether dotfiles are hidden. + +- `dateFormat`: This boolean value determines whether date formatting is enabled. + diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e5deadfb..d54ba7b2 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,7 +8,7 @@ "name": "filebrowser-frontend", "version": "2.0.0", "dependencies": { - "ace-builds": "^1.4.7", + "ace-builds": "^1.24.2", "clipboard": "^2.0.4", "css-vars-ponyfill": "^2.4.3", "file-loader": "^6.2.0", @@ -53,12 +53,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -137,13 +137,13 @@ } }, "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.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -153,27 +153,27 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "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.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", @@ -247,9 +247,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -387,9 +387,9 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "version": "1.0.0-next.23", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", + "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, "node_modules/@sideway/address": { @@ -466,18 +466,18 @@ } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", + "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -520,9 +520,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "version": "4.17.36", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz", + "integrity": "sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q==", "dev": true, "dependencies": { "@types/node": "*", @@ -570,9 +570,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.5.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.0.tgz", - "integrity": "sha512-Mgq7eCtoTjT89FqNoTzzXg2XvCi5VMhRV6+I2aYanc6kQCBImeNaAYRs/DyoVqk1YEUJK5gN9VO7HRIdz4Wo3Q==" + "version": "20.6.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.6.0.tgz", + "integrity": "sha512-najjVq5KN2vsH2U/xyh2opaSEz6cZMR2SetLIlxlj08nOcmPOemJmUK2o4kUzfLqfrWE0PIrNeE16XhYDd3nqg==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -587,9 +587,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", "dev": true }, "node_modules/@types/range-parser": { @@ -923,9 +923,9 @@ }, "node_modules/@vue/vue-loader-v15": { "name": "vue-loader", - "version": "15.10.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.1.tgz", - "integrity": "sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==", + "version": "15.10.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.2.tgz", + "integrity": "sha512-ndeSe/8KQc/nlA7TJ+OBhv2qalmj1s+uBs7yHDRFaAXscFTApBzY9F1jES3bautmgWjDlDct0fw8rPuySDLwxw==", "dev": true, "dependencies": { "@vue/component-compiler-utils": "^3.1.0", @@ -942,6 +942,9 @@ "cache-loader": { "optional": true }, + "prettier": { + "optional": true + }, "vue-template-compiler": { "optional": true } @@ -1114,9 +1117,9 @@ } }, "node_modules/ace-builds": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.24.1.tgz", - "integrity": "sha512-TLcxMxiTRX5Eq9bBVSd/bTJlanCBULiv/IULLohJDDaCAfcpZKJBVSd4OWfN/j2c2jCLc+jhpNWGELiJZw3wPw==" + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.24.2.tgz", + "integrity": "sha512-zjvJiEw05BADxPMq5gN/Vgc9FgyiiDHpdy676Af1nJk8DF4ipgf0cNmV3wy8JHeQ6vezypEZV6pHQu9avO+WtQ==" }, "node_modules/acorn": { "version": "8.10.0", @@ -1621,9 +1624,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001521", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001521.tgz", - "integrity": "sha512-fnx1grfpEOvDGH+V17eccmNjucGUnCbP6KL+l5KqBIerp26WK/+RQ7CIDE37KGJjaPyqWXXlFUyKiWmvdNNKmQ==", + "version": "1.0.30001532", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001532.tgz", + "integrity": "sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==", "funding": [ { "type": "opencollective", @@ -1839,6 +1842,18 @@ "node": ">=6" } }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2629,9 +2644,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -2751,9 +2766,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.495", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.495.tgz", - "integrity": "sha512-mwknuemBZnoOCths4GtpU/SDuVMp3uQHKa2UNJT9/aVD6WVRjGpXOxRGX7lm6ILIenTdGXPSTCTDaWos5tEU8Q==" + "version": "1.4.513", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.513.tgz", + "integrity": "sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -3253,16 +3268,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.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fresh": { @@ -3302,9 +3317,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3932,13 +3947,10 @@ } }, "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, "engines": { "node": ">=0.10.0" } @@ -4031,9 +4043,9 @@ } }, "node_modules/joi": { - "version": "17.9.2", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz", - "integrity": "sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==", + "version": "17.10.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.10.1.tgz", + "integrity": "sha512-vIiDxQKmRidUVp8KngT8MZSOcmRVm2zV7jbMjNYWuHcJWI0bUck3nRTGQjhpPlQenIQIBC5Vp9AhcnHbWQqafw==", "dev": true, "dependencies": { "@hapi/hoek": "^9.0.0", @@ -4201,12 +4213,36 @@ "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", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, "node_modules/lodash.defaultsdeep": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz", "integrity": "sha512-3j8wdDzYuWO3lM3Reg03MuQR957t287Rpcxp1njpEa8oDrikb+FwGdW3n+FELh/A6qib6yPit0j/pv9G/yeAqA==", "dev": true }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", + "dev": true + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true + }, + "node_modules/lodash.invokemap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", + "integrity": "sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==", + "dev": true + }, "node_modules/lodash.mapvalues": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", @@ -4219,6 +4255,12 @@ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", "dev": true }, + "node_modules/lodash.pullall": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz", + "integrity": "sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==", + "dev": true + }, "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -4230,6 +4272,12 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "dev": true }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -4397,9 +4445,9 @@ } }, "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.11", + "resolved": "https://registry.npmjs.org/material-icons/-/material-icons-1.13.11.tgz", + "integrity": "sha512-kp2oAdaqo/Zp6hpTZW01rOgDPWmxBUszSdDzkRm1idCjjNvdUMnqu8qu58cll6CObo+o0cydOiPLdoSugLm+mQ==" }, "node_modules/mdn-data": { "version": "2.0.14", @@ -4696,9 +4744,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.12", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", - "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -5181,9 +5229,9 @@ } }, "node_modules/postcss": { - "version": "8.4.28", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", - "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", "funding": [ { "type": "opencollective", @@ -6497,14 +6545,14 @@ "dev": true }, "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", "dev": true, "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", - "totalist": "^1.0.0" + "totalist": "^3.0.0" }, "engines": { "node": ">= 10" @@ -6783,9 +6831,9 @@ } }, "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.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -7034,9 +7082,9 @@ } }, "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, "engines": { "node": ">=6" @@ -7049,9 +7097,9 @@ "dev": true }, "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/type-fest": { @@ -7401,20 +7449,27 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz", - "integrity": "sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz", + "integrity": "sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", "commander": "^7.2.0", + "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", - "lodash": "^4.17.20", + "is-plain-object": "^5.0.0", + "lodash.debounce": "^4.0.8", + "lodash.escape": "^4.0.1", + "lodash.flatten": "^4.4.0", + "lodash.invokemap": "^4.6.0", + "lodash.pullall": "^4.2.0", + "lodash.uniqby": "^4.7.0", "opener": "^1.5.2", - "sirv": "^1.0.7", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", "ws": "^7.3.1" }, "bin": { @@ -7424,22 +7479,6 @@ "node": ">= 10.13.0" } }, - "node_modules/webpack-bundle-analyzer/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/webpack-bundle-analyzer/node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -7449,6 +7488,18 @@ "node": ">= 10" } }, + "node_modules/webpack-bundle-analyzer/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/webpack-chain": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/webpack-chain/-/webpack-chain-6.5.1.tgz", @@ -7545,9 +7596,9 @@ } }, "node_modules/webpack-dev-server/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.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", "dev": true, "engines": { "node": ">=10.0.0" @@ -7661,9 +7712,9 @@ } }, "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==" + "version": "3.6.18", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.18.tgz", + "integrity": "sha512-ltN7j66EneWn5TFDO4L9inYC1D+Czsxlrw2SalgjMmEMkLfA5SIZxEFdE6QtHFiiM6Q7WL32c7AkI3w6yxM84Q==" }, "node_modules/whatwg-url": { "version": "5.0.0", diff --git a/frontend/package.json b/frontend/package.json index 1c37e8fb..87f6487c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,16 +12,16 @@ "format": "prettier --write ." }, "dependencies": { - "ace-builds": "^1.4.7", + "ace-builds": "^1.24.2", "clipboard": "^2.0.4", - "normalize.css": "^8.0.1", - "file-loader": "^6.2.0", "css-vars-ponyfill": "^2.4.3", + "file-loader": "^6.2.0", "js-base64": "^2.5.1", "lodash.clonedeep": "^4.5.0", "lodash.throttle": "^4.1.1", "material-icons": "^1.10.5", "moment": "^2.29.4", + "normalize.css": "^8.0.1", "noty": "^3.2.0-beta", "pretty-bytes": "^6.0.0", "qrcode.vue": "^1.7.0", diff --git a/frontend/public/img/icons/android-chrome-192x192.png b/frontend/public/img/icons/android-chrome-192x192.png new file mode 120000 index 00000000..f2ee31b9 --- /dev/null +++ b/frontend/public/img/icons/android-chrome-192x192.png @@ -0,0 +1 @@ +favicon-256x256.png \ No newline at end of file diff --git a/frontend/public/img/icons/android-chrome-256x256.png b/frontend/public/img/icons/android-chrome-256x256.png new file mode 120000 index 00000000..f2ee31b9 --- /dev/null +++ b/frontend/public/img/icons/android-chrome-256x256.png @@ -0,0 +1 @@ +favicon-256x256.png \ No newline at end of file diff --git a/frontend/public/img/icons/favicon-16x16.png b/frontend/public/img/icons/favicon-16x16.png new file mode 120000 index 00000000..f2ee31b9 --- /dev/null +++ b/frontend/public/img/icons/favicon-16x16.png @@ -0,0 +1 @@ +favicon-256x256.png \ No newline at end of file diff --git a/frontend/public/img/icons/favicon-256x256.png b/frontend/public/img/icons/favicon-256x256.png new file mode 100644 index 00000000..50b30a60 Binary files /dev/null and b/frontend/public/img/icons/favicon-256x256.png differ diff --git a/frontend/public/img/icons/favicon-32x32.png b/frontend/public/img/icons/favicon-32x32.png deleted file mode 100644 index bb33be2b..00000000 Binary files a/frontend/public/img/icons/favicon-32x32.png and /dev/null differ diff --git a/frontend/public/img/icons/favicon.ico b/frontend/public/img/icons/favicon.ico index d78d8bdb..7f7a9eca 100644 Binary files a/frontend/public/img/icons/favicon.ico and b/frontend/public/img/icons/favicon.ico differ diff --git a/frontend/public/img/icons/mstile-150x150.png b/frontend/public/img/icons/mstile-150x150.png deleted file mode 100644 index bb33be2b..00000000 Binary files a/frontend/public/img/icons/mstile-150x150.png and /dev/null differ diff --git a/frontend/public/img/icons/mstile-256x256.png b/frontend/public/img/icons/mstile-256x256.png new file mode 120000 index 00000000..f2ee31b9 --- /dev/null +++ b/frontend/public/img/icons/mstile-256x256.png @@ -0,0 +1 @@ +favicon-256x256.png \ No newline at end of file diff --git a/frontend/public/index.html b/frontend/public/index.html index d6986bf1..00bd9650 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -11,8 +11,7 @@ [{[ if .Name -]}][{[ .Name ]}][{[ else ]}]File Browser[{[ end ]}] - - + @@ -38,12 +37,7 @@ "short_name": window.FileBrowser.Name || 'File Browser', "icons": [ { - "src": fullStaticURL + "/img/icons/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": fullStaticURL + "/img/icons/android-chrome-512x512.png", + "src": fullStaticURL + "/img/icons/android-chrome-256x256.png", "sizes": "512x512", "type": "image/png" } diff --git a/frontend/src/views/bars/EditorBar.vue b/frontend/src/views/bars/EditorBar.vue index 8977c1f3..96b3d5a0 100644 --- a/frontend/src/views/bars/EditorBar.vue +++ b/frontend/src/views/bars/EditorBar.vue @@ -25,14 +25,9 @@ + \ No newline at end of file diff --git a/frontend/vue.config.js b/frontend/vue.config.js index 6f0be70c..4f6ecd6b 100644 --- a/frontend/vue.config.js +++ b/frontend/vue.config.js @@ -5,11 +5,17 @@ module.exports = { publicPath: "[{[ .StaticURL ]}]", parallel: true, configureWebpack: { + resolve: { + alias: { + // Add Ace Editor alias for importing it in your Vue components + ace: "ace-builds/src-min-noconflict", + }, + extensions: ["*", ".js", ".vue", ".json"], + }, plugins: [ new CompressionPlugin({ include: /\.js$/, deleteOriginalAssets: true, - threshold: 10240, // Only compress files larger than 10KB minRatio: 0.8, }), ], diff --git a/roadmap.md b/roadmap.md new file mode 100644 index 00000000..cf358b07 --- /dev/null +++ b/roadmap.md @@ -0,0 +1,29 @@ +# Planned Roadmap + +Next release (0.2.1): + + - Improve browsing directory performance by utilizing the index. + - Add editor themes back that were removed because of issues. + - Add "running config" which is editable in filebrowser settings to add rules, users, settings which would normally be done via commands. + - baseurl issue https://github.com/filebrowser/filebrowser/pull/2579 + - https://github.com/filebrowser/filebrowser/issues/2526 + - https://github.com/filebrowser/filebrowser/issues/2698 + - https://github.com/filebrowser/filebrowser/pull/2667 + - https://github.com/filebrowser/filebrowser/issues/2632 + - https://github.com/filebrowser/filebrowser/issues/2619 + - https://github.com/filebrowser/filebrowser/issues/2618 + - https://github.com/filebrowser/filebrowser/issues/2607 + + +Future releases (within 6 months): + + - Allow multiple volumes to show up in the same filebrowser container. https://github.com/filebrowser/filebrowser/issues/2514 + - enable/disable indexing for certain mounts + - Add tools to sidebar + - duplicate file detector. + - bulk rename https://github.com/filebrowser/filebrowser/issues/2473 + - Add Job status to the sidebar - indexin status. + - Use vite instead of webpack + - upgrade to vue3 + - support minio/s3 https://github.com/filebrowser/filebrowser/issues/2544 + - https://github.com/filebrowser/filebrowser/issues/2537