diff --git a/.env b/.env
index dc071310..d18c9322 100644
--- a/.env
+++ b/.env
@@ -7,12 +7,19 @@
# The port to expose the running application on
# PORT=4000
+# If you've proved SSL certs, then can set HTTPS port
+# SSL_PORT=4001
+
# The host that Dashy is running on, domain or IP
# HOST=localhost
# The default base path for serving up static assets
# BASE_URL=./
+# Optionally, specify the path of SSL private + public keys
+# SSL_PRIV_KEY_PATH=/etc/ssl/certs/dashy-priv.key
+# SSL_PUB_KEY_PATH=/etc/ssl/certs/dashy-pub.pem
+
# Usually the same as BASE_URL, but accessible in frontend
# VUE_APP_DOMAIN=https://dashy.to
@@ -23,4 +30,4 @@
# IS_DOCKER=true
# Again, set automatically using package.json during build time
-# VUE_APP_VERSION=1.7.0
+# VUE_APP_VERSION=2.0.0
diff --git a/.github/.lycheeexclude b/.github/.lycheeexclude
new file mode 100644
index 00000000..58461b09
--- /dev/null
+++ b/.github/.lycheeexclude
@@ -0,0 +1,14 @@
+# Ignore list, for automated broken link checking
+
+https://fonts.gstatic.com/**
+https://metager.org/meta/**
+https://developers.cloudflare.com/**
+
+http://localhost**
+https://localhost**
+http://192.168**
+https://192.168**
+file:///github/**
+http://[dashy-location]**
+https://[dashy-location]**
+**.local/**
\ No newline at end of file
diff --git a/.github/AUTHORS.txt b/.github/AUTHORS.txt
new file mode 100644
index 00000000..3868cc24
--- /dev/null
+++ b/.github/AUTHORS.txt
@@ -0,0 +1,33 @@
+Alicia - 1 commits
+Begin - 1 commits
+David - 1 commits
+DeepSource - 1 commits
+Devin - 1 commits
+FormatToday <616099456@qq.com> - 1 commits
+Iaroslav - 1 commits
+Rune - 1 commits
+Ryan - 1 commits
+Shreya - 1 commits
+deepsource-io[bot] - 1 commits
+jnach <33467747+jnach@users.noreply.github.com> - 1 commits
+Brendan <'Lear> - 2 commits
+Dan - 2 commits
+liss-bot <87835202+liss-bot@users.noreply.github.com> - 2 commits
+ᗪєνιη <υн> - 2 commits
+Niklas - 4 commits
+UrekD - 5 commits
+Erik - 6 commits
+liss-bot - 6 commits
+repo-visualizer - 14 commits
+snyk-bot - 15 commits
+Alicia - 16 commits
+github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> - 16 commits
+snyk-bot - 18 commits
+EVOTk <45015615+EVOTk@users.noreply.github.com> - 22 commits
+Alicia - 24 commits
+Alicia - 25 commits
+liss-bot - 35 commits
+Lissy93 - 78 commits
+Lissy93 - 201 commits
+Alicia - 283 commits
+Alicia - 1168 commits
\ No newline at end of file
diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md
index 5aaf2eee..e3b95055 100644
--- a/.github/CHANGELOG.md
+++ b/.github/CHANGELOG.md
@@ -1,7 +1,64 @@
# Changelog
-## ✨ 1.8.3 - Adds Login option to Remember Me for a Long Time [PR #237](https://github.com/Lissy93/dashy/pull/237)
-- Adds option to Remember Me dropdown, for a Long Time
+## ⚡️ 1.9.2 - Native SSL Support + Performance Improvements [PR #326](https://github.com/Lissy93/dashy/pull/326)
+- Updates the server to use Express, removing serve-static, connect and body-parser
+- Adds native support for passing in self-signed SSL certificates and updates docs
+- Updates router to lazy-load additional pages (minimal, workspace, etc)
+- Changes default favicon API to allesedv, since faviconkit is down, and adds basic fallback
+- Updates GH action build scripts to fallback on context token when running on fork
+
+## 💄 1.9.1 - Editor and Theming Fixes and Improvements [PR #319](https://github.com/Lissy93/dashy/pull/319)
+- Bug fixes for interactive editor: #310, #311, #312
+- Adds option to modify text font through the UI
+- Adds two new themes: One Dark and Adventure
+- Theming stylesheet refactor, better inheritance
+
+## 🐳 1.9.0 - Alpha of Dashy-Lite Docker Container [PR #306](https://github.com/Lissy93/dashy/pull/306)
+- Create an Alpine-based container, that serves the built app up with plain NGINX, instead of Node.
+- This is much lighter, but doesn't currently support any of the server-side actions (like status-checks, and writing changes to disk)
+
+## ✨ 1.8.9 - All New Interactive Config Editor [PR #298](https://github.com/Lissy93/dashy/pull/298)
+- Builds a new UI-based config editor
+- Support for sections, items, app config and page info
+- Live preview, and undoing of local changes
+- Export config or write changes to disk through UI
+
+## ✨ 1.8.8 - Improved Item Targets [PR #292](https://github.com/Lissy93/dashy/pull/292)
+- Adds support for `_top` and `_parent` anchor targets on items, Re: #289
+- Adds `appConfig.defaultOpeningMethod` option to specify default target
+- Adds new icons to show items opening method on hover
+- Refactors target checking, updates item target docs and schema
+
+## ⚡️ 1.8.7 - Bug Fixes and Improvements [PR #273](https://github.com/Lissy93/dashy/pull/273)
+- Clean URLs without the hash, now using history-mode routing
+- New initial main example conf.yml
+- Minor UI style updates and fixes
+- Support for single section view
+- A new theme, soft-glow
+- Container security in management docs, and other things
+- Bug fixes, including missing Firefox favicon and fix custom icon paths with base_url
+
+## ⚡️ 1.8.6 - Implementation of VueX [PR: #271](https://github.com/Lissy93/dashy/pull/271)
+- New state management pattern, which should lead to a more organized code base long term, and will also make building out the new UI editor significantly easier to do in a clean and reliable way
+
+## 💄 1.8.5 - Lots of Requested UI Improvements [PR #261](https://github.com/Lissy93/dashy/pull/261)
+- Adds an option for landing URL in workspace, Re: #255
+- Switches to a new API for generative icons, Re: #163
+- Adds new tab functionality to Workspace, Re: #254
+- Remove CSS validation in style editor, Re: #259
+- Cap item description at 2 lines, Re: #250
+- Adds native support for common homelab icons, using dashboard-icons
+- Improves general responsiveness of home page sections positioning
+- Updates, fixes and adds a bunch of actions for easier repo management
+
+## ✨ 1.8.4 - Custom Error Pages [PR #257](https://github.com/Lissy93/dashy/pull/257)
+- Creates a 404 Not Found page
+- Routes any missing views to the 404 page
+
+## ⚡️ 1.8.3 - Improved UX for Initial Load [PR #238](https://github.com/Lissy93/dashy/pull/238)
+- Removes the old splash screen
+- Adds placeholder in the HTML index, which will usually be visible on initial load
+- Show progress bar on route switcher
## ✨ 1.8.2 - Serverless Functions for Netlify Instances [PR #235](https://github.com/Lissy93/dashy/pull/235)
- Previously when Dashy was deployed as a static site to Netlify, it was not possible to use several features, which required server-side code
diff --git a/.github/ISSUE_REPORT.md b/.github/ISSUE_REPORT.md
deleted file mode 100644
index 67fa3dd7..00000000
--- a/.github/ISSUE_REPORT.md
+++ /dev/null
@@ -1,38 +0,0 @@
-### Dashy Historical Issue Report
-### Summary
-| Section Title | Labels | Threshold | Count | Status |
-| -- | -- | -- | -- | -- |
-| [Feature Requests](#-Feature-Requests-query) | `🦄 Feature Request` | 100 | 2 | 💚🥳 |
-| [Bugs](#-Bugs-query) | `🐛 Bug` | 100 | 2 | 💚🥳 |
-| [Questions & Feedback](#-Questions-&-Feedback-query) | `🤷♂️ Question`, `🌈 Feedback` | 100 | 0 | 💚🥳 |
-## Details
-### 💚🥳 Feature Requests [(query)](https://github.com/Lissy93/dashy/issues?q=is%3Aissue+is%3Aopen+label%3A%22%F0%9F%A6%84%20Feature%20Request%22)
-Total: 2
-
-Threshold: 100
-
-Labels: `🦄 Feature Request`
-
-| Owner | Count |
-| -- | -- |
-| [**Unassigned**](https://github.com/Lissy93/dashy/issues?q=is%3Aissue+is%3Aopen+label%3A%22%F0%9F%A6%84%20Feature%20Request%22+no%3Aassignee) | 1 |
-| [Lissy93](https://github.com/Lissy93/dashy/issues?q=is%3Aissue+is%3Aopen+label%3A%22%F0%9F%A6%84%20Feature%20Request%22+assignee%3ALissy93) | 1 |
-### 💚🥳 Bugs [(query)](https://github.com/Lissy93/dashy/issues?q=is%3Aissue+is%3Aopen+label%3A%22%F0%9F%90%9B%20Bug%22)
-Total: 2
-
-Threshold: 100
-
-Labels: `🐛 Bug`
-
-| Owner | Count |
-| -- | -- |
-| [Lissy93](https://github.com/Lissy93/dashy/issues?q=is%3Aissue+is%3Aopen+label%3A%22%F0%9F%90%9B%20Bug%22+assignee%3ALissy93) | 2 |
-### 💚🥳 Questions & Feedback [(query)](https://github.com/Lissy93/dashy/issues?q=is%3Aissue+is%3Aopen+label%3A%22%F0%9F%A4%B7%E2%80%8D%E2%99%82%EF%B8%8F%20Question%22+label%3A%22%F0%9F%8C%88%20Feedback%22)
-Total: 0
-
-Threshold: 100
-
-Labels: `🤷♂️ Question`, `🌈 Feedback`
-
-| Owner | Count |
-| -- | -- |
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md
deleted file mode 100644
index c0b757f3..00000000
--- a/.github/ISSUE_TEMPLATE/question.md
+++ /dev/null
@@ -1,11 +0,0 @@
----
-name: "Question \U0001F937♀️"
-about: Got a question about Dashy, deployment, development or usage?
-title: "[QUESTION]"
-labels: "\U0001F937♂️ Question"
-assignees: Lissy93
-
----
-
-All questions are welcome :)
-In the meantime, you might find the answer to your questions in the (recently written) [docs](https://github.com/Lissy93/dashy/tree/master/docs)
diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml
new file mode 100644
index 00000000..0346fb30
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/question.yml
@@ -0,0 +1,62 @@
+name: Question 🤷♂️
+description: Got a question about Dashy, deployment, development or usage?
+title: '[QUESTION] '
+labels: ['🤷♂️ Question']
+
+body:
+ # Filed 1 - Intro Text
+ - type: markdown
+ attributes:
+ value: >
+ Thanks for using Dashy! Questions are welcome, but in the future will be moving over to
+ [Discussions](https://github.com/Lissy93/dashy/discussions) page.
+ Quick questions should be asked [here](https://github.com/Lissy93/dashy/discussions/148) instead.
+ validations:
+ required: false
+
+ # Field 2 - The actual question
+ - type: textarea
+ id: question
+ attributes:
+ label: Question
+ description: Outline your question in a clear and concise manner
+ validations:
+ required: true
+
+ # Field 3 - Category
+ - type: dropdown
+ id: category
+ attributes:
+ label: Category
+ description: What part of the application does this relate to?
+ options:
+ - Setup and Deployment
+ - Configuration
+ - App Usage
+ - Development
+ - Documentation
+ - Alternate Views
+ - Authentication
+ - Using Icons
+ - Language Support
+ - Search & Shortcuts
+ - Status Checking
+ - Theming & Layout
+ validations:
+ required: true
+
+ # Field 4 - User has RTFM first, and agrees to code of conduct, etc
+ - type: checkboxes
+ id: idiot-check
+ attributes:
+ label: Please tick the boxes
+ description: Before submitting, please ensure that
+ options:
+ - label: You are using a [supported](https://github.com/Lissy93/dashy/blob/master/.github/SECURITY.md#supported-versions) version of Dashy (check the first two digits of the version number)
+ required: true
+ - label: You've checked that this [question hasn't already been raised](https://github.com/Lissy93/dashy/issues?q=is%3Aissue)
+ required: true
+ - label: You've checked the [docs](https://github.com/Lissy93/dashy/tree/master/docs#readme) and [troubleshooting](https://github.com/Lissy93/dashy/blob/master/docs/troubleshooting.md#troubleshooting) guide
+ required: true
+ - label: You agree to the [code of conduct](https://github.com/Lissy93/dashy/blob/master/.github/CODE_OF_CONDUCT.md#contributor-covenant-code-of-conduct)
+ required: true
diff --git a/.github/LEGAL.md b/.github/LEGAL.md
index 9a946f55..3e1d9531 100644
--- a/.github/LEGAL.md
+++ b/.github/LEGAL.md
@@ -1,966 +1,1156 @@
-# 3rd-Party Software for [dashy](https://github.com/lissy93/dashy)
+# 3rd-Party Software for Dashy
-The following 3rd-party software packages may be used by or distributed with **dashy**.
+The following 3rd-party software packages may be used by or distributed with **dashy**. Any information relevant to third-party vendors listed below are collected using common, reasonable means.
-## Direct Dependencies
-| Package | Licenses |
-| --------------------------------------------------------------------- | --------------------------------------------------------------- |
-| **[ajv (8.6.2)](#ajv-8-6-2)** | MIT |
-| **[axios (0.21.1)](#axios-0-21-1)** | MIT |
-| **[body-parser (1.19.0)](#body-parser-1-19-0)** | MIT |
-| **[connect (3.7.0)](#connect-3-7-0)** | MIT |
-| **[crypto-js (4.1.1)](#crypto-js-4-1-1)** | MIT |
-| **[highlight.js (11.1.0)](#highlight.js-11-1-0)** | **Multi-license:** BSD-2-Clause _OR_ BSD-3-Clause, BSD-3-Clause |
-| **[js-yaml (4.1.0)](#js-yaml-4-1-0)** | MIT |
-| **[npm-run-all (4.1.5)](#npm-run-all-4-1-5)** | MIT |
-| **[register-service-worker (1.7.2)](#register-service-worker-1-7-2)** | MIT |
-| **[remedial (1.0.8)](#remedial-1-0-8)** | **Multi-license:** Apache-2.0 _OR_ MIT |
-| **[serve-static (1.14.1)](#serve-static-1-14-1)** | MIT |
-| **[v-jsoneditor (1.4.4)](#v-jsoneditor-1-4-4)** | MIT |
-| **[v-tooltip (2.1.3)](#v-tooltip-2-1-3)** | MIT |
-| **[vue (2.6.14)](#vue-2-6-14)** | MIT |
-| **[vue-cli-plugin-yaml (1.0.2)](#vue-cli-plugin-yaml-1-0-2)** | MIT |
-| **[vue-i18n (8.25.0)](#vue-i18n-8-25-0)** | MIT |
-| **[vue-js-modal (2.0.0-rc.6)](#vue-js-modal-2-0-0-rc-6)** | MIT |
-| **[vue-material-tabs (0.1.6)](#vue-material-tabs-0-1-6)** | MIT |
-| **[vue-prism-editor (1.2.2)](#vue-prism-editor-1-2-2)** | MIT |
-| **[vue-router (3.5.2)](#vue-router-3-5-2)** | MIT |
-| **[vue-select (3.12.2)](#vue-select-3-12-2)** | MIT |
-| **[vue-swatches (2.1.1)](#vue-swatches-2-1-1)** | MIT |
-| **[vue-toasted (1.1.28)](#vue-toasted-1-1-28)** | MIT |
+Date generated | Revision ID
+:------------: | :----------:
+10/02/21 | cc7101a871e151a2dea7830d1e492ef6ef05fd53
-### Details
+---
+## Dependencies
-#### **ajv (8.6.2)**
+### [@sentry/tracing (6.11.0)](https://www.npmjs.com/package/@sentry/tracing)
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
+```
+MIT License
- - Attribution:
- The MIT License (MIT)
+Copyright (c) 2020 Sentry (https://sentry.io/) and individual contributors.
- Copyright (c) 2015-2021 Evgeny Poberezkin
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
+```
-- Discovered License(s)
+#### Other Licenses
+Apache-2.0
+
+```
+Copyright 2020 Google LLC
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+```
---
----
+### [@sentry/vue (6.11.0)](https://www.npmjs.com/package/@sentry/vue)
-#### **axios (0.21.1)**
-- Declared License(s)
+#### Declared Licenses
+**Multi-license:**MIT, **Multi-license:**BSD-3-Clause
- - MIT
+```
+Copyright (c) 2021, @sentry/vue Contributors
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- - Attribution:
- Copyright (c) 2014-present Matt Zabriskie
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+```
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
+```
+MIT License
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
+Copyright (c) 2019, Sentry
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+\* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+\* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+\* Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+```
+
+
+#### Other Licenses
+Apache-2.0
+
+
+```
+Copyright Microsoft Corporation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+```
-- Discovered License(s)
---
----
+### [ajv (8.6.2)](https://www.npmjs.com/package/ajv)
-#### **body-parser (1.19.0)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- (The MIT License)
+```
+The MIT License (MIT)
- Copyright (c) 2014 Jonathan Ong
- Copyright (c) 2014-2015 Douglas Christopher Wilson
+Copyright (c) 2015-2021 Evgeny Poberezkin
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- 'Software'), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+
+```
-- Discovered License(s)
---
----
+### [axios (0.21.1)](https://www.npmjs.com/package/axios)
-#### **connect (3.7.0)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- (The MIT License)
+```
+Copyright (c) 2014-present Matt Zabriskie
- Copyright (c) 2010 Sencha Inc.
- Copyright (c) 2011 LearnBoost
- Copyright (c) 2011-2014 TJ Holowaychuk
- Copyright (c) 2015 Douglas Christopher Wilson
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- 'Software'), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-- Discovered License(s)
+```
---
----
+### [body-parser (1.19.0)](https://www.npmjs.com/package/body-parser)
-#### **crypto-js (4.1.1)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- \# License
+```
+(The MIT License)
- [The MIT License (MIT)](http://opensource.org/licenses/MIT)
+Copyright (c) 2014 Jonathan Ong
+Copyright (c) 2014-2015 Douglas Christopher Wilson
- Copyright (c) 2009-2013 Jeff Mott
- Copyright (c) 2013-2016 Evan Vosberg
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
+```
-- Discovered License(s)
- - BSD-2-Clause
---
----
+### [connect (3.7.0)](https://www.npmjs.com/package/connect)
-#### **highlight.js (11.1.0)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - **Multi-license:** BSD-2-Clause
- - Attribution:
- Copyright (c) 2021, highlight.js Contributors<>
- All rights reserved.<>
+```
+(The MIT License)
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
+Copyright (c) 2010 Sencha Inc.
+Copyright (c) 2011 LearnBoost
+Copyright (c) 2011-2014 TJ Holowaychuk
+Copyright (c) 2015 Douglas Christopher Wilson
- 1. Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
- and/or other materials provided with the distribution.
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. _OR_ BSD-3-Clause
+```
- - Attribution:
- BSD 3-Clause License
-
- Copyright (c) 2006, Ivan Sagalaev.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- \* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
- \* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- \* Neither the name of the copyright holder nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
- - BSD-3-Clause
-
- - Attribution:
- BSD 3-Clause License
-
- Copyright (c) 2006, Ivan Sagalaev.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- \* Redistributions of source code must retain the above copyright notice, this
- list of conditions and the following disclaimer.
-
- \* Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- \* Neither the name of the copyright holder nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-- Discovered License(s)
- - MIT
- - CC-BY-SA-4.0
- - **Multi-license:** MIT _OR_ PHP-3.01
- - public-domain
---
----
+### [crypto-js (4.1.1)](https://www.npmjs.com/package/crypto-js)
-#### **js-yaml (4.1.0)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- (The MIT License)
+```
+\# License
- Copyright (C) 2011-2015 by Vitaly Puzrin
+[The MIT License (MIT)](http://opensource.org/licenses/MIT)
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Copyright (c) 2009-2013 Jeff Mott
+Copyright (c) 2013-2016 Evan Vosberg
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
-- Discovered License(s)
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+```
+
+
+#### Other Licenses
+BSD-2-Clause
+
+
+```
+Copyright (c) 2021, crypto-js Contributors<>
+All rights reserved.<>
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+```
---
----
+### [js-yaml (4.1.0)](https://www.npmjs.com/package/js-yaml)
-#### **npm-run-all (4.1.5)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- The MIT License (MIT)
+```
+(The MIT License)
- Copyright (c) 2015 Toru Nagashima
+Copyright (C) 2011-2015 by Vitaly Puzrin
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+```
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-- Discovered License(s)
---
----
+### [keycloak-js (15.0.2)](https://www.npmjs.com/package/keycloak-js)
-#### **register-service-worker (1.7.2)**
-- Declared License(s)
+#### Declared Licenses
+Apache-2.0
- - MIT
- - Attribution:
- The MIT License (MIT)
+```
+Copyright 2016 Red Hat, Inc
- Copyright (c) 2013-present, Yuxi (Evan) You
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+http://www.apache.org/licenses/LICENSE-2.0
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+```
+
+
+#### Other Licenses
+MIT
+
+
+```
+Copyright (c) 2017 Brett Epps
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+```
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
-- Discovered License(s)
---
----
+### [register-service-worker (1.7.2)](https://www.npmjs.com/package/register-service-worker)
-#### **remedial (1.0.8)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - **Multi-license:** Apache-2.0
- - Attribution:
- Copyright 2018 AJ ONeal
+```
+The MIT License (MIT)
- This is open source software; you can redistribute it and/or modify it under the
- terms of either:
+Copyright (c) 2013-present, Yuxi (Evan) You
- a) the "MIT License"
- b) the "Apache-2.0 License"
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- MIT License
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+```
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-
- Apache-2.0 License Summary
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- _OR_ MIT
-
- - Attribution:
- Copyright (c) 2018 AJ ONeal
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-
-- Discovered License(s)
---
----
+### [remedial (1.0.8)](https://www.npmjs.com/package/remedial)
-#### **serve-static (1.14.1)**
-- Declared License(s)
+#### Declared Licenses
+Apache-2.0 *OR* MIT
- - MIT
- - Attribution:
- (The MIT License)
- Copyright (c) 2010 Sencha Inc.
- Copyright (c) 2011 LearnBoost
- Copyright (c) 2011 TJ Holowaychuk
- Copyright (c) 2014-2016 Douglas Christopher Wilson
+```
+Copyright 2018 AJ ONeal
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- 'Software'), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
+This is open source software; you can redistribute it and/or modify it under the
+terms of either:
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
+ a) the "MIT License"
+ b) the "Apache-2.0 License"
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+MIT License
-- Discovered License(s)
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+
+Apache-2.0 License Summary
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+```
---
----
+### [rsup-progress (2.0.4)](https://www.npmjs.com/package/rsup-progress)
-#### **v-jsoneditor (1.4.4)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- MIT License
+```
+MIT License
+-----------
- Copyright (c) 2018
+Copyright (c) 2019 skt-t1-byungi
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
+```
-- Discovered License(s)
---
----
+### [serve-static (1.14.1)](https://www.npmjs.com/package/serve-static)
-#### **v-tooltip (2.1.3)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- MIT License
+```
+(The MIT License)
- Copyright (c) 2018 Guillaume Chau (alias Akryum)
+Copyright (c) 2010 Sencha Inc.
+Copyright (c) 2011 LearnBoost
+Copyright (c) 2011 TJ Holowaychuk
+Copyright (c) 2014-2016 Douglas Christopher Wilson
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+```
-- Discovered License(s)
---
----
+### [simple-icons (5.12.0)](https://www.npmjs.com/package/simple-icons)
-#### **vue (2.6.14)**
-- Declared License(s)
+#### Declared Licenses
+CC0-1.0
- - MIT
- - Attribution:
- The MIT License (MIT)
+```
+\# CC0 1.0 Universal
- Copyright (c) 2013-present, Yuxi (Evan) You
+\## Statement of Purpose
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an “owner”) of an original work of authorship and/or a database (each, a “Work”).
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
+Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works (“Commons”) that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
+For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the “Affirmer”), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
+
+1\. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights (“Copyright and Related Rights”). Copyright and Related Rights include, but are not limited to, the following:
+ 1. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
+ 2. moral rights retained by the original author(s) and/or performer(s);
+ 3. publicity and privacy rights pertaining to a person’s image or likeness depicted in a Work;
+ 4. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(i), below;
+ 5. rights protecting the extraction, dissemination, use and reuse of data in a Work;
+ 6. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
+ 7. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
+
+2\. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “Waiver”). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer’s heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer’s express Statement of Purpose.
+
+3\. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer’s express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer’s Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the “License”). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer’s express Statement of Purpose.
+
+4\. Limitations and Disclaimers.
+ 1. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
+ 2. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
+ 3. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person’s Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
+ 4. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
+
+For more information, please see http://creativecommons.org/publicdomain/zero/1.0/.
+
+```
+
+
+
+#### Other Licenses
+**Multi-license:**Apache-2.0, **Multi-license:**MIT, **Multi-license:**GPL-2.0-or-later, **Multi-license:**GPL-3.0-only, **Multi-license:**W3C, **Multi-license:**GPL-3.0-or-later *OR* W3C, **Multi-license:**GPL-3.0-or-later, **Multi-license:**BSD-3-Clause, **Multi-license:**PHP-3.01
+
+
+```
+Copyright 2021, simple-icons Contributors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+```
+
+
+```
+Copyright (c) 2021, simple-icons Contributors
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+```
+
+
+```
+Copyright (C) 2021, simple-icons Contributors
+This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 or any later version.
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+```
+
+
+```
+Copyright (C) 2021, simple-icons Contributors
+This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3.
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/
+```
+
+```
+Copyright (C) [$date-of-software] World Wide Web Consortium, (Massachusetts Institute of Technology, European Research Consortium for Informatics and Mathematics, Keio University). All Rights Reserved.
+This work is distributed under the W3C® Software License in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+```
+
+```
+Copyright (C) 2021, simple-icons Contributors
+This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3 or any later version.
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/
+```
+
+
+
+```
+Copyright (c) 2021, simple-icons Contributors . All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+ 3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+```
+
+
+
+```
+Copyright (c) 1999 - 2012 The PHP Group. All rights reserved.
+Redistribution and use in source and binary forms, with or without modification, is permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ 3. The name "PHP" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact group@php.net.
+ 4. Products derived from this software may not be called "PHP", nor may "PHP" appear in their name, without prior written permission from group@php.net. You may indicate that your software works in conjunction with PHP by saying "Foo for PHP" instead of calling it "PHP Foo" or "phpfoo"
+ 5. The PHP Group may publish revised and/or new versions of the license from time to time. Each version will be given a distinguishing version number. Once covered code has been published under a particular version of the license, you may always continue to use it under the terms of that version. You may also choose to use such covered code under the terms of any subsequent version of the license published by the PHP Group. No one other than the PHP Group has the right to modify the terms applicable to covered code created under this License.
+ 6. Redistributions of any form whatsoever must retain the following acknowledgment: "This product includes PHP software, freely available from ".
+THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+This software consists of voluntary contributions made by many individuals on behalf of the PHP Group.
+The PHP Group can be contacted via Email at group@php.net.
+For more information on the PHP Group and the PHP project, please see .
+PHP includes the Zend Engine, freely available at .
+```
-- Discovered License(s)
- - Apache-2.0
- - GPL-2.0-or-later
---
----
+### [v-jsoneditor (1.4.5)](https://www.npmjs.com/package/v-jsoneditor)
-#### **vue-cli-plugin-yaml (1.0.2)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- MIT License
+```
+MIT License
- Copyright (c) 2018 Eduardo Hidalgo H
+Copyright (c) 2018
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+```
-- Discovered License(s)
---
----
+### [v-tooltip (2.1.3)](https://www.npmjs.com/package/v-tooltip)
-#### **vue-i18n (8.25.0)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- The MIT License (MIT)
+```
+MIT License
- Copyright (c) 2016 kazuya kawaguchi
+Copyright (c) 2018 Guillaume Chau (alias Akryum)
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- the Software, and to permit persons to whom the Software is furnished to do so,
- subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+```
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-- Discovered License(s)
---
----
+### [vue (2.6.14)](https://www.npmjs.com/package/vue)
-#### **vue-js-modal (2.0.0-rc.6)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- MIT License
+```
+The MIT License (MIT)
- Copyright (c) 2017 Yev Vlasenko
+Copyright (c) 2013-present, Yuxi (Evan) You
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
+```
+
+
+#### Other Licenses
+**Multi-license:**Apache-2.0, **Multi-license:**GPL-2.0-or-later
+
+
+```
+Copyright 2021, vue Contributors
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+
+See the License for the specific language governing permissions and limitations under the License.
+```
+
+
+```
+Copyright (C) 2021, vue Contributors
+This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 or any later version.
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+```
-- Discovered License(s)
---
----
+### [vue-i18n (8.25.0)](https://www.npmjs.com/package/vue-i18n)
-#### **vue-material-tabs (0.1.6)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- MIT License
+```
+The MIT License (MIT)
- Copyright (c) 2021 Jairo Blatt
+Copyright (c) 2016 kazuya kawaguchi
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+```
-- Discovered License(s)
---
----
+### [vue-js-modal (2.0.1)](https://www.npmjs.com/package/vue-js-modal)
-#### **vue-prism-editor (1.2.2)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- MIT License
+```
+MIT License
- Copyright (c) 2020 Mesut Koca
+Copyright (c) 2017 Yev Vlasenko
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+```
-- Discovered License(s)
---
----
+### [vue-material-tabs (0.1.6)](https://www.npmjs.com/package/vue-material-tabs)
-#### **vue-router (3.5.2)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- MIT License
+```
+MIT License
- Copyright (c) 2013-present Evan You
+Copyright (c) 2021 Jairo Blatt
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+```
-- Discovered License(s)
---
----
+### [vue-router (3.5.2)](https://www.npmjs.com/package/vue-router)
-#### **vue-select (3.12.2)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- The MIT License (MIT)
+```
+MIT License
- Copyright (c) 2016 Jeff Sagal & vue-select contributors
+Copyright (c) 2013-present Evan You
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+```
-- Discovered License(s)
---
----
+### [vue-select (3.13.0)](https://www.npmjs.com/package/vue-select)
-#### **vue-swatches (2.1.1)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- MIT License
+```
+The MIT License (MIT)
- Copyright (c) 2018 - Present Diego Jara
+Copyright (c) 2016 Jeff Sagal & vue-select contributors
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
+```
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-- Discovered License(s)
---
----
+### [vue-swatches (2.1.1)](https://www.npmjs.com/package/vue-swatches)
-#### **vue-toasted (1.1.28)**
-- Declared License(s)
+#### Declared Licenses
+MIT
- - MIT
- - Attribution:
- MIT License
+```
+MIT License
- Copyright (c) 2017 Shakeeb Sadikeen
+Copyright (c) 2018 - Present Diego Jara
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
-- Discovered License(s)
+```
---
----
+### [vue-toasted (1.1.28)](https://www.npmjs.com/package/vue-toasted)
+
+
+#### Declared Licenses
+MIT
+
+
+```
+MIT License
+
+Copyright (c) 2017 Shakeeb Sadikeen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+```
-[fossa]: # "Do not touch the comments below"
-[fossa]: # "==depsig=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855=="
diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md
index 28b82425..0f154f53 100644
--- a/.github/SUPPORT.md
+++ b/.github/SUPPORT.md
@@ -1,5 +1,15 @@
-# SUPPORT
+# Support
-For help with getting Dashy up and running, please see the [Discussion](https://github.com/Lissy93/dashy/discussions).
+To report a potential vulnerability, follow the steps in **[Security](https://github.com/Lissy93/dashy/blob/master/.github/SECURITY.md#reporting-a-security-issue)**.
-If you'd like to help support Dashy's future development, see [Contributing](/docs/contributing.md)
\ No newline at end of file
+For setup and usage guides, see **[dashy.to/docs](https://dashy.to/)** or the **[GitHub](https://github.com/Lissy93/dashy)** repo.
+
+To raise a bug, for something that's not working, **[Open a new Issue](https://github.com/Lissy93/dashy/issues/new/choose)**.
+
+For help with getting Dashy up and running, please see the **[Discussions](https://github.com/Lissy93/dashy/discussions)**.
+
+If you'd like to help support Dashy's future development, see **[Contributing](https://github.com/Lissy93/dashy/blob/master/docs/contributing.md)**.
+
+To get in contact with the author, email me at **`alicia at omg dot lol`** **[[PGP]](https://keybase.io/aliciasykes/pgp_keys.asc?fingerprint=0688f8d34587d954e9e51fb8fedb68f55c0283a7)**.
+
+-Thank you
\ No newline at end of file
diff --git a/.github/close-label.yml b/.github/close-label.yml
new file mode 100644
index 00000000..c354451b
--- /dev/null
+++ b/.github/close-label.yml
@@ -0,0 +1,3 @@
+🐛 Bug: ✅ Fixed
+🦄 Feature Request: ✅ Implemented
+🤷♂️ Question: ✅ Answered
diff --git a/.github/issue-auto-comments.yml b/.github/issue-auto-comments.yml
index d09202ba..0c7dece3 100644
--- a/.github/issue-auto-comments.yml
+++ b/.github/issue-auto-comments.yml
@@ -1,15 +1,63 @@
comment:
- header: Hello 👋
footer: |
- ---
+ ---
> I am a bot, and this is an automated message 🤖
labels:
- - name: invalid
+ - name: ✖️ Invalid
labeled:
issue:
- body: Please follow the issue templates.
action: close
+ body: >
+ Hello @{{ issue.user.login }} your ticket has been marked as invalid.
+ Please ensure you follow the issue template, provide all requested info,
+ and be sure to check the docs + previous issues prior to raising tickets.
pr:
body: Thank you @{{ pull_request.user.login }} for suggesting this. Please follow the pull request templates.
action: close
+ - name: 👩💻 Good First Issue
+ labeled:
+ issue:
+ body: >
+ This issue has been marked as a good first issue for first-time contributors to implement!
+ This is a great way to support the project, while also improving your skills, you'll also be credited as a contributor once your PR is merged.
+ If you're new to web development, [here are a collection of resources](https://dashy.to/docs/developing#resources-for-beginners)
+ to help you get started. You can also find step-by-step tutorials for common tasks within Dashy, on the [Dev Guides](https://dashy.to/docs/development-guides) page.
+ If you need any support at all, feel free to reach out via [GitHub Discussions](https://github.com/Lissy93/dashy/discussions).
+
+ - name: ❌ wontfix
+ labeled:
+ issue:
+ action: close
+ body: >
+ This ticked has been marked as 'wontfix', which usually means it is out-of-scope, or not feasible at this time.
+ You can still fork the project and make the changes yourself, for support in doing so, please reference the [Developing Docs](https://dashy.to/docs/developing).
+
+ - name: ✅ Fixed
+ labeled:
+ issue:
+ body: >
+ Hello @{{ issue.user.login }}! It looks like all or part of this issue has now been implemented :)
+ If you're enjoying Dashy, please consider supporting the project- for ways to get involved, see [Contributing](https://dashy.to/docs/contributing) 💖
+
+ - name: ‼️ High Priority
+ labeled:
+ issue:
+ body: >
+ This ticket has been marked as high priority, and has been bumped to the top of the priority list.
+ You should expect an implementation to be pushed out within the next 7 days. Thank you for your patience.
+
+ - name: 💀 Spam
+ labeled:
+ issue:
+ action: close
+ locking: lock
+ lock_reason: spam
+ body: >
+ This issue has been identified as spam, and is now locked.
+ Users who repeatedly raise spam issues may be blocked or reported.
+
+ - name: ⛔ Don't Merge
+ labeled:
+ pr:
+ body: This PR has been temporarily blocked from merging.
diff --git a/.github/pr-badge.yml b/.github/pr-badge.yml
index c32c37c3..54ba4e22 100644
--- a/.github/pr-badge.yml
+++ b/.github/pr-badge.yml
@@ -1,92 +1,145 @@
-# Config file for pull-request-badge. See: https://pullrequestbadge.com/
-# Enables badges to be inserted into the PR description, based on certain conditions
+# Config file for pull-request-badge. See: https://pullrequestbadge.com/ by @stefanbuck
+# Dynamically inserts status badges into PR description, based on certain conditions
-# Checks if the required sections are missing
-- label: "⚠️Missing"
- message: "Category"
- color: "#f25265"
- when: "$payload.pull_request.body.includes('Category') === false"
-- label: "⚠️Missing"
- message: "Overview"
- color: "#f25265"
- when: "$payload.pull_request.body.includes('Overview') === false"
-- label: "⚠️Missing"
- message: "Quality Checklist"
- color: "#f25265"
- when: "$payload.pull_request.body.includes('Code Quality Checklist') === false"
-- label: "⚠️Description"
- message: "Incomplete"
- color: "#f25265"
- when: "$payload.pull_request.body.length < 25"
-- label: "⚠️Missing"
- message: "Label"
- color: "#f25265"
- when: "$labels.length == 0"
-
-# Show note when in draft mode
-- label: "Status"
- message: "Draft"
- when: "$isDraft"
- color: "#ffa933"
-
-# Add size label based on very large or tiny PRs
-- label: "PR Size"
- message: "Large"
- color: "#f79c47"
- when: "$additions > 600"
-- label: "PR Size"
- message: "Quick"
- color: "#3eef8b"
- when: "$additions < 5"
-
-# Show PR number, to destination and from destination
-- label: "#$prNumber"
- message: "$payload.pull_request.user.login /$payload.pull_request.head.ref → $payload.repository.full_name"
- color: "#ab5afc"
- url: "https://github.com/$slug/tree/$branchName"
-
-# Show total code added minus deleted
-- label: "New Code"
- message: "Commits: $payload.pull_request.commits | Files Changed: $payload.pull_request.changed_files | Additions: $payload.pull_request.additions-$payload.pull_request.deletions"
- color: "#dddd00"
-
# Show submitting user's username and profile link
- label: 💕 Submitted by
- message: "$payload.pull_request.user.login"
- color: "#f73ae6"
- when: "$payload.pull_request.author_association !== 'OWNER'"
- url: "https://github.com/$payload.pull_request.user.login"
+ message: $payload.pull_request.user.login
+ color: '#f73ae6'
+ when: $payload.pull_request.author_association !== 'OWNER'
+ url: 'https://github.com/$payload.pull_request.user.login'
+
+# Show a badge indicating the PR category, based on tag
+- label: Type
+ message: ✨ Feature
+ color: '#39b0fd'
+ when: $labels.includes('✨ New Feature')
+- label: Type
+ message: 🐛 Fix
+ color: '#39b0fd'
+ when: $labels.includes('🦋 Bug Fix')
+- label: Type
+ message: 📕 Docs
+ color: '#39b0fd'
+ when: $labels.includes('📕 Docs')
+- label: Type
+ message: 🛠️ Build Changes
+ color: '#39b0fd'
+ when: $labels.includes('🛠️ Build Changes')
+- label: Type
+ message: 🛠️ Build Changes
+ color: '#39b0fd'
+ when: $labels.includes('🛠️ Build Changes')
+- label: Type
+ message: 🚚 Refactor
+ color: '#39b0fd'
+ when: $labels.includes('🚚 Refactor')
+- label: Type
+ message: 💄 Stylistic Changes
+ color: '#39b0fd'
+ when: $labels.includes('💄 Stylistic Changes')
+- label: Type
+ message: 🌟 Showcase Addition
+ color: '#39b0fd'
+ when: $labels.includes('💯 Showcase')
+- label: Type
+ message: 🏗️ Architecture
+ color: '#39b0fd'
+ when: $labels.includes('🏗️ Architectural Changes')
+- label: Type
+ message: 🤖 Auto Submission
+ color: '#39b0fd'
+ when: $labels.includes('🤖 Auto')
+- label: Type
+ message: 🌐 Language Update
+ color: '#39b0fd'
+ when: $labels.includes('🌐 Language')
+
+# Add size label based on very large or tiny PRs
+- label: PR Size
+ message: Extra Large
+ color: '#f9833e'
+ when: '$additions > 1000'
+- label: PR Size
+ message: Large
+ color: '#f4b546'
+ when: '$additions > 500 && $additions < 1000'
+- label: PR Size
+ message: Medium
+ color: '#f3ff59'
+ when: '$additions > 10 && $additions < 500'
+- label: PR Size
+ message: Quick
+ color: '#3eef8b'
+ when: '$additions < 10'
+
+# Show badge indicating PR status
+- label: Status
+ message: ✏️ Draft
+ when: $isDraft
+ color: '#ffa933'
+- label: Status
+ message: 🧱 Work in Progress
+ when: $payload.pull_request.title.includes('WIP')
+ color: '#29e3f4'
+- label: Status
+ message: ✅ Ready
+ color: '#3ef963'
+ when: $labels.includes('🔀 Ready for Merge')
+
+# Show PR number, to destination and from destination
+- label: '#$prNumber'
+ message: '$payload.pull_request.user.login /$payload.pull_request.head.ref → $payload.repository.full_name'
+ color: '#ab5afc'
+ url: 'https://github.com/$slug/tree/$branchName'
+
+# Show total code added minus deleted
+- label: New Code
+ message: 'Commits: $payload.pull_request.commits | Files Changed: $payload.pull_request.changed_files | Additions: $payload.pull_request.additions-$payload.pull_request.deletions'
+ color: '#dddd00'
+
+# Checks if the required sections are missing
+- label: ⚠️Missing
+ message: Category
+ color: '#f25265'
+ when: $payload.pull_request.body.includes('Category') === false
+- label: ⚠️Missing
+ message: Overview
+ color: '#f25265'
+ when: $payload.pull_request.body.includes('Overview') === false
+- label: ⚠️Missing
+ message: Quality Checklist
+ color: '#f25265'
+ when: $payload.pull_request.body.includes('Code Quality Checklist') === false
+- label: ⚠️Description
+ message: Incomplete
+ color: '#f25265'
+ when: $payload.pull_request.body.length < 25
+- label: ⚠️Missing
+ message: Label
+ color: '#f25265'
+ when: $labels.length == 0
+
+# Show note when task list has unfinished items
+- label: ⚠️Notice
+ message: Unchecked Tasks
+ when: $payload.pull_request.body.includes('- [ ] ')
+ color: '#f25265'
+
+# Show warning, when certain tags are applied
+- label: Warning
+ message: ⛔ Do Not Merge
+ color: '#f25265'
+ when: $labels.includes("⛔ Don't Merge")
+- label: Warning
+ message: 🚫 Merge Conflicts
+ color: '#f25265'
+ when: $labels.includes('🚫 Merge Conflicts')
+- label: Warning
+ message: 🕸️ Inactive
+ color: '#f25265'
+ when: $labels.includes('🕸️ Inactive')
+- label: Warning
+ message: 💀 Spam
+ color: '#f25265'
+ when: $labels.includes('💀 Spam')
-# Show a badge indicating the PR category
-- label: "Type"
- message: "✨ Feature"
- color: "#39b0fd"
- when: "$labels.includes('✨ New Feature')"
-- label: "Type"
- message: "🐛 Fix"
- color: "#39b0fd"
- when: "$labels.includes('🦋 Bug Fix')"
-- label: "Type"
- message: "📕 Docs"
- color: "#39b0fd"
- when: "$labels.includes('📕 Docs')"
-- label: "Type"
- message: "🛠️ Build Changes"
- color: "#39b0fd"
- when: "$labels.includes('🛠️ Build Changes')"
-- label: "Type"
- message: "🛠️ Build Changes"
- color: "#39b0fd"
- when: "$labels.includes('🛠️ Build Changes')"
-- label: "Type"
- message: "🚚 Refactor"
- color: "#39b0fd"
- when: "$labels.includes('🚚 Refactor')"
-- label: "Type"
- message: "💄 Stylistic Changes"
- color: "#39b0fd"
- when: "$labels.includes('💄 Stylistic Changes')"
-- label: "Type"
- message: "🌟 Showcase Addition"
- color: "#39b0fd"
- when: "$labels.includes('💯 Showcase')"
diff --git a/.github/pr-branch-labeler.yml b/.github/pr-branch-labeler.yml
new file mode 100644
index 00000000..c01da993
--- /dev/null
+++ b/.github/pr-branch-labeler.yml
@@ -0,0 +1,11 @@
+# PR labels and the branch patterns they should be auto-assigned to
+✨ New Feature: ['FEATURE/*', 'FEAT/*']
+🚚 Refactor: ['IMPROVMENTS/*', 'REFACTOR/*']
+🦋 Bug Fix: ['FIX/*', 'HOT-FIX/*', 'BUG-FIX/*']
+💯 Showcase: ['SHOWCASE/*', 'SHOWCASE_SUBMISSION/*']
+💄 Stylistic Changes: ['STYLES/*', 'THEME/*', 'UI/*']
+🏗️ Architectural Changes: ['ARCH/*', 'ARCHITECTURE/*']
+🛠️ Build Changes: ['DOCKER/*', 'BUILD/*', 'CI/*', 'ACTIONS/*']
+🌐 Language: ['LANG/*', 'INTERNATIONALIZATION/*', 'I18N/*', 'TEXT-UPDATE/*']
+🤖 Auto: ['AUTO/*', 'BOT/*', 'snyk-upgrade-*', 'snyk-fix-*']
+⛔ Don't Merge: ['WEBSITE/*', 'EXPERIMENT/*', 'DEPLOY/*', 'deploy_*', 'gh-pages', 'dev-demo']
\ No newline at end of file
diff --git a/.github/workflows/add-comment-from-tag.yml b/.github/workflows/add-comment-from-tag.yml
index 831da95c..64d7932f 100644
--- a/.github/workflows/add-comment-from-tag.yml
+++ b/.github/workflows/add-comment-from-tag.yml
@@ -24,4 +24,4 @@ jobs:
uses: peaceiris/actions-label-commenter@v1
with:
config_file: .github/issue-auto-comments.yml
- github_token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ github_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/apply-done-label.yml b/.github/workflows/apply-done-label.yml
new file mode 100644
index 00000000..2b101f59
--- /dev/null
+++ b/.github/workflows/apply-done-label.yml
@@ -0,0 +1,13 @@
+# When a PR is merged, any associated issues will have a Done label applied
+# The label will depend on the issue type, see: ./github/close-label.yml
+name: 💡 Apply Done Label
+on:
+ pull_request:
+ types: [opened, merged, closed]
+jobs:
+ triage:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: logerfo/close-label@0.0.4
+ with:
+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/assign-reviewer.yml b/.github/workflows/assign-reviewer.yml
new file mode 100644
index 00000000..bba9cc07
--- /dev/null
+++ b/.github/workflows/assign-reviewer.yml
@@ -0,0 +1,15 @@
+# Automatically assigns the author as a reviewer to opened PRs and issues
+name: 💡 Auto-Assign Author to PR
+on:
+ pull_request:
+ types: [opened]
+ issues:
+ types: [opened]
+jobs:
+ assign-author:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Assign author
+ uses: technote-space/assign-author@v1
+ with:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/auto-rebase-pr.yml b/.github/workflows/auto-rebase-pr.yml
new file mode 100644
index 00000000..f08bb70d
--- /dev/null
+++ b/.github/workflows/auto-rebase-pr.yml
@@ -0,0 +1,23 @@
+# When a '/rebase' comment is added to a PR, it will be rebased from the main branch
+name: 🏗️ Automatic PR Rebase
+on:
+ issue_comment:
+ types: [created]
+jobs:
+ rebase:
+ name: Rebase
+ if: >
+ github.event.issue.pull_request != ''
+ && contains(github.event.comment.body, '/rebase')
+ && github.event.comment.author_association == 'MEMBER'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ fetch-depth: 0
+ - name: Rebase
+ uses: cirrus-actions/rebase@1.4
+ env:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/auto-tag-pr.yml b/.github/workflows/auto-tag-pr.yml
index e05948eb..b828c82c 100644
--- a/.github/workflows/auto-tag-pr.yml
+++ b/.github/workflows/auto-tag-pr.yml
@@ -1,16 +1,26 @@
# Creates a new tag, whenever the app version (in package.json) is updated in master
-name: 🏗️ Create Tag on Version Change
+# And marks any relevant issues as fixed
+name: 🏗️ Release Tag new Versions
on:
push:
branches:
- master
jobs:
- build:
+ tag-pre-release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: butlerlogic/action-autotag@stable
with:
- GITHUB_TOKEN: '${{ secrets.BOT_GITHUB_TOKEN }}'
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
strategy: package
commit_message_template: "🔖 {{number}} {{message}} (by {{author}})\nSHA: {{sha}}\n."
+ mark-issue-fixed:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - name: Label Fixed Issues
+ uses: gh-bot/fix-labeler@master
+ with:
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ label: '✅ Fixed'
diff --git a/.github/workflows/broadcast-message.yml b/.github/workflows/broadcast-message.yml
index 46178e59..da0ece17 100644
--- a/.github/workflows/broadcast-message.yml
+++ b/.github/workflows/broadcast-message.yml
@@ -11,4 +11,4 @@ jobs:
steps:
- uses: jenschelkopf/broadcast-action@master
with:
- token: ${{ secrets.BOT_GITHUB_TOKEN }}
\ No newline at end of file
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/build-app.yml b/.github/workflows/build-app.yml
index 4f29a69d..0042da65 100644
--- a/.github/workflows/build-app.yml
+++ b/.github/workflows/build-app.yml
@@ -18,6 +18,7 @@ jobs:
npm run build
- name: Deploy 🚀
uses: JamesIves/github-pages-deploy-action@4.1.4
+ if: ${{ github.repository_owner === 'lissy93' }}
with:
branch: dev-demo
folder: dist
diff --git a/.github/workflows/check-duplicate-issues.yml b/.github/workflows/check-duplicate-issues.yml
new file mode 100644
index 00000000..3641fa78
--- /dev/null
+++ b/.github/workflows/check-duplicate-issues.yml
@@ -0,0 +1,22 @@
+# Attempts to auto-detect weather an issue is a duplicate, and adds a comment
+name: 🎯 Issue Duplicate Check
+on:
+ issues:
+ types: [opened, edited]
+jobs:
+ check-duplicate:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: wow-actions/potential-duplicates@v1
+ with:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ filter: ''
+ exclude: '[BUG] [QUESTION] [FEEDBACK] [SHOWCASE]'
+ label: '🕸️ Potential Duplicate'
+ state: all
+ threshold: 0.75
+ reactions: 'eyes'
+ comment: >
+ Potential duplicates: {{#issues}}
+ - [#{{ number }}] {{ title }} ({{ accuracy }}%)
+ {{/issues}}
\ No newline at end of file
diff --git a/.github/workflows/check-merge-conflicts.yml b/.github/workflows/check-merge-conflicts.yml
new file mode 100644
index 00000000..d00df142
--- /dev/null
+++ b/.github/workflows/check-merge-conflicts.yml
@@ -0,0 +1,16 @@
+# Detect and label pull requests that have merge conflicts
+name: 🏗️ Check Merge Conflicts
+on:
+ push:
+ branches:
+ - master
+jobs:
+ check-conflicts:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: mschilde/auto-label-merge-conflicts@master
+ with:
+ CONFLICT_LABEL_NAME: "🚫 Merge Conflicts"
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ MAX_RETRIES: 5
+ WAIT_MS: 5000
diff --git a/.github/workflows/close-incomplete-issues.yml b/.github/workflows/close-incomplete-issues.yml
index 35cdf3f7..61331f6c 100644
--- a/.github/workflows/close-incomplete-issues.yml
+++ b/.github/workflows/close-incomplete-issues.yml
@@ -12,7 +12,7 @@ jobs:
- name: Automatically close issues that don't follow the issue template
uses: lucasbento/auto-close-issues@v1.0.2
with:
- github-token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ github-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
closed-issues-label: '🙁 Auto-Closed'
issue-close-message: |
Hello @${issue.user.login} 👋
diff --git a/.github/workflows/close-stale-issues.yml b/.github/workflows/close-stale-issues.yml
index 1ef583ec..24c9545f 100644
--- a/.github/workflows/close-stale-issues.yml
+++ b/.github/workflows/close-stale-issues.yml
@@ -8,18 +8,26 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- - uses: actions/stale@v4
+ # Comment on, then close issues that haven't been updated for ages
+ - name: Close Stale Issues
+ uses: actions/stale@v4
with:
- repo-token: ${{ secrets.BOT_GITHUB_TOKEN }}
- days-before-stale: 42
+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ days-before-stale: 30
days-before-close: 5
operations-per-run: 30
remove-stale-when-updated: true
enable-statistics: true
- stale-issue-message: 'This issue has gone 6 weeks without an update. To keep the ticket open, please indicate that it is still relevant in a comment below. Otherwise it will be closed in 5 working days.'
- stale-pr-message: 'This PR is stale because it has been open 6 weeks with no activity. Either remove the stale label or comment below with a short update, otherwise this PR will be closed in 5 days.'
- close-issue-message: 'This issue was automatically closed because it has been stalled for over 6 weeks with no activity.'
- close-pr-message: 'This pull request was automatically closed because it has been stalled for over 6 weeks with no activity.'
+ stale-issue-message: >
+ This issue has gone 6 weeks without an update. To keep the ticket open, please indicate that it is still relevant in a comment below.
+ Otherwise it will be closed in 5 working days.
+ stale-pr-message: >
+ This PR is stale because it has been open 6 weeks with no activity. Either remove the stale label or comment below with a short update,
+ otherwise this PR will be closed in 5 days.
+ close-issue-message: >
+ This issue was automatically closed because it has been stalled for over 6 weeks with no activity.
+ close-pr-message: >
+ This pull request was automatically closed because it has been stalled for over 6 weeks with no activity.
stale-issue-label: '⚰️ Stale'
close-issue-label: '🕸️ Inactive'
stale-pr-label: '⚰️ Stale'
@@ -27,3 +35,45 @@ jobs:
exempt-issue-labels: '📌 Keep Open'
exempt-pr-labels: '📌 Keep Open'
labels-to-add-when-unstale: '📌 Keep Open'
+
+ # Comment on, then close issues that required a response from the user, but didn't get one
+ - name: Close Issues without Response
+ uses: actions/stale@v4
+ with:
+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ days-before-stale: 5
+ days-before-close: 3
+ operations-per-run: 30
+ remove-stale-when-updated: true
+ stale-issue-message: >
+ Hello! Looks like additional info is required for this issue to be addressed.
+ Don't forget to provide this within the next few days to keep your ticket open.
+ close-issue-message: 'Issue closed due to no response from user.'
+ only-labels: '🚏 Awaiting User Response'
+ labels-to-remove-when-unstale: '🚏 Awaiting User Response, 🛑 No Response'
+ stale-issue-label: '🛑 No Response'
+ close-issue-label: '🕸️ Inactive'
+ exempt-issue-labels: '📌 Keep Open'
+ exempt-pr-labels: '📌 Keep Open'
+
+ # Comment on issues that I should have replied to
+ - name: Notify Repo Owner to Respond
+ uses: actions/stale@v4
+ with:
+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ days-before-stale: 7
+ days-before-close: 365
+ operations-per-run: 30
+ remove-stale-when-updated: true
+ stale-issue-message: Hey @Lissy93 - Don't forget to respond!
+ stale-pr-message: Hey @Lissy93 - Don't forget to respond!
+ only-labels: '👤 Awaiting Maintainer Response'
+ labels-to-remove-when-unstale: '👤 Awaiting Maintainer Response'
+ close-issue-message: 'Closed due to no response from repo author for over a year'
+ close-pr-message: 'Closed due to no response from repo author for over a year'
+ stale-issue-label: '👤 Awaiting Maintainer Response'
+ stale-pr-label: '👤 Awaiting Maintainer Response'
+ close-issue-label: '🕸️ Inactive'
+ close-pr-label: '🕸️ Inactive'
+ exempt-issue-labels: '📌 Keep Open'
+ exempt-pr-labels: '📌 Keep Open'
\ No newline at end of file
diff --git a/.github/workflows/code-spell-check.yml b/.github/workflows/code-spell-check.yml
index 8b162f02..0a062445 100644
--- a/.github/workflows/code-spell-check.yml
+++ b/.github/workflows/code-spell-check.yml
@@ -20,7 +20,7 @@ jobs:
uses: peter-evans/create-pull-request@v3.10.1
if: startsWith(github.head_ref, 'AUTO/') == false
with:
- token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
base: master
commit-message: ':pencil2: Auto-fix typos in text'
title: '[AUTO] Fix spelling and language'
diff --git a/.github/workflows/dependency-updates-summary.yml b/.github/workflows/dependency-updates-summary.yml
index bca9f2d0..24fedb2d 100644
--- a/.github/workflows/dependency-updates-summary.yml
+++ b/.github/workflows/dependency-updates-summary.yml
@@ -11,7 +11,7 @@ jobs:
- name: Yarn Lock Changes
uses: Simek/yarn-lock-changes@main
with:
- token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
collapsibleThreshold: '25'
failOnDowngrade: 'false'
path: 'yarn.lock'
diff --git a/.github/workflows/docs-link-checker.yml b/.github/workflows/docs-link-checker.yml
new file mode 100644
index 00000000..c344774c
--- /dev/null
+++ b/.github/workflows/docs-link-checker.yml
@@ -0,0 +1,33 @@
+# Checks for any broken links in the docs, and raises an issue if found
+name: 🌈 Broken Link Checker
+on:
+ repository_dispatch:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 1 1 * *' # Run monthly
+jobs:
+ link-checker:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Load Excludes
+ run: |
+ LYCHEE_EXCLUDE=$(sed -e :a -e 'N;s/\n/ /;ta' .github/.lycheeexclude)
+ echo "LYCHEE_EXCLUDE=$LYCHEE_EXCLUDE" >> $GITHUB_ENV
+
+ - name: Check for Broken Links
+ uses: lycheeverse/lychee-action@v1.0.8
+ with:
+ args: --verbose -a 200,302,304,429 --exclude ${{ env.LYCHEE_EXCLUDE }} --exclude-mail --no-progress **/*.md
+ env:
+ GITHUB_TOKEN: ${{secrets.BOT_GITHUB_TOKEN}}
+ LYCHEE_OUT: .github/broken-link-report.md
+
+ - name: Raise an Issue with Results
+ uses: peter-evans/create-issue-from-file@v3
+ with:
+ token: ${{secrets.BOT_GITHUB_TOKEN}}
+ title: '[DOCS] Broken Links found in Documentation'
+ content-filepath: .github/broken-link-report.md
+ labels: '📕 Docs, 👩💻 Good First Issue, 💤 Low Priority, 🤖 Auto'
\ No newline at end of file
diff --git a/.github/workflows/domain-expirey-check.yml b/.github/workflows/domain-expirey-check.yml
new file mode 100644
index 00000000..caf3ad86
--- /dev/null
+++ b/.github/workflows/domain-expirey-check.yml
@@ -0,0 +1,43 @@
+name: 📕 Check Docs Domain Expiry
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 1 * * 0' # At 01:00 on Sunday.
+jobs:
+ check-domain:
+ runs-on: ubuntu-latest
+ name: Check domain
+ strategy:
+ matrix:
+ domain:
+ - https://dashy.to
+ steps:
+ - name: Check domain SSL and registry expire date
+ id: check-domain
+ uses: codex-team/action-check-domain@v1
+ with:
+ url: ${{ matrix.domain }}
+ - name: Raise issue if domain expiring soon
+ if: ${{ steps.check-domain.outputs.paid-till-days-left && steps.check-domain.outputs.paid-till-days-left < 30 }}
+ uses: rishabhgupta/git-action-issue@v2
+ with:
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ assignees: Lissy93
+ title: '[WEBSITE] Domain Expiring Soon'
+ body: >
+ **Priority Notice**
+ Domain, ${{ matrix.domain }} will expire in ${{ steps.check-domain.outputs.paid-till-days-left }} days.
+ @Lissy93 - Please take action immediately to prevent any downtime
+
+ - name: Raise issue if SSL Cert expiring soon
+ if: ${{ steps.check-domain.outputs.ssl-expire-days-left && steps.check-domain.outputs.ssl-expire-days-left < 14 }}
+ uses: rishabhgupta/git-action-issue@v2
+ with:
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ assignees: Lissy93
+ title: '[WEBSITE] SSL Cert Expiring Soon'
+ body: >
+ **Priority Notice**
+ The SSL Certificate for ${{ matrix.domain }} will expire in ${{ steps.check-domain.outputs.ssl-expire-days-left }} days, on ${{ steps.check-domain.outputs.ssl-expire-date }}.
+ @Lissy93 - Please take action immediately to prevent any downtime
+
diff --git a/.github/workflows/generate-credits.yml b/.github/workflows/generate-credits.yml
index e7b02aa0..ebb86f79 100644
--- a/.github/workflows/generate-credits.yml
+++ b/.github/workflows/generate-credits.yml
@@ -12,7 +12,7 @@ jobs:
steps:
- uses: bubkoo/contributors-list@v1
with:
- GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
svgPath: docs/assets/CONTRIBUTORS.svg
affiliation: all
includeBots: false
@@ -30,12 +30,12 @@ jobs:
- name: Generate Sponsors in Readme 💖
uses: JamesIves/github-sponsors-readme-action@1.0.5
with:
- token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
file: 'README.md'
- name: Generate Sponsors in Credits 💖
uses: JamesIves/github-sponsors-readme-action@1.0.5
with:
- token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
file: 'docs/credits.md'
# Job #3 - Update the Credits page
insert-credits:
@@ -45,7 +45,7 @@ jobs:
- name: Contribute List - Credits Page
uses: akhilmhdh/contributors-readme-action@v2.2
env:
- GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
with:
image_size: 80
readme_path: docs/credits.md
@@ -56,7 +56,7 @@ jobs:
- name: Sponsors List - Readme
uses: akhilmhdh/contributors-readme-action@v2.2
env:
- GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
with:
image_size: 80
readme_path: README.md
@@ -65,4 +65,18 @@ jobs:
committer_username: liss-bot
committer_email: liss-bot@d0h.co
-
+ make-author-list:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout 🛎️
+ uses: actions/checkout@v2
+ with:
+ fetch-depth: 0
+ - uses: wow-actions/update-authors@v1
+ with:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ sort: commits
+ bots: true
+ path: .github/AUTHORS.txt
+ commit: ':blue_heart: Makes author list'
+ template: '{{name}} <{{email}}> - {{commits}} commits'
diff --git a/.github/workflows/get-size.yml b/.github/workflows/get-size.yml
index f2576fef..d778e35a 100644
--- a/.github/workflows/get-size.yml
+++ b/.github/workflows/get-size.yml
@@ -1,5 +1,5 @@
# Adds a comment to new PRs, showing the compressed size and size difference of new code
-# And labels the PR based on the number of lines changes
+# And also labels the PR based on the number of lines changes
name: 🌈 Check PR Size
on: [pull_request]
jobs:
@@ -12,19 +12,27 @@ jobs:
- name: Get Compressed Size
uses: preactjs/compressed-size-action@v2
with:
- repo-token: ${{ secrets.BOT_GITHUB_TOKEN }}
- pattern: "./dist/**/**"
+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ pattern: './dist/**/*.{js,css,html}'
+ strip-hash: '\\b\\w{8}\\.'
+ exclude: '{./dist/manifest.json,**/*.map,**/node_modules/**}'
+ minimum-change-threshold: 100
# Check number of lines of code added
- name: Label based on Lines of Code
uses: codelytv/pr-size-labeler@v1
- with:
- GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
- xs_max_size: '10'
- s_max_size: '100'
- m_max_size: '500'
- l_max_size: '1000'
- fail_if_xl: 'false'
- message_if_xl: >
- It looks like this PR is very large (over 1000 lines).
- Try to avoid addressing multiple issues in a single PR, and
- in the future consider breaking large tasks down into smaller steps.
+ with:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ xs_max_size: '10'
+ s_max_size: '100'
+ m_max_size: '500'
+ l_max_size: '1000'
+ s_label: '🟩 PR - Small'
+ m_label: '🟨 PR - Medium'
+ l_label: '🟧 PR - Large'
+ xl_label: '🟥 PR - XL'
+ fail_if_xl: 'false'
+ message_if_xl: >
+ It looks like this PR is very large (over 1000 lines).
+ Try to avoid addressing multiple issues in a single PR, and
+ in the future consider breaking large tasks down into smaller steps.
+ This it to make reviewing, testing, reverting and general quality management easier.
diff --git a/.github/workflows/issue-spam-control.yml b/.github/workflows/issue-spam-control.yml
index c10a6521..86491c3e 100644
--- a/.github/workflows/issue-spam-control.yml
+++ b/.github/workflows/issue-spam-control.yml
@@ -1,22 +1,28 @@
-# Will add a comment and close new issues opened by users that may be spam, or have not starred
-# Is still a work in progress, will also detect if user has previous activity in repo and check when joined GH
+# Will add a comment and close any new issues opened by
+# users who have not yet committed to, or starred the repo
name: 🎯 Issue Spam Control
on:
issues:
types: [opened, reopened]
jobs:
- check:
- if: ${{ ! contains( github.event.issue.labels.*.name, 'keep-open') }}
+ check-user:
+ if: >
+ ${{
+ ! contains( github.event.issue.labels.*.name, '📌 Keep Open') &&
+ ! contains( github.event.issue.labels.*.name, '🌈 Feedback') &&
+ ! contains( github.event.issue.labels.*.name, '💯 Showcase') &&
+ github.event.comment.author_association != 'CONTRIBUTOR'
+ }}
runs-on: ubuntu-latest
name: Close issue opened by non-stargazer
steps:
- name: close
uses: uhyo/please-star-first@v1
with:
- token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
message: |
Welcome to Dashy 👋
- It's great to have you here, but unfortunately your ticket has been closed to prevent spam and low quality issues. Please ensure the following criteria are met, before reopening this issue.
+ It's great to have you here, but unfortunately your ticket has been closed to prevent spam. Before reopening this issue, please ensure the following criteria are met.
Issues are sometimes closed when users:
- Have only recently joined GitHub
@@ -28,4 +34,4 @@ jobs:
- You have checked the documentation for an existing solution
- You have completed the relevant sections in the Issue template
- Once you have verified the above standards are met, you may reopen this issue.
+ Once you have verified the above standards are met, you may reopen this issue. Sorry for any inconvenience caused, I'm just a bot, and sometimes make mistakes 🤖
diff --git a/.github/workflows/issue-translator.yml b/.github/workflows/issue-translator.yml
index 2f4967c5..c7db30ce 100644
--- a/.github/workflows/issue-translator.yml
+++ b/.github/workflows/issue-translator.yml
@@ -12,7 +12,7 @@ jobs:
steps:
- uses: tomsun28/issues-translate-action@v2.5
with:
- BOT_GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+ BOT_GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
BOT_LOGIN_NAME: liss-bot
IS_MODIFY_TITLE: true
CUSTOM_BOT_NOTE: It looks like this issue isn't in English - not a problem, here's the translation! 🇬🇧
diff --git a/.github/workflows/label-sponsors.yml b/.github/workflows/label-sponsors.yml
index a18a4b85..5acab87d 100644
--- a/.github/workflows/label-sponsors.yml
+++ b/.github/workflows/label-sponsors.yml
@@ -2,8 +2,6 @@
# In order to allow their request can be prioritized
name: 🎯 Label sponsors
on:
- pull_request:
- types: [opened]
issues:
types: [opened]
jobs:
diff --git a/.github/workflows/label-top-issues.yml b/.github/workflows/label-top-issues.yml
new file mode 100644
index 00000000..fc6d6ba7
--- /dev/null
+++ b/.github/workflows/label-top-issues.yml
@@ -0,0 +1,18 @@
+# Applies the 'Top Issue' label to tickets with most user reactions
+name: 🎯 Label Top Issues
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 1 * * *' # Run at 01:00 each day
+jobs:
+ labelTopIssues:
+ name: Label Top Issues
+ runs-on: ubuntu-latest
+ steps:
+ - name: Label Issues
+ uses: adamzolyak/top-issues-action@master
+ env:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ TOP_NUMBER_OF_ISSUES: 10
+ TOP_LABEL_NAME: "👍 Top 10 Issue!"
+ TOP_LABEL_COLOR: FBCA04
diff --git a/.github/workflows/lgtm-comment.yml b/.github/workflows/lgtm-comment.yml
index aeb9f99a..d0ccf496 100644
--- a/.github/workflows/lgtm-comment.yml
+++ b/.github/workflows/lgtm-comment.yml
@@ -24,4 +24,4 @@ jobs:
- uses: ddradar/lgtm-action@v1
with:
image-url: ${{ steps.act.outputs.selected }}
- token: ${{ secrets.BOT_GITHUB_TOKEN }}
\ No newline at end of file
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/manage-pending-labels-closed.yml b/.github/workflows/manage-pending-labels-closed.yml
new file mode 100644
index 00000000..10a05894
--- /dev/null
+++ b/.github/workflows/manage-pending-labels-closed.yml
@@ -0,0 +1,17 @@
+# When a new comment is added to an issue, if it had the Stale or Awaiting User Response labels,
+# then those labels will be removed, providing it was not user lissy93 who added the commend.
+name: 🎯 Remove Pending Labels on Close
+on:
+ issues:
+ types: [closed]
+jobs:
+ remove-labels:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Remove Labels when Closed
+ uses: actions-cool/issues-helper@v2
+ with:
+ actions: remove-labels
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ issue-number: ${{ github.event.issue.number }}
+ labels: '🚏 Awaiting User Response,⚰️ Stale,👤 Awaiting Maintainer Response'
diff --git a/.github/workflows/manage-pending-labels.yml b/.github/workflows/manage-pending-labels.yml
new file mode 100644
index 00000000..9ade47b0
--- /dev/null
+++ b/.github/workflows/manage-pending-labels.yml
@@ -0,0 +1,48 @@
+# When a new comment is added to an issue, if it had the Stale or Awaiting User Response labels,
+# then those labels will be removed, providing it was not user lissy93 who added the commend.
+name: 🎯 Add/ Remove Awaiting Response Labels
+on:
+ issue_comment:
+ types: [created]
+jobs:
+ remove-stale:
+ runs-on: ubuntu-latest
+ if: ${{ github.event.comment.author_association != 'COLLABORATOR' && github.event.comment.author_association != 'OWNER' }}
+ steps:
+ - name: Remove Stale labels when Updated
+ uses: actions-cool/issues-helper@v2
+ with:
+ actions: remove-labels
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ issue-number: ${{ github.event.issue.number }}
+ labels: '🚏 Awaiting User Response,⚰️ Stale'
+
+ add-awaiting-author:
+ runs-on: ubuntu-latest
+ if: >
+ ${{
+ !github.event.issue.pull_request
+ && github.event.comment.author_association != 'COLLABORATOR'
+ && github.event.comment.author_association != 'OWNER'
+ && github.event.issue.state === 'open'
+ }}
+ steps:
+ - name: Add Awaiting Author labels when Updated
+ uses: actions-cool/issues-helper@v2
+ with:
+ actions: add-labels
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ issue-number: ${{ github.event.issue.number }}
+ labels: '👤 Awaiting Maintainer Response'
+
+ remove-awaiting-author:
+ runs-on: ubuntu-latest
+ if: ${{ github.event.comment.author_association == 'OWNER' }}
+ steps:
+ - name: Remove Awaiting Author labels when Updated
+ uses: actions-cool/issues-helper@v2
+ with:
+ actions: remove-labels
+ token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ issue-number: ${{ github.event.issue.number }}
+ labels: '👤 Awaiting Maintainer Response'
diff --git a/.github/workflows/mind-your-language.yml b/.github/workflows/mind-your-language.yml
index fd97fbc3..a4bf8590 100644
--- a/.github/workflows/mind-your-language.yml
+++ b/.github/workflows/mind-your-language.yml
@@ -2,17 +2,11 @@
name: 🎯 Mind your language
on:
issues:
- types:
- - opened
- - edited
+ types: [opened]
issue_comment:
- types:
- - created
- - edited
- pull_request_review_comment:
- types:
- - created
- - edited
+ types: [created]
+ pull_request:
+ types: [opened]
jobs:
echo_issue_comment:
runs-on: ubuntu-latest
@@ -23,4 +17,4 @@ jobs:
- name: Profanity check step
uses: tailaiw/mind-your-language-action@v1.0.3
env:
- GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
\ No newline at end of file
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/pr-commenter.yml b/.github/workflows/pr-commenter.yml
index 09e73744..8e13f6d3 100644
--- a/.github/workflows/pr-commenter.yml
+++ b/.github/workflows/pr-commenter.yml
@@ -7,7 +7,7 @@ jobs:
steps:
- uses: exercism/pr-commenter-action@v1.3.0
with:
- github-token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ github-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
config-file: .github/pr-auto-comments.yml
template-variables: |
{ "prAuthor": "${{ github.event.pull_request.user.login }}" }
diff --git a/.github/workflows/pr-labler.yml b/.github/workflows/pr-labler.yml
new file mode 100644
index 00000000..c65ad46c
--- /dev/null
+++ b/.github/workflows/pr-labler.yml
@@ -0,0 +1,12 @@
+# Labels pull requests based on their branch name
+name: 💡 PR Branch Labeler
+on: pull_request
+jobs:
+ label-pr:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Label PR
+ if: github.event.action == 'opened'
+ uses: ffittschen/pr-branch-labeler@v1
+ with:
+ repo-token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/raise-issue-from-todo.yml b/.github/workflows/raise-issue-from-todo.yml
index f4afd3d5..18d229f9 100644
--- a/.github/workflows/raise-issue-from-todo.yml
+++ b/.github/workflows/raise-issue-from-todo.yml
@@ -10,4 +10,4 @@ jobs:
uses: "alstr/todo-to-issue-action@v4.2"
id: "todo"
with:
- TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
\ No newline at end of file
+ TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/release-commenter.yml b/.github/workflows/release-commenter.yml
index 4a9fe266..4f2ab187 100644
--- a/.github/workflows/release-commenter.yml
+++ b/.github/workflows/release-commenter.yml
@@ -9,7 +9,7 @@ jobs:
steps:
- uses: apexskier/github-release-commenter@v1
with:
- GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
label-template: 🛩️ Released {release_tag}, 🔨 Fixed
comment-template: |
**The fix for this issue has now been released in {release_name} ✨**
diff --git a/.github/workflows/repo-visualization.yml b/.github/workflows/repo-visualization.yml
index f0fdc46c..3d5db92e 100644
--- a/.github/workflows/repo-visualization.yml
+++ b/.github/workflows/repo-visualization.yml
@@ -1,16 +1,17 @@
-# Generates diagram showing file breakdown
-name: 📊 Generate Repo Visualization
+# Generates series of diagrams and visualizations
+name: 📊 Generate Repo Stats
on:
workflow_dispatch: # Manual dispatch
schedule:
- cron: '0 1 * * 0' # At 01:00 on Sunday.
+
jobs:
- build:
+ # File structure chart
+ file-structure:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@master
-
- name: Generate File Structure Diagram
uses: githubocto/repo-visualizer@0.7.1
with:
@@ -19,12 +20,33 @@ jobs:
excluded_paths: dist,node_modules
commit_message: ':yellow_heart: Updates repo diagram'
branch: master
-
+
+ # Hercules git branching stats
+ git-stats:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@master
+ with:
+ fetch-depth: 0
+ - name: Hercules
+ uses: src-d/hercules@master
+ - uses: actions/upload-artifact@master
+ with:
+ name: hercules_charts
+ path: hercules_charts.tar
+
+ # Lowlighter metrics community metrics
+ community-stats:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@master
- name: Generate Repo Metrics
uses: lowlighter/metrics@latest
with:
token: ${{ secrets.LISSY93_PAT }}
- committer_token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ committer_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
committer_branch: master
committer_message: ':purple_heart: Adds repo metrics'
filename: docs/assets/repo-metrics.*
@@ -32,12 +54,12 @@ jobs:
user: Lissy93
repo: dashy
delay: 5
-
+
- name: Generate License Metrics
uses: lowlighter/metrics@latest
with:
token: ${{ secrets.LISSY93_PAT }}
- committer_token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ committer_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
committer_branch: master
committer_message: ':purple_heart: Adds license metrics'
filename: docs/assets/license-metrics.*
@@ -54,7 +76,7 @@ jobs:
uses: lowlighter/metrics@latest
with:
token: ${{ secrets.LISSY93_PAT }}
- committer_token: ${{ secrets.BOT_GITHUB_TOKEN }}
+ committer_token: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
committer_branch: master
committer_message: ':purple_heart: Adds contributor metrics'
filename: docs/assets/controbutor-metrics.*
@@ -67,5 +89,4 @@ jobs:
plugin_contributors_ignored: bot
plugin_contributors_contributions: yes
plugin_contributors_sections: contributors
-
-
+
\ No newline at end of file
diff --git a/.github/workflows/save-repo-analytics.yml b/.github/workflows/save-repo-analytics.yml
new file mode 100644
index 00000000..962a09ca
--- /dev/null
+++ b/.github/workflows/save-repo-analytics.yml
@@ -0,0 +1,15 @@
+name: 📊 Save Repo Analytics
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 1 * * 0' # At 01:00 on Sunday.
+jobs:
+ gen-stats:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Repo Analytics
+ uses: jgehrcke/github-repo-stats@HEAD
+ with:
+ repository: lissy93/dashy
+ databranch: DATA/repo-stats
+ ghtoken: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/.github/workflows/unfurl-links.yml b/.github/workflows/unfurl-links.yml
new file mode 100644
index 00000000..c2a2146d
--- /dev/null
+++ b/.github/workflows/unfurl-links.yml
@@ -0,0 +1,17 @@
+# Expands any raw pasted link in comments. Useful so people know what they're clicking
+name: 🎯 Unfurl Links
+on:
+ issues:
+ types: [opened]
+ issue_comment:
+ types: [created]
+ pull_request:
+ types: [opened]
+jobs:
+ run:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: wow-actions/unfurl-links@v1
+ with:
+ GITHUB_TOKEN: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
+ raw: true
diff --git a/.github/workflows/wiki-sync.yml b/.github/workflows/wiki-sync.yml
index c700a967..6825ef3a 100644
--- a/.github/workflows/wiki-sync.yml
+++ b/.github/workflows/wiki-sync.yml
@@ -13,7 +13,7 @@ jobs:
- name: Upload Docs to GH Wiki
uses: docker://decathlon/wiki-page-creator-action:latest
env:
- GH_PAT: ${{ secrets.BOT_GITHUB_TOKEN }}
+ GH_PAT: ${{ secrets.BOT_GITHUB_TOKEN || secrets.GITHUB_TOKEN }}
ACTION_MAIL: alicia-gh-bot@mail.as93.net
ACTION_NAME: liss-bot
OWNER: Lissy93
diff --git a/README.md b/README.md
index 024d2dd4..a63e3b7f 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
Dashy
- Dashy helps you organize your self-hosted services, by making them all accessible from a single place
+ Dashy helps you organize your self-hosted services by making them accessible from a single place
@@ -49,6 +49,7 @@
- [🌎 Language Switching](#language-switching-)
- [🌳 Dashboard Info](#setting-dashboard-info-)
- **Community**
+ - [📊 System Requirements](#system-requirements-)
- [🙋♀️ Getting Help](#getting-help-%EF%B8%8F)
- [🐛 Raising Issues](#raising-issues-)
- [💖 Supporting Dashy](#supporting-dashy-)
@@ -65,47 +66,39 @@
## Features 🌈
-- 🔎 Instant search by name, domain and tags - just start typing + customizable keyboard shortcuts
+- 🔎 Instant search by name, domain or tags + customizable hotkeys & keyboard shortcuts
- 🎨 Multiple built-in color themes, with UI color editor and support for custom CSS
-- 🧸 Many options for icons, including Font-Awesome support, auto-fetching favicon, images and emojis
-- 🚦 Service status feature for each of your apps / links, for basic availability and uptime monitoring
-- 💂 Optional authentication with multi-user support, configurable privileges and SSO support
-- ☁ Optional encrypted cloud backup and restore feature available
-- 💼 A workspace view, for easily switching between multiple apps at once
+- 🧸 Many icon options - Font-Awesome, homelab icons, auto-fetching favicon, images, emojis, etc.
+- 🚦 Status monitoring for each of your apps / links for basic availability and uptime checking
+- 💂 Optional authentication with multi-user access, configurable privileges and SSO support
+- 🌎 Multi-language support, with 10+ human-translated languages, and more on the way
+- ☁ Optional, encrypted, free off-site cloud backup and restore feature available
+- 💼 A workspace view, for easily switching between multiple apps at simultaneously
- 🛩️ A minimal view, for use as a fast-loading browser startpage
-- 🖱️ Choose how to launch apps, either new tab, same tab, a pop-up modal or in the workspace view
-- 🌎 Multi-language support, with more languages being added regularly
-- 📏 Customizable layout, sizes, text, component visibility, sort order, behavior etc
-- 🖼️ Option for full-screen background image, custom nav-bar links, html footer, title, and more
+- 🖱️ Choose app launch method, either new tab, same tab, a pop-up modal or in the workspace view
+- 📏 Customizable layout, sizes, text, component visibility, sort order, behavior etc.
+- 🖼️ Option for full-screen background image, custom nav-bar links, html footer, title, etc.
- 🚀 Easy to setup with Docker, or on bare metal, or with 1-Click cloud deployment
-- ⚙️ Easy single-file YAML-based configuration, with option to configure app directly through the UI
-- 🤏 Small bundle size, fully responsive UI and PWA makes the app easy to use on any device
+- ⚙️ Easy single-file YAML-based configuration, and option to configure app through the UI
- ✨ Under active development with improvements and new features added regularly
+- 🤏 Small bundle size, fully responsive UI and PWA for basic offline access
- 🆓 100% free and open source
- 🔐 Strong focus on privacy
-- 🌈 Plus lots more...
+- 🌈 And loads more...
## Demo ⚡
-> For more examples of Dashy in action, see: [**The Showcase**](./docs/showcase.md)
+**Live Instances**: [Demo 1](https://demo.dashy.to) (Live Demo) ┆ [Demo 2](https://live.dashy.to) (Dashy Links) ┆ [Demo 3](https://dev.dashy.to) (Dev Preview)
-#### Live Demos
-[Demo 1](https://dashy-demo-1.as93.net) ┆ [Demo 2](https://dashy-demo-2.as93.net) ┆ [Demo 3](https://dashy-demo-3.as93.net)
+**Screenshots**: Checkout the [Showcase](./docs/showcase.md), to see example dashboards from the community
+
+**Spin up your own demo**: [](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml) or [`docker run -p 8080:80 lissy93/dashy`](./docs/quick-start.md)
-#### Spin up your own Demo
-- 1-Click Deploy: [](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml)
-- Or on your own machine: `docker run -p 8080:80 lissy93/dashy`
- - See the [Quick Start Guide](./docs/quick-start.md) for getting Dashy up and running in under 5 minutes
-#### Demo GIF
-#### User Showcase
-Are using Dashy? Want to share your dashboard here too - [Submit your Screenshots to the Showcase](./docs/showcase.md#submitting-your-dashboard)!
-
-
**[⬆️ Back to Top](#dashy)**
@@ -135,15 +128,9 @@ docker run -d \
```
[](https://hub.docker.com/r/lissy93/dashy)
-If you prefer to use Docker Compose, [here is an example](./docs/deployment.md#using-docker-compose).
+See also examples [with Docker Compose](./docs/deployment.md#using-docker-compose). Dashy is also available via GHCR, and tags for other architectures (`arm32-7`, `arm64-v8`, etc) and set versions are supported
-Dashy is also available through GHCR, run: `docker pull ghcr.io/lissy93/dashy`.
-
-To use Dashy on an system other than `amd64`, then use [one of these tags](https://hub.docker.com/r/lissy93/dashy/tags). There are containers for `arm32-7`, `arm64-v8` and a multi-architecture image.
-
-The image defaults to `:latest`, but you can instead specify a specific version, e.g. `docker pull lissy93/dashy:release-1.5.0`
-
-> Once you've got Dashy running, you can take a look at [App Management Docs](./docs/management.md), for info on using health checks, provisioning assets, configuring web servers, securing your app, logs, performance and more.
+> Once you've got Dashy running, see [App Management Docs](./docs/management.md), for info on using health checks, updating, backups, web-server configs, logs, performance, security and more.
### Deploying from Source 🚀
@@ -177,13 +164,7 @@ Dashy supports 1-Click deployments on several popular cloud platforms. To spin u
> For full configuration documentation, see: [**Configuring**](./docs/configuring.md)
-All of Dashy's configuration is specified in a single [YAML](https://yaml.org/) file, located at `./public/conf.yml`. You can find a complete list of available options in th [Configuring Docs](/docs/configuring.md). If you're using Docker, you'll probably want to pass this file in as a Docker volume (e.g. `-v /root/my-local-conf.yml:/app/public/conf.yml`).
-
-The config can also be edited directly through the UI, with changes written to your conf.yml file. After making any modifications the app needs to be rebuilt, which will happen automatically or can be trigger with `yarn build` or directly through the UI.
-
-You can check that your config is valid and matches Dashy's [schema](https://github.com/Lissy93/dashy/blob/master/src/utils/ConfigSchema.json), by running: `yarn validate-config`.
-
-Finally, you may find these [example config](https://gist.github.com/Lissy93/000f712a5ce98f212817d20bc16bab10) helpful for getting you started.
+Dashy is configured through a YAML file, located at `./public/conf.yml`. You can find a complete list of available options in th [Configuring Docs](/docs/configuring.md). The config can also be edited and saved directly through the UI.
**[⬆️ Back to Top](#dashy)**
@@ -193,14 +174,14 @@ Finally, you may find these [example config](https://gist.github.com/Lissy93/000
> For full theming documentation, see: [**Theming**](./docs/theming.md)
+Dashy comes pre-bundled with several built-in themes, which you can preview, applied and edited through the UI. With the theme configurator, and support for custom CSS, everything is in place for you to easily develop your own unique looking dashboard.
+
-Dashy comes with a number of built-in themes, but it's also easy to make you're own. You can either use the color editor, or you're own custom CSS. All colors, and most other CSS properties are specified using CSS variables, which are [documented here](./docs/theming.md#css-variables), so customizing the look and feel of Dashy very easy. Learn more about adding your own theme in the [docs](https://github.com/Lissy93/dashy/blob/master/docs/theming.md#adding-your-own-theme).
-
@@ -215,20 +196,28 @@ Dashy comes with a number of built-in themes, but it's also easy to make you're
> For full iconography documentation, see: [**Icons**](./docs/icons.md)
-Both sections and items can have an icon associated with them, and defined under the `icon` attribute. There are many options for icons, including Font Awesome support, automatic fetching from favicon, emojis, programmatically generated icons and direct local or remote URLs.
+Both sections and items can have an icon associated with them, defined under the `icon` attribute. With several different icon packs supported, you'll be able to find the perfect thumbnail for any app or service.
+
+The following icon types are supported:
+- **Favicon** - Automatically fetch an apps icon from it's favicon or logo image
+- **Icon Packs** - Use any icon from [font-awesome], [simple-icons] or [material icons]
+- **Emoji** - Any valid emoji can be used as an icon
+- **Generative** - Unique, auto-generated images for easily identifying services
+- **URL** - Pass the URL of any valid image in to have it fetched and rendered
+- **Local** - Store custom images locally, and reference by filename
+- **Homelab Icons** - Using [dashboard-icons] for logos of commonly self-hosted services
+
+
+[font-awesome]: https://fontawesome.com/icons
+[simple-icons]: https://simpleicons.org/
+[material icons]: https://github.com/Templarian/MaterialDesign
+[dashboard-icons]: https://github.com/WalkxCode/dashboard-icons
+
-- **Favicon**: Set `icon: favicon` to fetch a services icon automatically from the URL of the corresponding application
-- **Font-Awesome**: To use any font-awesome icon, specify the category, followed by the icon name, e.g. `fas fa-rocket` or `fab fa-monero`. You can also use Pro icons if you have a license key, just set it under `appConfig.fontAwesomeKey`
-- **Simple Icons**: Use any brand/ logo icon from [simpleicons.org](https://simpleicons.org/) by setting the icon to `si-[icon-name]`
-- **Emoji**: Use an emoji as a tile icon, by putting the emoji's code as the icon attribute. Emojis can be specified either as emojis (`🚀`), unicode (`'U+1F680'`) or shortcode (`':rocket:'`)
-- **Generative**: Setting `icon: generative`, will generate a unique logo for a given service, based on it's specified URL or IP
-- **URL**: You can also pass in a URL to an icon asset, hosted either locally or using any CDN service. E.g. `icon: https://i.ibb.co/710B3Yc/space-invader-x256.png`
-- **Local Image**: To use a local image, store it in `./public/item-icons/` (or create a volume in Docker: `-v /local/image/directory:/app/public/item-icons/`) , and reference it by name and extension - e.g. set `icon: image.png` to use `./public/item-icon/image.png`. You can also use sub-folders here
-- **Material Design Icons**: You can also use any icon from [materialdesignicons.com](https://dev.materialdesignicons.com/icons) by setting the icon to `mdi-[icon-name]`
**[⬆️ Back to Top](#dashy)**
@@ -238,11 +227,9 @@ Both sections and items can have an icon associated with them, and defined under
> For full monitoring documentation, see: [**Status Indicators**](./docs/status-indicators.md)
-Dashy has an optional feature that can display a small icon next to each of your running services, indicating it's current status. This is useful if you are using Dashy as your homelab's start page, as it gives you an overview of the health of each of your running services. Hovering over the indicator will show additional information, including average response time and an error message for services which are down.
+Dashy has an optional feature that can check if each app/ service is up and responding, then display a small status indicator icon. Hovering over it will show additional stats like response time and status code.
-By default, this feature is off, but you can enable it globally by setting `appConfig.statusCheck: true`, or enable/ disable it for an individual item, with `item[n].statusCheck`.
-
-You can also specify an time interval in seconds under `appConfig.statusCheckInterval`, between checks, if this value is `0`, then status is only checked on initial page load, which is the default behavior. Status checks use the `url` attribute, but to call a different endpoint instead, you can set `statusCheckUrl`. Custom headers can also be specified using `statusCheckHeaders`.
+Status indicators can be globally enabled by setting `appConfig.statusCheck: true`, or enabled/ disabled on a per-item basis. Status is checked on page load, but you can enable continuous polling by specifying a time interval between checks, in seconds under `appConfig.statusCheckInterval`. You can also use a different endpoint for status checking, with `statusCheckUrl`, and if needed pass in custom headers under `statusCheckHeaders`.
@@ -256,9 +243,10 @@ You can also specify an time interval in seconds under `appConfig.statusCheckInt
> For full authentication documentation, see: [**Authentication**](./docs/authentication.md)
-Dashy now has full support for secure single-sign-on using [Keycloak](https://www.keycloak.org/)! This provides secure, easy single-sign on. See [setup docs](/docs/authentication.md#keycloak) for a full usage guide
+Dashy has full support for secure single-sign-on using [Keycloak](https://www.keycloak.org/) for secure, easy authentication, see [setup docs](/docs/authentication.md#keycloak) for a full usage guide.
+
+There is also a basic auth feature, which doesn't require any additional setup. To enable this, just add an `auth` attribute under `appConfig`, containing an array of `users`, each with a username, SHA-256 hashed password and optional user type. Basic auth also has support for several access control features, including read-only guest access and granular controls.
-There is also a simple login feature for basic access control, which doesn't require any additional setup. To enable this feature, add an `auth` attribute under `appConfig`, containing an array of `users`, each with a username, SHA-256 hashed password and optional user type.
```yaml
appConfig:
@@ -269,57 +257,19 @@ appConfig:
type: admin
```
-**Guest Access**: By default, when authentication is configured no user can access your dashboard without first logging in. If you would like to allow for read-only access by unauthenticated users, then you can enable guest mode, by setting `appConfig.auth.enableGuestAccess: true`.
-
-**Granular Controls**: With basic login, it is also possible to control which sections are visible to which users. Under the `displayData` property of a section, you can pass an array of usernames to one of the following attributes:
-- `hideForUsers` - Section will be visible to all users, except for those specified in this list
-- `showForUsers` - Section will be hidden from all users, except for those specified in this list
-- `hideForGuests` - Section will be visible for all logged in users, but not for guests (if guest access is enabled)
-
-
-
-
-
-**Note**: The simple auth method handles access control on the frontend, and therefore in security-critical situations, it is recommended to use an alternate method for authentication, like [Keycloak](docs/authentication.md#keycloak) or one of the [alternatives](docs/authentication.md#alternative-authentication-methods).
+Other access control systems are also supported, see the [Alternative Auth Methods](./docs/authentication.md#alternative-authentication-methods) docs.
**[⬆️ Back to Top](#dashy)**
---
-## Opening Methods 🖱️
-
-> For full documentation on views and opening methods, see: [**Alternate Views**](./docs/alternate-views.md)
-
-One of the primary purposes of Dashy is to make launching commonly used apps and services as quick as possible. To aid in this, there are several different options on how items can be opened. You can configure your preference by setting the `target` property of any item, to one of the following values:
-- `sametab` - The app will be launched in the current tab
-- `newtab` - The app will be launched in a new tab
-- `modal` - Launch app in a resizable/ movable popup modal on the current page
-- `workspace` - Changes to Workspace view, and launches app
-
-Even if the target is not set (or is set to `sametab`), you can still launch any given app in an alternative method: Alt + Click will open the modal, and Ctrl + Click will open in a new tab. You can also right-click on any item to see all options (as seen in the screenshot below). This custom context menu can be disabled by setting `appConfig.disableContextMenu: true`.
-
-In the workspace view, you can keep previously opened websites/ apps open in the background, by setting `appConfig.enableMultiTasking: true`. This comes at the cost of performance, but does mean that your session with each app is preserved, enabling you to quickly switch between your apps.
-
-
-
-
-
-The modal and workspace views work by rendering the target application in an iframe. If you are getting a a `Refused to Connect` error, then you need to set the HTTP response header [`X-Frame-Options`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options) to `ALLOW [url-for-dashy]`. See [the docs](./docs/troubleshooting.md#refused-to-connect-in-modal-or-workspace-view) for instructions on how to do this.
-
----
-
## Alternate Views 👓
As well as the default homepage, there is also:
- A minimal view, useful for use as a browser start page
- A workspace view, useful for visiting many apps simultaneously
-
-You can change the view from the UI, using the switch icon in the top-right corner, or select a default view in the config, under `appConfig.startingView` attribute (can be either `default`, `minimal` or `workspace`). Clicking the page title on any view will take you back to your default starting view.
+
+You can change the view from the UI, using the switch icon in the top-right corner, or select a default view in the config, under `appConfig.startingView` attribute.
Example of Workspace View
@@ -335,51 +285,47 @@ You can change the view from the UI, using the switch icon in the top-right corn
---
+## Opening Methods 🖱️
+
+> For full documentation on views and opening methods, see: [**Alternate Views**](./docs/alternate-views.md)
+
+There are several different ways apps can be launched. You can specify the default opening method for any given item under the `target` attribute, or set a site-wide default under `appConfig.defaultOpeningMethod`. Right-click on an item to item for all options. The following options are supported:
+- `sametab` - The app will be launched in the current tab
+- `newtab` - The app will be launched in a new tab (or use Ctrl + Click)
+- `modal` - Launch app in a resizable/ movable popup modal on the current page (or use Alt + Click)
+- `workspace` - Changes to Workspace view, and launches app
+- `top` - Opens in the top-most browsing context, useful if your accessing Dashy through an iframe
+
+---
+
## Searching and Shortcuts 🔎
> For full documentation on searching, see: [**Searching & Shortcuts**](./docs/searching.md)
Quickly finding and launching applications is the primary aim of Dashy. To that end instant search and customizable keyboard shortcuts are built-in.
-To start filtering, just start typing. No need to select the search bar or use any special key. You can then use either the tab key or arrow keys to select and move between results, and hit enter to launch the currently selected application. You can also use `Alt + Enter` on a selected app to launch it in a popup modal, `Ctrl + Enter` to open in new tab, or right-click on it to see all opening methods.
+To start filtering, just start typing. No need to select the search bar or use any special key. Then use either the tab key or arrow keys to select and move between results, and hit enter to launch the currently selected application.
+
+For apps that you use regularly, you can set a custom keybinding. Use the `hotkey` parameter on a certain item to specify a numeric key, between `0 - 9`. You can then launch that app, by just pressing that key.
You can also add custom tags to a given item, to make finding them based on keywords easier. For example, in the following example, searching for 'Movies' will show 'Plex'
```yaml
items:
- title: Plex
- description: Media library
+ hotkey: 8
icon: favicon
+ description: Media library
url: https://plex.lab.local
tags: [ movies, videos, music ]
```
-For apps that you use regularly, you can set a custom keybinding. Use the `hotkey` parameter on a certain item to specify a numeric key, between `0 - 9`. You can then launch that app, by just pressing that key, which is very useful for services you use frequently.
-
-Example:
-
-```yaml
-- title: Bookstack
- icon: far fa-books
- url: https://bookstack.local/
- hotkey: 8
-```
-
-To search the web directly through Dashy, just press enter after typing your query. Options for web search are set under `appConfig.webSearch`. There is built in support for [10+ search engines](./docs/searching.md#setting-search-engine), or [use your own custom provider](./docs/searching.md#using-custom-search-engine) or self-hosted instance.
-To disable web search all together, set: `webSearch: { disableWebSearch: true }`
+To search the web directly through Dashy, just press enter after typing your query. Options for web search are set under `appConfig.webSearch`. There is built in support for [10+ search engines](./docs/searching.md#setting-search-engine), or [use your own custom provider](./docs/searching.md#using-custom-search-engine) or self-hosted instance. With the web search, you can also define your own bangs, to redirect results to any given app, website or search engine, when the query is preceded with a certain character sequence (usually beginning in `/`, `!` or `:`).
```yaml
webSearch:
searchEngine: duckduckgo
openingMethod: newtab
-```
-
-With the web search, you can also define your own bangs, to redirect results to any given app, website or search engine, when the query is preceded with a certain character sequence (usually beginning in `/`, `!` or `:`).
-
-For example, with the below code, typing `:git dashy` will search GitHub for Dashy, or `/w docker` will open the Docker Wikipedia page.
-
-```yaml
-webSearch:
searchBangs:
/r: reddit
/w: wikipedia
@@ -398,16 +344,21 @@ Hit `Esc` at anytime to close any open apps, clear the search field, or hide any
## Config Editor ⚙️
> For full config documentation, see: [**Configuring**](./docs/configuring.md)
-From the Settings Menu in Dashy, you can download, backup, edit and rest your config. The editor will tell you if you've got any validation warnings.
+As well as passing in a YAML config file, you can also configure the app directly through the UI, and preview changes live.
+
+To edit any section or item, right-click on it, and select "Edit", or enter the Edit Mode (using the Pen icon in the top-right), then click any part of the page to edit. Changes will be visible immediately, but will not be saved until you click "Save to Disk" or "Save Locally".
+
+Under the config menu, you can export, view, backup, or reset app config, as well as edit the raw config file in a text editor, with built-in schema validation. It's recommended to keep a backup of your config.
+
+
+
+
-A full list of available config options can be found [here](./docs/configuring.md). It's recommend to make a backup of your configuration, as you can then restore it into a new instance of Dashy, without having to set it up again. [json2yaml](https://www.json2yaml.com/) is very useful for converting between YAML to JSON and visa versa.
-**Update:** A new and improved drag-and-drop UI editor is in progress, and should be released within the next couple of weeks!
-
**[⬆️ Back to Top](#dashy)**
---
@@ -416,15 +367,9 @@ A full list of available config options can be found [here](./docs/configuring.m
> For full backup documentation, see: [**Cloud Backup & Sync**](./docs/backup-restore.md)
-Dashy has an **optional** built-in feature for securely backing up your config to a hosted cloud service, and then restoring it on another instance. This feature is totally optional, and if you do not enable it, then Dashy will not make any external network requests.
+Dashy has an **optional** built-in feature for securely backing up your config to a hosted cloud service, and then restoring it on another instance. This is useful not only for backing up your configuration off-site, but it also enables Dashy to be used without having write a YAML config file.
-This is useful not only for backing up your configuration off-site, but it also enables Dashy to be used without having write a YAML config file, and in the future there will allow the use of the public hosted instance of Dashy for users without a server.
-
-All data is fully E2E encrypted before being sent to the backend. In Dashy, this is done in [`CloudBackup.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/CloudBackup.js), using [crypto.js](https://github.com/brix/crypto-js)'s AES method, with the users chosen password as the key. The data is then sent to a [Cloudflare worker](https://developers.cloudflare.com/workers/learning/how-workers-works), and stored in a [KV](https://developers.cloudflare.com/workers/learning/how-kv-works) data store.
-
-
-
-
+All data is fully E2E encrypted before being sent to the backend (done in [`CloudBackup.js`](https://github.com/Lissy93/dashy/blob/master/src/utils/CloudBackup.js) using [crypto.js](https://github.com/brix/crypto-js)'s AES method). The data is then sent to a [Cloudflare worker](https://developers.cloudflare.com/workers/learning/how-workers-works), and stored in a [KV](https://developers.cloudflare.com/workers/learning/how-kv-works) data store.
**[⬆️ Back to Top](#dashy)**
@@ -433,7 +378,7 @@ All data is fully E2E encrypted before being sent to the backend. In Dashy, this
## Language Switching 🌎
> For full internationalization documentation, see: [**Multi-Language Support**](./docs/multi-language-support.md)
-Dashy supports multiple languages and locales. When available, you're language should be automatically detected and applied on load, based on your browser or systems settings. But you can also select a language through the UI (under Config --> Switch Language), or set `appConfig.language` to your language (specified as a 2-digit [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)).
+Dashy supports multiple languages and locales. When available, your language should be automatically detected and applied on load. But you can also select a language through the UI (under Config --> Switch Language), or set `appConfig.language` to your language (specified as a 2-digit [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)).
#### Supported Languages
- 🇬🇧 **English**: `en` - _Default_
@@ -441,6 +386,8 @@ Dashy supports multiple languages and locales. When available, you're language s
- 🇳🇱 **Dutch**: `nl` - Contributed by **[@evroon](https://github.com/evroon)**
- 🇲🇫 **French**: `fr` - Contributed by **[@EVOTk](https://github.com/EVOTk)**
- 🇩🇪 **German**: `de` - Contributed by **[@Niklashere](https://github.com/Niklashere)**
+- 🇳🇴 **Norwegian Bokmål**: `nb` - Contributed by **[@rubjo](https://github.com/rubjo)**
+- 🇵🇱 **Polish**: `pl` - Contributed by **[@skaarj1989](https://github.com/skaarj1989)**
- 🇪🇸 **Spanish**: `es` - Contributed by **[@lu4t](https://github.com/lu4t)**
- 🇸🇮 **Slovenian**: `sl` - Contributed by **[@UrekD](https://github.com/UrekD)**
- 🇮🇹 **Italian**: `it` - Machine Translated *(awaiting human review)*
@@ -451,56 +398,39 @@ Dashy supports multiple languages and locales. When available, you're language s
- 🇯🇵 **Japanese**: `ja` - Contributed by Anon
#### Add your Language
-I would love for Dashy to be available to everyone, without language being a barrier to entry for non-native English speakers. If you have a few minutes to sapir, you're help with translating it would be very much appreciated.
-It's quite a quick task, all text is in [a single JSON file](https://github.com/Lissy93/dashy/tree/master/src/assets/locales), and you don't have to translate it all. For more info, see the [Adding a New Language Docs](./docs/multi-language-support.md#adding-a-new-language), and feel free to reach out if you need any support.
+I would love Dashy to be available to everyone, without language being a barrier to entry. If you've got a few minutes to spare, consider adding translations for your language. It's a quick task and all text is in [a single JSON file](https://github.com/Lissy93/dashy/tree/master/src/assets/locales). Since any missing text will fallback to English, you don't need to translate it all.
**[⬆️ Back to Top](#dashy)**
---
-## Setting Dashboard Info 🌳
+## System Requirements 📊
-Page settings are defined under [`pageInfo`](https://github.com/Lissy93/dashy/blob/master/docs/configuring.md#pageinfo). Here you can set things like title, sub-title, navigation links, footer text, etc. For example:
+The hardware requirements vary depending on where and how you are running Dashy. Generally speaking, on a bare metal system or Docker container, 1GB of memory should be more than enough, and depending on whether you are using your own assets, then 1GB of disk space should be sufficient.
-```yaml
-pageInfo:
- title: Home Lab
- description: Dashy
- navLinks:
- - title: Home
- path: /
- - title: Server Monitoring
- path: https://server-start.local
- - title: Start Page
- path: https://start-page.local
- footerText: 'My Awesome Dashboard. Built with Dashy '
-```
+If you are using one of the 1-click cloud deployment methods, serving the app through a CDN or using a static hosting provider, then there are no specific requirements, as the built app is just a series of static JS files, and so is very light-weight.
+
+Dashy also wells run on low-powered ARM-based single board computers, such as a Raspberry Pi (tested on Pi 3)
+
+**Browser Support**
+ |  |  |  | 
+--- | --- | --- | --- | --- |
+Latest ✔ | Latest ✔ | 10+ ✔ | Latest ✔ | 6.1+ ✔ |
+
+---
+
+## Support 🙋♀️
+
+If you're having trouble getting Dashy up and running, or have a question about usage or configuration, feel free to ask. The best place to do this is via [the Discussions](https://github.com/Lissy93/dashy/discussions).
+
+If you've found something which isn't working as it should, please raise a bug by [opening a ticket](https://github.com/Lissy93/dashy/issues/new/choose).
+
+It's best to check the [docs](./docs), [previous issues](https://github.com/Lissy93/dashy/issues?q=label%3A%22%F0%9F%A4%B7%E2%80%8D%E2%99%82%EF%B8%8F+Question%22+) and [troubleshooting guide](./docs/troubleshooting.md) first.
**[⬆️ Back to Top](#dashy)**
---
-## Getting Help 🙋♀️
-
-> For general discussions, check out the **[Discussions Board](https://github.com/Lissy93/dashy/discussions)**
-
-If you're having trouble getting things up and running, feel free to ask a question. The best way to do so is in the [discussion](https://github.com/Lissy93/dashy/discussions), or if you think you think the issue is on Dashy's side, you can [raise a ticket](https://github.com/Lissy93/dashy/issues/new/choose). It's best to check the [docs](./docs) and [previous questions](https://github.com/Lissy93/dashy/issues?q=label%3A%22%F0%9F%A4%B7%E2%80%8D%E2%99%82%EF%B8%8F+Question%22+) first, as you'll likely find the solution there.
-
-**[⬆️ Back to Top](#dashy)**
-
-## Raising Issues 🐛
-
-Found a bug, or something that isn't working as you'd expect? Please raise it as an issue so that it can be resolved. Feature requests are also welcome. Similarlty, feedback is very useful, as it helps me know what areas of Dashy need some improvement.
-
-- [Raise a Bug 🐛](https://github.com/Lissy93/dashy/issues/new?assignees=lissy93&labels=%F0%9F%90%9B+Bug&template=bug.yml&title=%5BBUG%5D+%3Ctitle%3E)
-- [Submit a Feature Request 🦄](https://github.com/Lissy93/dashy/issues/new?template=feature-request.yml)
-- [Share Feedback 🌈](https://github.com/Lissy93/dashy/issues/new?assignees=&labels=%F0%9F%8C%88+Feedback&template=share-feedback.md&title=%5BFEEDBACK%5D)
-
-**Issue Status** [](https://isitmaintained.com/project/lissy93/dashy) [](https://github.com/Lissy93/dashy/issues) [](https://github.com/Lissy93/dashy/issues?q=is%3Aissue+is%3Aclosed) [
-](https://github.com/Lissy93/dashy/discussions)
-
-**[⬆️ Back to Top](#dashy)**
-
## Supporting Dashy 💖
> For full details, and other ways you can help out, see: [**Contributing**](./docs/contributing.md)
@@ -510,9 +440,8 @@ If you're using Dashy, and would like to help support it's development, then tha
Several areas that we need a bit of help with at the moment are:
- Translating - Help make Dashy available to non-native English speakers by [adding youre language](./docs/multi-language-support.md#adding-a-new-language)
- Donate a small amount, by [Sponsoring @Lissy93 on GitHub](https://github.com/sponsors/Lissy93) and receive some extra perks!
-- Complete a [short survey](https://n9fy6xak9yd.typeform.com/to/gl0L68ou), to have your say about future features
+- Complete a [short survey](https://survey.typeform.com/to/gl0L68ou), to have your say about future features
- Share your dashboard in the [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#dashy-showcase-), to provide inspiration for others
-- Join the [discussion](https://github.com/Lissy93/dashy/discussions), help answer other users questions, suggest features, share tips and ask questions
- Spread the word, by sharing Dashy or a screenshot of your dashboard, to help new users discover it
- Submit a PR, to add a new feature, fix a bug, update the docs, add a theme or something else
- Star Dashy on GitHub/ DockerHub or leave an upvote / review on [these platforms](https://github.com/Lissy93/dashy/blob/master/docs/contributing.md#star-upvote-or-leave-a-review)
@@ -534,17 +463,24 @@ Huge thanks to the sponsors helping to support Dashy's development!
@@ -553,23 +489,17 @@ Huge thanks to the sponsors helping to support Dashy's development!
#### Contributors
[](./docs/credits.md)
-#### Packages
-Dashy was made possible thanks to the following packages and components. For more details on each, see [Dependency Credits](./docs/credits.md#dependencies-). Full credit to their respective authors.
-- **Utils**: [`crypto-js`](https://github.com/brix/crypto-js), [`axios`](https://github.com/axios/axios), [`ajv`](https://github.com/ajv-validator/ajv)
-- **Components**: [`vue-select`](https://github.com/sagalbot/vue-select) by @sagalbot, [`vue-js-modal`](https://github.com/euvl/vue-js-modal) by @euvl, [`v-tooltip`](https://github.com/Akryum/v-tooltip) by @Akryum, [`vue-material-tabs`](https://github.com/jairoblatt/vue-material-tabs) by @jairoblatt, [`JsonEditor`](https://github.com/josdejong/jsoneditor) by @josdejong, [`vue-toasted`](https://github.com/shakee93/vue-toasted) by @shakee93
-- **Core**: Vue.js, TypeScript, SCSS, Node.js, ESLint
-- **Backup & sync**: This server uses [Cloudflare workers](https://workers.cloudflare.com/) plus [KV](https://developers.cloudflare.com/workers/runtime-apis/kv) and [web crypto](https://developers.cloudflare.com/workers/runtime-apis/web-crypto)
-- **Services**: The 1-Click demo uses [Play-with-Docker Labs](https://play-with-docker.com/). Code is hosted on [GitHub](https://github.com), Docker image is hosted on [DockerHub](https://hub.docker.com/), and the demos are hosted on [Netlify](https://www.netlify.com/).
-- **Actions**: [`action-autotag`](https://github.com/butlerlogic/action-autotag) by @butlerlogic, [`contributors-list`](https://github.com/bubkoo/contributors-list), [`github-pages-deploy-action`](https://github.com/JamesIves/github-pages-deploy-action), [`is-sponsor-label-action`](https://github.com/JasonEtco/is-sponsor-label-action), [`issues-translate-action`](https://github.com/tomsun28/issues-translate-action) by @tomsun28, [`pr-commenter-action`](https://github.com/exercism/pr-commenter-action) by @exercism, [`snyk node`](https://github.com/snyk/actions/node) by @snyk, and [`yarn-lock-changes`](https://github.com/Simek/yarn-lock-changes) by @Simek. See [all action credits](/docs/credits.md#actions)
-
-
**[⬆️ Back to Top](#dashy)**
+---
+
## Developing 🧱
> For full development documentation, see: [**Developing**](./docs/developing.md)
-[](https://open.vscode.dev/Lissy93/Dashy)
+[](https://open.vscode.dev/Lissy93/Dashy)
+[](https://gitpod.io/#github.com/lissy93/dashy.git)
+[](https://github.dev/Lissy93/dashy)
Before getting started, you'll need [Git](https://git-scm.com/downloads), [Node](https://nodejs.org/en/download/) and optionally [Yarn](https://yarnpkg.com/) (run `npm i -g yarn`) installed.
@@ -580,23 +510,6 @@ To set up the development environment:
Hot reload is enabled, so changes will be automatically detected, compiled and refreshed.
-Like most Git repos, we are following the [Github Flow](https://guides.github.com/introduction/flow) standard.
-1. Create a branch (or fork if you're not a collaborator)
-2. Code some awesome stuff, then add and commit your changes
-3. Create a Pull Request, complete the checklist and ensure the build succeeds
-4. Follow up with any reviews on your code
-5. Merge 🎉
-
-Branch names are specified in the following format: `[TYPE]/[TICKET]_[TITLE]`. E.g. `FEATURE/420_Awesome-feature` or `FIX/690_login-server-error`.
-
-Most commit messages use git [commit emojis](https://gist.github.com/parmentf/035de27d6ed1dce0b36a) - e.g. ✨ = New feature, 🐛 = Bug fix, 💄 = UI stuff, 🚧 = Work in progress, 🌐 = Language, 🔖 = New release, and so on. Take a look at [gitmoji.dev](https://gitmoji.dev/) for a list of what each emoji indicates
-
-Before you submit your pull request, please ensure you've checked off all the boxes in the template. For your PR to be merged, it must:
-- Must be backwards compatible
-- Any new features should be documented
-- The build, lint and tests (run by GH actions) should all pass (there are some exceptions)
-- There must not be any merge conflicts
-
If you're new to web development, I've put together a short [list of resources](https://github.com/Lissy93/dashy/blob/master/docs/developing.md#resources-for-beginners), to help beginners get started
**Repo Status**:
@@ -618,9 +531,9 @@ Dashy is under active development, with features, improvements and changes pushe
We're using [Semantic Versioning](https://semver.org/), to indicate major, minor and patch versions. You can find the current version number in the readme, and check your apps version under the config menu. The version number is pulled from the [package.json](https://github.com/Lissy93/dashy/blob/master/package.json#L3) file.
-Typically there is a new major release every 2 weeks, usually on Sunday, and you can view these under the [Releases Page](https://github.com/Lissy93/dashy/releases). Each release will create a new [tag on GitHub](https://github.com/Lissy93/dashy/tags), and each major release will also result in the creation of a new [tag on DockerHub](https://hub.docker.com/r/lissy93/dashy/tags), so that you can fix your container to a certain version.
+Typically there is a new major release every 2 - 4 weeks, usually on Sunday, and you can view these under the [Releases Page](https://github.com/Lissy93/dashy/releases) and [on DockerHub](https://hub.docker.com/r/lissy93/dashy/tags). New minor versions are pushed several times a week, and are [tagged here](https://github.com/Lissy93/dashy/tags).
-For a full breakdown of each change, you can view the [Changelog](https://github.com/Lissy93/dashy/blob/master/.github/CHANGELOG.md). Each new feature or significant change needs to be submitted through a pull request, which makes it easy to review and track these changes, and roll back if needed.
+For a full breakdown of each change, you can view the [Changelog](https://github.com/Lissy93/dashy/blob/master/.github/CHANGELOG.md). Each new feature or significant change needs to be submitted through [a pull request](https://github.com/Lissy93/dashy/pulls?q=is%3Apr), which makes it easy to review and track these changes, and roll back if needed.
**[⬆️ Back to Top](#dashy)**
@@ -635,7 +548,7 @@ For a full breakdown of each change, you can view the [Changelog](https://github
- 💻 [Management](/docs/management.md) - Managing your app, updating, security, web server configuration, etc
- 🚒 [Troubleshooting](/docs/troubleshooting.md) - Common errors and problems, and how to fix them
-#### Development and Contributing
+#### Development and Contributing
- 🧱 [Developing](/docs/developing.md) - Running Dashy development server locally, and general workflow
- 🛎️ [Development Guides](/docs/development-guides.md) - Common development tasks, to help new contributors
- 💖 [Contributing](/docs/contributing.md) - How to contribute to Dashy
@@ -668,12 +581,10 @@ For a full breakdown of each change, you can view the [Changelog](https://github
> For past and future app updates, see: [**Changelog**](/.github/CHANGELOG.md)
-
The following features and tasks are planned for the near future.
- Widget support- cards showing live stats and interactive content from your self-hosted services
-- UI Drag & Drop editor and visual configurator
-- Conversion to TypeScript
-- Improved test coverage
+- ✅ UI editor and visual configurator
+- Replacement of Node backend with Go
**[⬆️ Back to Top](#dashy)**
@@ -746,4 +657,3 @@ For more info, see TLDR Legal's [Explanation of MIT](https://tldrlegal.com/licen
Thank you for Visiting
-
diff --git a/docker-compose.yml b/docker-compose.yml
index e3ee93f3..0d09a26a 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,5 +1,5 @@
---
-# Welcome to Dashy! To get started, run `docker compose up`
+# Welcome to Dashy! To get started, run `docker compose up -d`
# You can configure your container here, by modifying this file
version: "3.8"
services:
@@ -21,7 +21,8 @@ services:
# Pass in your config file below, by specifying the path on your host machine
# volumes:
- # - /root/my-config.yml:/app/public/conf.yml
+ # - /path/to/my-config.yml:/app/public/conf.yml
+ # - /path/to/item-icons:/app/public/item-icons
# Set port that web service will be served on. Keep container port as 80
ports:
diff --git a/docker/Dockerfile-lite b/docker/Dockerfile-lite
new file mode 100644
index 00000000..8280d38c
--- /dev/null
+++ b/docker/Dockerfile-lite
@@ -0,0 +1,22 @@
+# -----------------------------------------------------------------------------------------
+# A light-weight alternative Docker image, using NGINX rather than Node.js to serve the app
+# This means that certain features that require server-side endpoints will not be available
+# -----------------------------------------------------------------------------------------
+
+# Build Stage - Install dependencies + build the app
+FROM node:lts-alpine3.14 as build
+WORKDIR /dashy
+COPY package*.json .
+COPY yarn.lock .
+RUN yarn
+COPY . .
+RUN yarn build
+
+# Production Stage - Serve up built files with NGINX
+FROM nginx:alpine as production
+COPY ./docker/nginx.conf /etc/nginx/nginx.conf
+COPY --from=build /dashy/dist /usr/share/nginx/html
+EXPOSE 80
+ENTRYPOINT ["nginx", "-g", "daemon off;"]
+
+LABEL maintainer="Alicia Sykes "
diff --git a/docker/nginx.conf b/docker/nginx.conf
new file mode 100644
index 00000000..82f6843b
--- /dev/null
+++ b/docker/nginx.conf
@@ -0,0 +1,15 @@
+worker_processes 4;
+
+events { worker_connections 1024; }
+
+http {
+ server {
+ listen 80;
+ root /usr/share/nginx/html;
+ include /etc/nginx/mime.types;
+
+ location /appui {
+ try_files $uri /index.html;
+ }
+ }
+}
\ No newline at end of file
diff --git a/docs/alternate-views.md b/docs/alternate-views.md
index de72cd1a..2417316a 100644
--- a/docs/alternate-views.md
+++ b/docs/alternate-views.md
@@ -14,7 +14,9 @@ This is the main page that you will land on when you first launch the applicatio
### Workspace
The workspace view displays your links in a sidebar on the left-hand side, and apps are launched within Dashy. This enables you to use all of your self-hosted apps from one place, and makes multi-tasking easy.
-In the workspace view, you can keep previously opened websites/ apps open in the background, by setting `appConfig.enableMultiTasking: true`. This comes at the cost of performance, but does mean that your session with each app is preserved, enabling you to quickly switch between your apps.
+In the workspace view, you can opt to keep previously opened websites/ apps open in the background, by setting `appConfig.enableMultiTasking: true`. This comes at the cost of performance, but does mean that your session with each app is preserved, enabling you to quickly switch between your apps.
+
+You can also specify a default app to be opened when you land on the workspace, by setting `appConfig.workspaceLandingUrl: https://app-to-open/`. If this app exists within your sections.items, then the corresponding section will also be expanded.
Example of Workspace View
@@ -35,9 +37,12 @@ Dashy supports several different ways to launch your apps. The default opening m
- `sametab` - The app will be launched in the current tab
- `newtab` - The app will be launched in a new tab
+- `top` - Opens in the top-most browsing context, useful if your accessing Dashy through an iframe
- `modal` - Launch app in a resizable/ movable popup modal on the current page
- `workspace` - Changes to Workspace view, and launches app
+You can also set the default opening method, which will be applied to all items that don't have a specified target, using `appConfig.defaultOpeningMethod`, to one of the above values.
+
Even if the target is not set (or is set to `sametab`), you can still launch any given app in an alternative method: Alt + Click will open the modal, and Ctrl + Click will open in a new tab. You can also right-click on any item to see all options (as seen in the screenshot below). This custom context menu can be disabled by setting `appConfig.disableContextMenu: true`.
diff --git a/docs/assets/CONTRIBUTORS.svg b/docs/assets/CONTRIBUTORS.svg
index 7fa0b7dc..12615fea 100644
--- a/docs/assets/CONTRIBUTORS.svg
+++ b/docs/assets/CONTRIBUTORS.svg
@@ -1,30 +1,48 @@
-
+
+
+
+
-
+
-
+
-
+
-
+
-
+
+
+
+
-
+
-
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/docs/assets/repo-visualization.svg b/docs/assets/repo-visualization.svg
index 35834737..6661877f 100644
--- a/docs/assets/repo-visualization.svg
+++ b/docs/assets/repo-visualization.svg
@@ -1 +1 @@
-views views utils utils styles styles components components assets assets Workspace Workspace Settings Settings PageStrcture PageStrcture MinimalView MinimalView LinkItems LinkItems FormElements FormElements Configuration Configuration locales locales interface-icons interface-icons Login.vue Login.vue Login.vue Home.vue Home.vue Home.vue Minimal.vue Minimal.vue Minimal.vue emojis.json emojis.json emojis.json ConfigSche... ConfigSche... ConfigSche... Auth.js Auth.js Auth.js defaults.js defaults.js defaults.js color-them... color-them... color-them... CustomThe... CustomThe... CustomThe... Item.vue Item.vue Item.vue ItemIcon.vue ItemIcon.vue ItemIcon.vue Section.vue Section.vue Section.vue ConfigCon... ConfigCon... ConfigCon... JsonEdito... JsonEdito... JsonEdito... CloudBac... CloudBac... CloudBac... hi.json hi.json hi.json ru.json ru.json ru.json ar.json ar.json ar.json ja.json ja.json ja.json fr.json fr.json fr.json es.json es.json es.json pt.json pt.json pt.json it.json it.json it.json sl.json sl.json sl.json en.json en.json en.json de.json de.json de.json .js .json .scss .svg .vue each dot sized by file size
\ No newline at end of file
+views views utils utils styles styles components components assets assets Workspace Workspace Settings Settings PageStrcture PageStrcture MinimalView MinimalView LinkItems LinkItems InteractiveEditor InteractiveEditor FormElements FormElements Configuration Configuration locales locales interface-icons interface-icons Home.vue Home.vue Home.vue Login.vue Login.vue Login.vue emojis.json emojis.json emojis.json ConfigSch... ConfigSch... ConfigSch... color-the... color-the... color-the... CustomThe... CustomThe... CustomThe... Item.vue Item.vue Item.vue Section.vue Section.vue Section.vue ItemIcon... ItemIcon... ItemIcon... EditItem... EditItem... EditItem... JsonEdito... JsonEdito... JsonEdito... ConfigCo... ConfigCo... ConfigCo... hi.json hi.json hi.json fr.json fr.json fr.json ru.json ru.json ru.json sl.json sl.json sl.json en.json en.json en.json ar.json ar.json ar.json .js .json .scss .svg .vue each dot sized by file size
\ No newline at end of file
diff --git a/docs/authentication.md b/docs/authentication.md
index 1dfecc5e..e5de308c 100644
--- a/docs/authentication.md
+++ b/docs/authentication.md
@@ -4,7 +4,9 @@
- [Setting Up Authentication](#setting-up-authentication)
- [Hash Password](#hash-password)
- [Logging In and Out](#logging-in-and-out)
- - [Security](#security)
+ - [Guest Access](#enabling-guest-access)
+ - [Per-User Access](#granular-access)
+ - [Security Considerations](#security)
- [Keycloak Auth](#keycloak)
- [Deploying Keycloak](#1-deploy-keycloak)
- [Setting up Keycloak](#2-setup-keycloak-users)
diff --git a/docs/configuring.md b/docs/configuring.md
index 6ef15d12..d06fd429 100644
--- a/docs/configuring.md
+++ b/docs/configuring.md
@@ -1,6 +1,8 @@
# Configuring
-All app configuration is specified in [`/public/conf.yml`](https://github.com/Lissy93/dashy/blob/master/public/conf.yml) which is in [YAML Format](https://yaml.org/) format.
+All app configuration is specified in [`/public/conf.yml`](https://github.com/Lissy93/dashy/blob/master/public/conf.yml) which is in [YAML Format](https://yaml.org/) format. Changes can also be made [directly through the UI](#editing-config-through-the-ui) and previewed live, from here you can also export, backup, reset, validate and download your configuration file.
+
+The following file provides a reference of all supported configuration options.
---
@@ -20,10 +22,11 @@ All app configuration is specified in [`/public/conf.yml`](https://github.com/Li
- [`items`](#sectionitem) - List of items
- [`icon`](#sectionicon-and-sectionitemicon) - Icon for an item
- [**Notes**](#notes)
+ - [Editing Config through the UI](#editing-config-through-the-ui)
- [About YAML](#about-yaml)
- [Config Saving Methods](#config-saving-methods)
- [Preventing Changes](#preventing-changes-being-written-to-disk)
- - [Example](#example)
+ - [Example](#example)
---
@@ -74,6 +77,7 @@ Tips:
--- | --- | --- | ---
**`language`** | `string` | _Optional_ | The 2 (or 4-digit) [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) for your language, e.g. `en` or `en-GB`. This must be a language that the app has already been [translated](https://github.com/Lissy93/dashy/tree/master/src/assets/locales) into. If your language is unavailable, Dashy will fallback to English. By default Dashy will attempt to auto-detect your language, although this may not work on some privacy browsers.
**`startingView`** | `enum` | _Optional_ | Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI. Can be either `default`, `minimal` or `workspace`. Defaults to `default`
+**`defaultOpeningMethod`** | `enum` | _Optional_ | The default opening method for items, if no `target` is specified for a given item. Can be either `newtab`, `sametab`, `top`, `parent`, `modal` or `workspace`. Defaults to `newtab`
**`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping each of your services and display their status as a dot next to each item. This can be overridden by setting `statusCheck` under each item. Defaults to `false`
**`statusCheckInterval`** | `boolean` | _Optional_ | The number of seconds between checks. If set to `0` then service will only be checked on initial page load, which is usually the desired functionality. If value is less than `10` you may experience a hit in performance. Defaults to `0`
**`webSearch`** | `object` | _Optional_ | Configuration options for the web search feature, set your default search engine, opening method or disable web search. See [`webSearch`](#appconfigwebsearch-optional)
@@ -82,15 +86,18 @@ Tips:
**`fontAwesomeKey`** | `string` | _Optional_ | If you have a font-awesome key, then you can use it here and make use of premium icons. It is a 10-digit alpha-numeric string from you're FA kit URL (e.g. `13014ae648`)
**`faviconApi`** | `enum` | _Optional_ | Only applicable if you are using favicons for item icons. Specifies which service to use to resolve favicons. Set to `local` to do this locally, without using an API. Services running locally will use this option always. Available options are: `local`, `faviconkit`, `google`, `clearbit`, `webmasterapi` and `allesedv`. Defaults to `faviconkit`. See [Icons](/docs/icons.md#favicons) for more info
**`auth`** | `object` | _Optional_ | All settings relating to user authentication. See [`auth`](#appconfigauth-optional)
-**`layout`** | `enum` | _Optional_ | App layout, either `horizontal`, `vertical`, `auto` or `sidebar`. Defaults to `auto`. This specifies the layout and direction of how sections are positioned on the home screen. This can also be modified from the UI.
+**`layout`** | `enum` | _Optional_ | Layout for homepage, either `horizontal`, `vertical` or `auto`. Defaults to `auto`. This specifies the layout and direction of how sections are positioned on the home screen. This can also be modified and overridden from the UI.
**`iconSize`** | `enum` | _Optional_ | The size of link items / icons. Can be either `small`, `medium,` or `large`. Defaults to `medium`. This can also be set directly from the UI.
+**`colCount`** | `number` | _Optional_ | The number of columns of sections displayed on the homepage, using the default view. Should be in integer between `1` and `8`. Note that by default this is applied responsively, based on current screen size, and specifying a value here will override this behavior, which may not be desirable.
**`theme`** | `string` | _Optional_ | The default theme for first load (you can change this later from the UI)
**`cssThemes`** | `string[]` | _Optional_ | An array of custom theme names which can be used in the theme switcher dropdown
**`customColors`** | `object`| _Optional_ | Enables you to apply a custom color palette to any given theme. Use the theme name (lowercase) as the key, for an object including key-value-pairs, with the color variable name as keys, and 6-digit hex code as value. See [Theming](/docs/theming.md#modifying-theme-colors) for more info
**`externalStyleSheet`** | `string` or `string[]` | _Optional_ | Either a URL to an external stylesheet or an array or URLs, which can be applied as themes within the UI
**`customCss`** | `string` | _Optional_ | Raw CSS that will be applied to the page. This can also be set from the UI. Please minify it first.
**`hideComponents`** | `object` | _Optional_ | A list of key page components (header, footer, search, settings, etc) that are present by default, but can be removed using this option. See [`appConfig.hideComponents`](#appconfighideComponents-optional)
+**`routingMode`** | `string` | _Optional_ | Can be either `hash` or `history`. Determines the URL format for sub-pages, hash mode will look like `/#/home` whereas with history mode available you have nice clean URLs, like `/home`. For more info, see the [Vue docs](https://router.vuejs.org/guide/essentials/history-mode.html#example-server-configurations). If you're hosting Dashy with a custom BASE_URL, you will find that a bit of extra server config is necessary to get history mode working, so here you may want to instead use `hash` mode.Defaults to `history`.
**`enableMultiTasking`** | `boolean` | _Optional_ | If set to true, will keep apps open in the background when in the workspace view. Useful for quickly switching between multiple sites, and preserving their state, but comes at the cost of performance.
+**`workspaceLandingUrl`** | `string` | _Optional_ | The URL or an app, service or website to launch when the workspace view is opened, before another service has been launched
**`allowConfigEdit`** | `boolean` | _Optional_ | Should prevent / allow the user to write configuration changes to the conf.yml from the UI. When set to `false`, the user can only apply changes locally using the config editor within the app, whereas if set to `true` then changes can be written to disk directly through the UI. Defaults to `true`. Note that if authentication is enabled, the user must be of type `admin` in order to apply changes globally.
**`enableErrorReporting`** | `boolean` | _Optional_ | Enable reporting of unexpected errors and crashes. This is off by default, and **no data will ever be captured unless you explicitly enable it**. Turning on error reporting helps previously unknown bugs get discovered and fixed. Dashy uses [Sentry](https://github.com/getsentry/sentry) for error reporting. Defaults to `false`.
**`sentryDsn`** | `boolean` | _Optional_ | If you need to monitor errors in your instance, then you can use Sentry to collect and process bug reports. Sentry can be self-hosted, or used as SaaS, once your instance is setup, then all you need to do is pass in the DSN here, and enable error reporting. You can learn more on the [Sentry DSN Docs](https://docs.sentry.io/product/sentry-basics/dsn-explainer/). Note that this will only ever be used if `enableErrorReporting` is explicitly enabled.
@@ -105,8 +112,8 @@ Tips:
**Field** | **Type** | **Required**| **Description**
--- | --- | --- | ---
**`users`** | `array` | _Optional_ | An array of objects containing usernames and hashed passwords. If this is not provided, then authentication will be off by default, and you will not need any credentials to access the app. See [`appConfig.auth.users`](#appconfigauthusers-optional). **Note** this method of authentication is handled on the client side, so for security critical situations, it is recommended to use an [alternate authentication method](/docs/authentication.md#alternative-authentication-methods).
-**`enableKeycloak`** | `object` | _Optional_ | If set to `true`, then authentication using Keycloak will be anabled. Note that you need to have an instance running, and have also configured `auth.keycloak`. Defaults to `false`
-**`keycloak`** | `boolean` | _Optional_ | Config options to point Dashy to your Keycloak server. Requires `enableKeycloak: true`. See [`auth.keycloak`](#appconfigauthkeycloak-optional) for more info
+**`enableKeycloak`** | `boolean` | _Optional_ | If set to `true`, then authentication using Keycloak will be anabled. Note that you need to have an instance running, and have also configured `auth.keycloak`. Defaults to `false`
+**`keycloak`** | `object` | _Optional_ | Config options to point Dashy to your Keycloak server. Requires `enableKeycloak: true`. See [`auth.keycloak`](#appconfigauthkeycloak-optional) for more info
**`enableGuestAccess`** | `boolean` | _Optional_ | When set to `true`, an unauthenticated user will be able to access the dashboard, with read-only access, without having to login. Requires `auth.users` to be configured. Defaults to `false`.
For more info, see the **[Authentication Docs](/docs/authentication.md)**
@@ -178,7 +185,7 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)**
**`description`** | `string` | _Optional_ | Additional info about an item, which is shown in the tooltip on hover, or visible on large tiles
**`url`** | `string` | Required | The URL / location of web address for when the item is clicked
**`icon`** | `string` | _Optional_ | The icon for a given item. Can be a font-awesome icon, favicon, remote URL or local URL. See [`item.icon`](#sectionicon-and-sectionitemicon)
-**`target`** | `string` | _Optional_ | The opening method for when the item is clicked, either `newtab`, `sametab`, `modal` or `workspace`. Where `newtab` will open the link in a new tab, `sametab` will open it in the current tab, and `modal` will open a pop-up modal with the content displayed within that iframe. Note that for the iframe to load, you must have set the CORS headers to either allow `*` ot allow the domain that you are hosting Dashy on, for some websites and self-hosted services, this is already set.
+**`target`** | `string` | _Optional_ | The opening method for when the item is clicked, either `newtab`, `sametab`, `top`, `parent`, `modal` or `workspace`. Where `newtab` will open the link in a new tab, `sametab` will open it in the current tab, and `modal` will open a pop-up modal and `workspace` will open in the Workspace view. Defaults to `newtab`
**`hotkey`** | `number` | _Optional_ | Give frequently opened applications a numeric hotkey, between `0 - 9`. You can then just press that key to launch that application.
**`tags`** | `string[]` | _Optional_ | A list of tags, which can be used for improved search
**`statusCheck`** | `boolean` | _Optional_ | When set to `true`, Dashy will ping the URL associated with the current service, and display its status as a dot next to the item. The value here will override `appConfig.statusCheck` so you can turn off or on checks for a given service. Defaults to `appConfig.statusCheck`, falls back to `false`
@@ -223,6 +230,22 @@ For more info, see the **[Authentication Docs](/docs/authentication.md)**
## Notes
+### Editing Config through the UI
+
+Config can be modified directly through the UI, and then written to disk, or applied locally. This can be done wither with the raw config editor (introduced in V 0.6.5 / [#3](https://github.com/Lissy93/dashy/pull/3)), or the interactive editor (introduced in V 1.8.9 / [#298](https://github.com/Lissy93/dashy/pull/298)).
+
+
+
+ Interactive Editor
+
+
+
+
+ Raw Editor
+
+
+
+
### About YAML
If you're new to YAML, it's pretty straight-forward. The format is exactly the same as that of JSON, but instead of using curly braces, structure is denoted using whitespace. This [quick guide](https://linuxhandbook.com/yaml-basics/) should get you up to speed in a few minutes, for more advanced topics take a look at this [Wikipedia article](https://en.wikipedia.org/wiki/YAML).
diff --git a/docs/contributing.md b/docs/contributing.md
index 8a7841a4..0f242c38 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -13,7 +13,7 @@ If you speak another language, then adding translations would be really helpful,
## Take a 2-minute survey
Help improve Dashy by taking a very short, 6-question survey. This will give me a better understanding of what is important to you, so that I can make Dashy better in the future :)
-[](https://n9fy6xak9yd.typeform.com/to/gl0L68ou)
+[](https://survey.typeform.com/to/gl0L68ou)
## Share your dashboard
Dashy now has a [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#dashy-showcase-) where you can show off a screenshot of your dashboard, and get inspiration from other users. I also really enjoy seeing how people are using Dashy. To [submit your dashboard](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md#submitting-your-dashboard), please either open a PR or raise an issue.
@@ -66,9 +66,14 @@ Sponsoring will give you several perks, from $1 / £0.70 per month, as well as a
You can also send a one-off small contribution using crypto
+[](https://en.cryptobadges.io/donate/3853bSxupMjvxEYfwGDGAaLZhTKxB2vEVC)[](https://en.cryptobadges.io/donate/0x0fc98cBf8bea932B4470C46C0FbE1ed1f6765017)
+
- **BTC**: `3853bSxupMjvxEYfwGDGAaLZhTKxB2vEVC`
- **ETH**: `0x0fc98cBf8bea932B4470C46C0FbE1ed1f6765017` / `aliciasykes.eth`
- **XMR**: `471KZdxb6N63aABR4WYwMRjTVkc1p1x7wGsUTEF7AMYzL8L94A5pCuYWkosgJQ5Ze8Y2PscVCGZFJa3hDPg6MaDq47GUm8r`
+- **LTC**: `MAuck6Ea1qaNihwKfXutkR1R6BorMth86H`
+- **ZEC**: `t1bw1SefijsXRDQVxC9w64XsRK8hBhtQohQ`
+
@@ -111,5 +116,5 @@ For a full list of Dashy's contributors, see the [Credits Page](/docs/credits.md
### Star-Gazers Over Time
-
+[](https://seladb.github.io/StarTrack-js/#/preload?r=Lissy93,dashy)
diff --git a/docs/credits.md b/docs/credits.md
index 691c4af6..411e572f 100644
--- a/docs/credits.md
+++ b/docs/credits.md
@@ -5,17 +5,24 @@
@@ -32,6 +39,13 @@
Alicia Sykes
+
+
+
+
+ Alicia Bot
+
+
@@ -39,13 +53,6 @@
EVOTk
-
-
-
-
- Erik Vroon
-
-
@@ -53,21 +60,28 @@
Snyk Bot
+
+
+
+
+ Erik Vroon
+
+
UrekD
-
+
+
ᗪєνιη ᗷυнʟ
-
-
+
@@ -82,6 +96,13 @@
Begin
+
+
+
+
+ David
+
+
@@ -95,6 +116,21 @@
FormatToday
+
+
+
+
+
+
+ Iaroslav Dronskii
+
+
+
+
+
+
+ Rubjo
+
@@ -102,13 +138,27 @@
Ryan Turner
+
+
+
+
+
+ Shreya Roy
+
+
+
+
+
+
+ Jnach
+
### Helpful Users
-
+
-
+
### Bots
@@ -207,6 +257,12 @@
> The above section is auto-generated, using [contribute-list](https://github.com/marketplace/actions/contribute-list) by @akhilmhdh.
+### Newest Stargazers
+
+[](https://github.com/Lissy93/dashy/stargazers)
+
+[](https://github.com/lissy93/dashy/network/members)
+
---
## Dependencies
diff --git a/docs/deployment.md b/docs/deployment.md
index 5dfd1e63..9f0508a9 100644
--- a/docs/deployment.md
+++ b/docs/deployment.md
@@ -68,7 +68,7 @@ The image defaults to `:latest`, but you can instead specify a specific version,
### Using Docker Compose
-Using Docker Compose can be useful for saving your specific config in files, without having to type out a long run command each time. Save compose config as a YAML file, and then run `docker compose up` (optionally use the `-f` flag to specify file location, if it isn't located at `./docker-compose.yml`). Compose is also useful if you are using clusters, as the format is very similar to stack files, used with Docker Swarm.
+Using Docker Compose can be useful for saving your specific config in files, without having to type out a long run command each time. Save compose config as a YAML file, and then run `docker compose up -d` (optionally use the `-f` flag to specify file location, if it isn't located at `./docker-compose.yml`), `-d` is detached mode (not running in the foreground of your terminal). Compose is also useful if you are using clusters, as the format is very similar to stack files, used with Docker Swarm.
The following is a complete example of a [`docker-compose.yml`](https://github.com/Lissy93/dashy/blob/master/docker-compose.yml) for Dashy. Run it as is, or uncomment the additional options you need.
@@ -242,3 +242,29 @@ surge ./dist
Once Dashy has been built, it is effectivley just a static web app. This means that it can be served up with pretty much any static host, CDN or web server. To host Dashy through a CDN, the steps are very similar to building from source: clone the project, cd into it, install dependencies, write your config file and build the app. Once build is complete you will have a `./dist` directory within Dashy's root, and this is the build application which is ready to be served up.
However without Dashy's node server, there are a couple of features that will be unavailible to you, including: Writing config changes to disk through the UI, triggering a rebuild through the UI and application status checks. Everything else will work fine.
+
+
+## Requirements
+
+### System Requirements
+
+Dashy works well on a Raspberry Pi (tested on Pi 3 and later), but should also run well on any system.
+
+### Docker
+Initial app build causes a spike in resource usage, but once the built app is running it is fairly steady. For this reason, Dashy works best with a minimum of 1GB of memory, and 1GB of disk space.
+
+### Bare Metal
+Minimum 526mb mem, 2GB disk space,
+
+### CDN / Cloud Deploy
+No specific requirements. The built application alone (without the Node server) is very light-weight, and can be handled smoothly by pretty much any CDN or cloud deployment service (see [this list](/docs/deployment.md#deploy-to-cloud-service) or natively supported cloud providers).
+
+If you're using your own icons, or other assets, additional disk space will be required for those resources.
+
+### Browser Support
+
+JavaScript is required to run Dashy.
+
+In terms of browser support, pretty much any browser released since 2018 should render content just fine. However, for Internet Explorer, only IE11+ is supported, yet performance here is still not optimal. The recommended browser is either a Chromium-based / Webkit browser (Chrome, Brave, Vivaldi, Edge, Yandex, etc), or Firefox or one of it's forks (FF-ESR, Tor, LibreWolf, etc). Recent versions of Safari and Opera are also supported, but with limited continuous testing.
+
+
diff --git a/docs/developing.md b/docs/developing.md
index 17649f3d..6f8ac2b0 100644
--- a/docs/developing.md
+++ b/docs/developing.md
@@ -84,11 +84,13 @@ You can set the environment using the `NODE_ENV` variable. By default, the corre
### Git Flow
Like most Git repos, we are following the [Github Flow](https://guides.github.com/introduction/flow) standard.
-1. Create a branch (or fork if you don'd have write acces)
-2. Code some awesome stuff, then add and commit your changes
-3. Create a Pull Request, complete the checklist and ensure the build succeeds
-4. Follow up with any reviews on your code
-5. Merge 🎉
+1. Create a branch (or fork if you don'd have write access)
+2. Code some awesome stuff 🧑💻
+3. Add, commit and push your changes to your branch/ fork
+4. Head over to GitHub and create a Pull Request
+5. Fill in the required sections in the template, and hit submit
+6. Follow up with any reviews on your code
+7. Merge 🎉
### Git Branch Naming
The format of your branch name should be something similar to: `[TYPE]/[TICKET]_[TITLE]`
@@ -143,8 +145,10 @@ When you submit your PR, include the required info, by filling out the PR templa
## Resources for Beginners
New to Web Development? Glad you're here! Dashy is a pretty simple app, so it should make a good candidate for your first PR. Presuming that you already have a basic knowledge of JavaScript, the following articles should point you in the right direction for getting up to speed with the technologies used in this project:
+- [Open Source for Beginners](https://opensource.guide/how-to-contribute/)
- [Introduction to Vue.js](https://v3.vuejs.org/guide/introduction.html)
- [Vue.js Walkthrough](https://www.taniarascia.com/getting-started-with-vue/)
+- [ES6 Features](https://github.com/lukehoban/es6features)
- [Definitive guide to SCSS](https://blog.logrocket.com/the-definitive-guide-to-scss/)
- [Complete beginners guide to Docker](https://docker-curriculum.com/)
- [Docker Classroom - Interactive Tutorials](https://training.play-with-docker.com/)
diff --git a/docs/icons.md b/docs/icons.md
index 2b4bcd53..ac4adeaf 100644
--- a/docs/icons.md
+++ b/docs/icons.md
@@ -1,32 +1,57 @@
# Icons
-Both sections and items can have an icon, which is specified using the `icon` attribute. Using icons improves the aesthetics of your UI and makes the app more intuitive to use. There are several options when it comes to setting icons, and this article outlines each of them
+Both sections and items can have an icon, which is specified using the `icon` attribute. Using icons improves the aesthetics of your UI and makes the app more intuitive to use. Dashy supports multiple different icon providers, usage instructions for which are explained here.
+- [Auto-Fetched Favicons](#favicons)
- [Font Awesome Icons](#font-awesome)
- [Simple Icons](#simple-icons)
-- [Auto-Fetched Favicons](#favicons)
- [Generative Icons](#generative-icons)
- [Emoji Icons](#emoji-icons)
+- [Home-Lab Icons](#home-lab-icons)
+- [Material Icons](#material-design-icons)
- [Icons by URL](#icons-by-url)
- [Local Icons](#local-icons)
-- [Material Design Icons](#material-design-icons)
- [No Icon](#no-icon)
-Note that, if you are using icons from an external source (like font-awesome or material-design-icons), then the relevant font file will be loaded in automatically if and when needed, but combining icons from multiple services may have a negative impact on performance.
+---
+
+## Favicons
+Dashy can auto-fetch an icon for a given service, using it's favicon. Just set `icon: favicon` to use this feature.
+
+
+
+
+
+Since different websites host their favicons at different paths, for the best results Dashy can use an API to resolve a websites icon.
+
+The default favicon API is [allesedv.com](https://favicon.allesedv.com/), but you can change this under `appConfig.faviconApi`. If you'd prefer not to use an API, just set this value to `local`. You can also use different APIs for individual items, by setting `icon: favicon-[api]`, e.g. `favicon-clearbit`.
+
+The following favicon APIs are supported:
+- `allesedv` - [allesedv.com](https://favicon.allesedv.com/) is a highly efficient IPv6-enabled service
+- `clearbit` - [Clearbit](https://clearbit.com/logo) returns high-quality square logos from mainstream websites
+- `faviconkit` - [faviconkit.com](https://faviconkit.com/) good quality icons and most sites supported (Note: down as of Nov '21)
+- `besticon` - [BestIcon](https://github.com/mat/besticon) fetches websites icons from manifest
+- `mcapi` - [MC-API](https://eu.mc-api.net/) fetches default website favicon, originally a Minecraft util
+- `duckduckgo` - Returns decent quality website icons, from DuckDuckGo search
+- `google` - Official Google favicon API service, good support for all sites, but poor quality
+- `yandex` - Lower quality icons, but useful in some regions where other services are blocked
+- `local` - Set to local to fetch the default icon at /favicon.ico instead of using an API
+
+If for a given service none of the APIs work in your situation, and nor does local, then the best option is to find the path of the services logo or favicon, and set the icon to the URL of the raw image. For example, `icon: https://monitoring.local/faviconx128.png`- you can find this path using the browser dev tools.
---
## Font Awesome
-You can use any [Font Awesome Icon](https://fontawesome.com/icons) simply by specifying it's identifier. This is in the format of `[category] [name]` and can be found on the page for any given icon on the Font Awesome site. For example: `fas fa-rocket`, `fab fa-monero` or `fas fa-unicorn`.
+You can use any [Font Awesome Icon](https://fontawesome.com/icons) simply by specifying it's identifier. This is in the format of `[category] [name]` and can be found on the page for that icon on the Font Awesome site. For example: `fas fa-rocket`, `fab fa-monero` or `fas fa-unicorn`.
Font-Awesome has a wide variety of free icons, but you can also use their pro icons if you have a membership. To do so, you need to specify your license key under: `appConfig.fontAwesomeKey`. This is usually a 10-digit string, for example `13014ae648`.
-
+
---
@@ -34,6 +59,10 @@ Font-Awesome has a wide variety of free icons, but you can also use their pro ic
## Simple Icons
[SimpleIcons.org](https://simpleicons.org/) is a collection of 2000+ high quality, free and open source brand and logo SVG icons. Usage of which is very similar to font-awesome icons. First find the glyph you want to use on the [website](https://simpleicons.org/), then just set your icon the the simple icon slug, prefixed with `si-`.
+
+
+
+
For example:
```yaml
sections:
@@ -51,34 +80,11 @@ sections:
---
-## Favicons
-Dashy can auto-fetch the favicon for a given service using it's URL. Just set `icon: favicon` to use this feature. If the services URL is a local IP, then Dashy will attempt to find the favicon from `http://[ip]/favicon.ico`. This has two issues, favicons are not always hosted at the same location for every service, and often the default favicon is a low resolution. Therefore to fix this, for remote services an API is used to return a high-quality icon for any online service.
-
-
-
-
-
-The default favicon API is [Favicon Kit](https://faviconkit.com/), a free and reliable service for returning images from any given URL. However several other API's are supported. To change the API used, under `appConfig`, set `faviconApi` to one of the following values:
-
-- `faviconkit` - [faviconkit.com](https://faviconkit.com/) (Recommend)
-- `google` - Official Google favicon API service, good support for all sites, but poor quality
-- `clearbit` - [Clearbit](https://clearbit.com/logo) returns high-quality logos from mainstream websites
-- `webmasterapi` - [WebMasterAPI](https://www.webmasterapi.com/get-favicons)
-- `allesedv` - [allesedv.com](https://favicon.allesedv.com/) is a highly efficient IPv6-enabled service
-
-You can also force Dashy to always get favicons from the root of the domain, and not use an external service, by setting `appConfig.faviconApi` to `local`.
-
-To use a different favicon API for certain items, then set `icon: favicon-[api]`, e.g. `favicon-clearbit`
-
-If for a given service none of the APIs work in your situation, and nor does local, then the best option is to find the path of the services logo or favicon, and set the icon to the URL of the raw image.
-
----
-
## Generative Icons
-Uses a unique and programmatically generated icon for a given service. This is particularly useful when you have a lot of similar services with a different IP or port, and no specific icon. These icons are generated with [ipsicon.io](https://ipsicon.io/). To use this option, just set an item's to: `icon: generative`.
+To uses a unique and programmatically generated icon for a given service just set `icon: generative`. This is particularly useful when you have a lot of similar services with a different IP or port, and no specific icon. These icons are generated with [DiceBear](https://avatars.dicebear.com/) (or [Evatar](https://evatar.io/) for fallback), and use a hash of the services domain/ ip for entropy, so each domain will have a unique icon.
-
+
---
@@ -94,15 +100,29 @@ For example, these will all render the same rocket (🚀) emoji: `icon: ':rocket
---
-## Icons by URL
-You can also set an icon by passing in a valid URL pointing to the icons location. For example `icon: https://i.ibb.co/710B3Yc/space-invader-x256.png`, this can be in .png, .jpg or .svg format, and hosted anywhere- so long as it's accessible from where you are hosting Dashy. The icon will be automatically scaled to fit, however loading in a lot of large icons may have a negative impact on performance, especially if you visit Dashy from new devices often.
+## Home-Lab Icons
----
+The [dashboard-icons](https://github.com/WalkxCode/dashboard-icons) repo by [@WalkxCode](https://github.com/WalkxCode) provides a comprehensive collection of 360+ high-quality PNG icons for commonly self-hosted services. Dashy natively supports these icons, and you can use them just by specifying the icon name (without extension) preceded by `hl-`. See [here](https://github.com/WalkxCode/dashboard-icons/tree/master/png) for a full list of all available icons. Note that these are fetched and cached strait from GitHub, so if you require offline access, the [Local Icons](#local-icons) method may be a better option for you.
-## Local Icons
-You may also want to store your icons locally, bundled within Dashy so that there is no reliance on outside services. This can be done by putting the icons within Dashy's `./public/item-icons/` directory. If you are using Docker, then the easiest option is to map a volume from your host system, for example: `-v /local/image/directory:/app/public/item-icons/`. To reference an icon stored locally, just specify it's name and extension. For example, if my icon was stored in `/app/public/item-icons/maltrail.png`, then I would just set `icon: maltrail.png`.
+For example:
+```yaml
+sections:
+- name: Home Lab Icons Example
+ items:
+ - title: AdGuard Home
+ icon: hl-adguardhome
+ - title: Long Horn
+ icon: hl-longhorn
+ - title: Nagios
+ icon: hl-nagios
+ - title: Whoogle Search
+ icon: hl-whooglesearch
+```
-You can also use sub-folders within the `item-icons` directory to keep things organised. You would then specify an icon with it's folder name slash image name. For example: `networking/monit.png`
+
+
+
+
---
@@ -120,10 +140,51 @@ sections:
icon: mdi-fire
- title: Dino Icon
icon: mdi-google-downasaur
-
```
+
+
+
+
+---
+
+## Icons by URL
+You can also set an icon by passing in a valid URL pointing to the icons location. For example `icon: https://i.ibb.co/710B3Yc/space-invader-x256.png`, this can be in .png, .jpg or .svg format, and hosted anywhere (local or remote) - so long as it's accessible from where you are hosting Dashy. The icon will be automatically scaled to fit, however loading in a lot of large icons may have a negative impact on performance, especially if you visit Dashy from new devices often.
+
+---
+
+## Local Icons
+You may also want to store your icons locally, bundled within Dashy so that there is no reliance on outside services. This can be done by putting the icons within Dashy's `./public/item-icons/` directory. If you are using Docker, then the easiest option is to map a volume from your host system, for example: `-v /local/image/directory:/app/public/item-icons/`. To reference an icon stored locally, just specify it's name and extension. For example, if my icon was stored in `/app/public/item-icons/maltrail.png`, then I would just set `icon: maltrail.png`.
+
+You can also use sub-folders within the `item-icons` directory to keep things organized. You would then specify an icon with it's folder name slash image name. For example: `networking/monit.png`
+
---
## No Icon
If you don't wish for a given item or section to have an icon, just leave out the `icon` attribute.
+
+---
+
+## Icon Collections and Resources
+
+The following websites provide good-quality, free icon sets. To use any of these icons, either copy the link to the raw icon (it should end in `.svg` or `.png`) and paste it as your `icon`, or download and save the icons in `/public/item-icons` / mapped Docker volume. Full credit to the authors, please see the licenses for each service for usage and copyright information.
+
+- [Icons for Self-Hosted Apps](https://thehomelab.wiki/books/helpful-tools-resources/page/icons-for-self-hosted-dashboards) - 350+ high-quality icons for commonly self-hosted services
+- [SVG Box](https://svgbox.net/iconsets/) - Cryptocurrency, social media apps and flag icons
+- [Simple Icons](https://simpleicons.org/) - Free SVG brand icons, with easy API access
+- [Material Design Icons](https://github.com/google/material-design-icons/) - Hundreds of Open source PNG + SVG icons by Google
+- [Icons8](https://icons8.com/icons) - Thousands of icons, all with free versions at 64x64
+- [Flat Icon](https://www.flaticon.com/) - Wide variety of icon sets, most of which are free to use
+- [SVG Repo](https://www.svgrepo.com/) - 300,000+ Vector Icons
+
+If you are a student, then you can get free access to premium icons on [Icon Scout](https://education.github.com/pack/redeem/iconscout-student) or [Icons8](https://icons8.com/github-students) using the [GitHub Student Pack](https://education.github.com/pack).
+
+---
+
+## Notes
+
+If you are using icons from an external source, these will be fetched on initial page load automatically, if and when needed. But combining icons from multiple services may have a negative impact on performance.
+
+You can improve load speeds, by downloading your required icons, and serving them locally. Scaling icons to the minimum required dimensions (e.g. 128x128 or 64x64) will also greatly improve application load times.
+
+For icons from external sources, please see the Privacy Policies and Licenses for that provider.
diff --git a/docs/management.md b/docs/management.md
index afd1394a..088a0eca 100644
--- a/docs/management.md
+++ b/docs/management.md
@@ -1,27 +1,70 @@
# Management
-## Providing Assets
-Although not essential, you will most likely want to provide several assets to Dashy. All web assets can be found in the `/public` directory.
+_The following article explains aspects of app management, and is useful to know for when self-hosting. It covers everything from keeping the Dashy (or any other app) up-to-date, secure, backed up, to other topics like auto-starting, monitoring, log management, web server configuration and using custom environments. It's like a top-20 list of need-to-know knowledge for self-hosting._
-For example:
-- `./public/conf.yml` - As mentioned, this is your main application config file
-- `./public/item-icons` - If you're using your own icons, you can choose to store them locally for better load time, and this is the directory to put them in. You can also use sub-folders here to keep things organized
-- Also within `./public` you'll find standard website assets, including `favicon.ico`, `manifest.json`, `robots.txt`, etc. There's no need to pass these in, but you can do so if you wish
+## Contents
+- [Providing Assets](#providing-assets)
+- [Running Commands](#running-commands)
+- [Healthchecks](#healthchecks)
+- [Logs and Performance](#logs-and-performance)
+- [Auto-Starting at Boot](#auto-starting-at-system-boot)
+- [Updating](#updating)
+- [Backing Up](#backing-up)
+- [Scheduling](#scheduling)
+- [SSL Certificates](#ssl-certificates)
+- [Authentication](#authentication)
+- [Managing with Compose](#managing-containers-with-docker-compose)
+- [Environmental Variables](#passing-in-environmental-variables)
+- [Securing Containers](#container-security)
+- [Remote Access](#remote-access)
+- [Custom Domain](#custom-domain)
+- [Web Server Configuration](#web-server-configuration)
+- [Running a Modified App](#running-a-modified-version-of-the-app)
+- [Building your Own Container](#building-your-own-container)
+
+---
+
+## Providing Assets
+Although not essential, you will most likely want to provide several assets to your running app.
This is easy to do using [Docker Volumes](https://docs.docker.com/storage/volumes/), which lets you share a file or directory between your host system, and the container. Volumes are specified in the Docker run command, or Docker compose file, using the `--volume` or `-v` flags. The value of which consists of the path to the file / directory on your host system, followed by the destination path within the container. Fields are separated by a colon (`:`), and must be in the correct order. For example: `-v ~/alicia/my-local-conf.yml:/app/public/conf.yml`
+In Dashy, commonly configured resources include:
+- `./public/conf.yml` - Your main application config file
+- `./public/item-icons` - A directory containing your own icons. This allows for offline access, and better performance than fetching from a CDN
+- Also within `./public` you'll find standard website assets, including `favicon.ico`, `manifest.json`, `robots.txt`, etc. There's no need to pass these in, but you can do so if you wish
+- `/src/styles/user-defined-themes.scss` - A stylesheet for applying custom CSS to your app. You can also write your own themes here.
+
+**[⬆️ Back to Top](#management)**
+
+---
## Running Commands
-The project has a few commands that can be used for various tasks, you can find a list of these either in the [Developing Docs](/docs/developing.md#project-commands), or by looking at the [`package.json`](https://github.com/Lissy93/dashy/blob/master/package.json#L5). These can be used by running `yarn [command-name]`.
+ If you're running an app in Docker, then commands will need to be passed to the container to be executed. This can be done by preceding each command with `docker exec -it [container-id]`, where container ID can be found by running `docker ps`. For example `docker exec -it 26c156c467b4 yarn build`. You can also enter the container, with `docker exec -it [container-id] /bin/ash`, and navigate around it with normal Linux commands.
- But if you're using Docker, then you'll need to execute them within the container. This can be done by preceding each command with `docker exec -it [container-id]`, where container ID can be found by running `docker ps`. For example `docker exec -it 26c156c467b4 yarn build`. You can also enter the container, with `docker exec -it [container-id] /bin/ash`, and navigate around it with normal Linux commands.
+ Dashy has several commands that can be used for various tasks, you can find a list of these either in the [Developing Docs](/docs/developing.md#project-commands), or by looking at the [`package.json`](https://github.com/Lissy93/dashy/blob/master/package.json#L5). These can be used by running `yarn [command-name]`.
+**[⬆️ Back to Top](#management)**
+
+---
## Healthchecks
Healthchecks are configured to periodically check that Dashy is up and running correctly on the specified port. By default, the health script is called every 5 minutes, but this can be modified with the `--health-interval` option. You can check the current container health with: `docker inspect --format "{{json .State.Health }}" [container-id]`, and a summary of health status will show up under `docker ps`. You can also manually request the current application status by running `docker exec -it [container-id] yarn health-check`. You can disable healthchecks altogether by adding the `--no-healthcheck` flag to your Docker run command.
-To restart unhealthy containers automatically, check out [Autoheal](https://hub.docker.com/r/willfarrell/autoheal/). This image watches for unhealthy containers, and automatically triggers a restart. This is a stand in for Docker's `--exit-on-unhealthy` that was proposed, but [not merged](https://github.com/moby/moby/pull/22719).
+To restart unhealthy containers automatically, check out [Autoheal](https://hub.docker.com/r/willfarrell/autoheal/). This image watches for unhealthy containers, and automatically triggers a restart. (This is a stand in for Docker's `--exit-on-unhealthy` that was proposed, but [not merged](https://github.com/moby/moby/pull/22719)). There's also [Deunhealth](https://github.com/qdm12/deunhealth), which is super light-weight, and doesn't require network access.
+```
+docker run -d \
+ --name autoheal \
+ --restart=always \
+ -e AUTOHEAL_CONTAINER_LABEL=all \
+ -v /var/run/docker.sock:/var/run/docker.sock \
+ willfarrell/autoheal
+```
+
+**[⬆️ Back to Top](#management)**
+
+---
## Logs and Performance
#### Container Logs
@@ -36,6 +79,10 @@ You can also view logs, resource usage and other info as well as manage your ent
#### Advanced Logging and Monitoring
Docker supports using [Prometheus](https://prometheus.io/) to collect logs, which can then be visualized using a platform like [Grafana](https://grafana.com/). For more info, see [this guide](https://docs.docker.com/config/daemon/prometheus/). If you need to route your logs to a remote syslog, then consider using [logspout](https://github.com/gliderlabs/logspout). For enterprise-grade instances, there are managed services, that make monitoring container logs and metrics very easy, such as [Sematext](https://sematext.com/blog/docker-container-monitoring-with-sematext/) with [Logagent](https://github.com/sematext/logagent-js).
+**[⬆️ Back to Top](#management)**
+
+---
+
## Auto-Starting at System Boot
You can use Docker's [restart policies](https://docs.docker.com/engine/reference/run/#restart-policies---restart) to instruct the container to start after a system reboot, or restart after a crash. Just add the `--restart=always` flag to your Docker compose script or Docker run command. For more information, see the docs on [Starting Containers Automatically](https://docs.docker.com/config/containers/start-containers-automatically/).
@@ -44,25 +91,6 @@ For Podman, you can use `systemd` to create a service that launches your contain
To restart the container after something within it has crashed, consider using [`docker-autoheal`](https://github.com/willfarrell/docker-autoheal) by @willfarrell, a service that monitors and restarts unhealthy containers. For more info, see the [Healthchecks](#healthchecks) section above.
-## Securing
-
-#### SSL
-
-Enabling HTTPS with an SSL certificate is recommended if you hare hosting Dashy anywhere other than your home. This will ensure that all traffic is encrypted in transit.
-
-[Let's Encrypt](https://letsencrypt.org/docs/) is a global Certificate Authority, providing free SSL/TLS Domain Validation certificates in order to enable secure HTTPS access to your website. They have good browser/ OS [compatibility](https://letsencrypt.org/docs/certificate-compatibility/) with their ISRG X1 and DST CA X3 root certificates, support [Wildcard issuance](https://community.letsencrypt.org/t/acme-v2-production-environment-wildcards/55578) done via ACMEv2 using the DNS-01 and have [Multi-Perspective Validation](https://letsencrypt.org/2020/02/19/multi-perspective-validation.html). Let's Encrypt provide [CertBot](https://certbot.eff.org/) an easy app for generating and setting up an SSL certificate
-
-[ZeroSSL](https://zerossl.com/) is another popular certificate issuer, they are free for personal use, and also provide easy-to-use tools for getting things setup.
-
-
-If you're hosting Dashy behind Cloudflare, then they offer [free and easy SSL](https://www.cloudflare.com/en-gb/learning/ssl/what-is-an-ssl-certificate/).
-
-If you're not so comfortable on the command line, then you can use a tool like [SSL For Free](https://www.sslforfree.com/) to generate your Let's Encrypt or ZeroSSL certificate, and support shared hosting servers. They also provide step-by-step tutorials on setting up your certificate on most common platforms. If you are using shared hosting, you may find [this tutorial](https://www.sitepoint.com/a-guide-to-setting-up-lets-encrypt-ssl-on-shared-hosting/) helpful.
-
-#### Authentication
-Dashy has [basic authentication](/docs/authentication.md) built in, however at present this is handled on the front-end, and so where security is critical, it is recommended to use an alternative method. See [here](/docs/authentication.md#alternative-authentication-methods) for options regarding securing Dashy.
-
-
**[⬆️ Back to Top](#management)**
---
@@ -95,11 +123,477 @@ docker run -d \
For more information, see the [Watchtower Docs](https://containrrr.dev/watchtower/)
### Updating Dashy from Source
-1. Navigate into directory: `cd ./dashy`
-2. Stop your current instance
-3. Pull latest code: `git pull origin master`
-4. Re-build: `yarn build`
-5. Start: `yarn start`
+Stop your current instance of Dashy, then navigate into the source directory. Pull down the latest code, with `git pull origin master`, then update dependencies with `yarn`, rebuild with `yarn build`, and start the server again with `yarn start`.
+
+**[⬆️ Back to Top](#management)**
+
+---
+
+## Backing Up
+
+### Backing Up Containers
+
+You can make a backup of any running container really easily, using [`docker commit`](https://docs.docker.com/engine/reference/commandline/commit/) and save it with [`docker export`](https://docs.docker.com/engine/reference/commandline/export/), to do so:
+- First find the container ID, you can do this with `docker container ls`
+- Now to create the snapshot, just run `docker commit -p [container-id] my-backup`
+- Finally, to save the backup locally, run `docker save -o ~/dashy-backup.tar my-backup`
+- If you want to push this to a container registry, run `docker push my-backup:latest`
+
+Note that this will not include any data in docker volumes, and the process here is a bit different. Since these files exist on your host system, if you have an existing backup solution implemented, you can incorporate and volume files within that system.
+
+### Backing Up Volumes
+[offen/docker-volume-backup](https://github.com/offen/docker-volume-backup) is a useful tool for periodic Docker volume backups, to any S3-compatible storage provider. It's run as a light-weight Docker container, and is easy to setup, and also supports GPG-encryption, email notification, and routing away older backups.
+
+To get started, create a docker-compose similar to the example below, and then start the container. For more info, check out their [documentation](https://github.com/offen/docker-volume-backup), which is very clear.
+
+```yaml
+version: '3'
+services:
+ backup:
+ image: offen/docker-volume-backup:latest
+ environment:
+ BACKUP_CRON_EXPRESSION: "0 * * * *"
+ BACKUP_PRUNING_PREFIX: backup-
+ BACKUP_RETENTION_DAYS: 7
+ AWS_BUCKET_NAME: backup-bucket
+ AWS_ACCESS_KEY_ID: AKIAIOSFODNN7EXAMPLE
+ AWS_SECRET_ACCESS_KEY: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
+ volumes:
+ - data:/backup/my-app-backup:ro
+ - /var/run/docker.sock:/var/run/docker.sock:ro
+volumes:
+ data:
+```
+
+It's worth noting that this process can also be done manually, using the following commands:
+
+Backup:
+```
+docker run --rm -v some_volume:/volume -v /tmp:/backup alpine tar -cjf /backup/some_archive.tar.bz2 -C /volume ./
+```
+Restore:
+```
+docker run --rm -v some_volume:/volume -v /tmp:/backup alpine sh -c "rm -rf /volume/* /volume/..?* /volume/.[!.]* ; tar -C /volume/ -xjf /backup/some_archive.tar.bz2"
+```
+### Dashy-Specific Backup
+Since Dashy is open source, and freely available, providing you're configuration data is passed in as volumes, there shouldn't be any need to backup the main container. Your main config file, and any assets you're using should be kept backed up, preferably in at least two places, and you should ensure that you can easily restore from backup, if needed.
+
+Dashy also has a built-in cloud backup feature, which is free for personal users, and will let you make and restore fully encrypted backups of your config directly through the UI. To learn more, see the [Cloud Backup Docs](/docs/backup-restore.md)
+
+**[⬆️ Back to Top](#management)**
+
+---
+
+## Scheduling
+
+If you need to periodically schedule the running of a given command on Dashy (or any other container), then a useful tool for doing so it [ofelia](https://github.com/mcuadros/ofelia). This runs as a Docker container and is really useful for things like backups, logging, updating, notifications, etc. Crons are specified using Go's crontab format, and a useful tool for visualizing this is [crontab.guru](https://crontab.guru/). This can also be done natively with Alpine: `docker run -it alpine ls /etc/periodic`.
+I recommend combining this with [healthchecks](https://github.com/healthchecks/healthchecks) for easy monitoring of jobs, and failure notifications.
+
+**[⬆️ Back to Top](#management)**
+
+---
+
+## SSL Certificates
+
+Enabling HTTPS with an SSL certificate is recommended, especially if you hare hosting Dashy anywhere other than your home. This will ensure that all traffic is encrypted in transit.
+
+### Auto-SSL
+If you are using [NGINX Proxy Manager](https://nginxproxymanager.com/), then SSL is supported out of the box. Once you've added your proxy host and web address, then set the scheme to HTTPS, then under the SSL Tab select "Request a new SSL certificate" and follow the on-screen instructions.
+
+If you're hosting Dashy behind Cloudflare, then they offer [free and easy SSL](https://www.cloudflare.com/en-gb/learning/ssl/what-is-an-ssl-certificate/)- all you need to do is enable it under the SSL/TLS tab. Or if you are using shared hosting, you may find [this tutorial](https://www.sitepoint.com/a-guide-to-setting-up-lets-encrypt-ssl-on-shared-hosting/) helpful.
+
+### Getting a Self-Signed SSL Certificate
+[Let's Encrypt](https://letsencrypt.org/docs/) is a global Certificate Authority, providing free SSL/TLS Domain Validation certificates in order to enable secure HTTPS access to your website. They have good browser/ OS [compatibility](https://letsencrypt.org/docs/certificate-compatibility/) with their ISRG X1 and DST CA X3 root certificates, support [Wildcard issuance](https://community.letsencrypt.org/t/acme-v2-production-environment-wildcards/55578) done via ACMEv2 using the DNS-01 and have [Multi-Perspective Validation](https://letsencrypt.org/2020/02/19/multi-perspective-validation.html). Let's Encrypt provide [CertBot](https://certbot.eff.org/) an easy app for generating and setting up an SSL certificate.
+
+This process can be automated, using something like the [Docker-NGINX-Auto-SSL Container](https://github.com/Valian/docker-nginx-auto-ssl) to generate and renew certificates when needed.
+
+If you're not so comfortable on the command line, then you can use a tool like [SSL For Free](https://www.sslforfree.com/) or [ZeroSSL](https://zerossl.com/) to generate your cert. They also provide step-by-step setup instructions for most platforms.
+
+### Passing a Self-Signed Certificate to Dashy
+Once you've generated your SSL cert, you'll need to pass it to Dashy. This can be done by specifying the paths to your public and private keys using the `SSL_PRIV_KEY_PATH` and `SSL_PUB_KEY_PATH` environmental variables. Or if you're using Docker, then just pass public + private SSL keys in under `/etc/ssl/certs/dashy-pub.pem` and `/etc/ssl/certs/dashy-priv.key` respectively, e.g:
+
+```
+docker run -d \
+ -p 8080:80 \
+ -v ~/my-private-key.key:/etc/ssl/certs/dashy-priv.key:ro \
+ -v ~/my-public-key.pem:/etc/ssl/certs/dashy-pub.pem:ro \
+ lissy93/dashy:latest
+```
+
+By default the SSL port is `443` within a Docker container, or `4001` if running on bare metal, but you can override this with the `SSL_PORT` environmental variable.
+
+Once everything is setup, you can verify your site is secured using a tool like [SSL Checker](https://www.sslchecker.com/sslchecker).
+
+**[⬆️ Back to Top](#management)**
+
+---
+
+## Authentication
+
+Dashy natively supports secure authentication using KeyCloak. There is also a Simple Auth feature that doesn't require any additional setup. Usage instructions for both, as well as alternative auth methods, has now moved to the **[Authentication Docs](/docs/authentication.md)** page.
+
+**[⬆️ Back to Top](#management)**
+
+---
+
+## Managing Containers with Docker Compose
+
+When you have a lot of containers, it quickly becomes hard to manage with `docker run` commands. The solution to this is [docker compose](https://docs.docker.com/compose/), a handy tool for defining all a containers run settings in a single YAML file, and then spinning up that container with a single short command - `docker compose up`. A good example of which can be seen in [@abhilesh's docker compose collection](https://github.com/abhilesh/self-hosted_docker_setups).
+
+You can use Dashy's default [`docker-compose.yml`](https://github.com/Lissy93/dashy/blob/master/docker-compose.yml) file as a template, and modify it according to your needs.
+
+An example Docker compose, using the default base image from DockerHub, might look something like this:
+
+```yaml
+---
+version: "3.8"
+services:
+ dashy:
+ container_name: Dashy
+ image: lissy93/dashy
+ volumes:
+ - /root/my-config.yml:/app/public/conf.yml
+ ports:
+ - 4000:80
+ environment:
+ - BASE_URL=/my-dashboard
+ restart: unless-stopped
+ healthcheck:
+ test: ['CMD', 'node', '/app/services/healthcheck']
+ interval: 1m30s
+ timeout: 10s
+ retries: 3
+ start_period: 40s
+```
+
+**[⬆️ Back to Top](#management)**
+
+---
+
+## Passing in Environmental Variables
+
+With Docker, you can define environmental variables under the `environment` section of your Docker compose file. Environmental variables are used to configure high-level settings, usually before the config file has been read. For a list of all supported env vars in Dashy, see [the developing docs](/docs/developing.md#environmental-variables), or the default [`.env`](https://github.com/Lissy93/dashy/blob/master/.env) file.
+
+A common use case, is to run Dashy under a sub-page, instead of at the root of a URL (e.g. `https://my-homelab.local/dashy` instead of `https://dashy.my-homelab.local`). In this use-case, you'd specify the `BASE_URL` variable in your compose file.
+
+```yaml
+environment:
+ - BASE_URL=/dashy
+```
+
+You can also do the same thing with the docker run command, using the [`--env`](https://docs.docker.com/engine/reference/commandline/run/#set-environment-variables--e---env---env-file) flag.
+If you've got many environmental variables, you might find it useful to put them in a [`.env` file](https://docs.docker.com/compose/env-file/). Similarly, for Docker run you can use [`--env-file`](https://docs.docker.com/engine/reference/commandline/run/#set-environment-variables--e---env---env-file) if you'd like to pass in a file containing all your environmental variables.
+
+**[⬆️ Back to Top](#management)**
+
+---
+
+## Container Security
+
+- [Keep Docker Up-To-Date](#keep-docker-up-to-date)
+- [Set Resource Quotas](#set-resource-quotas)
+- [Don't Run as Root](#dont-run-as-root)
+- [Specify a User](#specify-a-user)
+- [Limit Capabilities](#limit-capabilities)
+- [Prevent new Privilages being Added](#prevent-new-privilages-being-added)
+- [Disable Inter-Container Communication](#disable-inter-container-communication)
+- [Don't Expose the Docker Daemon Socket](#dont-expose-the-docker-daemon-socket)
+- [Use Read-Only Volumes](#use-read-only-volumes)
+- [Set the Logging Level](#set-the-logging-level)
+- [Verify Image before Pulling](#verify-image-before-pulling)
+- [Specify the Tag](#specify-the-tag)
+- [Container Security Scanning](#container-security-scanning)
+- [Registry Security](#registry-security)
+- [Security Modules](#security-modules)
+
+### Keep Docker Up-To-Date
+To prevent known container escape vulnerabilities, which typically end in escalating to root/administrator privileges, patching Docker Engine and Docker Machine is crucial. For more info, see the [Docker Installation Docs](https://docs.docker.com/engine/install/).
+
+### Set Resource Quotas
+Docker enables you to limit resource consumption (CPU, memory, disk) on a per-container basis. This not only enhances system performance, but also prevents a compromised container from consuming a large amount of resources, in order to disrupt service or perform malicious activities. To learn more, see the [Resource Constraints Docs](https://docs.docker.com/config/containers/resource_constraints/)
+
+For example, to run Dashy with max of 1GB ram, and max of 50% of 1 CP core:
+`docker run -d -p 8080:80 --cpus=".5" --memory="1024m" lissy93/dashy:latest`
+
+### Don't Run as Root
+Running a container with admin privileges gives it more power than it needs, and can be abused. Dashy does not need any root privileges, and Docker by default doesn't run containers as root, so providing you don't specifically type sudo, you should be all good here.
+
+Note that if you're facing permission issues on Debian-based systems, you may need to add your user to the Docker group. First create the group: `sudo groupadd docker`, then add your (non-root) user: `sudo usermod −aG docker [my-username]`, finally `newgrp docker` to refresh.
+
+### Specify a User
+One of the best ways to prevent privilege escalation attacks, is to configure the container to use an unprivileged user. This also means that any files created by the container and mounted, will be owned by the specified user (and not root), which makes things much easier.
+
+You can specify a user, using the [`--user` param](https://docs.docker.com/engine/reference/run/#user), and should include the user ID (`UID`), which can be found by running `id -u`, and the and the group ID (`GID`), using `id -g`.
+
+With Docker run, you specify it like:
+`docker run --user 1000:1000 -p 8080:80 lissy93/dashy`
+
+Of if you're using Docker-compose, you could use an environmental variable
+
+```yaml
+version: "3.8"
+services:
+ dashy:
+ image: lissy93/dashy
+ user: ${CURRENT_UID}
+ ports: [ 4000:80 ]
+```
+
+And then to set the variable, and start the container, run: `CURRENT_UID=$(id -u):$(id -g) docker-compose up`
+
+### Limit capabilities
+Docker containers run with a subset of [Linux Kernal's Capabilities](https://man7.org/linux/man-pages/man7/capabilities.7.html) by default. It's good practice to drop privilege permissions that are not needed for any given container.
+
+With Docker run, you can use the `--cap-drop` flag to remove capabilities, you can also use `--cap-drop=all` and then define just the required permissions using the `--cap-add` option. For a list of available capabilities, see the [Privilege Capabilities Docs](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities).
+
+Here's an example using docker-compose, removing privileges that are not required for Dashy to run:
+
+```yaml
+version: "3.8"
+services:
+ dashy:
+ image: lissy93/dashy
+ ports: [ 4000:80 ]
+ cap_drop:
+ - ALL
+ cap_add:
+ - CHOWN
+ - SETGID
+ - SETUID
+ - DAC_OVERRIDE
+ - NET_BIND_SERVICE
+```
+
+### Prevent new Privilages being Added
+To prevent processes inside the container from getting additional privileges, pass in the `--security-opt=no-new-privileges:true` option to the Docker run command (see [docs](https://docs.docker.com/engine/reference/run/#security-configuration)).
+
+Run Command:
+`docker run --security-opt=no-new-privileges:true -p 8080:80 lissy93/dashy`
+
+Docker Compose
+```yaml
+security_opt:
+- no-new-privileges:true
+```
+
+### Disable Inter-Container Communication
+By default Docker containers can talk to each other (using [`docker0` bridged network](https://docs.docker.com/config/containers/container-networking/)). If you don't need this capability, then it should be disabled. This can be done with the `--icc=false` in your run command. You can learn more about how to facilitate secure communication between containers in the [Compose Networking docs](https://docs.docker.com/compose/networking/).
+
+### Don't Expose the Docker Daemon Socket
+Docker socket `/var/run/docker.sock` is the UNIX socket that Docker is listening to. This is the primary entry point for the Docker API. The owner of this socket is root. Giving someone access to it is equivalent to giving unrestricted root access to your host.
+
+You should **not** enable TCP Docker daemon socket (`-H tcp://0.0.0.0:XXX`), as doing so exposes un-encrypted and unauthenticated direct access to the Docker daemon, and if the host is connected to the internet, the daemon on your computer can be used by anyone from the public internet- which is bad. If you need TCP, you should [see the docs](https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-socket-option) to understand how to do this more securely.
+Similarly, never expose `/var/run/docker.sock` to other containers as a volume, as it can be exploited.
+
+### Use Read-Only Volumes
+You can specify that a specific volume should be read-only by appending `:ro` to the `-v` switch. For example, while running Dashy, if we want our config to be writable, but keep all other assets protected, we would do:
+```
+docker run -d \
+ -p 8080:80 \
+ -v ~/dashy-conf.yml:/app/public/conf.yml \
+ -v ~/dashy-icons:/app/public/item-icons:ro \
+ -v ~/dashy-theme.scss:/app/src/styles/user-defined-themes.scss:ro \
+ lissy93/dashy:latest
+```
+
+You can also prevent a container from writing any changes to volumes on your host's disk, using the `--read-only` flag. Although, for Dashy, you will not be able to write config changes to disk, when edited through the UI with this method. You could make this work, by specifying the config directory as a temp write location, with `--tmpfs /app/public/conf.yml` - but that this will not write the volume back to your host.
+
+### Set the Logging Level
+Logging is important, as it enables you to review events in the future, and in the case of a compromise this will let get an idea of what may have happened. The default log level is `INFO`, and this is also the recommendation, use `--log-level info` to ensure this is set.
+
+### Verify Image before Pulling
+Only use trusted images, from verified/ official sources. If an app is open source, it is more likely to be safe, as anyone can verify the code. There are also tools available for scanning containers,
+
+Unless otherwise configured, containers can communicate among each other, so running one bad image may lead to other areas of your setup being compromised. Docker images typically contain both original code, as well as up-stream packages, and even if that image has come from a trusted source, the up-stream packages it includes may not have.
+
+### Specify the Tag
+Using fixed tags (as opposed to `:latest` ) will ensure immutability, meaning the base image will not change between builds. Note that for Dashy, the app is being actively developed, new features, bug fixes and general improvements are merged each week, and if you use a fixed version you will not enjoy these benefits. So it's up to you weather you would prefer a stable and reproducible environment, or the latest features and enhancements.
+
+### Container Security Scanning
+It's helpful to be aware of any potential security issues in any of the Docker images you are using. You can run a quick scan using Snyk on any image to output known vulnerabilities using [Docker scan](https://docs.docker.com/engine/scan/), e.g: `docker scan lissy93/dashy:latest`.
+
+A similar product is [Trivy](https://github.com/aquasecurity/trivy), which is free an open source. First install it (with your package manager), then to scan an image, just run: `trivy image lissy93/dashy:latest`
+
+For larger systems, RedHat [Clair](https://www.redhat.com/en/topics/containers/what-is-clair) is an app for parsing image contents and reporting on any found vulnerabilities. You run it locally in a container, and configure it with YAML. It can be integrated with Red Hat Quay, to show results on a dashboard. Most of these use static analysis to find potential issues, and scan included packages for any known security vulnerabilities.
+
+### Registry Security
+Although over-kill for most users, you could run your own registry locally which would give you ultimate control over all images, see the [Deploying a Registry Docs](https://docs.docker.com/registry/deploying/) for more info. Another option is [Docker Trusted Registry](https://docker-docs.netlify.app/ee/dtr/), it's great for enterprise applications, it sits behind your firewall, running on a swarm managed by Docker Universal Control Plane, and lets you securely store and manage your Docker images, mitigating the risk of breaches from the internet.
+
+### Security Modules
+Docker supports several modules that let you write your own security profiles.
+
+[AppArmor](https://www.apparmor.net/)is a kernel module that proactively protects the operating system and applications from external or internal threats, by enabling you to restrict programs' capabilities with per-program profiles. You can specify either a security policy by name, or by file path with the `apparmor` flag in docker run. Learn more about writing profiles, [here](https://gitlab.com/apparmor/apparmor/-/wikis/QuickProfileLanguage).
+
+[Seccomp](https://en.wikipedia.org/wiki/Seccomp) (Secure Computing Mode) is a sandboxing facility in the Linux kernel that acts like a firewall for system calls (syscalls). It uses Berkeley Packet Filter (BPF) rules to filter syscalls and control how they are handled. These filters can significantly limit a containers access to the Docker Host’s Linux kernel - especially for simple containers/applications. It requires a Linux-based Docker host, with secomp enabled, and you can check for this by running `docker info | grep seccomp`. A great resource for learning more about this is [DockerLabs](https://training.play-with-docker.com/security-seccomp/).
+
+
+**[⬆️ Back to Top](#management)**
+
+---
+
+## Remote Access
+
+- [WireGuard](#wireguard)
+- [Reverse SSH Tunnel](#reverse-ssh-tunnel)
+
+### WireGuard
+
+Using a VPN is one of the easiest ways to provide secure, full access to your local network from remote locations. [WireGuard](https://www.wireguard.com/) is a reasonably new open source VPN protocol, that was designed with ease of use, performance and security in mind. Unlike OpenVPN, it doesn't need to recreate the tunnel whenever connection is dropped, and it's also much easier to setup, using shared keys instead.
+
+- **Install Wireguard** - See the [Install Docs](https://www.wireguard.com/install/) for download links + instructions
+ - On Debian-based systems, it's `sudo apt install wireguard`
+- **Generate a Private Key** - Run `wg genkey` on the Wireguard server, and copy it to somewhere safe for later
+- **Create Server Config** - Open or create a file at `/etc/wireguard/wg0.conf` and under `[Interface]` add the following (see example below):
+ - `Address` - as a subnet of all desired IPs
+ - `PrivateKey` - that you just generated
+ - `ListenPort` - Default is `51820`, but can be anything
+- **Get Client App** - Download the [WG client app](https://www.wireguard.com/install/) for your platform (Linux, Windows, MacOS, Android or iOS are all supported)
+- **Create new Client Tunnel** - On your client app, there should be an option to create a new tunnel, when doing so a client private key will be generated (but if not, use the `wg genkey` command again), and keep it somewhere safe. A public key will also be generated, and this will go in our saver config
+- **Add Clients to Server Config** - Head back to your `wg0.conf` file on the server, create a `[Peer]` section, and populate the following info
+ - `AllowedIPs` - List of IP address inside the subnet, the client should have access to
+ - `PublicKey` - The public key for the client you just generated
+- **Start the Server** - You can now start the WG server, using: `wg-quick up wg0` on your server
+- **Finish Client Setup** - Head back to your client device, and edit the config file, leave the private key as is, and add the following fields:
+ - `PublicKey` - The public key of the server
+ - `Address` - This should match the `AllowedIPs` section on the servers config file
+ - `DNS` - The DNS server that'll be used when accessing the network through the VPN
+ - `Endpoint` - The hostname or IP + Port where your WG server is running (you may need to forward this in your firewall's settings)
+- **Done** - Your clients should now be able to connect to your WG server :) Depending on your networks firewall rules, you may need to port forward the address of your WG server
+
+**Example Server Config**
+
+```ini
+# Server file
+[Interface]
+# Which networks does my interface belong to? Notice: /24 and /64
+Address = 10.5.0.1/24, 2001:470:xxxx:xxxx::1/64
+PrivateKey = xxx
+ListenPort = 51820
+
+# Peer 1
+[Peer]
+PublicKey = xxx
+# Which source IPs can I expect from that peer? Notice: /32 and /128
+AllowedIps = 10.5.0.35/32, 2001:470:xxxx:xxxx::746f:786f/128
+
+# Peer 2
+[Peer]
+PublicKey = xxx
+# Which source IPs can I expect from that peer? This one has a LAN which can
+# access hosts/jails without NAT.
+# Peer 2 has a single IP address inside the VPN: it's 10.5.0.25/32
+AllowedIps = 10.5.0.25/32,10.21.10.0/24,10.21.20.0/24,10.21.30.0/24,10.31.0.0/24,2001:470:xxxx:xxxx::ca:571e/128
+```
+
+**Example Client Config**
+
+```ini
+[Interface]
+# Which networks does my interface belong to? Notice: /24 and /64
+Address = 10.5.0.35/24, 2001:470:xxxx:xxxx::746f:786f/64
+PrivateKey = xxx
+
+# Server
+[Peer]
+PublicKey = xxx
+# I want to route everything through the server, both IPv4 and IPv6. All IPs are
+# thus available through the Server, and I can expect packets from any IP to
+# come from that peer.
+AllowedIPs = 0.0.0.0/0, ::0/0
+# Where is the server on the internet? This is a public address. The port
+# (:51820) is the same as ListenPort in the [Interface] of the Server file above
+Endpoint = 1.2.3.4:51820
+# Usually, clients are behind NAT. to keep the connection running, keep alive.
+PersistentKeepalive = 15
+```
+
+
+A useful tool for getting WG setup is [Algo](https://github.com/trailofbits/algo). It includes scripts and docs which cover almost all devices, platforms and clients, and has best practices implemented, and security features enabled. All of this is better explained in [this blog post](https://blog.trailofbits.com/2016/12/12/meet-algo-the-vpn-that-works/).
+
+
+### Reverse SSH Tunnel
+
+SSH (or [Secure Shell](https://en.wikipedia.org/wiki/Secure_Shell)) is a secure tunnel that allows you to connect to a remote host. Unlike the VPN methods, an SSH connection does not require an intermediary, and will not be affected by your IP changing. However it only allows you to access a single service at a time. SSH was really designed for terminal access, but because of the latter mentioned benefits it's useful to setup, as a fallback option.
+
+Directly SSH'ing into your home, would require you to open a port (usually 22), which would be terrible for security, and is not recommended. However a reverse SSH connection is initiated from inside your network. Once the connection is established, the port is redirected, allowing you to use the established connection to SSH into your home network.
+
+The issue you've probably spotted, is that most public, corporate, and institutional networks will block SSH connections. To overcome this, you'd have to establish a server outside of your homelab that your homelab's device could SSH into to establish the reverse SSH connection. You can then connect to that remote server (the _mothership_), which in turn connects to your home network.
+
+Now all of this is starting to sound like quite a lot of work, but this is where services like [remot3.it](https://remote.it/) come in. They maintain the intermediary mothership server, and create the tunnel service for you. It's free for personal use, secure and easy. There are several similar services, such as [RemoteIoT](https://remoteiot.com/), or you could create your own on a cloud VPS (see [this tutorial](https://gist.github.com/nileshtrivedi/4c615e8d3c1bf053b0d31176b9e69e42) for more info on that).
+
+Before getting started, you'll need to head over to [Remote.it](https://app.remote.it/auth/#/sign-up) and create an account.
+
+Then setup your local device:
+1. If you haven't already done so, you'll need to enable and configure SSH.
+ - This is out-of-scope of this article, but I've explained it in detail in [this post](https://notes.aliciasykes.com/22798/my-server-setup#configure-ssh).
+2. Download the Remote.it install script from their [GitHub](https://github.com/remoteit/installer)
+ - `curl -LkO https://raw.githubusercontent.com/remoteit/installer/master/scripts/auto-install.sh`
+3. Make it executable, with `chmod +x ./auto-install.sh`, and then run it with `sudo ./auto-install.sh`
+4. Finally, configure your device, by running `sudo connectd_installer` and following the on-screen instructions
+
+And when you're ready to connect to it:
+1. Login to [app.remote.it](https://app.remote.it/), and select the name of your device
+2. You should see a list of running services, click SSH
+3. You'll then be presented with some SSH credentials that you can now use to securely connect to your home, via the Remote.it servers
+
+Done :)
+
+**[⬆️ Back to Top](#management)**
+
+---
+
+## Custom Domain
+
+- [Using DNS](#using-nginx)
+- [Using NGINX](#using-dns)
+
+### Using DNS
+For locally running services, a domain can be set up directly in the DNS records. This method is really quick and easy, and doesn't require you to purchase an actual domain. Just update your networks DNS resolver, to point your desired URL to the local IP where Dashy (or any other app) is running. For example, a line in your hosts file might look something like: `192.168.0.2 dashy.homelab.local`.
+
+If you're using Pi-Hole, a similar thing can be done in the `/etc/dnsmasq.d/03-custom-dns.conf` file, add a line like: `address=/dashy.example.com/192.168.2.0` for each of your services.
+
+If you're running OPNSense/ PfSense, then this can be done through the UI with Unbound, it's explained nicely in [this article](https://homenetworkguy.com/how-to/use-custom-domain-name-in-internal-network/), by Dustin Casto.
+
+### Using NGINX
+If you're using NGINX, then you can use your own domain name, with a config similar to the below example.
+
+```
+upstream dashy {
+ server 127.0.0.1:32400;
+}
+
+server {
+ listen 80;
+ server_name dashy.mydomain.com;
+
+ # Setup SSL
+ ssl_certificate /var/www/mydomain/sslcert.pem;
+ ssl_certificate_key /var/www/mydomain/sslkey.pem;
+ ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
+ ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
+ ssl_session_timeout 5m;
+ ssl_prefer_server_ciphers on;
+
+ location / {
+ proxy_pass http://dashy;
+ proxy_redirect off;
+ proxy_buffering off;
+ proxy_set_header host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
+ }
+}
+```
+Similarly, a basic `Caddyfile` might look like:
+
+```
+dashy.example.com {
+ reverse_proxy / nginx:80
+}
+```
+
+For more info, [this guide](https://thehomelab.wiki/books/dns-reverse-proxy/page/create-domain-records-to-point-to-your-home-server-on-cloudflare-using-nginx-progy-manager) on Setting up Domains with NGINX Proxy Manager and CloudFlare may be useful.
**[⬆️ Back to Top](#management)**
@@ -120,6 +614,11 @@ Note, that if you choose not to use `server.js` to serve up the app, you will lo
- Writing config file to disk from the UI
- Website status indicators, and ping checks
+Example Configs
+- [NGINX](#nginx)
+- [Apache](#apache)
+- [cPanel](#cpanel)
+
### NGINX
Create a new file in `/etc/nginx/sites-enabled/dashy`
@@ -180,9 +679,29 @@ Then restart Apache, with `sudo systemctl restart apache2`
---
-## Authentication
+## Running a Modified Version of the App
-Dashy has built-in authentication and login functionality. However, since this is handled on the client-side, if you are using Dashy in security-critical situations, it is recommended to use an alternate method for authentication, such as [Authelia](https://www.authelia.com/), a VPN or web server and firewall rules. For more info, see **[Authentication Docs](/docs/authentication.md)**.
+If you'd like to make any code changes to the app, and deploy your modified version, this section briefly explains how.
+The first step is to fork the project on GitHub, and clone it to your local system. Next, install the dependencies (`yarn`), and start the development server (`yarn dev`) and visit `localhost:8080` in your browser. You can then make changes to the codebase, and see the live app update in real-time. Once you've finished, running `yarn build` will build the app for production, and output the assets into `./dist` which can then be deployed using a web server, CDN or the built-in Node server with `yarn start`. For more info on all of this, take a look at the [Developing Docs](/docs/developing.md). To build your own Docker container from the modified app, see [Building your Own Container](#building-your-own-container)
-**[⬆️ Back to Top](#management)**
\ No newline at end of file
+**[⬆️ Back to Top](#management)**
+
+---
+
+## Building your Own Container
+
+Similar to above, you'll first need to fork and clone Dashy to your local system, and then install dependencies.
+
+Then, either use Dashy's default [`Dockerfile`](https://github.com/Lissy93/dashy/blob/master/Dockerfile) as is, or modify it according to your needs.
+
+To build and deploy locally, first build the app with: `docker build -t dashy .`, and then start the app with `docker run -p 8080:80 --name my-dashboard dashy`. Or modify the `docker-compose.yml` file, replacing `image: lissy93/dashy` with `build: .` and run `docker compose up`.
+
+Your container should now be running, and will appear in the list when you run `docker container ls –a`. If you'd like to enter the container, run `docker exec -it [container-id] /bin/ash`.
+
+You may wish to upload your image to a container registry for easier access. Note that if you choose to do this on a public registry, please name your container something other than just 'dashy', to avoid confusion with the official image.
+You can push your build image, by running: `docker push ghcr.io/OWNER/IMAGE_NAME:latest`. You will first need to authenticate, this can be done by running `echo $CR_PAT | docker login ghcr.io -u USERNAME --password-stdin`, where `CR_PAT` is an environmental variable containing a token generated from your GitHub account. For more info, see the [Container Registry Docs](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry).
+
+**[⬆️ Back to Top](#management)**
+
+---
\ No newline at end of file
diff --git a/docs/privacy.md b/docs/privacy.md
index 76d3c271..434fac1d 100644
--- a/docs/privacy.md
+++ b/docs/privacy.md
@@ -18,6 +18,10 @@ If an item's icon is set to `favicon`, then it will be auto-fetched from the cor
The default favicon API is [Favicon Kit](https://faviconkit.com/), but this can be changed by setting `appConfig.faviconApi` to an alternate source (`google`, `clearbit`, `webmasterapi` and `allesedv` are supported). If you do not want to use any API, then you can set this property to `local`, and the favicon will be fetched from the default path. For hosted services, this will still incur an external request.
+### Generative Icons
+If an item has the icon set to `generative`, then an external request it made to [Dice Bear](https://dicebear.com/) to fetch the uniquely generated icon. The URL of a given service is used as the key for generating the icon, but it is first hashed and encoded for basic privacy. For more info, please reference the [Dicebear Privacy Policy](https://avatars.dicebear.com/legal/privacy-policy)
+
+
### Other Icons
Section icons, item icons and app icons are able to accept a URL to a raw image, if the image is hosted online then an external request will be made. To avoid the need to make external requests for icon assets, you can either use a self-hosted CDN, or store your images within `./public/item-icons` (which can be mounted as a volume if you're using Docker).
diff --git a/docs/quick-start.md b/docs/quick-start.md
index ade9a407..7041fc76 100644
--- a/docs/quick-start.md
+++ b/docs/quick-start.md
@@ -19,14 +19,15 @@ To pull the latest image, and build and start the app run:
```
docker run -d \
-p 8080:80 \
+ -v ~/my-conf.yml:/app/public/conf.yml \
--name my-dashboard \
--restart=always \
lissy93/dashy:latest
```
-For a full list of available options, then see [Dashy with Docker](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#deploy-with-docker) Docs. If you'd prefer to use Docker Compose, then see [Dashy with Docker Compose](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#using-docker-compose) Docs.
+Either replace the -v path to point to your config file, or leave it out. For a full list of available options, then see [Dashy with Docker](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#deploy-with-docker) Docs. If you'd prefer to use Docker Compose, then see [Dashy with Docker Compose](https://github.com/Lissy93/dashy/blob/master/docs/deployment.md#using-docker-compose) Docs. Alternate registries, architectures and pinned versions are also supported.
-Your dashboard should now be up and running at `http://localhost:8080` (or your servers IP address/ domain, and the port that you chose). The first build will may take a few minutes
+Your dashboard should now be up and running at `http://localhost:8080` (or your servers IP address/ domain, and the port that you chose). The first time you build, it may take a few minutes.
---
@@ -84,22 +85,21 @@ Once you've got Dashy setup, you'll want to ensure the container is properly hea
You might also want to check out the docs for specific features you'd like to use:
- [Authentication](/docs/authentication.md) - Setting up authentication to protect your dashboard
+- [Alternate Views](/docs/alternate-views.md) - Using the startpage and workspace view
- [Backup & Restore](/docs/backup-restore.md) - Guide to Dashy's cloud sync feature
- [Icons](/docs/icons.md) - Outline of all available icon types for sections and items
- [Localisation](/docs/multi-language-support.md) - How to change language, or add your own
- [Status Indicators](/docs/status-indicators.md) - Using Dashy to monitor uptime and status of your apps
+- [Search & Shortcuts](/docs/searching.md) - Using instant filter, web search and custom hotkeys
- [Theming](/docs/theming.md) - Complete guide to applying, writing and modifying themes and styles
---
## 5. Final Note
-If you're enjoying Dashy, and have a few minutes to spare, please do take a moment to look at the [Contributing Page](https://github.com/Lissy93/dashy/blob/master/docs/contributing.md). There are a few things that we really need some help with, and whatever your skill set, there are ways you can help out. Any contributions, however small would be greatly appreciated.
-Thank you to [everyone](https://github.com/Lissy93/dashy/blob/master/docs/credits.md) who is already doing so, without developing and maintaining Dashy would not have been so possible.
+If you need any help or support in getting Dashy running, head over to the [Discussions](https://github.com/Lissy93/dashy/discussions) page. If you think you've found a bug, please do [raise it](https://github.com/Lissy93/dashy/issues/new/choose) so it can be fixed. For contact options, see the [Support Page](https://github.com/Lissy93/dashy/blob/master/.github/SUPPORT.md).
-You can also consider sharing your dashboard in the [Showcase](https://github.com/Lissy93/dashy/blob/master/docs/showcase.md), to help provide inspiration for others.
-
-For more info, check out the [Documentation](https://github.com/Lissy93/dashy/tree/master/docs#readme). If you've got any questions feel free to ask in the [Discussion](https://github.com/Lissy93/dashy/discussions), and if you think you've found a bug you can [raise an issue](https://github.com/Lissy93/dashy/issues/new/choose) to get it fixed.
+If you're enjoying Dashy, and have a few minutes to spare, please do take a moment to look at the [Contributing Page](https://github.com/Lissy93/dashy/blob/master/docs/contributing.md). Huge thanks to [everyone](https://github.com/Lissy93/dashy/blob/master/docs/credits.md) who has already helped out!
Enjoy your dashboard :)
@@ -126,3 +126,15 @@ Don't have a server? No problem! You can run Dashy for free on Netlify (as well
2. [Log in](app.netlify.com/login/) to Netlify with GitHub
3. Click "New site from Git" and select your forked repo, then click **Deploy**!
4. You can then edit the config in `./public/conf.yml` in your repo, and Netlify will rebuild the app
+
+---
+
+## Alternative Deployment Method 3 - Cloud Services
+
+Dashy supports 1-Click deployments on several popular cloud platforms. To spin up a new instance, just click a link below:
+- [ Deploy to Netlify](https://app.netlify.com/start/deploy?repository=https://github.com/lissy93/dashy)
+- [ Deploy to Heroku](https://heroku.com/deploy?template=https://github.com/Lissy93/dashy)
+- [ Deploy to Vercel](https://vercel.com/new/project?template=https://github.com/lissy93/dashy)
+- [ Deploy to Render](https://render.com/deploy?repo=https://github.com/lissy93/dashy/tree/deploy_render)
+- [ Deploy to GCP](https://deploy.cloud.run/?git_repo=https://github.com/lissy93/dashy.git)
+- [ Deploy to PWD](https://labs.play-with-docker.com/?stack=https://raw.githubusercontent.com/Lissy93/dashy/master/docker-compose.yml)
\ No newline at end of file
diff --git a/docs/searching.md b/docs/searching.md
index 870618d1..e699f97d 100644
--- a/docs/searching.md
+++ b/docs/searching.md
@@ -7,7 +7,7 @@ One of the primary purposes of Dashy is to allow you to quickly find and launch
You can navigate through your items or search results using the keyboard. You can use Tab to cycle through results, and Shift + Tab to go backwards. Or use the arrow keys, ↑ , → , ↓ and ← .
## Launching Apps
-You can launch a elected app by hitting Enter . This will open the app using your default opening method, specified in `target` (either `newtab`, `sametab`, `modal` or `workspace`). You can also use Alt + Enter to open the app in a pop-up modal, or Ctrl + Enter to open it in a new tab. For all available opening methods, just right-click on an item, to bring up the context menu.
+You can launch a elected app by hitting Enter . This will open the app using your default opening method, specified in `target` (either `newtab`, `sametab`, `modal`, `top` or `workspace`). You can also use Alt + Enter to open the app in a pop-up modal, or Ctrl + Enter to open it in a new tab. For all available opening methods, just right-click on an item, to bring up the context menu.
## Tags
By default, items are filtered by the `title` attribute, as well as the hostname (extracted from `url`), the `provider` and `description`. If you need to find results based on text which isn't included in these attributes, then you can add `tags` to a given item.
diff --git a/docs/showcase.md b/docs/showcase.md
index cd6da0c8..5f946545 100644
--- a/docs/showcase.md
+++ b/docs/showcase.md
@@ -23,6 +23,14 @@
---
+### EVO Dashboard
+
+> By [@EVOTk](https://github.com/EVOTk)
+
+
+
+---
+
### NAS Home Dashboard
> By [@cerealconyogurt](https://github.com/cerealconyogurt)
@@ -32,7 +40,8 @@
### Dashy Live
> By [@Lissy93](https://github.com/lissy93)
-> A dashboard I made to manage all project development links from one place
+
+> A dashboard I made to manage all project development links from one place. View demo at [live.dashy.to](https://live.dashy.to/).

@@ -54,6 +63,14 @@
---
+### Dashy Example
+
+> An example dashboard, by [@Lissy93](https://github.com/lissy93). View live at [demo.dashy.to](https://demo.dashy.to/).
+
+
+
+---
+
### First Week of Self-Hosting
> By [u//RickyCZ](https://www.reddit.com/user/RickyCZ)
@@ -61,6 +78,16 @@
---
+### HomeLAb 3.0
+
+> By [@skoogee](https://github.com/skoogee) (http://zhrn.cc)
+
+> Dashy, is the most complete dashboard I ever tried, has all the features, and it sets itself apart from the rest. It is my default homepage now. I am thankful to the developer @Lissy93 for sharing such a wonderful creation.
+
+[](https://ibb.co/album/ynSwzm)
+
+---
+
### Ground Control
> By [@dtctek](https://github.com/dtctek)
diff --git a/docs/showcase/12-evo-dashboard.png b/docs/showcase/12-evo-dashboard.png
new file mode 100644
index 00000000..324a0b57
Binary files /dev/null and b/docs/showcase/12-evo-dashboard.png differ
diff --git a/docs/status-indicators.md b/docs/status-indicators.md
index 9d3ad488..0c473e8e 100644
--- a/docs/status-indicators.md
+++ b/docs/status-indicators.md
@@ -65,7 +65,7 @@ If the status is always returning an error, despite the service being online, th
If your service requires requests to include any authorization in the headers, then use the `statusCheckHeaders` property, as described above.
If you are still having issues, it may be because your target application is blocking requests from Dashy's IP. This is a [CORS error](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS), and can be fixed by setting the headers on your target app, to include:
```
-Access-Control-Allow-Origin: https://location-of-dashy/
+Access-Control-Allow-Origin: https://[dashy-location]/
Vary: Origin
```
If the URL you are checking is not using HTTPS, then you may need to disable the rejection of insecure requests. This can be done by setting `statusCheckAllowInsecure` to true for a given item.
@@ -74,13 +74,13 @@ If you get an error, like `Service Unavailable: Server resulted in a fatal error
Currently, the status check needs a page to be rendered, so if this URL in your browser does not return anything, then status checks will not work. This may be modified in the future, but in the meantime, a fix would be to make your own status service, which just checks if your app responds with whatever code you'd like, and then return a 200 plus renders an arbitrary message. Then just point `statusCheckUrl` to your custom page.
-For further troubleshooting, use an application like [Postman](https://postman.com) to diagnose the issue. Set the parameter to `GET`, and then make a call to: `https://[url-of-dashy]/ping/?&url=[service-url]`. Where the service URL must have first been encoded (e.g. with `encodeURIComponent()` or [urlencoder.io](https://www.urlencoder.io/))
+For further troubleshooting, use an application like [Postman](https://postman.com) to diagnose the issue. Set the parameter to `GET`, and then make a call to: `https://[url-of-dashy]/status-check/?&url=[service-url]`. Where the service URL must have first been encoded (e.g. with `encodeURIComponent()` or [urlencoder.io](https://www.urlencoder.io/))
If you're serving Dashy though a CDN, instead of using the Node server or Docker image, then the Node endpoint that makes requests will not be available to you, and all requests will fail. A workaround for this may be implemented in the future, but in the meantime, your only option is to use the Docker or Node deployment method.
## How it Works
-When the app is loaded, if `appConfig.statusCheck: true` is set, or if any items have the `statusCheck: true` enabled, then Dashy will make a request, to `https://[your-host-name]/ping?url=[address-or-servce]` (may al include GET params for headers and the secure flag), which in turn will ping that running service, and respond with a status code. Response time is calculated from the difference between start and end time of the request.
+When the app is loaded, if `appConfig.statusCheck: true` is set, or if any items have the `statusCheck: true` enabled, then Dashy will make a request, to `https://[your-host-name]/status-check?url=[address-or-servce]` (may al include GET params for headers and the secure flag), which in turn will ping that running service, and respond with a status code. Response time is calculated from the difference between start and end time of the request.
When the response completes, an indicator will display next to each item. The color denotes the status: Yellow while waiting for the response to return, green if request was successful, red if it failed, and grey if it was unable to make the request all together.
diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md
index 1e210967..70c52539 100644
--- a/docs/troubleshooting.md
+++ b/docs/troubleshooting.md
@@ -78,6 +78,24 @@ auth:
---
+## Config Not Updating
+
+Dashy has the option to save settings and config locally, in browser storage. Anything here will take precedence over whatever is in your config file, sometimes with unintended consequences. If you've updated the config file manually, and are not seeing changes reflected in the UI, then try visiting the site in Incognito mode. If that works, then the solution is just to clear local storage. This can be done from the config menu, under "Clear Local Settings".
+
+---
+
+## Config Still not Updating
+
+Sometimes your text editor updates files [inode](https://linuxhandbook.com/inode-linux/), meaning changes will not be picked up by the Docker container. This [article](https://medium.com/@jonsbun/why-need-to-be-careful-when-mounting-single-files-into-a-docker-container-4f929340834) explains things further.
+
+---
+
+## Styles and Assets not Updating
+
+If you find that your styles and other visual assets work when visiting `ip:port` by not `dashy.domain.com`, then this is usually caused by caching. In your browser, do a hard-refresh (Ctrl + F5 ). If you use Cloudflare, then you can clear the cache through the management console, or set the cache level to Bypass for certain files, under the Rules tab.
+
+---
+
## DockerHub `toomanyrequests`
This situation relates to error messages similar to one of the following, returned when pulling, updating or running the Docker container from Docker Hub.
@@ -138,6 +156,12 @@ Please acknowledge the difference between errors and warnings before raising an
---
+## Docker Login Fails on Ubuntu
+
+Run `sudo apt install gnupg2 pass && gpg2 -k`
+
+---
+
## Status Checks Failing
If you're using status checks, and despite a given service being online, the check is displaying an error, there are a couple of things you can look at:
@@ -154,6 +178,6 @@ If you get an error, like `Service Unavailable: Server resulted in a fatal error
Currently, the status check needs a page to be rendered, so if this URL in your browser does not return anything, then status checks will not work. This may be modified in the future, but in the meantime, a fix would be to make your own status service, which just checks if your app responds with whatever code you'd like, and then return a 200 plus renders an arbitrary message. Then just point `statusCheckUrl` to your custom page.
-For further troubleshooting, use an application like [Postman](https://postman.com) to diagnose the issue. Set the parameter to `GET`, and then make a call to: `https://[url-of-dashy]/ping/?&url=[service-url]`. Where the service URL must have first been encoded (e.g. with `encodeURIComponent()` or [urlencoder.io](https://www.urlencoder.io/))
+For further troubleshooting, use an application like [Postman](https://postman.com) to diagnose the issue. Set the parameter to `GET`, and then make a call to: `https://[url-of-dashy]/status-check/?&url=[service-url]`. Where the service URL must have first been encoded (e.g. with `encodeURIComponent()` or [urlencoder.io](https://www.urlencoder.io/))
If you're serving Dashy though a CDN, instead of using the Node server or Docker image, then the Node endpoint that makes requests will not be available to you, and all requests will fail. A workaround for this may be implemented in the future, but in the meantime, your only option is to use the Docker or Node deployment method.
\ No newline at end of file
diff --git a/netlify.toml b/netlify.toml
index 79c7438a..6ed4983e 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -4,7 +4,7 @@
# Essential site config
[build]
- base = "/"
+ base = "/"
command = "yarn build"
publish = "dist"
functions = "services/serverless-functions"
@@ -27,10 +27,16 @@
to = "/.netlify/functions/not-supported"
status = 301
force = true
+
+# For router history mode, ensure pages land on index
+[[redirects]]
+ from = "/*"
+ to = "/index.html"
+ status = 200
# Set any security headers here
[[headers]]
for = "/*"
- [headers.values]
+ [headers.values]
# Uncomment to enable Netlify user control. You must have a paid plan.
# Basic-Auth = "someuser:somepassword anotheruser:anotherpassword"
diff --git a/package.json b/package.json
index 023a0a46..d99c37b7 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,9 @@
{
"name": "Dashy",
- "version": "1.8.3",
+ "version": "1.9.3",
"license": "MIT",
"main": "server",
+ "author": "Alicia Sykes (https://aliciasykes.com)",
"scripts": {
"start": "node server",
"dev": "vue-cli-service serve",
@@ -16,30 +17,32 @@
"dependency-audit": "npx improved-yarn-audit --ignore-dev-deps"
},
"dependencies": {
- "@sentry/tracing": "^6.10.0",
- "@sentry/vue": "^6.10.0",
- "ajv": "^8.6.2",
- "axios": "^0.21.4",
- "body-parser": "^1.19.0",
- "connect": "^3.7.0",
+ "@formschema/native": "^2.0.0-beta.5",
+ "@sentry/tracing": "^6.13.1",
+ "@sentry/vue": "^6.13.1",
+ "ajv": "^8.6.3",
+ "axios": "^0.24.0",
+ "connect-history-api-fallback": "^1.6.0",
"crypto-js": "^4.1.1",
+ "express": "^4.17.1",
"js-yaml": "^4.1.0",
"keycloak-js": "^15.0.2",
"register-service-worker": "^1.6.2",
"remedial": "^1.0.8",
"rsup-progress": "^2.0.4",
- "serve-static": "^1.14.1",
- "simple-icons": "^5.12.0",
+ "simple-icons": "^5.19.0",
"v-jsoneditor": "^1.4.2",
"v-tooltip": "^2.1.3",
"vue": "^2.6.10",
- "vue-i18n": "^8.25.0",
+ "vue-i18n": "^8.25.1",
"vue-js-modal": "^2.0.0-rc.6",
+ "vue-json-tree-view": "^2.1.6",
"vue-material-tabs": "0.1.5",
"vue-router": "^3.0.3",
- "vue-select": "^3.12.1",
+ "vue-select": "^3.15.0",
"vue-swatches": "^2.1.1",
- "vue-toasted": "^1.1.28"
+ "vue-toasted": "^1.1.28",
+ "vuex": "^3.6.2"
},
"devDependencies": {
"@architect/sandbox": "^3.7.4",
diff --git a/public/conf.yml b/public/conf.yml
index 2bc33c90..b4e49194 100644
--- a/public/conf.yml
+++ b/public/conf.yml
@@ -1,33 +1,47 @@
---
+# Page meta info, like heading, footer text and nav links
pageInfo:
title: Dashy
+ description: Welcome to your new dashboard!
navLinks:
- - title: Home
- path: /
- - title: About
- path: /about
- - title: Source Code
+ - title: GitHub
path: https://github.com/Lissy93/dashy
+ - title: Documentation
+ path: https://dashy.to/docs
+
+# Optional app settings and configuration
appConfig:
theme: colorful
- fontAwesomeKey: 0821c65656
+
+# Main content - An array of sections, each containing an array of items
sections:
- name: Getting Started
+ icon: fas fa-rocket
items:
- - title: Source
- description: Source code and documentation on GitHub
- icon: fab fa-github
- url: https://github.com/Lissy93/dashy
- - title: Issues
- description: View currently open issues, or raise a new one
- icon: fas fa-bug
- url: https://github.com/Lissy93/dashy/issues
- - title: Demo 1
- description: 'Live Demo #1'
- icon: far fa-rocket
- url: https://dashy-demo-1.netlify.app
- - title: Demo 2
- description: 'Live Demo #2'
- icon: fad fa-planet-ringed
- url: https://dashy-demo-2.netlify.app
+ - title: Dashy Live
+ description: Development a project management links for Dashy
+ icon: https://i.ibb.co/qWWpD0v/astro-dab-128.png
+ url: https://live.dashy.to/
+ target: newtab
+ - title: GitHub
+ description: Source Code, Issues and Pull Requests
+ url: https://github.com/lissy93/dashy
+ icon: favicon
+ - title: Docs
+ description: Configuring & Usage Documentation
+ provider: Dashy.to
+ icon: far fa-book
+ url: https://dashy.to/docs
+ - title: Showcase
+ description: See how others are using Dashy
+ url: https://github.com/Lissy93/dashy/blob/master/docs/showcase.md
+ icon: far fa-grin-hearts
+ - title: Config Guide
+ description: See full list of configuration options
+ url: https://github.com/Lissy93/dashy/blob/master/docs/configuring.md
+ icon: fas fa-wrench
+ - title: Support
+ description: Get help with Dashy, raise a bug, or get in contact
+ url: https://github.com/Lissy93/dashy/blob/master/.github/SUPPORT.md
+ icon: far fa-hands-helping
\ No newline at end of file
diff --git a/public/img/icons/android-chrome-512x512.png b/public/img/icons/android-chrome-512x512.png
new file mode 100644
index 00000000..8e070b2d
Binary files /dev/null and b/public/img/icons/android-chrome-512x512.png differ
diff --git a/public/img/icons/apple-touch-icon-152x152.png b/public/img/icons/apple-touch-icon-152x152.png
new file mode 100644
index 00000000..8e070b2d
Binary files /dev/null and b/public/img/icons/apple-touch-icon-152x152.png differ
diff --git a/public/img/icons/favicon-16x16.png b/public/img/icons/favicon-16x16.png
new file mode 100644
index 00000000..629a3687
Binary files /dev/null and b/public/img/icons/favicon-16x16.png differ
diff --git a/public/index.html b/public/index.html
index c02e9e4d..6c43844c 100644
--- a/public/index.html
+++ b/public/index.html
@@ -1,27 +1,63 @@
-
-
-
+
+
+
Dashy
+
+
- Sorry, JavaScript is required to run this app 😥
+ Sorry, JavaScript needs to be enabled to run Dashy 😥
-
-
-
+
+
-
\ No newline at end of file
diff --git a/public/default.html b/public/initialization.html
similarity index 96%
rename from public/default.html
rename to public/initialization.html
index aaedff4f..3b751b8a 100644
--- a/public/default.html
+++ b/public/initialization.html
@@ -1,7 +1,7 @@
-
+
Dashy
diff --git a/server.js b/server.js
index f19704bf..f3455f46 100644
--- a/server.js
+++ b/server.js
@@ -5,13 +5,16 @@
* Also includes some routes for status checks/ ping and config saving
* */
-/* Include required node dependencies */
-const serveStatic = require('serve-static');
-const connect = require('connect');
+/* Import built-in Node server modules */
+const http = require('http');
+const path = require('path');
const util = require('util');
const dns = require('dns');
const os = require('os');
-const bodyParser = require('body-parser');
+
+/* Import Express + middleware functions */
+const express = require('express');
+const history = require('connect-history-api-fallback');
/* Kick of some basic checks */
require('./services/update-checker'); // Checks if there are any updates available, prints message
@@ -21,6 +24,7 @@ require('./services/config-validator'); // Include and kicks off the config file
const statusCheck = require('./services/status-check'); // Used by the status check feature, uses GET
const saveConfig = require('./services/save-config'); // Saves users new conf.yml to file-system
const rebuild = require('./services/rebuild-app'); // A script to programmatically trigger a build
+const sslServer = require('./services/ssl-server');
/* Helper functions, and default config */
const printMessage = require('./services/print-message'); // Function to print welcome msg on start
@@ -54,43 +58,43 @@ const printWarning = (msg, error) => {
/* A middleware function for Connect, that filters requests based on method type */
const method = (m, mw) => (req, res, next) => (req.method === m ? mw(req, res, next) : next());
-try {
- connect()
- .use(bodyParser.json())
- // Serves up the main built application to the root
- .use(serveStatic(`${__dirname}/dist`))
- // During build, a custom page will be served before the app is available
- .use(serveStatic(`${__dirname}/public`, { index: 'default.html' }))
- // GET endpoint to run status of a given URL with GET request
- .use(ENDPOINTS.statusCheck, (req, res) => {
- try {
- statusCheck(req.url, async (results) => {
- await res.end(results);
- });
- } catch (e) {
- printWarning(`Error running status check for ${req.url}\n`, e);
- }
- })
- // POST Endpoint used to save config, by writing conf.yml to disk
- .use(ENDPOINTS.save, method('POST', (req, res) => {
- try {
- saveConfig(req.body, (results) => { res.end(results); });
- } catch (e) {
- res.end(JSON.stringify({ success: false, message: e }));
- }
- }))
- // GET endpoint to trigger a build, and respond with success status and output
- .use(ENDPOINTS.rebuild, (req, res) => {
- rebuild().then((response) => {
- res.end(JSON.stringify(response));
- }).catch((response) => {
- res.end(JSON.stringify(response));
+const app = express()
+ // Serves up static files
+ .use(express.static(path.join(__dirname, 'dist')))
+ .use(express.static(path.join(__dirname, 'public'), { index: 'initialization.html' }))
+ // Load middlewares for parsing JSON, and supporting HTML5 history routing
+ .use(express.json())
+ .use(history())
+ // GET endpoint to run status of a given URL with GET request
+ .use(ENDPOINTS.statusCheck, (req, res) => {
+ try {
+ statusCheck(req.url, async (results) => {
+ await res.end(results);
});
- })
- // Finally, initialize the server then print welcome message
- .listen(port, () => {
- try { printWelcomeMessage(); } catch (e) { printWarning('Dashy is Starting...'); }
+ } catch (e) {
+ printWarning(`Error running status check for ${req.url}\n`, e);
+ }
+ })
+ // POST Endpoint used to save config, by writing conf.yml to disk
+ .use(ENDPOINTS.save, method('POST', (req, res) => {
+ try {
+ saveConfig(req.body, (results) => { res.end(results); });
+ } catch (e) {
+ printWarning('Error writing config file to disk', e);
+ res.end(JSON.stringify({ success: false, message: e }));
+ }
+ }))
+ // GET endpoint to trigger a build, and respond with success status and output
+ .use(ENDPOINTS.rebuild, (req, res) => {
+ rebuild().then((response) => {
+ res.end(JSON.stringify(response));
+ }).catch((response) => {
+ res.end(JSON.stringify(response));
});
-} catch (error) {
- printWarning('Sorry, a critical error occurred ', error);
-}
+ });
+
+/* Create HTTP server from app on port, and print welcome message */
+http.createServer(app).listen(port, () => { printWelcomeMessage(); });
+
+/* Check, and if possible start SSL server too */
+sslServer(app);
diff --git a/services/config-validator.js b/services/config-validator.js
index bc6545e3..b56c4d35 100644
--- a/services/config-validator.js
+++ b/services/config-validator.js
@@ -19,6 +19,9 @@ const ajv = new Ajv(validatorOptions);
/* Message printed when validation was successful */
const successMsg = () => '\x1b[1m\x1b[32mNo issues found, your configuration is valid :)\x1b[0m\n';
+/* Just a wrapper to system's console.log */
+const logToConsole = (msg) => { console.log(msg); };
+
/* Formats error message. ready for printing to the console */
const errorMsg = (output) => {
const warningFont = '\x1b[103m\x1b[34m';
@@ -46,14 +49,14 @@ const setIsValidVariable = (isValid) => {
/* Start the validation */
const validate = (config) => {
- console.log('\nChecking config file against schema...');
+ logToConsole('\nChecking config file against schema...');
const valid = ajv.validate(schema, config);
if (valid) {
setIsValidVariable(true);
- console.log(successMsg());
+ logToConsole(successMsg());
} else {
setIsValidVariable(false);
- console.log(errorMsg(ajv.errors));
+ logToConsole(errorMsg(ajv.errors));
}
};
@@ -62,11 +65,11 @@ try {
validate(config);
} catch (e) { // Something went very wrong...
setIsValidVariable(false);
- console.log(bigError());
- console.log('Please ensure that your config file is present, '
+ logToConsole(bigError());
+ logToConsole('Please ensure that your config file is present, '
+ 'has the correct access rights and is parsable. '
+ 'If this warning persists, it may be an issue with the '
+ 'validator function. Please raise an issue, and include the following stack trace:\n');
console.warn('\x1b[33mStack Trace for config-validator.js:\x1b[0m\n', e);
- console.log('\n\n');
+ logToConsole('\n\n');
}
diff --git a/services/ssl-server.js b/services/ssl-server.js
new file mode 100644
index 00000000..a3dada05
--- /dev/null
+++ b/services/ssl-server.js
@@ -0,0 +1,40 @@
+const fs = require('fs');
+const util = require('util');
+const https = require('https');
+
+const promise = util.promisify;
+const stat = promise(fs.stat);
+
+module.exports = (app) => {
+ const httpsCerts = {
+ private: process.env.SSL_PRIV_KEY_PATH || '/etc/ssl/certs/dashy-priv.key',
+ public: process.env.SSL_PUB_KEY_PATH || '/etc/ssl/certs/dashy-pub.pem',
+ };
+
+ const isDocker = !!process.env.IS_DOCKER;
+ const SSLPort = process.env.SSL_PORT || (isDocker ? 443 : 4001);
+
+ const printSuccess = () => {
+ console.log(`🔐 HTTPS server successfully started (port: ${SSLPort} ${isDocker ? 'of container' : ''})`);
+ };
+
+ const printNotSoGood = (msg) => {
+ console.log(`SSL Not Enabled: ${msg}`);
+ };
+
+ /* Starts SSL-secured node server */
+ const startSSLServer = () => {
+ const httpsServer = https.createServer({
+ key: fs.readFileSync(httpsCerts.private),
+ cert: fs.readFileSync(httpsCerts.public),
+ }, app);
+ httpsServer.listen(SSLPort, () => { printSuccess(); });
+ };
+
+ /* Check if SSL certs present, if so also start the HTTPS server */
+ stat(httpsCerts.public).then(() => {
+ stat(httpsCerts.private).then(() => {
+ startSSLServer();
+ }).catch(() => { printNotSoGood('Private key not present'); });
+ }).catch(() => { printNotSoGood('Public key not present'); });
+};
diff --git a/services/update-checker.js b/services/update-checker.js
index 8f503888..5160fa77 100644
--- a/services/update-checker.js
+++ b/services/update-checker.js
@@ -4,6 +4,10 @@ const currentVersion = require('../package.json').version;
const packageUrl = 'https://raw.githubusercontent.com/Lissy93/dashy/master/package.json';
+const logToConsole = (msg) => {
+ console.log(msg); // eslint-disable-line no-console
+};
+
const makeMsg = (latestVersion) => {
const parse = (version) => parseInt(version.replace(/\./g, ''), 10);
const difference = parse(latestVersion) - parse(currentVersion);
@@ -20,9 +24,9 @@ const makeMsg = (latestVersion) => {
axios.get(packageUrl).then((response) => {
if (response && response.data && response.data.version) {
- console.log(`\nUsing Dashy V-${currentVersion}. Update Check Complete`);
- console.log(makeMsg(response.data.version));
+ logToConsole(`\nUsing Dashy V-${currentVersion}. Update Check Complete`);
+ logToConsole(makeMsg(response.data.version));
}
}).catch(() => {
- console.log('Unable to check for updates');
+ logToConsole('Unable to check for updates');
});
diff --git a/src/App.vue b/src/App.vue
index 098656e9..d1f0e761 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,5 +1,6 @@
+
@@ -10,11 +11,11 @@
import Header from '@/components/PageStrcture/Header.vue';
import Footer from '@/components/PageStrcture/Footer.vue';
+import EditModeTopBanner from '@/components/InteractiveEditor/EditModeTopBanner.vue';
import LoadingScreen from '@/components/PageStrcture/LoadingScreen.vue';
-import { componentVisibility } from '@/utils/ConfigHelpers';
-import ConfigAccumulator from '@/utils/ConfigAccumalator';
import { welcomeMsg } from '@/utils/CoolConsole';
import ErrorHandler from '@/utils/ErrorHandler';
+import Keys from '@/utils/StoreMutations';
import {
localStorageKeys,
splashScreenTime,
@@ -22,28 +23,17 @@ import {
language as defaultLanguage,
} from '@/utils/defaults';
-const Accumulator = new ConfigAccumulator();
-const config = Accumulator.config();
-const visibleComponents = componentVisibility(config.appConfig) || defaultVisibleComponents;
-
export default {
name: 'app',
components: {
Header,
Footer,
LoadingScreen,
- },
- provide: {
- config,
- visibleComponents,
+ EditModeTopBanner,
},
data() {
return {
isLoading: true, // Set to false after mount complete
- showFooter: visibleComponents.footer,
- appConfig: Accumulator.appConfig(),
- pageInfo: Accumulator.pageInfo(),
- visibleComponents,
};
},
computed: {
@@ -53,9 +43,29 @@ export default {
},
/* Determine if splash screen should be shown */
shouldShowSplash() {
- return (this.visibleComponents || defaultVisibleComponents).splashScreen
- || !localStorage[localStorageKeys.HIDE_WELCOME_BANNER];
+ return (this.visibleComponents || defaultVisibleComponents).splashScreen;
},
+ config() {
+ return this.$store.state.config;
+ },
+ appConfig() {
+ return this.$store.getters.appConfig;
+ },
+ pageInfo() {
+ return this.$store.getters.pageInfo;
+ },
+ sections() {
+ return this.$store.getters.pageInfo;
+ },
+ visibleComponents() {
+ return this.$store.getters.visibleComponents;
+ },
+ isEditMode() {
+ return this.$store.state.editMode;
+ },
+ },
+ created() {
+ this.$store.dispatch(Keys.INITIALIZE_CONFIG);
},
methods: {
/* Injects the users custom CSS as a style tag */
@@ -104,9 +114,14 @@ export default {
/* Fetch or detect users language, then apply it */
applyLanguage() {
const language = this.getLanguage();
+ this.$store.commit(Keys.SET_LANGUAGE, language);
this.$i18n.locale = language;
document.getElementsByTagName('html')[0].setAttribute('lang', language);
},
+ hideLoader() {
+ const loader = document.getElementById('loader');
+ if (loader) loader.style.display = 'none';
+ },
},
/* When component mounted, hide splash and initiate the injection of custom styles */
mounted() {
@@ -115,6 +130,7 @@ export default {
if (this.appConfig.customCss) {
const cleanedCss = this.appConfig.customCss.replace(/<\/?[^>]+(>|$)/g, '');
this.injectCustomStyles(cleanedCss);
+ this.hideLoader();
}
welcomeMsg();
},
diff --git a/src/assets/interface-icons/back-arrow.svg b/src/assets/interface-icons/back-arrow.svg
new file mode 100644
index 00000000..d34b2539
--- /dev/null
+++ b/src/assets/interface-icons/back-arrow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/burger-menu.svg b/src/assets/interface-icons/burger-menu.svg
new file mode 100644
index 00000000..8a8b715c
--- /dev/null
+++ b/src/assets/interface-icons/burger-menu.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-add.svg b/src/assets/interface-icons/interactive-editor-add.svg
new file mode 100644
index 00000000..bfa907d9
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-app-config.svg b/src/assets/interface-icons/interactive-editor-app-config.svg
new file mode 100644
index 00000000..9f9d7864
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-app-config.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-cancel-changes.svg b/src/assets/interface-icons/interactive-editor-cancel-changes.svg
new file mode 100644
index 00000000..8db2e459
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-cancel-changes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-copy-clipboard.svg b/src/assets/interface-icons/interactive-editor-copy-clipboard.svg
new file mode 100644
index 00000000..78430407
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-copy-clipboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-edit-mode.svg b/src/assets/interface-icons/interactive-editor-edit-mode.svg
new file mode 100644
index 00000000..d85eef0b
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-edit-mode.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-export-changes.svg b/src/assets/interface-icons/interactive-editor-export-changes.svg
new file mode 100644
index 00000000..794407d4
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-export-changes.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-move-to.svg b/src/assets/interface-icons/interactive-editor-move-to.svg
new file mode 100644
index 00000000..4a3794d7
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-move-to.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-page-info.svg b/src/assets/interface-icons/interactive-editor-page-info.svg
new file mode 100644
index 00000000..5fdfbd54
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-page-info.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-remove.svg b/src/assets/interface-icons/interactive-editor-remove.svg
new file mode 100644
index 00000000..500af9cb
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-remove.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-save-disk.svg b/src/assets/interface-icons/interactive-editor-save-disk.svg
new file mode 100644
index 00000000..5b61bcf0
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-save-disk.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/interactive-editor-save-locally.svg b/src/assets/interface-icons/interactive-editor-save-locally.svg
new file mode 100644
index 00000000..b25a6a1b
--- /dev/null
+++ b/src/assets/interface-icons/interactive-editor-save-locally.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/open-parent.svg b/src/assets/interface-icons/open-parent.svg
new file mode 100644
index 00000000..09f69591
--- /dev/null
+++ b/src/assets/interface-icons/open-parent.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/open-top.svg b/src/assets/interface-icons/open-top.svg
new file mode 100644
index 00000000..b93ecf0d
--- /dev/null
+++ b/src/assets/interface-icons/open-top.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/open-workspace.svg b/src/assets/interface-icons/open-workspace.svg
index b0a186ca..6c0590d8 100644
--- a/src/assets/interface-icons/open-workspace.svg
+++ b/src/assets/interface-icons/open-workspace.svg
@@ -1,20 +1 @@
-
-
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/src/assets/interface-icons/unknown-icon.svg b/src/assets/interface-icons/unknown-icon.svg
new file mode 100644
index 00000000..2a3a5c66
--- /dev/null
+++ b/src/assets/interface-icons/unknown-icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json
index f2d9e747..50d58465 100644
--- a/src/assets/locales/en.json
+++ b/src/assets/locales/en.json
@@ -38,7 +38,7 @@
"edit-config-tab": "Edit Config",
"custom-css-tab": "Custom Styles",
"heading": "Configuration Options",
- "download-config-button": "Download Config",
+ "download-config-button": "View / Export Config",
"edit-config-button": "Edit Config",
"edit-css-button": "Edit Custom CSS",
"cloud-sync-button": "Enable Cloud Sync",
@@ -102,6 +102,7 @@
"export-button": "Export Custom Variables",
"reset-button": "Reset Styles for",
"show-all-button": "Show All Variables",
+ "change-fonts-button": "Change Fonts",
"save-button": "Save",
"cancel-button": "Cancel",
"saved-toast": "{theme} Updated Successfully",
@@ -113,6 +114,7 @@
"location-local-label": "Apply Locally",
"location-disk-label": "Write Changes to Config File",
"save-button": "Save Changes",
+ "preview-button": "Preview Changes",
"valid-label": "Config is Valid",
"status-success-msg": "Task Complete",
"status-fail-msg": "Task Failed",
@@ -165,9 +167,82 @@
"restore-success-msg": "Config Restored Successfully"
},
"menu": {
- "sametab": "Open in Current Tab",
- "newtab": "Open in New Tab",
- "modal": "Open in Pop-Up Modal",
- "workspace": "Open in Workspace View"
+ "open-section-title": "Open In",
+ "sametab": "Current Tab",
+ "newtab": "New Tab",
+ "modal": "Pop-Up Modal",
+ "workspace": "Workspace View",
+ "options-section-title": "Options",
+ "edit-item": "Edit",
+ "move-item": "Copy or Move",
+ "remove-item": "Remove"
+ },
+ "context-menus": {
+ "item": {
+ "open-section-title": "Open In",
+ "sametab": "Current Tab",
+ "newtab": "New Tab",
+ "modal": "Pop-Up Modal",
+ "workspace": "Workspace View",
+ "options-section-title": "Options",
+ "edit-item": "Edit",
+ "move-item": "Copy or Move",
+ "remove-item": "Remove"
+ },
+ "section": {
+ "open-section": "Open Section",
+ "edit-section": "Edit",
+ "move-section": "Move To",
+ "remove-section": "Remove"
+ }
+ },
+ "interactive-editor": {
+ "menu": {
+ "start-editing-tooltip": "Enter the Interactive Editor",
+ "edit-site-data-subheading": "Edit Site Data",
+ "edit-page-info-btn": "Edit Page Info",
+ "edit-page-info-tooltip": "App title, description, nav links, footer text, etc",
+ "edit-app-config-btn": "Edit App Config",
+ "edit-app-config-tooltip": "All other app configuration options",
+ "config-save-methods-subheading": "Config Saving Options",
+ "save-locally-btn": "Save Locally",
+ "save-locally-tooltip": "Save config locally, to browser storage. This will not affect your config file, but changes will only be saved on this device",
+ "save-disk-btn": "Save to Disk",
+ "save-disk-tooltip": "Save config to the conf.yml file on disk. This will backup, and then over-write your existing config",
+ "export-config-btn": "Export Config",
+ "export-config-tooltip": "View and export new config, either to a file, or to clipboard",
+ "cloud-backup-btn": "Backup to Cloud",
+ "cloud-backup-tooltip": "Save encrypted backup of configuration to cloud",
+ "edit-raw-config-btn": "Edit Raw Config",
+ "edit-raw-config-tooltip": "View and modify raw config via JSON editor",
+ "cancel-changes-btn": "Cancel Edit",
+ "cancel-changes-tooltip": "Reset current modifications, and exit Edit Mode. This will not affect your saved config",
+ "edit-mode-name": "Edit Mode",
+ "edit-mode-subtitle": "You are in Edit Mode",
+ "edit-mode-description": "This means you can make modifications to your config, and preview the results, but until you save, none of your changes will be preserved.",
+ "save-stage-btn": "Save",
+ "cancel-stage-btn": "Cancel"
+ },
+ "edit-section": {
+ "edit-section-title": "Edit Section",
+ "add-section-title": "Add New Section",
+ "edit-tooltip": "Click to Edit, or right-click for more options",
+ "remove-confirm": "Are you sure you want to remove this section? This action can be undone later."
+ },
+ "edit-app-config": {
+ "warning-msg-title": "Proceed with Caution",
+ "warning-msg-l1": "The following options are for advanced app configuration.",
+ "warning-msg-l2": "If you are unsure about any of the fields, please reference the",
+ "warning-msg-docs": "documentation",
+ "warning-msg-l3": "to avoid unintended consequences."
+ },
+ "export": {
+ "export-title": "Export Config",
+ "copy-clipboard-btn": "Copy to Clipboard",
+ "copy-clipboard-tooltip": "Copy all app config to system clipboard, in YAML format",
+ "download-file-btn": "Download as File",
+ "download-file-tooltip": "Download all app config to your device, in a YAML file",
+ "view-title": "View Config"
+ }
}
}
\ No newline at end of file
diff --git a/src/assets/locales/fr.json b/src/assets/locales/fr.json
index bfb72e11..0af355f6 100644
--- a/src/assets/locales/fr.json
+++ b/src/assets/locales/fr.json
@@ -78,7 +78,7 @@
"item-size-small": "Petite",
"item-size-medium": "Moyenne",
"item-size-large": "Grande",
- "config-launcher-label": "Config.",
+ "config-launcher-label": "Configuration",
"config-launcher-tooltip": "Modifier la configuration",
"sign-out-tooltip": "Déconnexion",
"sign-in-tooltip": "Connexion",
@@ -102,6 +102,7 @@
"export-button": "Exporter des variables personnalisées",
"reset-button": "Réinitialiser les styles pour",
"show-all-button": "Afficher toutes les variables",
+ "change-fonts-button": "Changer les Polices d'écritures",
"save-button": "Enregistrer",
"cancel-button": "Annuler",
"saved-toast": "{theme} mis à jour avec succès",
@@ -113,6 +114,7 @@
"location-local-label": "Appliquer localement",
"location-disk-label": "Appliquer dans le fichier de configuration",
"save-button": "Enregistrer",
+ "preview-button": "Prévisuliser les modifications",
"valid-label": "La configuration est valide",
"status-success-msg": "Tâche terminée",
"status-fail-msg": "Échec de la tâche",
@@ -165,9 +167,78 @@
"restore-success-msg": "Configuration restaurée avec succès"
},
"menu": {
+ "open-section-title": "Ouvrir ...",
"sametab": "Ouvrir dans l'onglet actuel",
"newtab": "Ouvrir dans un nouvel onglet",
"modal": "Ouvrir en mode fenêtré",
- "workspace": "Ouvrir en plein écran"
+ "workspace": "Ouvrir en plein écran",
+ "options-section-title": "Options",
+ "edit-item": "Modifier",
+ "move-item": "Copier et Déplacer",
+ "remove-item": "Supprimer"
+ },
+ "context-menus": {
+ "item": {
+ "open-section-title": "Ouvrir ...",
+ "sametab": "Ouvrir dans l'onglet actuel",
+ "newtab": "Ouvrir dans un nouvel onglet",
+ "modal": "Ouvrir en mode fenêtré",
+ "workspace": "Ouvrir en plein écran",
+ "options-section-title": "Options",
+ "edit-item": "Modifier",
+ "move-item": "Copier et Déplacer",
+ "remove-item": "Supprimer"
+ },
+ "section": {
+ "open-section": "Ouvrir",
+ "edit-section": "Modifier",
+ "move-section": "Déplacer vers",
+ "remove-section": "Supprimer"
+ }
+ },
+ "interactive-editor": {
+ "menu": {
+ "start-editing-tooltip": "Entrer dans l'éditeur interactif",
+ "edit-site-data-subheading": "Modifier l'application",
+ "edit-page-info-btn": "Modifier les informations",
+ "edit-page-info-tooltip": "Titre de l'application, description, liens de navigation, texte de pied de page, etc.",
+ "edit-app-config-btn": "Modifier la configuration",
+ "edit-app-config-tooltip": "Toutes les autres options de configuration",
+ "config-save-methods-subheading": "Options de sauvegarde",
+ "save-locally-btn": "Enregistrer localement",
+ "save-locally-tooltip": "Enregistrez la configuration localement, dans le stockage du navigateur. Cela n'affectera pas votre fichier de configuration, mais les modifications ne seront présentes que sur cet appareil",
+ "save-disk-btn": "Enregistrer sur le disque",
+ "save-disk-tooltip": "Enregistrez la configuration dans le fichier conf.yml sur le disque. Cela sauvegardera, puis écrasera votre configuration existante",
+ "export-config-btn": "Exporter la configuration",
+ "export-config-tooltip": "Afficher et exporter la nouvelle configuration, soit dans un fichier, soit dans le presse-papier",
+ "cancel-changes-btn": "Annuler",
+ "cancel-changes-tooltip": "Réinitialisez les modifications en cours et quittez le mode d'édition. Cela n'affectera pas votre configuration enregistrée",
+ "edit-mode-name": "Éditeur interactif",
+ "edit-mode-subtitle": "Vous êtes en mode d'édition",
+ "edit-mode-description": "Vous pouvez apporter des modifications à votre configuration et prévisualiser les résultats, mais jusqu'à ce que vous sauvegardiez, aucune de vos modifications ne sera conservée.",
+ "save-stage-btn": "Enregistrer",
+ "cancel-stage-btn": "Annuler"
+ },
+ "edit-section": {
+ "edit-section-title": "Éditeur",
+ "add-section-title": "Ajouter une section",
+ "edit-tooltip": "Cliquer pour modifier ou cliquer droit pour plus d'options",
+ "remove-confirm": "Voulez-vous vraiment supprimer cette section ? Cette action peut être annulée ultérieurement."
+ },
+ "edit-app-config": {
+ "warning-msg-title": "Procéder avec prudence",
+ "warning-msg-l1": "Les options suivantes concernent la configuration avancée de l'application.",
+ "warning-msg-l2": "Si vous n'êtes pas sûr de l'un des champs, veuillez consulter la",
+ "warning-msg-docs": "documentation",
+ "warning-msg-l3": "pour éviter des conséquences inattendues."
+ },
+ "export": {
+ "export-title": "Exporter la configuration",
+ "copy-clipboard-btn": "Copier dans le presse-papier",
+ "copy-clipboard-tooltip": "Copier la configuration complète de l'application sur votre appareil dans un fichier YAML",
+ "download-file-btn": "Télécharger",
+ "download-file-tooltip": "Téléchargez la configuration complète de l'application sur votre appareil dans un fichier YAML",
+ "view-title": "Afficher la configuration"
+ }
}
}
diff --git a/src/assets/locales/nb.json b/src/assets/locales/nb.json
new file mode 100644
index 00000000..305b4c04
--- /dev/null
+++ b/src/assets/locales/nb.json
@@ -0,0 +1,172 @@
+{
+ "home": {
+ "no-results": "Ingen søkeresultater",
+ "no-data": "Ingen data konfigurert"
+ },
+ "search": {
+ "search-label": "Søk",
+ "search-placeholder": "Begynn å skrive for å filtrere",
+ "clear-search-tooltip": "Fjern søk",
+ "enter-to-search-web": "Trykk enter for å søke på nettet"
+ },
+ "login": {
+ "title": "Dashy",
+ "username-label": "Brukernavn",
+ "password-label": "Passord",
+ "login-button": "Logg inn",
+ "remember-me-label": "Husk meg",
+ "remember-me-never": "Aldri",
+ "remember-me-hour": "4 timer",
+ "remember-me-day": "1 dag",
+ "remember-me-week": "1 uke",
+ "error-missing-username": "Mangler brukernavn",
+ "error-missing-password": "Manglende passord",
+ "error-incorrect-username": "Bruker ikke funnet",
+ "error-incorrect-password": "Feil passord",
+ "success-message": "Logger på...",
+ "logout-message": "Logget ut",
+ "already-logged-in-title": "Allerede logget inn",
+ "already-logged-in-text": "Du er logget inn som",
+ "continue-to-dashboard": "Fortsett til dashbordet",
+ "log-out-button": "Logg ut",
+ "continue-guest-button": "Fortsett som gjest"
+ },
+ "config": {
+ "main-tab": "Hovedmeny",
+ "view-config-tab": "Vis konfigurering",
+ "edit-config-tab": "Rediger konfigurering",
+ "custom-css-tab": "Egendefinerte stiler",
+ "heading": "Konfigurasjonsalternativer",
+ "download-config-button": "Last ned konfigurasjon",
+ "edit-config-button": "Rediger konfigurering",
+ "edit-css-button": "Rediger tilpasset CSS",
+ "cloud-sync-button": "Aktiver skysynkronisering",
+ "edit-cloud-sync-button": "Rediger skysynkronisering",
+ "rebuild-app-button": "Bygg program",
+ "change-language-button": "Endre appspråk",
+ "reset-settings-button": "Tilbakestill lokale innstillinger",
+ "app-info-button": "Appinfo",
+ "backup-note": "Det anbefales å ta en sikkerhetskopi av konfigurasjonen din før du gjør endringer.",
+ "reset-config-msg-l1": "Dette fjerner alle brukerinnstillinger fra lokal lagring, men påvirker ikke din 'conf.yml' -fil.",
+ "reset-config-msg-l2": "Du bør først ta sikkerhetskopi av eventuelle endringer du har gjort lokalt, hvis du vil bruke dem i fremtiden.",
+ "reset-config-msg-l3": "Er du sikker på at du vil fortsette?",
+ "data-cleared-msg": "Data slettet vellykket",
+ "actions-label": "Handlinger",
+ "copy-config-label": "Kopier konfigurasjon",
+ "data-copied-msg": "Konfig er kopiert til utklippstavlen",
+ "reset-config-label": "Tilbakestill konfigurasjon",
+ "css-save-btn": "Lagre endringer",
+ "css-note-label": "Merk",
+ "css-note-l1": "Du må oppdatere siden for at endringene dine skal tre i kraft.",
+ "css-note-l2": "Overstyring av stiler lagres bare lokalt, så det anbefales å lage en kopi av CSS.",
+ "css-note-l3": "For å fjerne alle egendefinerte stiler, slett innholdet og trykk Lagre endringer"
+ },
+ "alternate-views": {
+ "alternate-view-heading": "Bytt visning",
+ "default": "Standard",
+ "workspace": "Workspace",
+ "minimal": "Minimal"
+ },
+ "settings": {
+ "theme-label": "Tema",
+ "layout-label": "Layout",
+ "layout-auto": "Auto",
+ "layout-horizontal": "Horisontal",
+ "layout-vertical": "Vertikal",
+ "item-size-label": "Enhetsstørrelse",
+ "item-size-small": "Small",
+ "item-size-medium": "Medium",
+ "item-size-large": "Large",
+ "config-launcher-label": "Konfig",
+ "config-launcher-tooltip": "Oppdater konfigurasjon",
+ "sign-out-tooltip": "Logg av",
+ "sign-in-tooltip": "Logg inn",
+ "sign-in-welcome": "Hei {brukernavn}!"
+ },
+ "updates": {
+ "app-version-note": "Dashy-versjon",
+ "up-to-date": "Oppdatert",
+ "out-of-date": "Oppdatering tilgjengelig",
+ "unsupported-version-l1": "Du bruker en ikke-støttet versjon av Dashy",
+ "unsupported-version-l2": "For den beste opplevelsen og de siste sikkerhetsoppdateringene, vennligst oppdater til"
+ },
+ "language-switcher": {
+ "title": "Endre applikasjonsspråk",
+ "dropdown-label": "Velg et språk",
+ "save-button": "Lagre",
+ "success-msg": "Språk oppdatert til"
+ },
+ "theme-maker": {
+ "title": "Temakonfigurator",
+ "export-button": "Eksporter tilpassede variabler",
+ "reset-button": "Tilbakestill stiler for",
+ "show-all-button": "Vis alle variabler",
+ "save-button": "Lagre",
+ "cancel-button": "Avbryt",
+ "saved-toast": "{theme} Oppdatert vellykket",
+ "copied-toast": "Temadata for {theme} kopiert til utklippstavlen",
+ "reset-toast": "Egendefinerte farger for {theme} fjernet"
+ },
+ "config-editor": {
+ "save-location-label": "Lagre beliggenhet",
+ "location-local-label": "Søk lokalt",
+ "location-disk-label": "Skriv endringer i konfigurasjonsfil",
+ "save-button": "Lagre endringer",
+ "valid-label": "Konfigurasjon er gyldig",
+ "status-success-msg": "Oppgaven fullført",
+ "status-fail-msg": "Oppgaven mislyktes",
+ "success-msg-disk": "Konfigurasjonsfil skrevet til disk med hell",
+ "success-msg-local": "Lokale endringer er lagret",
+ "success-note-l1": "Appen bør bygge om automatisk.",
+ "success-note-l2": "Dette kan ta opptil et minutt.",
+ "success-note-l3": "Du må oppdatere siden for at endringene skal tre i kraft.",
+ "error-msg-save-mode": "Velg en lagringsmodus: lokal eller fil",
+ "error-msg-cannot-save": "Det oppsto en feil under konfigurering",
+ "error-msg-bad-json": "Feil i JSON, muligens feilformet",
+ "warning-msg-validation": "Valideringsadvarsel",
+ "not-admin-note": "Du kan ikke skrive endret til disk, fordi du ikke er logget inn som admin"
+ },
+ "app-rebuild": {
+ "title": "Ombygg applikasjon",
+ "rebuild-note-l1": "En ombygging er nødvendig for at endringer skrevet i conf.yml-filen skal tre i kraft.",
+ "rebuild-note-l2": "Dette bør skje automatisk, men hvis det ikke har blitt gjort, kan du manuelt utløse det her.",
+ "rebuild-note-l3": "Dette er ikke nødvendig for endringer som er lagret lokalt.",
+ "rebuild-button": "Start Build",
+ "rebuilding-status-1": "Building ...",
+ "rebuilding-status-2": "Dette kan ta noen minutter",
+ "error-permission": "Du har ikke tillatelse til å utløse denne handlingen",
+ "success-msg": "Byggingen er fullført",
+ "fail-msg": "Byggoperasjonen mislyktes",
+ "reload-note": "En sideinnlasting er nå nødvendig for at endringer skal tre i kraft",
+ "reload-button": "Last siden på nytt"
+ },
+ "cloud-sync": {
+ "title": "Sikkerhetskopiering & gjenoppretting",
+ "intro-l1": "Sikkerhetskopiering og gjenoppretting er en valgfri funksjon, som lar deg laste opp konfigurasjonen din til internett og deretter gjenopprette den på en hvilken som helst annen enhet eller forekomst av Dashy.",
+ "intro-l2": "Alle data er helt ende-til-ende-kryptert med AES, og bruker passordet ditt som nøkkelen.",
+ "intro-l3": "For mer informasjon, se",
+ "backup-title-setup": "Lag en sikkerhetskopi",
+ "backup-title-update": "Oppdater sikkerhetskopi",
+ "password-label-setup": "Velg et passord",
+ "password-label-update": "Skriv inn passordet ditt",
+ "backup-button-setup": "Sikkerhetskopiering",
+ "backup-button-update": "Oppdater sikkerhetskopi",
+ "backup-id-label": "Din sikkerhetskopi-ID",
+ "backup-id-note": "Dette brukes til å gjenopprette fra sikkerhetskopier senere. Så behold det, sammen med passordet ditt et trygt sted.",
+ "restore-title": "Gjenopprett en sikkerhetskopi",
+ "restore-id-label": "Gjenopprett ID",
+ "restore-password-label": "Passord",
+ "restore-button": "Gjenopprett",
+ "backup-missing-password": "Manglende passord",
+ "backup-error-unknown": "Kan ikke behandle forespørselen",
+ "backup-error-password": "Feil passord. Skriv inn ditt nåværende passord.",
+ "backup-success-msg": "Fullført vellykket",
+ "restore-success-msg": "Konfigurasjon gjenopprettet vellykket"
+ },
+ "menu": {
+ "sametab": "Åpne i nåværende fane",
+ "newtab": "Åpne i ny fane",
+ "modal": "Åpne i popup-modus",
+ "workspace": "Åpne i Workspace-visning"
+ }
+}
\ No newline at end of file
diff --git a/src/assets/locales/pl.json b/src/assets/locales/pl.json
new file mode 100644
index 00000000..4523fde1
--- /dev/null
+++ b/src/assets/locales/pl.json
@@ -0,0 +1,172 @@
+{
+ "home": {
+ "no-results": "Brak wyników",
+ "no-data": "Brak danych"
+ },
+ "search": {
+ "search-label": "Wyszukaj",
+ "search-placeholder": "Zacznij pisać aby przefiltrować",
+ "clear-search-tooltip": "Wyczyść",
+ "enter-to-search-web": "Naciśnij ENTER aby przeszukać internet"
+ },
+ "login": {
+ "title": "Dashy",
+ "username-label": "Użytkownik",
+ "password-label": "Hasło",
+ "login-button": "Zaloguj",
+ "remember-me-label": "Zapamiętaj mnie",
+ "remember-me-never": "Nigdy",
+ "remember-me-hour": "4 godziny",
+ "remember-me-day": "Dzień",
+ "remember-me-week": "Tydzień",
+ "error-missing-username": "Nie podano nazwy użytkownika",
+ "error-missing-password": "Nie podano hasła",
+ "error-incorrect-username": "Nie znaleziono użytkownika",
+ "error-incorrect-password": "Niepoprawne hasło",
+ "success-message": "Zalogowano...",
+ "logout-message": "Wylogowano",
+ "already-logged-in-title": "Jesteś już zalogowany",
+ "already-logged-in-text": "Zalogowano jako",
+ "proceed-to-dashboard": "Przejdź do panelu",
+ "log-out-button": "Wyloguj",
+ "proceed-guest-button": "Kontynuuj jako gość"
+ },
+ "config": {
+ "main-tab": "Menu główne",
+ "view-config-tab": "Wyświetl konfigurację",
+ "edit-config-tab": "Edytuj konfigurację",
+ "custom-css-tab": "Niestandardowy styl",
+ "heading": "Opcje konfiguracji",
+ "download-config-button": "Pobierz plik konfiguracji",
+ "edit-config-button": "Edytuj konfigurację",
+ "edit-css-button": "Edytuj styl CSS",
+ "cloud-sync-button": "Ustawienia chmury",
+ "edit-cloud-sync-button": "Ustawienia chmury",
+ "rebuild-app-button": "Przebuduj aplikację",
+ "change-language-button": "Zmień język",
+ "reset-settings-button": "Zresetuj pamięć podręczną",
+ "app-info-button": "Informacje o aplikacji",
+ "backup-note": "Przed dokonaniem zmian zaleca się zapisanie kopii zapasowej konfiguracji.",
+ "reset-config-msg-l1": "Zostaną usunięte wszystkie ustawienia zapisane w pamięci podręcznej (Nie dotyczy pliku 'conf.yml'). ",
+ "reset-config-msg-l2": "Zrób kopię zapasową jeśli obecne ustawienia są ważne.",
+ "reset-config-msg-l3": "Czy na pewno chcesz kontynuować?",
+ "data-cleared-msg": "Dane wyczyszczone pomyślnie",
+ "actions-label": "Akcje",
+ "copy-config-label": "Kopia konfiguracji",
+ "data-copied-msg": "Konfiguracja skopiowana do schowka",
+ "reset-config-label": "Zresetuj konfigurację",
+ "css-save-btn": "Zapisz zmiany",
+ "css-note-label": "Informacja",
+ "css-note-l1": "Po dokonaniu zmian konieczne będzie odświeżenie strony.",
+ "css-note-l2": "Nadpisane style przechowywane są w pamięci podręcznej, zaleca się więc wykonanie kopii stylu CSS.",
+ "css-note-l3": "Aby usunąć niestandardowe style, wyczyść zawartość pola tekstowego i naciśnij Zapisz zmiany"
+ },
+ "alternate-views": {
+ "alternate-view-heading": "Zmień widok",
+ "default": "Domyślny",
+ "workspace": "Obszar roboczy",
+ "minimal": "Minimalny"
+ },
+ "settings": {
+ "theme-label": "Motyw",
+ "layout-label": "Układ",
+ "layout-auto": "Automatyczny",
+ "layout-horizontal": "Poziomy",
+ "layout-vertical": "Pionowy",
+ "item-size-label": "Rozmiar elementu",
+ "item-size-small": "Mały",
+ "item-size-medium": "Średni",
+ "item-size-large": "Duży",
+ "config-launcher-label": "Konfiguracja",
+ "config-launcher-tooltip": "Przejdź do ustawień",
+ "sign-out-tooltip": "Wyloguj",
+ "sign-in-tooltip": "Zaloguj",
+ "sign-in-welcome": "Cześć {username}!"
+ },
+ "updates": {
+ "app-version-note": "wersja Dashy",
+ "up-to-date": "Aktualna",
+ "out-of-date": "Dostępna aktualizacja",
+ "unsupported-version-l1": "Używasz niewspieranej wersji Dashy",
+ "unsupported-version-l2": "Zaleca się zaktualizowanie do"
+ },
+ "language-switcher": {
+ "title": "Zmień język",
+ "dropdown-label": "Wybierz język",
+ "save-button": "Zapisz",
+ "success-msg": "Język zmieniony na"
+ },
+ "theme-maker": {
+ "title": "Konfigurator motywu",
+ "export-button": "Eksportuj zmienne",
+ "reset-button": " Zresetuj styl",
+ "show-all-button": "Pokaż wszystkie zmienne",
+ "save-button": "Zapisz",
+ "cancel-button": "Anuluj",
+ "saved-toast": "Pomyślnie zaktualizowano {theme}",
+ "copied-toast": "Dane motywu {theme} zostały skopiowane do schowka",
+ "reset-toast": "Niestandardowe kolory dla {theme} usunięte"
+ },
+ "config-editor": {
+ "save-location-label": "Lokalizacja zapisu",
+ "location-local-label": "Pamięć podręczna",
+ "location-disk-label": "Plik na dysku",
+ "save-button": "Zapisz",
+ "valid-label": "Konfiguracja poprawna",
+ "status-success-msg": "Zadanie ukończone",
+ "status-fail-msg": "Zadanie nie powiodło się",
+ "success-msg-disk": "Pomyślnie zapisano na dysku",
+ "success-msg-local": "Pomyślnie zapisano w pamięci podręcznej",
+ "success-note-l1": "Aplikacja powinna automatycznie się przebudować.",
+ "success-note-l2": "Może to zająć około minuty.",
+ "success-note-l3": "Będzie konieczne odświeżenie strony",
+ "error-msg-save-mode": "Proszę wybrać pomiędzy pamięcią podręczną lub plikiem na dysku",
+ "error-msg-cannot-save": "Wystąpił błąd podczas zapisywania",
+ "error-msg-bad-json": "Błąd w JSON",
+ "warning-msg-validation": "Ostrzeżenie",
+ "not-admin-note": "Nie możesz zapisywać na dysku, wymagane uprawnienia administratora"
+ },
+ "app-rebuild": {
+ "title": "Przebuduj aplikację",
+ "rebuild-note-l1": "Przebudowanie jest koniecznne po dokonaniu zmian w pliku: conf.yml.",
+ "rebuild-note-l2": "Powinno to nastąpić automatycznie, jeśli jednak tak się nie stanie możesz je wymusić tutaj.",
+ "rebuild-note-l3": "Zmiany w pamięci podręcznej nie wymagają przebudowania aplikacji.",
+ "rebuild-button": "Rozpocznij",
+ "rebuilding-status-1": "Budowanie...",
+ "rebuilding-status-2": "Może to zająć kilka minut",
+ "error-permission": "Nie masz odpowiednich uprawnień do wykonania tej akcji",
+ "success-msg": "Budowanie zakończone pomyślnie",
+ "fail-msg": "Budowanie nie powiodło się",
+ "reload-note": "Zmiany będą widoczne po odświeżeniu strony",
+ "reload-button": "Odśwież stronę"
+ },
+ "cloud-sync": {
+ "title": "Kopia zapasowa w chmurze",
+ "intro-l1": "Tworzenie i przywracanie z chmury to opcjonalna funkcja, która umożliwia zapisanie konfiguracji w sieci, by później wgrać je na innym urządzeniu z Dashy.",
+ "intro-l2": "Wszystkie dane są w pełni zaszyfrowane z wykorzystaniem AES, kluczem będzie podane hasło.",
+ "intro-l3": "Aby uzyskać więcej informacji przejdź do",
+ "backup-title-setup": "Tworzenie",
+ "backup-title-update": "Zaktualizuj",
+ "password-label-setup": "Wybierz hasło",
+ "password-label-update": "Wprowadź hasło",
+ "backup-button-setup": "Zapisz",
+ "backup-button-update": "Zaktualizuj",
+ "backup-id-label": "Identyfikator kopii zapasowej",
+ "backup-id-note": "Wymagany do przywrócenia. Zapisz wraz z hasłem w bezpiecznym miejscu",
+ "restore-title": "Przywracanie",
+ "restore-id-label": "Identyfikator",
+ "restore-password-label": "Hasło",
+ "restore-button": "Przywróć",
+ "backup-missing-password": "Nie podano hasła",
+ "backup-error-unknown": "Nie udało się wykonać operacji",
+ "backup-error-password": "Hasło niepoprawne. Proszę wprowadzić aktualne hasło.",
+ "backup-success-msg": "zakończono pomyślnie",
+ "restore-success-msg": "Przywrócono pomyślnie"
+ },
+ "menu": {
+ "sametab": "Otwórz w tej karcie",
+ "newtab": "Otwórz w nowej karcie",
+ "modal": "Otwórz w oknie modalnym",
+ "workspace": "Otwórz w obszarze roboczym"
+ }
+}
\ No newline at end of file
diff --git a/src/assets/locales/sl.json b/src/assets/locales/sl.json
index a3e708c9..6b8fec13 100644
--- a/src/assets/locales/sl.json
+++ b/src/assets/locales/sl.json
@@ -29,7 +29,7 @@
"already-logged-in-text": "Prijavljeni ste kot",
"proceed-to-dashboard": "Nadaljujte na nadzorno ploščo",
"log-out-button": "Odjava",
- "proceed-guest-button": "Nadaljujte kot gost"
+ "proceed-guest-button": "Nadaljujte kot gost"
},
"config": {
"main-tab": "Glavni Meni",
@@ -62,10 +62,11 @@
"css-note-l3": "Če želite odstraniti vse sloge po meri, izbrišite vsebino in pritisnite Shrani spremembe"
},
"alternate-views": {
+ "alternate-view-heading": "Spremeni Pogled",
"default": "Privzeto",
"workspace": "Delovni prostor",
"minimal": "Minimalno"
- },
+ },
"settings": {
"theme-label": "Tema",
"layout-label": "Postavitev",
@@ -100,6 +101,7 @@
"export-button": "Izvozi Spremenljivke po Meri",
"reset-button": "Ponastavi Sloge za",
"show-all-button": "Pokaži Vse Spremenljivke",
+ "change-fonts-button": "Spremeni Pisavo",
"save-button": "Shrani",
"cancel-button": "Prekliči",
"saved-toast": "{theme} Posodbljena Uspešno",
@@ -111,6 +113,7 @@
"location-local-label": "Shrani Lokalno",
"location-disk-label": "Zapišite spremembe v datoteko za konfiguracijo",
"save-button": "Shrani Spremembe",
+ "preview-button": "Predogled Sprememb",
"valid-label": "Konfiguracija je veljavna",
"status-success-msg": "Operacija dokončana",
"status-fail-msg": "Operacija ni uspela",
@@ -163,10 +166,82 @@
"restore-success-msg": "Konfiguracija Uspešno Obnovljena"
},
"menu": {
+ "open-section-title": "Odpri V",
"sametab": "Odpri v Trenutnem Zavihku",
"newtab": "Odpri v Novem Zavihku",
"modal": "Odpri v Pojavnem Oknu",
- "workspace": "Odpri v Delovnem Pogledu"
+ "workspace": "Odpri v Delovnem Pogledu",
+ "options-section-title": "Nastavitve",
+ "edit-item": "Uredi",
+ "move-item": "Kopiral ali Premakni",
+ "remove-item": "Odstrani"
+ },
+ "context-menus": {
+ "item": {
+ "open-section-title": "Odpri V",
+ "sametab": "Trenutni Zavihek",
+ "newtab": "Nov Zavihek",
+ "modal": "Pojavno Okno",
+ "workspace": "Delovni Pogled",
+ "options-section-title": "Nastavitve",
+ "edit-item": "Uredi",
+ "move-item": "Kopiral ali Premakni",
+ "remove-item": "Odstrani"
+ },
+ "section": {
+ "open-section": "Odpri Razdelek",
+ "edit-section": "Uredi",
+ "move-section": "Premakni v",
+ "remove-section": "Odstrani"
+ }
+ },
+ "interactive-editor": {
+ "menu": {
+ "start-editing-tooltip": "Vstopite v Interaktivni Urejevalnik",
+ "edit-site-data-subheading": "Uredi Podatke Strani",
+ "edit-page-info-btn": "Uredi Informacije Strani",
+ "edit-page-info-tooltip": "Naslov, opis, nav linki, teks noge. itd",
+ "edit-app-config-btn": "Urejanje Konfiguracije",
+ "edit-app-config-tooltip": "Vse druge možnosti konfiguracije aplikacije",
+ "config-save-methods-subheading": "Možnosti Shranjevanja Konfiguracije",
+ "save-locally-btn": "Shrani Lokalno",
+ "save-locally-tooltip": "Shranite konfiguracijo lokalno v pomnilnik brskalnika. To ne bo vplivalo na vašo konfiguracijsko datoteko, vendar bodo spremembe shranjene samo v tej napravi",
+ "save-disk-btn": "Shrani na Disk",
+ "save-disk-tooltip": "Shranite konfiguracijo v datoteko conf.yml na disku. To bo varnostno kopiralo in nato prepisalo vašo obstoječo konfiguracijo",
+ "export-config-btn": "Izvozi Nastavitve",
+ "export-config-tooltip": "Oglejte si in izvozite novo konfiguracijo v datoteko ali v odložišče",
+ "cloud-backup-btn": "Varnostno kopiranje v Oblak",
+ "cloud-backup-tooltip": "Shranite šifrirano varnostno kopijo konfiguracije v oblak",
+ "edit-raw-config-btn": "Urejanje Raw Konfiguracije",
+ "edit-raw-config-tooltip": "Oglejte si in spremenite raw konfiguracijo prek urejevalnika JSON",
+ "cancel-changes-btn": "Prekliči Urejanje",
+ "cancel-changes-tooltip": "Ponastavite trenutne spremembe in zapustite način urejanja. To ne bo vplivalo na vašo shranjeno konfiguracijo",
+ "edit-mode-name": "Način Urejanja",
+ "edit-mode-subtitle": "Ste v načinu za Urejanje",
+ "edit-mode-description": "To pomeni, da lahko spremenite svojo konfiguracijo in si ogledate predogled rezultatov, vendar dokler ne shranite, nobena od vaših sprememb ne bo ohranjena.",
+ "save-stage-btn": "Shrani",
+ "cancel-stage-btn": "Prekliči"
+ },
+ "edit-section": {
+ "edit-section-title": "Uredi Razdelek",
+ "add-section-title": "Dodaj Razdelek",
+ "edit-tooltip": "Kliknite za Urejanje ali z desno tipko miške kliknite za Več Možnosti",
+ "remove-confirm": "Ali ste prepričani, da želite odstraniti ta razdelek? To dejanje lahko pozneje razveljavite."
+ },
+ "edit-app-config": {
+ "warning-msg-title": "Nadaljuj Previdno",
+ "warning-msg-l1": "Naslednje možnosti so za napredno konfiguracijo aplikacije.",
+ "warning-msg-l2": "Če niste prepričani glede katerega od polj, se obrnite na",
+ "warning-msg-docs": "dokumentacija",
+ "warning-msg-l3": "da bi se izognili neželenim posledicam."
+ },
+ "export": {
+ "export-title": "Izvozi Nastavitve",
+ "copy-clipboard-btn": "Kopirati v Odložišče",
+ "copy-clipboard-tooltip": "Kopirajte vso konfiguracijo aplikacije v sistemsko odložišče v formatu YAML",
+ "download-file-btn": "Prenesi kot Datoteko",
+ "download-file-tooltip": "Prenesite vso konfiguracijo aplikacije v svojo napravo v formatu YAML",
+ "view-title": "Ogled Konfiguracije"
+ }
}
-}
-
+}
\ No newline at end of file
diff --git a/src/assets/locales/zz-pirate.json b/src/assets/locales/zz-pirate.json
new file mode 100644
index 00000000..766c751b
--- /dev/null
+++ b/src/assets/locales/zz-pirate.json
@@ -0,0 +1,104 @@
+{
+ "home": {
+ "no-results": "Nay Search Results",
+ "no-data": "Nay Data Configured"
+ },
+ "search": {
+ "search-placeholder": "Start typin' t' filter",
+ "enter-to-search-web": "Press enter t' search th' web"
+ },
+ "login": {
+ "remember-me-label": "Remember me fer",
+ "error-missing-username": "Missin' Username",
+ "error-missing-password": "Missin' Password",
+ "success-message": "Loggin' in...",
+ "already-logged-in-text": "ye're logged in as",
+ "proceed-to-dashboard": "Proceed t' Dashboard",
+ "log-out-button": "Logout Ye All",
+ "proceed-guest-button": "Proceed as Ye Guest"
+ },
+ "config": {
+ "main-tab": "Ya Main Menu",
+ "heading": "Ye Configuration Options",
+ "download-config-button": "Download Config",
+ "reset-settings-button": "Reset Ship Settin's",
+ "change-language-button": "Change Ye Language",
+ "cloud-sync-button": "Enable Ship Sync",
+ "app-info-button": "Th' Ship Info",
+ "backup-note": "It be recommend t' make a backup o' yer configuration before makin' changes.",
+ "reset-config-msg-l1": "This will remove all user settin's from local storage, but won't effect yer 'conf.yml' file.",
+ "reset-config-msg-l2": "ye should first backup any changes ye've made locally, if ye want t' use them in th' future.",
+ "reset-config-msg-l3": "be ye sure ye want t' proceed?",
+ "data-copied-msg": "Config has been copied t' clipboardd",
+ "css-note-l1": "ye will need t' refresh th' page fer yer changes t' take effect.",
+ "css-note-l2": "Styles overrides be only stored locally, so it be recommended t' make a copy o' yer CSS.",
+ "css-note-l3": "To remove all custom styles, delete th' contents and hit Save Changes"
+ },
+ "settings": {
+ "sign-in-welcome": "Ahoy {username}!"
+ },
+ "updates": {
+ "app-version-note": "Dashy version",
+ "up-to-date": "Up-to-Date",
+ "out-of-date": "Update Available",
+ "unsupported-version-l1": "You are using a ye' old version of Dashy",
+ "unsupported-version-l2": "For th' best experience, and recent security patches, please update to"
+ },
+ "language-switcher": {
+ "success-msg": "Language Updated t'"
+ },
+ "theme-maker": {
+ "copied-toast": "Theme data for {theme} copied t' ye clipboard"
+ },
+ "config-editor": {
+ "save-location-label": "Save Location",
+ "location-local-label": "Apply Locally",
+ "location-disk-label": "Write Changes to Config File",
+ "save-button": "Save Changes",
+ "valid-label": "Config is Valid",
+ "status-success-msg": "Task Complete",
+ "status-fail-msg": "Task Failed",
+ "success-msg-disk": "Th' config file written to disk successfully",
+ "success-msg-local": "Ye local changes were successfully saved",
+ "success-note-l1": "th' app should rebuild automatically.",
+ "success-note-l2": "This may take up t' a minute.",
+ "success-note-l3": "ye will need t' refresh th' page fer changes t' take effect.",
+ "error-msg-cannot-save": "An error occurred savin' config",
+ "error-msg-bad-json": "Error in ye JSON, possibly malformed",
+ "warning-msg-validation": "Validation Warnin' Ahead",
+ "not-admin-note": "ye cannot write changed t' disk, because ye be not logged in as an admin"
+ },
+ "app-rebuild": {
+ "title": "Rebuild Application",
+ "rebuild-note-l1": "A rebuild be required fer changes written t' th' conf.yml file t' take effect.",
+ "rebuild-note-l2": "This should happen automatically, but if it hasn't, ye can manually trigger it here.",
+ "rebuild-note-l3": "This be not required fer modifications stored locally.",
+ "rebuild-button": "Start Build",
+ "rebuilding-status-1": "Buildin...",
+ "error-permission": "ye dern't have permission t' trigger this action",
+ "success-msg": "Ayhyo, build did complete successfully!",
+ "fail-msg": "Build operation did fail",
+ "reload-note": "A page reload be now required fer changes t' take effect",
+ "reload-button": "Reload Ye Page"
+ },
+ "cloud-sync": {
+ "intro-l1": "Cloud backup and restore be an optional feature, that enables ye t' upload yer config t' th' internet, and then restore it on any other device or instance o' Dashy.",
+ "intro-l2": "All data be fully end-t'-end encrypted with AES, usin' yer password as th' key.",
+ "intro-l3": "For more info, please see th'",
+ "backup-title-setup": "Make ye Backup",
+ "backup-title-update": "Update ye Backup",
+ "password-label-setup": "Choose ye Password",
+ "password-label-update": "Enter yer Password",
+ "backup-id-label": "Yer Backup ID",
+ "backup-id-note": "This be used t' restore from backups later. So keep it, along with yer password somewhere safe.",
+ "backup-missing-password": "Missin'g' Password",
+ "backup-error-unknown": "Unable t' process request",
+ "backup-error-password": "Incorrect password. Walk the plank! Please enter yer current password."
+ },
+ "menu": {
+ "sametab": "Stay Aboard",
+ "newtab": "Walk the Plank",
+ "modal": "Open in ye Pop-Up Ship",
+ "workspace": "Open on Workspace Deck"
+ }
+}
\ No newline at end of file
diff --git a/src/components/Configuration/AppInfoModal.vue b/src/components/Configuration/AppInfoModal.vue
index 8ba9dbc6..9d78a059 100644
--- a/src/components/Configuration/AppInfoModal.vue
+++ b/src/components/Configuration/AppInfoModal.vue
@@ -1,46 +1,30 @@
-
+
App Info
-
-
Version
-
Error Log
{{ errorLog }}
No recent errors detected :)
-
-
Service Worker Status
-
{{ serviceWorkerInfo }}
-
-
Config Validation Status
-
{{getIsConfigValidStatus()}}
Help & Support
-
-
Please include the following info in your bug report:
-
{{ showInfo ? 'Hide' : 'Show'}} system info
-
-
System Info
- Dashy Version: V {{appVersion}}
- Browser: {{systemInfo.browser}}
- Is Mobile? {{systemInfo.isMobile ? 'Yes' : 'No'}}
- OS: {{systemInfo.os}}
-
-
-
About
-
- Source: github.com/lissy93/dashy
- Documentation: dashy.to/docs
-
+ For getting support with running or configuring Dashy, see the
Discussions
+
Supporting Dashy
+ For ways that you can get involved, check out the
Contributing page.
+
Report a Bug
+ If you think you've found a bug, then please
raise an Issue .
+
More Info
+ Source:
github.com/lissy93/dashy
+ Documentation:
dashy.to/docs
License
-
Licensed under MIT X11. Copyright © 2021
-
+ Licensed under MIT X11. Copyright
Alicia Sykes © 2021.
+ For licenses for third-party modules, please see
Legal .
+ For the full list of contributors and thanks, see
Credits .
+
+
Version
+
@@ -58,71 +42,13 @@ export default {
return {
modalName: modalNames.ABOUT_APP,
appVersion: process.env.VUE_APP_VERSION,
- systemInfo: this.getSystemInfo(),
errorLog: this.getErrorLog(),
- serviceWorkerInfo: 'Checking...',
- showInfo: false,
};
},
- mounted() {
- setTimeout(() => {
- this.serviceWorkerInfo = this.getSwStatus();
- }, 100);
- },
methods: {
getErrorLog() {
return sessionStorage.getItem(sessionStorageKeys.ERROR_LOG) || '';
},
- getIsConfigValidStatus() {
- const isValidVar = process.env.VUE_APP_CONFIG_VALID;
- if (isValidVar === undefined) return 'Config validation status is missing';
- return `Config is ${isValidVar ? 'Valid' : 'Invalid'}`;
- },
- getSwStatus() {
- const sessionData = sessionStorage[sessionStorageKeys.SW_STATUS];
- const swInfo = sessionData ? JSON.parse(sessionData) : {};
- let swStatus = '';
- if (swInfo.registered) swStatus += 'Service worker registered\n';
- if (swInfo.ready) swStatus += 'Dashy is being served from service worker\n';
- if (swInfo.cached) swStatus += 'Content has been cached for offline use\n';
- if (swInfo.updateFound) swStatus += 'New content is downloading\n';
- if (swInfo.updated) swStatus += 'New content is available; please refresh\n';
- if (swInfo.offline) swStatus += 'No internet connection found. App is running in offline mode\n';
- if (swInfo.error) swStatus += 'Error during service worker registration\n';
- if (swInfo.devMode) swStatus += 'App running in dev mode, no need for service worker\n';
- if (swStatus.length === 0) swStatus += 'No service worker info available';
- return swStatus;
- },
- getSystemInfo() {
- const { userAgent } = navigator;
-
- // Find Operating System
- let os = 'Unknown';
- if (userAgent.indexOf('Win') !== -1) os = 'Windows';
- else if (userAgent.indexOf('Mac') !== -1) os = 'MacOS';
- else if (userAgent.indexOf('Android') !== -1) os = 'Android';
- else if (userAgent.indexOf('iPhone') !== -1) os = 'iOS';
- else if (userAgent.indexOf('Linux') !== -1) os = 'Linux';
- else if (userAgent.indexOf('X11') !== -1) os = 'UNIX';
-
- // Find Browser
- let browser = 'Unknown';
- if (userAgent.indexOf('Opera') !== -1) browser = 'Opera';
- else if (userAgent.indexOf('Chrome') !== -1) browser = 'Chrome';
- else if (userAgent.indexOf('Safari') !== -1) browser = 'Safari';
- else if (userAgent.indexOf('Firefox') !== -1) browser = 'Firefox';
- else if (userAgent.indexOf('MSIE') !== -1) browser = 'IE';
- else browser = 'Unknown';
-
- const isMobile = !!navigator.userAgent.match(/iphone|android|blackberry/ig) || false;
-
- return {
- os,
- browser,
- userAgent,
- isMobile,
- };
- },
},
};
@@ -152,40 +78,17 @@ div.about-modal {
}
}
h3 {
- font-size: 1.3rem;
- margin: 1rem 0 0.2rem 0;
+ font-size: 1.2rem;
+ margin: 0.75rem 0 0.2rem 0;
color: var(--about-page-accent);
}
- p.small-note {
- margin: 0.2rem 0;
- }
- p.about-text {
- margin: 0.2rem 0;
- }
a {
color: var(--about-page-accent);
}
- ul {
- margin-top: 0.2rem;
- }
a.info {
text-decoration: underline;
margin-left: 0.2rem;
}
- .system-info {
- font-size: 0.8rem;
- background: var(--black);
- color: var(--white);
- border-radius: var(--curve-factor-small);
- padding: 0.5rem;
- border: 1px solid var(--white);
- width: fit-content;
- h4 {
- font-size: 0.8rem;
- margin: 0 0 0.2rem 0;
- text-decoration: underline;
- }
- }
.app-version {
text-align: left;
}
@@ -203,3 +106,14 @@ div.about-modal {
}
+
+
diff --git a/src/components/Configuration/AppVersion.vue b/src/components/Configuration/AppVersion.vue
index 973cbb4f..0278011a 100644
--- a/src/components/Configuration/AppVersion.vue
+++ b/src/components/Configuration/AppVersion.vue
@@ -22,7 +22,7 @@
❗ {{ $t('updates.out-of-date') }}:
{{ latestVersion }}
{{ $t('updates.unsupported-version-l1') }}.
- {{ $t('updates.unsupported-version-2') }} {{ latestVersion }}
+ {{ $t('updates.unsupported-version-l2') }} {{ latestVersion }}
@@ -36,7 +36,11 @@ import ErrorHandler from '@/utils/ErrorHandler';
export default {
name: 'AppInfoModal',
- inject: ['config'],
+ computed: {
+ appConfig() {
+ return this.$store.getters.appConfig;
+ },
+ },
data() {
return {
appVersion: process.env.VUE_APP_VERSION, // Current version, from package.json
@@ -50,8 +54,7 @@ export default {
};
},
mounted() {
- const appConfig = this.config.appConfig || {};
- if (!this.appVersion || (appConfig && appConfig.disableUpdateChecks)) {
+ if (!this.appVersion || (this.appConfig && this.appConfig.disableUpdateChecks)) {
// Either current version isn't found, or user disabled checks
this.checksEnabled = false;
} else {
diff --git a/src/components/Configuration/CloudBackupRestore.vue b/src/components/Configuration/CloudBackupRestore.vue
index 83b303f4..b2bd5db0 100644
--- a/src/components/Configuration/CloudBackupRestore.vue
+++ b/src/components/Configuration/CloudBackupRestore.vue
@@ -1,5 +1,6 @@
+
{{ $t('cloud-sync.title') }}
@@ -11,6 +12,7 @@
docs
+
{{ $t('cloud-sync.backup-title-setup') }}
{{ $t('cloud-sync.backup-title-setup') }}
@@ -23,11 +25,9 @@
type="password"
/>
-
- {{backupId
- ? $t('cloud-sync.backup-button-update') : $t('cloud-sync.backup-button-setup')}}
-
-
+ {{backupId
+ ? $t('cloud-sync.backup-button-update') : $t('cloud-sync.backup-button-setup')}}
+
{{ $t('cloud-sync.backup-id-label') }}:
@@ -35,6 +35,7 @@
{{ $t('cloud-sync.backup-id-note') }}
+
{{ $t('cloud-sync.restore-title') }}
- {{ $t('cloud-sync.restore-button') }}
-
+ {{ $t('cloud-sync.restore-button') }}
+
diff --git a/src/components/Configuration/CustomCss.vue b/src/components/Configuration/CustomCss.vue
index 8b3b6262..dd1fc5a9 100644
--- a/src/components/Configuration/CustomCss.vue
+++ b/src/components/Configuration/CustomCss.vue
@@ -1,108 +1,130 @@
-
-
+
+
Custom CSS
-
{{ $t('config.css-save-btn') }}
+
{{ $t('config.css-save-btn') }}
{{ $t('config.css-note-label') }}:
{{ $t('config.css-note-l1') }} {{ $t('config.css-note-l2') }} {{ $t('config.css-note-l3') }}
-
+
+
+
Base Theme
+
+
-
+
+
+
diff --git a/src/components/Configuration/JsonEditor.vue b/src/components/Configuration/JsonEditor.vue
index 09709714..1ec4cfd6 100644
--- a/src/components/Configuration/JsonEditor.vue
+++ b/src/components/Configuration/JsonEditor.vue
@@ -1,31 +1,24 @@
-
+
-
-
{{ $t('config-editor.save-location-label') }}:
-
-
-
- {{ $t('config-editor.location-local-label') }}
-
-
-
-
-
- {{ $t('config-editor.location-disk-label') }}
-
-
+
+
+
+
+ {{ $t('config-editor.save-button') }}
+
+
+ {{ $t('config-editor.preview-button') }}
+
-
- {{ $t('config-editor.save-button') }}
-
@@ -50,7 +43,6 @@
{{ $t('config-editor.success-note-l1') }}
{{ $t('config-editor.success-note-l2') }}
- {{ $t('config-editor.success-note-l3') }}
{{ $t('config.backup-note') }}
@@ -61,25 +53,27 @@
import axios from 'axios';
import ProgressBar from 'rsup-progress';
import VJsoneditor from 'v-jsoneditor';
-import ErrorHandler, { InfoHandler } from '@/utils/ErrorHandler';
+import jsYaml from 'js-yaml';
+import ErrorHandler, { InfoHandler, InfoKeys } from '@/utils/ErrorHandler';
import configSchema from '@/utils/ConfigSchema.json';
-import JsonToYaml from '@/utils/JsonToYaml';
-import { localStorageKeys, serviceEndpoints } from '@/utils/defaults';
+import StoreKeys from '@/utils/StoreMutations';
+import { localStorageKeys, serviceEndpoints, modalNames } from '@/utils/defaults';
import { isUserAdmin } from '@/utils/Auth';
+import Button from '@/components/FormElements/Button';
+import Radio from '@/components/FormElements/Radio';
export default {
name: 'JsonEditor',
- props: {
- config: Object,
- },
components: {
VJsoneditor,
+ Button,
+ Radio,
},
data() {
return {
- jsonData: this.config,
+ jsonData: {},
errorMessages: [],
- saveMode: 'file',
+ saveMode: '',
options: {
schema: configSchema,
mode: 'tree',
@@ -87,26 +81,36 @@ export default {
name: 'config',
onValidationError: this.validationErrors,
},
- jsonParser: JsonToYaml,
responseText: '',
saveSuccess: undefined,
- allowWriteToDisk: this.shouldAllowWriteToDisk(),
progress: new ProgressBar({ color: 'var(--progress-bar)' }),
+ saveOptions: [
+ { label: this.$t('config-editor.location-disk-label'), value: 'file' },
+ { label: this.$t('config-editor.location-local-label'), value: 'local' },
+ ],
};
},
computed: {
+ config() {
+ return this.$store.state.config;
+ },
isValid() {
return this.errorMessages.length < 1;
},
- },
- mounted() {
- if (!this.allowWriteToDisk) this.saveMode = 'local';
- },
- methods: {
- shouldAllowWriteToDisk() {
+ allowWriteToDisk() {
const { appConfig } = this.config;
return appConfig.allowConfigEdit !== false && isUserAdmin();
},
+ initialSaveMode() {
+ return this.allowWriteToDisk ? 'file' : 'local';
+ },
+ },
+ mounted() {
+ this.jsonData = this.config;
+ if (!this.allowWriteToDisk) this.saveMode = 'local';
+ },
+ methods: {
+ /* Calls appropriate save method, based on save-type radio selected */
save() {
if (this.saveMode === 'local' || !this.allowWriteToDisk) {
this.saveConfigLocally();
@@ -116,9 +120,21 @@ export default {
this.$toasted.show(this.$t('config-editor.error-msg-save-mode'));
}
},
+ /* Applies changes to the local state, begins edit mode and closes modal */
+ startPreview() {
+ InfoHandler('Applying changes to local state...', InfoKeys.RAW_EDITOR);
+ const data = this.jsonData;
+ this.$store.commit(StoreKeys.SET_APP_CONFIG, data.appConfig);
+ this.$store.commit(StoreKeys.SET_PAGE_INFO, data.pageInfo);
+ this.$store.commit(StoreKeys.SET_SECTIONS, data.sections);
+ this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);
+ this.$store.commit(StoreKeys.SET_EDIT_MODE, true);
+ this.$modal.hide(modalNames.CONF_EDITOR);
+ },
+ /* Converts config to YAML, and writes it to disk */
writeConfigToDisk() {
// 1. Convert JSON into YAML
- const yaml = this.jsonParser(this.jsonData);
+ const yaml = jsYaml.dump(this.config);
// 2. Prepare the request
const baseUrl = process.env.VUE_APP_DOMAIN || window.location.origin;
const endpoint = `${baseUrl}${serviceEndpoints.save}`;
@@ -136,7 +152,8 @@ export default {
} else {
this.showToast(this.$t('config-editor.error-msg-cannot-save'), false);
}
- InfoHandler('Config has been written to disk succesfully', 'Config Update');
+ InfoHandler('Config has been written to disk succesfully', InfoKeys.RAW_EDITOR);
+ this.$store.commit(StoreKeys.SET_CONFIG, this.jsonData);
this.progress.end();
})
.catch((error) => {
@@ -147,6 +164,7 @@ export default {
this.progress.end();
});
},
+ /* Saves config to local browser storage */
saveConfigLocally() {
const data = this.jsonData;
if (data.sections) {
@@ -156,20 +174,22 @@ export default {
localStorage.setItem(localStorageKeys.PAGE_INFO, JSON.stringify(data.pageInfo));
}
if (data.appConfig) {
- data.appConfig.auth = this.config.appConfig.auth || [];
+ data.appConfig.auth = this.config.appConfig.auth || {};
localStorage.setItem(localStorageKeys.APP_CONFIG, JSON.stringify(data.appConfig));
}
if (data.appConfig.theme) {
localStorage.setItem(localStorageKeys.THEME, data.appConfig.theme);
}
- InfoHandler('Config has succesfully been saved in browser storage', 'Config Update');
+ InfoHandler('Config has succesfully been saved in browser storage', InfoKeys.RAW_EDITOR);
this.showToast(this.$t('config-editor.success-msg-local'), true);
},
+ /* Clears config from browser storage, only removing relevant items */
carefullyClearLocalStorage() {
localStorage.removeItem(localStorageKeys.PAGE_INFO);
localStorage.removeItem(localStorageKeys.APP_CONFIG);
localStorage.removeItem(localStorageKeys.CONF_SECTIONS);
},
+ /* Convert error messages into readable format for UI */
validationErrors(errors) {
const errorMessages = [];
errors.forEach((error) => {
@@ -197,6 +217,7 @@ export default {
});
this.errorMessages = errorMessages;
},
+ /* Shows toast message */
showToast(message, success) {
this.$toasted.show(message, { className: `toast-${success ? 'success' : 'error'}` });
},
@@ -259,52 +280,59 @@ p.no-permission-note {
color: var(--config-settings-color);
}
-button.save-button {
- padding: 0.5rem 1rem;
- margin: 0.25rem auto;
- font-size: 1.2rem;
- background: var(--config-settings-color);
- color: var(--config-settings-background);
- border: 1px solid var(--config-settings-background);
- border-radius: var(--curve-factor);
- cursor: pointer;
- &:hover {
+.btn-container {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ button {
+ padding: 0.5rem 1rem;
+ margin: 0.25rem;
+ font-size: 1.2rem;
background: var(--config-settings-background);
color: var(--config-settings-color);
- border-color: var(--config-settings-color);
- }
- &.err {
- opacity: 0.8;
- cursor: default;
+ border: 1px solid var(--config-settings-color);
+ border-radius: var(--curve-factor);
&:hover {
background: var(--config-settings-color);
color: var(--config-settings-background);
+ border-color: var(--config-settings-background);
+ }
+ }
+ &.err button {
+ opacity: 0.8;
+ cursor: default;
+ &:hover {
+ background: var(--config-settings-background);
+ color: var(--config-settings-color);
border-color: var(--danger);
}
}
}
-div.save-options {
+div.save-options.radio-container {
display: flex;
- align-items: flex-start;
+ align-items: center;
justify-content: center;
- padding: 0.5rem;
- margin-bottom: 0.5rem;
- background: var(--code-editor-background);
- color: var(--code-editor-color);
+ margin: 0;
+ padding: 0;
border-top: 2px solid var(--config-settings-background);
- @include tablet-down { flex-direction: column; }
- .option {
- @include tablet-up { margin-left: 2rem; }
+ background: var(--code-editor-background);
+ label.radio-label {
+ font-size: 1rem;
+ flex-grow: revert;
+ flex-basis: revert;
+ color: var(--code-editor-color);
+ padding-left: 1rem;
}
- span.save-option-title {
- cursor: default;
- }
- input.radio-option {
- cursor: pointer;
- }
- label.save-option-label {
- cursor: pointer;
+ .radio-wrapper {
+ margin: 0;
+ font-size: 1rem;
+ justify-content: space-around;
+ background: var(--code-editor-background);
+ color: var(--code-editor-color);
+ .radio-option:hover:not(.wrap-disabled) {
+ border: 1px solid var(--code-editor-color);
+ }
}
}
diff --git a/src/components/Configuration/RebuildApp.vue b/src/components/Configuration/RebuildApp.vue
index 5bcefdf0..725ee091 100644
--- a/src/components/Configuration/RebuildApp.vue
+++ b/src/components/Configuration/RebuildApp.vue
@@ -55,7 +55,11 @@ import { modalNames, serviceEndpoints } from '@/utils/defaults';
export default {
name: 'RebuildApp',
- inject: ['config'],
+ computed: {
+ appConfig() {
+ return this.$store.getters.appConfig;
+ },
+ },
components: {
Button,
RebuildIcon,
@@ -112,12 +116,8 @@ export default {
},
},
mounted() {
- if (this.config) {
- if (this.config.appConfig) {
- if (this.config.appConfig.allowConfigEdit === false) {
- this.allowRebuild = false;
- }
- }
+ if (this.appConfig.allowConfigEdit === false) {
+ this.allowRebuild = false;
}
},
};
diff --git a/src/components/FormElements/Button.vue b/src/components/FormElements/Button.vue
index 2c8f6279..d2da7a7c 100644
--- a/src/components/FormElements/Button.vue
+++ b/src/components/FormElements/Button.vue
@@ -1,5 +1,12 @@
-
+ null"
+ :class="disallow ? 'disallowed': ''"
+ :type="type || 'button'"
+ :disabled="disabled"
+ v-tooltip="hoverText"
+ :title="tooltip"
+ >
@@ -11,10 +18,21 @@
export default {
name: 'Button',
props: {
- text: String,
- click: Function,
- disabled: Boolean,
- disallow: Boolean,
+ text: String, // The text to be displayed in the button
+ click: Function, // Function to call when clicked
+ disabled: Boolean, // If true, button cannot be clicked
+ disallow: Boolean, // Show not-allowed cursor when true
+ type: String, // The html button type attribute
+ tooltip: String, // Text to be displayed on hover
+ },
+ computed: {
+ /* If tooltip prop specified, then return config for v-tooltip */
+ hoverText() {
+ const content = this.tooltip;
+ const trigger = 'hover focus';
+ const delay = { show: 350, hide: 100 };
+ return (content) ? { content, trigger, delay } : undefined;
+ },
},
};
diff --git a/src/components/FormElements/Input.vue b/src/components/FormElements/Input.vue
index 1fd2678c..42ec58af 100644
--- a/src/components/FormElements/Input.vue
+++ b/src/components/FormElements/Input.vue
@@ -1,6 +1,12 @@
-
{{label}}
+
+ {{label}}
+
+
+ {{ description }}
+
@@ -17,10 +30,11 @@
export default {
name: 'Input',
props: {
- value: String, // The value bound to v-model
+ value: [String, Number], // The value bound to v-model
label: String, // An optional label to display above
name: String, // Required unique ID value, for accessibility
placeholder: String, // Optional placeholder value
+ description: String, // Optional info paragraph
type: {
default: 'text', // Input type, e.g. text, password, number
type: String,
@@ -40,6 +54,8 @@ export default {
diff --git a/src/components/FormElements/Radio.vue b/src/components/FormElements/Radio.vue
new file mode 100644
index 00000000..b87ea4ca
--- /dev/null
+++ b/src/components/FormElements/Radio.vue
@@ -0,0 +1,109 @@
+
+
+
{{ label }}
+
+
+ {{ radio.label }}
+
+
+
+
{{ description }}
+
+
+
+
+
+
diff --git a/src/components/FormElements/Select.vue b/src/components/FormElements/Select.vue
new file mode 100644
index 00000000..9e4916f9
--- /dev/null
+++ b/src/components/FormElements/Select.vue
@@ -0,0 +1,128 @@
+
+
+
{{ label }}
+
+
{{ description }}
+
+
+
+
+
+
+
+
diff --git a/src/components/InteractiveEditor/AddNewSectionLauncher.vue b/src/components/InteractiveEditor/AddNewSectionLauncher.vue
new file mode 100644
index 00000000..965778ed
--- /dev/null
+++ b/src/components/InteractiveEditor/AddNewSectionLauncher.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
➕ {{ $t('interactive-editor.edit-section.add-section-title') }}
+
+
+
+
+
+
+
+
+
diff --git a/src/components/InteractiveEditor/EditAppConfig.vue b/src/components/InteractiveEditor/EditAppConfig.vue
new file mode 100644
index 00000000..56779b4c
--- /dev/null
+++ b/src/components/InteractiveEditor/EditAppConfig.vue
@@ -0,0 +1,134 @@
+
+
+
+
{{ $t('interactive-editor.menu.edit-app-config-btn') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/InteractiveEditor/EditItem.vue b/src/components/InteractiveEditor/EditItem.vue
new file mode 100644
index 00000000..14c7bfa0
--- /dev/null
+++ b/src/components/InteractiveEditor/EditItem.vue
@@ -0,0 +1,344 @@
+
+
+
+
+
Edit Item
+
Editing {{item.title}} (ID: {{itemId}})
+
+
+ No data configured yet. Click an attribute in the list below to add the field to the form.
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.name }} cannot currently be edited through the UI.
+
+
removeField(row.name)" />
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/InteractiveEditor/EditModeSaveMenu.vue b/src/components/InteractiveEditor/EditModeSaveMenu.vue
new file mode 100644
index 00000000..f71a9f52
--- /dev/null
+++ b/src/components/InteractiveEditor/EditModeSaveMenu.vue
@@ -0,0 +1,279 @@
+
+
+
+
+
+ {{ $t('interactive-editor.menu.edit-mode-subtitle') }}
+
+
+ {{ $t('interactive-editor.menu.edit-mode-description') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/InteractiveEditor/EditModeTopBanner.vue b/src/components/InteractiveEditor/EditModeTopBanner.vue
new file mode 100644
index 00000000..4d7047c6
--- /dev/null
+++ b/src/components/InteractiveEditor/EditModeTopBanner.vue
@@ -0,0 +1,20 @@
+
+
+ Edit Mode Enabled
+
+
+
+
diff --git a/src/components/InteractiveEditor/EditPageInfo.vue b/src/components/InteractiveEditor/EditPageInfo.vue
new file mode 100644
index 00000000..71f978da
--- /dev/null
+++ b/src/components/InteractiveEditor/EditPageInfo.vue
@@ -0,0 +1,93 @@
+
+
+
+
{{ $t('interactive-editor.menu.edit-page-info-btn') }}
+
+
+ {{ $t('interactive-editor.menu.save-stage-btn') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/InteractiveEditor/EditSection.vue b/src/components/InteractiveEditor/EditSection.vue
new file mode 100644
index 00000000..7e9b2635
--- /dev/null
+++ b/src/components/InteractiveEditor/EditSection.vue
@@ -0,0 +1,129 @@
+
+
+
+
+ {{ $t(`interactive-editor.edit-section.${isAddNew ? 'add' : 'edit'}-section-title`) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/InteractiveEditor/ExportConfigMenu.vue b/src/components/InteractiveEditor/ExportConfigMenu.vue
new file mode 100644
index 00000000..1032e8bb
--- /dev/null
+++ b/src/components/InteractiveEditor/ExportConfigMenu.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
{{ $t('interactive-editor.export.export-title') }}
+
+
+ {{ $t('interactive-editor.export.copy-clipboard-btn') }}
+
+
+
+ {{ $t('interactive-editor.export.download-file-btn') }}
+
+
+
+
+
{{ $t('interactive-editor.export.view-title') }}
+
+
+
+
+
+
+
+
diff --git a/src/components/InteractiveEditor/MoveItemTo.vue b/src/components/InteractiveEditor/MoveItemTo.vue
new file mode 100644
index 00000000..7a604d30
--- /dev/null
+++ b/src/components/InteractiveEditor/MoveItemTo.vue
@@ -0,0 +1,136 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/components/InteractiveEditor/SaveCancelButtons.vue b/src/components/InteractiveEditor/SaveCancelButtons.vue
new file mode 100644
index 00000000..b2f77424
--- /dev/null
+++ b/src/components/InteractiveEditor/SaveCancelButtons.vue
@@ -0,0 +1,61 @@
+
+
+
+ {{ $t('interactive-editor.menu.save-stage-btn') }}
+
+
+
+ {{ $t('interactive-editor.menu.cancel-stage-btn') }}
+
+
+
+
+
+
+
+
diff --git a/src/components/LinkItems/Collapsable.vue b/src/components/LinkItems/Collapsable.vue
index d33db09b..76732f03 100644
--- a/src/components/LinkItems/Collapsable.vue
+++ b/src/components/LinkItems/Collapsable.vue
@@ -1,18 +1,22 @@
-
-
+
{{ title }}
+
@@ -26,26 +30,50 @@
import { localStorageKeys } from '@/utils/defaults';
import Icon from '@/components/LinkItems/ItemIcon.vue';
+import EditModeIcon from '@/assets/interface-icons/interactive-editor-edit-mode.svg';
export default {
name: 'CollapsableContainer',
props: {
- uniqueKey: String,
- title: String,
- icon: String,
- collapsed: Boolean,
- cols: Number,
- rows: Number,
- color: String,
- customStyles: String,
+ uniqueKey: String, // Generated unique ID
+ title: String, // The section title
+ icon: String, // An optional section icon
+ collapsed: Boolean, // Optional override collapse state
+ cols: Number, // Set section horizontal col span / width
+ rows: Number, // Set section vertical row span / height
+ color: String, // Optional color override
+ customStyles: String, // Optional custom stylings
},
components: {
Icon,
+ EditModeIcon,
+ },
+ computed: {
+ isEditMode() {
+ return this.$store.state.editMode;
+ },
+ sectionKey() {
+ if (this.isEditMode) return undefined;
+ return `collapsible-${this.uniqueKey}`;
+ },
+ collapseClass() {
+ return !this.isExpanded ? ' is-collapsed' : 'is-open';
+ },
+ rowColSpanClass() {
+ const { rows, cols, checkSpanNum } = this;
+ return `${checkSpanNum(cols, 'col')} ${checkSpanNum(rows, 'row')}`;
+ },
+ },
+ data: () => ({
+ isExpanded: false,
+ }),
+ mounted() {
+ this.isExpanded = this.getCollapseState();
},
methods: {
/* Check that row & column span is valid, and not over the max */
checkSpanNum(span, classPrefix) {
- const maxSpan = 4;
+ const maxSpan = 5;
let numSpan = /^\d*$/.test(span) ? parseInt(span, 10) : 1;
numSpan = (numSpan > maxSpan) ? maxSpan : numSpan;
return `${classPrefix}-${numSpan}`;
@@ -54,28 +82,30 @@ export default {
sanitizeCustomStyles(userCss) {
return userCss ? userCss.replace(/[^a-zA-Z0-9- :;.]/g, '') : '';
},
- /* If not already done, then add object structure to local storage */
+ /* Returns local storage collapse state data, and if not yet set then initialized is */
initialiseStorage() {
+ const storageKey = localStorageKeys.COLLAPSE_STATE;
/* Initialize function will create and set a blank object to storage */
- const initStorage = () => localStorage.setItem(
- localStorageKeys.COLLAPSE_STATE, JSON.stringify({}),
- );
- if (!localStorage[localStorageKeys.COLLAPSE_STATE]) initStorage(); // Initialise if not set
- try { // Check storage is valid JSON, and has not been corrupted
- JSON.parse(localStorage[localStorageKeys.COLLAPSE_STATE]);
- } catch {
+ const initStorage = () => localStorage.setItem(storageKey, JSON.stringify({}));
+ // If not yet set, then call initialize
+ if (!localStorage[storageKey]) {
initStorage();
+ return {};
}
- return JSON.parse(localStorage[localStorageKeys.COLLAPSE_STATE]);
+ // Otherwise, return value of local storage
+ return JSON.parse(localStorage[storageKey]);
},
+ /* If specified by user, return conf collapse state, otherwise check local storage */
getCollapseState() {
- const collapseStateObject = this.initialiseStorage();
- let collapseState = !this.collapsed;
+ if (this.collapsed !== undefined) return !this.collapsed; // Check users config
+ const collapseStateObject = this.initialiseStorage(); // Check local storage
if (collapseStateObject[this.uniqueKey] !== undefined) {
- collapseState = collapseStateObject[this.uniqueKey];
+ return collapseStateObject[this.uniqueKey];
}
- return collapseState;
+ // Nothing specified, return Open
+ return true;
},
+ /* When section collapsed, update local storage, to remember for next time */
setCollapseState(id, newState) {
// Get the current localstorage collapse state object
const collapseState = JSON.parse(localStorage[localStorageKeys.COLLAPSE_STATE]);
@@ -84,9 +114,23 @@ export default {
// Stringify, and set the new object into local storage
localStorage.setItem(localStorageKeys.COLLAPSE_STATE, JSON.stringify(collapseState));
},
+ /* Called when collapse state changes, trigger local storage update if needed */
collapseChanged(whatChanged) {
- this.initialiseStorage();
- this.setCollapseState(this.uniqueKey.toString(), whatChanged.srcElement.checked);
+ this.isExpanded = whatChanged.srcElement.checked;
+ if (this.collapseState === undefined) { // Only run, if user hasn't manually set prop
+ this.initialiseStorage();
+ this.setCollapseState(this.uniqueKey.toString(), this.isExpanded);
+ }
+ },
+ openEditModal() {
+ this.$emit('openEditSection');
+ },
+ openContextMenu(e) {
+ this.$emit('openContextMenu', e);
+ },
+ editTooltip() {
+ const content = this.$t('interactive-editor.edit-section.edit-tooltip');
+ return { content, trigger: 'hover focus', delay: { show: 100, hide: 0 } };
},
},
};
@@ -110,22 +154,26 @@ export default {
&.row-2 { grid-row-start: span 2; }
&.row-3 { grid-row-start: span 3; }
&.row-4 { grid-row-start: span 4; }
+ &.row-5 { grid-row-start: span 5; }
grid-column-start: span 1;
@include tablet-up {
&.col-2 { grid-column-start: span 2; }
&.col-3 { grid-column-start: span 2; }
&.col-4 { grid-column-start: span 2; }
+ &.col-5 { grid-column-start: span 2; }
}
@include laptop-up {
&.col-2 { grid-column-start: span 2; }
&.col-3 { grid-column-start: span 3; }
&.col-4 { grid-column-start: span 3; }
+ &.col-5 { grid-column-start: span 3; }
}
@include monitor-up {
&.col-2 { grid-column-start: span 2; }
&.col-3 { grid-column-start: span 3; }
&.col-4 { grid-column-start: span 4; }
+ &.col-5 { grid-column-start: span 5; }
}
.wrap-collabsible {
@@ -144,7 +192,7 @@ export default {
border-radius: var(--curve-factor);
transition: all 0.25s ease-out;
text-align: left;
- color: var(--item-group-heading-text-color); //var(--item-group-background);
+ color: var(--item-group-heading-text-color);
h3 {
margin: 0;
padding: 0;
@@ -196,5 +244,13 @@ export default {
.collapsible-content .content-inner {
padding: 0.5rem;
}
+
+ .edit-mode-item {
+ width: 1rem;
+ height: 1rem;
+ float: right;
+ right: 0.5rem;
+ top: 0.5rem;
+ }
}
diff --git a/src/components/LinkItems/IframeModal.vue b/src/components/LinkItems/IframeModal.vue
index bc40f3d4..592b5d1a 100644
--- a/src/components/LinkItems/IframeModal.vue
+++ b/src/components/LinkItems/IframeModal.vue
@@ -9,6 +9,8 @@
+
+
diff --git a/src/components/LinkItems/ItemIcon.vue b/src/components/LinkItems/ItemIcon.vue
index b8c3f9c6..5e3a9667 100644
--- a/src/components/LinkItems/ItemIcon.vue
+++ b/src/components/LinkItems/ItemIcon.vue
@@ -1,5 +1,5 @@
-
+
@@ -23,13 +23,13 @@
import simpleIcons from 'simple-icons';
import BrokenImage from '@/assets/interface-icons/broken-icon.svg';
import ErrorHandler from '@/utils/ErrorHandler';
-import { faviconApi as defaultFaviconApi, faviconApiEndpoints, iconCdns } from '@/utils/defaults';
import EmojiUnicodeRegex from '@/utils/EmojiUnicodeRegex';
import emojiLookup from '@/utils/emojis.json';
+import { faviconApi as defaultFaviconApi, faviconApiEndpoints, iconCdns } from '@/utils/defaults';
+import { asciiHash } from '@/utils/MiscHelpers';
export default {
name: 'Icon',
- inject: ['config'],
props: {
icon: String, // Path to icon asset
url: String, // Used for fetching the favicon
@@ -39,18 +39,24 @@ export default {
BrokenImage,
},
computed: {
+ /* Get appConfig from store */
+ appConfig() {
+ return this.$store.getters.appConfig;
+ },
/* Determines the type of icon */
iconType: function iconType() {
return this.determineImageType(this.icon);
},
/* Gets the icon path, dependent on icon type */
iconPath: function iconPath() {
+ if (this.broken) return this.getFallbackIcon();
return this.getIconPath(this.icon, this.url);
},
},
data() {
return {
broken: false, // If true, was unable to resolve icon
+ attemptedFallback: false,
};
},
methods: {
@@ -90,12 +96,12 @@ export default {
},
/* Get favicon URL, for items which use the favicon as their icon */
getFavicon(fullUrl, specificApi) {
- if (this.shouldUseDefaultFavicon(fullUrl)) { // Check if we should use local icon
+ const faviconApi = specificApi || this.appConfig.faviconApi || defaultFaviconApi;
+ if (this.shouldUseDefaultFavicon(fullUrl) || faviconApi === 'local') { // Check if we should use local icon
const urlParts = fullUrl.split('/');
if (urlParts.length >= 2) return `${urlParts[0]}/${urlParts[1]}/${urlParts[2]}/${iconCdns.faviconName}`;
} else if (fullUrl.includes('http')) { // Service is running publicly
const host = this.getHostName(fullUrl);
- const faviconApi = specificApi || this.config.appConfig.faviconApi || defaultFaviconApi;
const endpoint = faviconApiEndpoints[faviconApi];
return endpoint.replace('$URL', host);
}
@@ -119,15 +125,16 @@ export default {
/* or if user prefers local favicon, then return true */
shouldUseDefaultFavicon(fullUrl) {
const isLocalIP = /(127\.)|(192\.168\.)|(10\.)|(172\.1[6-9]\.)|(172\.2[0-9]\.)|(172\.3[0-1]\.)|(::1$)|([fF][cCdD])|(localhost)/;
- return (isLocalIP.test(fullUrl) || this.config.appConfig.faviconApi === 'local');
+ return (isLocalIP.test(fullUrl) || this.appConfig.faviconApi === 'local');
},
/* Fetches the path of local images, from Docker container */
getLocalImagePath(img) {
return `${iconCdns.localPath}/${img}`;
},
/* Formats the URL for fetching the generative icons */
- getGenerativeIcon(url) {
- return `${iconCdns.generative}/${this.getHostName(url)}.svg`;
+ getGenerativeIcon(url, cdn) {
+ const host = encodeURI(url) || Math.random().toString();
+ return (cdn || iconCdns.generative).replace('{icon}', asciiHash(host));
},
/* Returns the SVG path content */
getSimpleIcon(img) {
@@ -135,6 +142,11 @@ export default {
const icon = simpleIcons.Get(imageName);
return icon.path;
},
+ /* Gets home-lab icon from GitHub */
+ getHomeLabIcon(img) {
+ const imageName = img.replace('hl-', '').toLocaleLowerCase();
+ return iconCdns.homeLabIcons.replace('{icon}', imageName);
+ },
/* Checks if the icon is from a local image, remote URL, SVG or font-awesome */
getIconPath(img, url) {
switch (this.determineImageType(img)) {
@@ -145,6 +157,7 @@ export default {
case 'generative': return this.getGenerativeIcon(url);
case 'mdi': return img; // Material design icons
case 'simple-icons': return this.getSimpleIcon(img);
+ case 'home-lab-icons': return this.getHomeLabIcon(img);
case 'svg': return img; // Local SVG icon
case 'emoji': return img; // Emoji/ unicode
default: return '';
@@ -159,6 +172,7 @@ export default {
else if (img.includes('fa-')) imgType = 'font-awesome';
else if (img.includes('mdi-')) imgType = 'mdi';
else if (img.includes('si-')) imgType = 'si';
+ else if (img.includes('hl-')) imgType = 'home-lab-icons';
else if (img.includes('favicon-')) imgType = 'custom-favicon';
else if (img === 'favicon') imgType = 'favicon';
else if (img === 'generative') imgType = 'generative';
@@ -175,11 +189,40 @@ export default {
this.broken = true;
ErrorHandler(`The path to '${this.icon}' could not be resolved`);
},
+ /* Called when initial icon has resulted in 404. Attempts to find new icon */
+ getFallbackIcon() {
+ if (this.attemptedFallback) return undefined; // If this is second attempt, then give up
+ const { iconType } = this;
+ const markAsSttempted = () => {
+ this.broken = false;
+ this.attemptedFallback = true;
+ };
+ if (iconType.includes('favicon')) { // Specify fallback for favicon-based icons
+ markAsSttempted();
+ return this.getFavicon(this.url, 'local');
+ } else if (iconType === 'generative') {
+ markAsSttempted();
+ return this.getGenerativeIcon(this.url, iconCdns.generativeFallback);
+ }
+ return undefined;
+ },
},
};
diff --git a/src/components/LinkItems/ContextMenu.vue b/src/components/LinkItems/SectionContextMenu.vue
similarity index 58%
rename from src/components/LinkItems/ContextMenu.vue
rename to src/components/LinkItems/SectionContextMenu.vue
index 68349c24..8f9b12c1 100644
--- a/src/components/LinkItems/ContextMenu.vue
+++ b/src/components/LinkItems/SectionContextMenu.vue
@@ -1,23 +1,20 @@
-
@@ -26,48 +23,47 @@
-
diff --git a/src/components/MinimalView/MinimalSection.vue b/src/components/MinimalView/MinimalSection.vue
index b20112ec..60a69326 100644
--- a/src/components/MinimalView/MinimalSection.vue
+++ b/src/components/MinimalView/MinimalSection.vue
@@ -26,7 +26,6 @@
:ref="`iframeModal-${groupId}`"
:name="`iframeModal-${groupId}`"
@closed="$emit('itemClicked')"
- @modalChanged="modalChanged"
/>
@@ -37,7 +36,6 @@ import IframeModal from '@/components/LinkItems/IframeModal.vue';
export default {
name: 'ItemGroup',
- inject: ['config'],
props: {
groupId: String,
title: String,
@@ -50,6 +48,11 @@ export default {
selected: Boolean,
showAll: Boolean,
},
+ computed: {
+ appConfig() {
+ return this.$store.getters.appConfig;
+ },
+ },
components: {
Item,
IframeModal,
@@ -66,15 +69,12 @@ export default {
triggerModal(url) {
this.$refs[`iframeModal-${this.groupId}`].show(url);
},
- modalChanged(changedTo) {
- this.$emit('change-modal-visibility', changedTo);
- },
shouldEnableStatusCheck(itemPreference) {
- const globalPreference = this.config.appConfig.statusCheck || false;
+ const globalPreference = this.appConfig.statusCheck || false;
return itemPreference !== undefined ? itemPreference : globalPreference;
},
getStatusCheckInterval() {
- let interval = this.config.appConfig.statusCheckInterval;
+ let interval = this.appConfig.statusCheckInterval;
if (!interval) return 0;
if (interval > 60) interval = 60;
if (interval < 1) interval = 0;
@@ -97,12 +97,13 @@ export default {
border-radius: 0 0 var(--curve-factor) var(--curve-factor);
.section-items {
display: grid;
- @include phone { grid-template-columns: repeat(1, 1fr); }
- @include tablet { grid-template-columns: repeat(2, 1fr); }
- @include laptop { grid-template-columns: repeat(3, 1fr); }
- @include monitor { grid-template-columns: repeat(4, 1fr); }
- @include big-screen { grid-template-columns: repeat(5, 1fr); }
- @include big-screen-up { grid-template-columns: repeat(6, 1fr); }
+ @include phone { --minimal-col-count: 1; }
+ @include tablet { --minimal-col-count: 2; }
+ @include laptop { --minimal-col-count: 3; }
+ @include monitor { --minimal-col-count: 4; }
+ @include big-screen { --minimal-col-count: 5; }
+ @include big-screen-up { --minimal-col-count: 6; }
+ grid-template-columns: repeat(var(--minimal-col-count, 1), minmax(0, 1fr));
}
&.selected {
border: 1px solid var(--minimal-view-group-color);
diff --git a/src/components/PageStrcture/Header.vue b/src/components/PageStrcture/Header.vue
index 6fb4679e..d17a41f4 100644
--- a/src/components/PageStrcture/Header.vue
+++ b/src/components/PageStrcture/Header.vue
@@ -1,5 +1,5 @@
-
+
import PageTitle from '@/components/PageStrcture/PageTitle.vue';
import Nav from '@/components/PageStrcture/Nav.vue';
-import { visibleComponents as defaultVisibleComponents } from '@/utils/defaults';
import { shouldBeVisible } from '@/utils/MiscHelpers';
export default {
name: 'Header',
- inject: ['visibleComponents'],
components: {
PageTitle,
Nav,
@@ -26,16 +24,19 @@ export default {
props: {
pageInfo: Object,
},
- data() {
- return {
- titleVisible: (this.visibleComponents || defaultVisibleComponents).pageTitle,
- navVisible: (this.visibleComponents || defaultVisibleComponents).navigation,
- };
- },
computed: {
- visible() {
+ componentVisible() {
return shouldBeVisible(this.$route.name);
},
+ visibleComponents() {
+ return this.$store.getters.visibleComponents;
+ },
+ titleVisible() {
+ return this.visibleComponents.pageTitle;
+ },
+ navVisible() {
+ return this.visibleComponents.navigation;
+ },
},
};
diff --git a/src/components/PageStrcture/Nav.vue b/src/components/PageStrcture/Nav.vue
index 5b4afd0c..09261b52 100644
--- a/src/components/PageStrcture/Nav.vue
+++ b/src/components/PageStrcture/Nav.vue
@@ -1,52 +1,93 @@
-
+
+
+
{{link.title}}
-
+
+
diff --git a/src/components/PageStrcture/PageTitle.vue b/src/components/PageStrcture/PageTitle.vue
index 98d75212..26c7ccef 100644
--- a/src/components/PageStrcture/PageTitle.vue
+++ b/src/components/PageStrcture/PageTitle.vue
@@ -1,14 +1,23 @@
-
+
+
+
-
{{ title }}
- {{ description }}
+ {{ title }}
+ {{ description }}
+
+
@@ -28,6 +57,7 @@ export default {
flex-direction: row;
align-items: center;
text-decoration: none;
+ position: relative;
h1 {
color: var(--heading-text-color);
font-size: 2.5rem;
@@ -49,5 +79,21 @@ export default {
text-align: center;
padding: 0.25rem 0;
}
+ &[disabled] {
+ cursor: default;
+ }
+ svg.edit-icon {
+ width: 1rem;
+ height: 1rem;
+ right: 1rem;
+ top: 0.5rem;
+ padding: 0.25rem;
+ margin: 0.25rem;
+ cursor: pointer;
+ border: 1px solid var(--background-darker);
+ border-radius: var(--curve-factor);
+ path { fill: var(--primary); }
+ &:hover { border: 1px solid var(--primary); }
+ }
}
diff --git a/src/components/Settings/ConfigLauncher.vue b/src/components/Settings/ConfigLauncher.vue
index 796c05e0..6ff46880 100644
--- a/src/components/Settings/ConfigLauncher.vue
+++ b/src/components/Settings/ConfigLauncher.vue
@@ -5,13 +5,16 @@
-
+
+ @closed="editorClosed" classes="dashy-modal">
@@ -44,11 +47,14 @@
diff --git a/src/components/Settings/SettingsContainer.vue b/src/components/Settings/SettingsContainer.vue
index 0024ad6c..e81f17b9 100644
--- a/src/components/Settings/SettingsContainer.vue
+++ b/src/components/Settings/SettingsContainer.vue
@@ -3,16 +3,13 @@
@@ -52,10 +49,6 @@ export default {
displayLayout: String,
iconSize: String,
externalThemes: Object,
- appConfig: Object,
- pageInfo: Object,
- sections: Array,
- modalOpen: Boolean,
},
components: {
SearchBar,
@@ -69,7 +62,43 @@ export default {
IconOpen,
IconClose,
},
- inject: ['visibleComponents'],
+ data() {
+ return {
+ settingsVisible: true,
+ };
+ },
+ computed: {
+ sections() {
+ return this.$store.getters.sections;
+ },
+ appConfig() {
+ return this.$store.getters.appConfig;
+ },
+ pageInfo() {
+ return this.$store.getters.pageInfo;
+ },
+ /**
+ * Determines which button should display, based on the user type
+ * 0 = Auth not configured, don't show anything
+ * 1 = Auth condifured, and user logged in, show logout button
+ * 2 = Auth configured, guest access enabled, and not logged in, show login
+ * Note that if auth is enabled, but not guest access, and user not logged in,
+ * then they will never be able to view the homepage, so no button needed
+ */
+ userState() {
+ return getUserState();
+ },
+ /* Object indicating which components should be hidden, based on user preferences */
+ visibleComponents() {
+ return this.$store.getters.visibleComponents;
+ },
+ searchVisible() {
+ return this.$store.getters.visibleComponents.searchBar;
+ },
+ },
+ mounted() {
+ this.settingsVisible = this.getSettingsVisibility();
+ },
methods: {
userIsTypingSomething(something) {
this.$emit('user-is-searchin', something);
@@ -77,15 +106,6 @@ export default {
clearFilterInput() {
this.$refs.SearchBar.clearFilterInput();
},
- updateDisplayLayout(layout) {
- this.$emit('change-display-layout', layout);
- },
- updateIconSize(iconSize) {
- this.$emit('change-icon-size', iconSize);
- },
- modalChanged(changedTo) {
- this.$emit('change-modal-visibility', changedTo);
- },
getInitialTheme() {
return this.appConfig.theme || '';
},
@@ -100,29 +120,13 @@ export default {
localStorage.setItem(localStorageKeys.HIDE_SETTINGS, this.settingsVisible);
},
getSettingsVisibility() {
- return JSON.parse(localStorage[localStorageKeys.HIDE_SETTINGS]
- || (this.visibleComponents || defaultVisibleComponents).settings);
+ const screenWidth = document.body.clientWidth;
+ if (screenWidth && screenWidth < 600) return false;
+ if ((this.visibleComponents || {}).settings === false) return false;
+ if (localStorage[localStorageKeys.HIDE_SETTINGS] === 'false') return false;
+ return defaultVisibleComponents.settings;
},
},
- computed: {
- /**
- * Determines which button should display, based on the user type
- * 0 = Auth not configured, don't show anything
- * 1 = Auth condifured, and user logged in, show logout button
- * 2 = Auth configured, guest access enabled, and not logged in, show login
- * Note that if auth is enabled, but not guest access, and user not logged in,
- * then they will never be able to view the homepage, so no button needed
- */
- userState() {
- return getUserState();
- },
- },
- data() {
- return {
- settingsVisible: this.getSettingsVisibility(),
- searchVisible: (this.visibleComponents || defaultVisibleComponents).searchBar,
- };
- },
};
@@ -165,6 +169,11 @@ export default {
@include very-tiny-phone {
flex-direction: column;
align-items: baseline;
+ div {
+ width: 100%;
+ text-align: center;
+ .theme-selector-section { justify-content: center; }
+ }
}
}
diff --git a/src/components/Settings/ThemeSelector.vue b/src/components/Settings/ThemeSelector.vue
index 7151aba3..11db7cd9 100644
--- a/src/components/Settings/ThemeSelector.vue
+++ b/src/components/Settings/ThemeSelector.vue
@@ -5,11 +5,14 @@
{
+ availibleThemes[`External Stylesheet ${i + 1}`] = ext;
+ });
+ } else {
+ availibleThemes['External Stylesheet'] = this.appConfig.externalStyleSheet;
+ }
+ }
+ }
+ availibleThemes.Default = '#';
+ return availibleThemes;
},
},
- created() {
+ mounted() {
+ const initialTheme = this.getInitialTheme();
+ this.selectedTheme = initialTheme;
// Pass all user custom stylesheets to the themehelper
const added = Object.keys(this.externalThemes).map(
name => this.themeHelper.add(name, this.externalThemes[name]),
);
// Quicker loading, if the theme is local we can apply it immidiatley
- if (this.isThemeLocal(this.selectedTheme)) {
- this.updateTheme(this.selectedTheme);
+ if (this.isThemeLocal(initialTheme)) {
+ this.updateTheme(initialTheme);
// If it's an external stylesheet, then wait for promise to resolve
- } else if (this.selectedTheme !== Defaults.theme) {
+ } else if (initialTheme !== Defaults.theme) {
Promise.all(added).then(() => {
- this.updateTheme(this.selectedTheme);
+ this.updateTheme(initialTheme);
});
}
},
methods: {
- /* Get default theme */
+ /* Called when dropdown changed
+ * Updates store, which will in turn update theme through watcher
+ */
+ themeChanged() {
+ this.$store.commit(Keys.SET_THEME, this.selectedTheme);
+ },
+ /* Returns the initial theme */
getInitialTheme() {
- return localStorage[localStorageKeys.THEME] || this.confTheme || Defaults.theme;
+ const localTheme = localStorage[localStorageKeys.THEME];
+ if (localTheme && localTheme !== 'undefined') return localTheme;
+ return this.appConfig.theme || Defaults.theme;
},
/* Determines if a given theme is local / not a custom user stylesheet */
isThemeLocal(themeToCheck) {
- return this.builtInThemes.includes(themeToCheck);
+ const localThemes = [...Defaults.builtInThemes, ...this.extraThemeNames];
+ return localThemes.includes(themeToCheck);
},
/* Opens the theme color configurator popup */
openThemeConfigurator() {
- this.$emit('modalChanged', true);
+ this.$store.commit(Keys.SET_MODAL_OPEN, true);
this.themeConfiguratorOpen = true;
},
/* Closes the theme color configurator popup */
closeThemeConfigurator() {
- // this.$emit('modalChanged', false);
- this.themeConfiguratorOpen = false;
+ if (this.themeConfiguratorOpen) {
+ this.$store.commit(Keys.SET_MODAL_OPEN, false);
+ this.themeConfiguratorOpen = false;
+ }
},
/* Updates theme. Checks if the new theme is local or external,
and calls appropirate updating function. Updates local storage */
@@ -169,6 +215,7 @@ export default {
display: flex;
flex-direction: row;
align-items: flex-start;
+ justify-content: center;
height: 100%;
span.theme-label {
font-size: 1rem;
diff --git a/src/components/Workspace/SideBar.vue b/src/components/Workspace/SideBar.vue
index b75fba72..94595b6e 100644
--- a/src/components/Workspace/SideBar.vue
+++ b/src/components/Workspace/SideBar.vue
@@ -36,9 +36,9 @@ import IconMinimalView from '@/assets/interface-icons/application-minimal.svg';
export default {
name: 'SideBar',
- inject: ['config'],
props: {
sections: Array,
+ initUrl: String,
},
data() {
return {
@@ -56,9 +56,26 @@ export default {
openSection(index) {
this.isOpen = this.isOpen.map((val, ind) => (ind !== index ? false : !val));
},
- launchApp(url) {
- this.$emit('launch-app', url);
+ /* When item clicked, emit a launch event */
+ launchApp(options) {
+ this.$emit('launch-app', options);
},
+ /* If an initial URL is specified, then open relevant section */
+ openDefaultSection() {
+ if (!this.initUrl) return;
+ const process = (url) => url.replace(/[^\w\s]/gi, '').toLowerCase();
+ const compare = (item) => (process(item.url) === process(this.initUrl));
+ this.sections.forEach((section, sectionIndex) => {
+ if (section.items.findIndex(compare) !== -1) this.openSection(sectionIndex);
+ });
+ },
+ },
+ mounted() {
+ if (this.sections.length === 1) { // If only 1 section, go ahead and open it
+ this.openSection(0);
+ } else { // Otherwise, see if user set a default section, and open that
+ this.openDefaultSection();
+ }
},
};
diff --git a/src/components/Workspace/SideBarItem.vue b/src/components/Workspace/SideBarItem.vue
index 5a66042a..90319afe 100644
--- a/src/components/Workspace/SideBarItem.vue
+++ b/src/components/Workspace/SideBarItem.vue
@@ -12,11 +12,11 @@ import Icon from '@/components/LinkItems/ItemIcon.vue';
export default {
name: 'SideBarItem',
- inject: ['config'],
props: {
icon: String,
title: String,
url: String,
+ target: String,
click: Function,
},
components: {
@@ -24,7 +24,7 @@ export default {
},
methods: {
itemClicked() {
- if (this.url) this.$emit('launch-app', this.url);
+ if (this.url) this.$emit('launch-app', { url: this.url, target: this.target });
},
},
data() {
diff --git a/src/components/Workspace/SideBarSection.vue b/src/components/Workspace/SideBarSection.vue
index b0410291..778a6cff 100644
--- a/src/components/Workspace/SideBarSection.vue
+++ b/src/components/Workspace/SideBarSection.vue
@@ -6,6 +6,7 @@
:icon="item.icon"
:title="item.title"
:url="item.url"
+ :target="item.target"
@launch-app="launchApp"
/>
@@ -18,7 +19,6 @@ import SideBarItem from '@/components/Workspace/SideBarItem.vue';
export default {
name: 'SideBarSection',
- inject: ['config'],
props: {
items: Array,
},
@@ -26,8 +26,8 @@ export default {
SideBarItem,
},
methods: {
- launchApp(url) {
- this.$emit('launch-app', url);
+ launchApp(options) {
+ this.$emit('launch-app', options);
},
},
};
diff --git a/src/main.js b/src/main.js
index a5d4c764..8b8fac3b 100644
--- a/src/main.js
+++ b/src/main.js
@@ -10,10 +10,12 @@ import VModal from 'vue-js-modal'; // Modal component
import VSelect from 'vue-select'; // Select dropdown component
import VTabs from 'vue-material-tabs'; // Tab view component, used on the config page
import Toasted from 'vue-toasted'; // Toast component, used to show confirmation notifications
+import TreeView from 'vue-json-tree-view';
// Import base Dashy components and utils
import Dashy from '@/App.vue'; // Main Dashy Vue app
import router from '@/router'; // Router, for navigation
+import store from '@/store'; // Store, for local state management
import serviceWorker from '@/utils/InitServiceWorker'; // Service worker initialization
import clickOutside from '@/utils/ClickOutside'; // Directive for closing popups, modals, etc
import { messages } from '@/utils/languages'; // Language texts
@@ -26,6 +28,7 @@ Vue.use(VueI18n);
Vue.use(VTooltip, tooltipOptions);
Vue.use(VModal);
Vue.use(VTabs);
+Vue.use(TreeView);
Vue.use(Toasted, toastedOptions);
Vue.component('v-select', VSelect);
Vue.directive('clickOutside', clickOutside);
@@ -48,9 +51,14 @@ ErrorReporting(Vue, router);
// Render function
const render = (awesome) => awesome(Dashy);
+// Mount the app, with router, store i18n and render func
+const mount = () => new Vue({
+ store, router, render, i18n,
+}).$mount('#app');
+
// If Keycloak not enabled, then proceed straight to the app
if (!isKeycloakEnabled()) {
- new Vue({ router, render, i18n }).$mount('#app');
+ mount();
} else { // Keycloak is enabled, redirect to KC login page
const { serverUrl, realm, clientId } = getKeycloakConfig();
const initOptions = {
@@ -63,7 +71,7 @@ if (!isKeycloakEnabled()) {
window.location.reload();
} else {
// Yay - user successfully authenticated with Keycloak, render the app!
- new Vue({ router, render, i18n }).$mount('#app');
+ mount();
}
});
}
diff --git a/src/router.js b/src/router.js
index 1db8ceae..ece6d9d7 100644
--- a/src/router.js
+++ b/src/router.js
@@ -7,20 +7,19 @@
// Import Vue.js and vue router
import Vue from 'vue';
import Router from 'vue-router';
+import ProgressBar from 'rsup-progress';
-// Import views
+// Import views, that are not lazy-loaded
import Home from '@/views/Home.vue';
-import Login from '@/views/Login.vue';
-import Workspace from '@/views/Workspace.vue';
-import Minimal from '@/views/Minimal.vue';
-import DownloadConfig from '@/views/DownloadConfig.vue';
+import ConfigAccumulator from '@/utils/ConfigAccumalator';
// Import helper functions, config data and defaults
import { isAuthEnabled, isLoggedIn, isGuestAccessEnabled } from '@/utils/Auth';
-import { config } from '@/utils/ConfigHelpers';
import { metaTagData, startingView, routePaths } from '@/utils/defaults';
+import ErrorHandler from '@/utils/ErrorHandler';
Vue.use(Router);
+const progress = new ProgressBar({ color: 'var(--progress-bar)' });
/* Returns true if user is already authenticated, or if auth is not enabled */
const isAuthenticated = () => {
@@ -30,8 +29,18 @@ const isAuthenticated = () => {
return (!authEnabled || userLoggedIn || guestEnabled);
};
+const getConfig = () => {
+ const Accumulator = new ConfigAccumulator();
+ return {
+ appConfig: Accumulator.appConfig(),
+ pageInfo: Accumulator.pageInfo(),
+ };
+};
+
+const { appConfig, pageInfo } = getConfig();
+
/* Get the users chosen starting view from app config, or return default */
-const getStartingView = () => config.appConfig.startingView || startingView;
+const getStartingView = () => appConfig.startingView || startingView;
/**
* Returns the component that should be rendered at the base path,
@@ -40,57 +49,59 @@ const getStartingView = () => config.appConfig.startingView || startingView;
const getStartingComponent = () => {
const usersPreference = getStartingView();
switch (usersPreference) {
- case 'default': return Home;
- case 'minimal': return Minimal;
- case 'workspace': return Workspace;
+ case 'minimal': return () => import('./views/Minimal.vue');
+ case 'workspace': return () => import('./views/Workspace.vue');
default: return Home;
}
};
/* Returns the meta tags for each route */
const makeMetaTags = (defaultTitle) => ({
- title: config.pageInfo.title || defaultTitle,
+ title: pageInfo.title || defaultTitle,
metaTags: metaTagData,
});
+/* Routing mode, can be either 'hash', 'history' or 'abstract' */
+const mode = appConfig.routingMode || 'history';
+
/* List of all routes, props, components and metadata */
const router = new Router({
+ mode,
routes: [
{ // The default view can be customized by the user
path: '/',
name: `landing-page-${getStartingView()}`,
component: getStartingComponent(),
- props: config,
meta: makeMetaTags('Home Page'),
},
{ // Default home page
path: routePaths.home,
name: 'home',
component: Home,
- props: config,
+ meta: makeMetaTags('Home Page'),
+ },
+ { // View only single section
+ path: `${routePaths.home}/:section`,
+ name: 'home-section',
+ component: Home,
meta: makeMetaTags('Home Page'),
},
{ // Workspace view page
path: routePaths.workspace,
name: 'workspace',
- component: Workspace,
- props: config,
+ component: () => import('./views/Workspace.vue'),
meta: makeMetaTags('Workspace'),
},
{ // Minimal view page
path: routePaths.minimal,
name: 'minimal',
- component: Minimal,
- props: config,
+ component: () => import('./views/Minimal.vue'),
meta: makeMetaTags('Start Page'),
},
{ // The login page
path: routePaths.login,
name: 'login',
- component: Login,
- props: {
- appConfig: config.appConfig,
- },
+ component: () => import('./views/Login.vue'),
beforeEnter: (to, from, next) => {
// If the user already logged in + guest mode not enabled, then redirect home
if (isAuthenticated() && !isGuestAccessEnabled()) router.push({ path: '/' });
@@ -100,16 +111,31 @@ const router = new Router({
{ // The about app page
path: routePaths.about,
name: 'about', // We lazy load the About page so as to not slow down the app
- component: () => import(/* webpackChunkName: "about" */ './views/About.vue'),
+ component: () => import('./views/About.vue'),
meta: makeMetaTags('About Dashy'),
},
{ // The export config page
path: routePaths.download,
name: 'download',
- component: DownloadConfig,
- props: config,
+ component: () => import('./views/DownloadConfig.vue'),
meta: makeMetaTags('Download Config'),
},
+ { // Page not found, any non-defined routes will land here
+ path: routePaths.notFound,
+ name: '404',
+ component: () => import('./views/404.vue'),
+ meta: makeMetaTags('404 Not Found'),
+ beforeEnter: (to, from, next) => {
+ if (to.redirectedFrom) { // Log error, if redirected here from another route
+ ErrorHandler(`Route not found: '${to.redirectedFrom}'`);
+ }
+ next();
+ },
+ },
+ { // Redirect any not-found routed to the 404 view
+ path: '*',
+ redirect: '/404',
+ },
],
});
@@ -119,12 +145,14 @@ const router = new Router({
* If not logged in, prevent all access and redirect them to login page
* */
router.beforeEach((to, from, next) => {
+ progress.start();
if (to.name !== 'login' && !isAuthenticated()) next({ name: 'login' });
else next();
});
/* If title is missing, then apply default page title */
router.afterEach((to) => {
+ progress.end();
Vue.nextTick(() => {
document.title = to.meta.title || 'Dashy';
});
diff --git a/src/store.js b/src/store.js
new file mode 100644
index 00000000..7f9aaaf9
--- /dev/null
+++ b/src/store.js
@@ -0,0 +1,249 @@
+/* eslint-disable no-param-reassign */
+import Vue from 'vue';
+import Vuex from 'vuex';
+import Keys from '@/utils/StoreMutations';
+import ConfigAccumulator from '@/utils/ConfigAccumalator';
+import { componentVisibility } from '@/utils/ConfigHelpers';
+import { applyItemId } from '@/utils/MiscHelpers';
+import filterUserSections from '@/utils/CheckSectionVisibility';
+import { InfoHandler, InfoKeys } from '@/utils/ErrorHandler';
+
+Vue.use(Vuex);
+
+const {
+ INITIALIZE_CONFIG,
+ SET_CONFIG,
+ SET_MODAL_OPEN,
+ SET_LANGUAGE,
+ SET_ITEM_LAYOUT,
+ SET_ITEM_SIZE,
+ SET_THEME,
+ SET_CUSTOM_COLORS,
+ UPDATE_ITEM,
+ SET_EDIT_MODE,
+ SET_PAGE_INFO,
+ SET_APP_CONFIG,
+ SET_SECTIONS,
+ UPDATE_SECTION,
+ INSERT_SECTION,
+ REMOVE_SECTION,
+ COPY_ITEM,
+ REMOVE_ITEM,
+ INSERT_ITEM,
+ UPDATE_CUSTOM_CSS,
+ CONF_MENU_INDEX,
+} = Keys;
+
+const store = new Vuex.Store({
+ state: {
+ config: {},
+ editMode: false, // While true, the user can drag and edit items + sections
+ modalOpen: false, // KB shortcut functionality will be disabled when modal is open
+ navigateConfToTab: undefined, // Used to switch active tab in config modal
+ },
+ getters: {
+ config(state) {
+ return state.config;
+ },
+ pageInfo(state) {
+ return state.config.pageInfo || {};
+ },
+ appConfig(state) {
+ return state.config.appConfig || {};
+ },
+ theme(state) {
+ return state.config.appConfig.theme;
+ },
+ sections(state) {
+ return filterUserSections(state.config.sections || []);
+ },
+ webSearch(state, getters) {
+ return getters.appConfig.webSearch || {};
+ },
+ visibleComponents(state, getters) {
+ return componentVisibility(getters.appConfig);
+ },
+ // eslint-disable-next-line arrow-body-style
+ getSectionByIndex: (state, getters) => (index) => {
+ return getters.sections[index];
+ },
+ getItemById: (state, getters) => (id) => {
+ let item;
+ getters.sections.forEach(sec => {
+ const foundItem = sec.items.find((itm) => itm.id === id);
+ if (foundItem) item = foundItem;
+ });
+ return item;
+ },
+ getParentSectionOfItem: (state, getters) => (itemId) => {
+ let foundSection;
+ getters.sections.forEach((section) => {
+ section.items.forEach((item) => {
+ if (item.id === itemId) foundSection = section;
+ });
+ });
+ return foundSection;
+ },
+ layout(state) {
+ return state.config.appConfig.layout || 'auto';
+ },
+ iconSize(state) {
+ return state.config.appConfig.iconSize || 'medium';
+ },
+ },
+ mutations: {
+ [SET_CONFIG](state, config) {
+ state.config = config;
+ },
+ [SET_LANGUAGE](state, lang) {
+ const newConfig = state.config;
+ newConfig.appConfig.language = lang;
+ state.config = newConfig;
+ },
+ [SET_MODAL_OPEN](state, modalOpen) {
+ state.modalOpen = modalOpen;
+ },
+ [SET_EDIT_MODE](state, editMode) {
+ if (editMode !== state.editMode) {
+ InfoHandler(editMode ? 'Edit session started' : 'Edit session ended', InfoKeys.EDITOR);
+ state.editMode = editMode;
+ }
+ },
+ [UPDATE_ITEM](state, payload) {
+ const { itemId, newItem } = payload;
+ const newConfig = { ...state.config };
+ newConfig.sections.forEach((section, secIndex) => {
+ section.items.forEach((item, itemIndex) => {
+ if (item.id === itemId) {
+ newConfig.sections[secIndex].items[itemIndex] = newItem;
+ InfoHandler('Item updated', InfoKeys.EDITOR);
+ }
+ });
+ });
+ state.config = newConfig;
+ },
+ [SET_PAGE_INFO](state, newPageInfo) {
+ const newConfig = state.config;
+ newConfig.pageInfo = newPageInfo;
+ state.config = newConfig;
+ InfoHandler('Page info updated', InfoKeys.EDITOR);
+ },
+ [SET_APP_CONFIG](state, newAppConfig) {
+ const newConfig = state.config;
+ newConfig.appConfig = newAppConfig;
+ state.config = newConfig;
+ InfoHandler('App config updated', InfoKeys.EDITOR);
+ },
+ [SET_SECTIONS](state, newSections) {
+ const newConfig = state.config;
+ newConfig.sections = newSections;
+ state.config = newConfig;
+ InfoHandler('Sections updated', InfoKeys.EDITOR);
+ },
+ [UPDATE_SECTION](state, payload) {
+ const { sectionIndex, sectionData } = payload;
+ const newConfig = { ...state.config };
+ newConfig.sections[sectionIndex] = sectionData;
+ state.config = newConfig;
+ InfoHandler('Section updated', InfoKeys.EDITOR);
+ },
+ [INSERT_SECTION](state, newSection) {
+ const newConfig = { ...state.config };
+ newSection.items = [];
+ newConfig.sections.push(newSection);
+ state.config = newConfig;
+ InfoHandler('New section added', InfoKeys.EDITOR);
+ },
+ [REMOVE_SECTION](state, payload) {
+ const { sectionIndex, sectionName } = payload;
+ const newConfig = { ...state.config };
+ if (newConfig.sections[sectionIndex].name === sectionName) {
+ newConfig.sections.splice(sectionIndex, 1);
+ InfoHandler('Section removed', InfoKeys.EDITOR);
+ }
+ state.config = newConfig;
+ },
+ [INSERT_ITEM](state, payload) {
+ const { newItem, targetSection } = payload;
+ const config = { ...state.config };
+ config.sections.forEach((section) => {
+ if (section.name === targetSection) {
+ section.items.push(newItem);
+ InfoHandler('New item added', InfoKeys.EDITOR);
+ }
+ });
+ config.sections = applyItemId(config.sections);
+ state.config = config;
+ },
+ [COPY_ITEM](state, payload) {
+ const { item, toSection, appendTo } = payload;
+ const config = { ...state.config };
+ const newItem = { ...item };
+ config.sections.forEach((section) => {
+ if (section.name === toSection) {
+ if (appendTo === 'beginning') {
+ section.items.unshift(newItem);
+ } else {
+ section.items.push(newItem);
+ }
+ InfoHandler('Item copied', InfoKeys.EDITOR);
+ }
+ });
+ config.sections = applyItemId(config.sections);
+ state.config = config;
+ },
+ [REMOVE_ITEM](state, payload) {
+ const { itemId, sectionName } = payload;
+ const config = { ...state.config };
+ config.sections.forEach((section) => {
+ if (section.name === sectionName) {
+ section.items.forEach((item, index) => {
+ if (item.id === itemId) {
+ section.items.splice(index, 1);
+ InfoHandler('Item removed', InfoKeys.EDITOR);
+ }
+ });
+ }
+ });
+ state.config = config;
+ },
+ [SET_THEME](state, theme) {
+ const newConfig = { ...state.config };
+ newConfig.appConfig.theme = theme;
+ state.config = newConfig;
+ InfoHandler('Theme updated', InfoKeys.VISUAL);
+ },
+ [SET_CUSTOM_COLORS](state, customColors) {
+ const newConfig = { ...state.config };
+ newConfig.appConfig.customColors = customColors;
+ state.config = newConfig;
+ InfoHandler('Color palette updated', InfoKeys.VISUAL);
+ },
+ [SET_ITEM_LAYOUT](state, layout) {
+ state.config.appConfig.layout = layout;
+ InfoHandler('Layout updated', InfoKeys.VISUAL);
+ },
+ [SET_ITEM_SIZE](state, iconSize) {
+ state.config.appConfig.iconSize = iconSize;
+ InfoHandler('Item size updated', InfoKeys.VISUAL);
+ },
+ [UPDATE_CUSTOM_CSS](state, customCss) {
+ state.config.appConfig.customCss = customCss;
+ InfoHandler('Custom colors updated', InfoKeys.VISUAL);
+ },
+ [CONF_MENU_INDEX](state, index) {
+ state.navigateConfToTab = index;
+ },
+ },
+ actions: {
+ /* Called when app first loaded. Reads config and sets state */
+ [INITIALIZE_CONFIG]({ commit }) {
+ const deepCopy = (json) => JSON.parse(JSON.stringify(json));
+ const config = deepCopy(new ConfigAccumulator().config());
+ commit(SET_CONFIG, config);
+ },
+ },
+ modules: {},
+});
+
+export default store;
diff --git a/src/styles/color-palette.scss b/src/styles/color-palette.scss
index 074b1d09..d672c2eb 100644
--- a/src/styles/color-palette.scss
+++ b/src/styles/color-palette.scss
@@ -42,21 +42,31 @@
--nav-link-background-color-hover: #607d8b33;
--nav-link-border-color: transparent;
--nav-link-border-color-hover: var(--primary);
+ --nav-link-shadow: 1px 1px 2px #232323;
+ --nav-link-shadow-hover: 1px 1px 2px #232323;
// Link items and sections
--item-text-color: var(--primary);
--item-text-color-hover: var(--item-text-color);
--item-group-outer-background: var(--primary);
--item-group-heading-text-color: var(--item-group-background);
--item-group-heading-text-color-hover: var(--background);
- // Settings and config
- --settings-background: var(--background);
+ // Homepage settings
--settings-text-color: var(--primary);
- --config-code-background: #fff;
- --config-code-color: var(--background);
+ --settings-background: var(--background);
+ // Config menu
--config-settings-color: var(--primary);
--config-settings-background: var(--background-darker);
+ --config-code-color: var(--background);
+ --config-code-background: #fff;
--code-editor-color: var(--black);
--code-editor-background: var(--white);
+ // Interactive editor
+ --interactive-editor-color: var(--primary);
+ --interactive-editor-background: var(--background);
+ --interactive-editor-background-darker: var(--background-darker);
+ // Cloud backup/ restore menu
+ --cloud-backup-color: var(--config-settings-color);
+ --cloud-backup-background: var(--config-settings-background);
// Search bar (on homepage)
--search-container-background: var(--background-darker);
--search-field-background: var(--background);
diff --git a/src/styles/color-themes.scss b/src/styles/color-themes.scss
index d0ace6ea..c6220cf1 100644
--- a/src/styles/color-themes.scss
+++ b/src/styles/color-themes.scss
@@ -1,12 +1,12 @@
html[data-theme='callisto'] {
+ --primary: #00CCB4;
--background: #141b33;
--background-darker: #060913;
--item-group-background: #0b1021;
- --item-background: #141b33;
- --item-background-hover: #060913;
+ --item-background: var(--background);
+ --item-background-hover: var(--background-darker);
--item-hover-shadow: 0 1px 3px #00ccb4b3, 0 1px 2px #00ccb4bf;
- --primary: #00CCB4;
--font-body: 'Inconsolata', 'Georgia', sans-serif;
--font-headings: 'PTMono', 'Courier New', monospace;
}
@@ -16,9 +16,9 @@ html[data-theme='thebe'] {
--background-darker: #060913;
--item-group-background: #0b1021;
--item-background: #141b33;
- --item-background-hover: #060913;
+ --item-background-hover: var(--background-darker);
--item-hover-shadow: 0 1px 3px #9660ecb3, 0 1px 2px #9660ecbf;
- --primary: #9660ec;
+ --primary: #b187f5;
--item-group-outer-background: #9660EC
linear-gradient(45deg, #9660ec 2%,#5f60ea 51%,#9660ec 100%);
--font-headings: 'PTMono', 'Courier New', monospace;
@@ -26,64 +26,69 @@ html[data-theme='thebe'] {
html[data-theme='dracula'] {
--font-headings: 'Allerta Stencil', sans-serif;
- --primary: #6272a4;
+ --primary: #98ace9;
--background: #44475a;
--background-darker: #282a36;
- --item-group-background: #282a36;
+ --item-group-background: var(--background-darker);
--item-background: none;
--item-background-hover: #191b22;
--item-shadow: none;
--item-hover-shadow: none;
- --settings-text-color: #98ace9;
- --config-settings-color: #98ace9;
- .collapsable:nth-child(1n) { background: #8be9fd; .item { border: 1px solid #8be9fd; color: #8be9fd; }}
- .collapsable:nth-child(2n) { background: #50fa7b; .item { border: 1px solid #50fa7b; color: #50fa7b; }}
- .collapsable:nth-child(3n) { background: #ffb86c; .item { border: 1px solid #ffb86c; color: #ffb86c; }}
- .collapsable:nth-child(4n) { background: #ff79c6; .item { border: 1px solid #ff79c6; color: #ff79c6; }}
- .collapsable:nth-child(4n) { background: #bd93f9; .item { border: 1px solid #bd93f9; color: #bd93f9; }}
+ --settings-text-color: var(--primary);
+ --config-settings-color: var(--primary);
+ --item-group-outer-background: var(--background-darker);
+ .item { border: 1px solid var(--primary); }
+ .collapsable:nth-child(1n) label { color: #8be9fd; }
+ .collapsable:nth-child(2n) label { color: #50fa7b; }
+ .collapsable:nth-child(3n) label { color: #ffb86c; }
+ .collapsable:nth-child(4n) label { color: #ff79c6; }
+ .collapsable:nth-child(4n) label { color: #bd93f9; }
}
html[data-theme='bee'] {
--primary: #c3eb5c;
+ --background: #0b1021;
--item-background: #1c2636;
- --item-group-background: #0b1021;
- --nav-link-background-color: #0b1021;
+ --item-group-background: var(--background);
+ --nav-link-background-color: var(--background);
--font-headings: 'Sniglet', cursive;
}
html[data-theme='raspberry-jam'] {
--primary: #eb2d6c;
+ --background: #0b1021;
--item-background: #1c2636;
- --item-group-background: #0b1021;
- --nav-link-background-color: #0b1021;
- --config-code-background: #0b1021;
- --config-code-color: #eb2d6c;
+ --item-group-background: var(--background);
+ --nav-link-background-color: var(--background);
+ --config-code-background: #1c1e24;
+ --config-code-color: var(--primary);
--font-headings: 'Sniglet', cursive;
}
html[data-theme='tiger'] {
--primary: #f58233;
+ --background: #0b1021;
--item-background: #1c2636;
- --item-group-background: #0b1021;
- --nav-link-background-color: #0b1021;
+ --item-group-background: var(--background);
+ --nav-link-background-color: var(--background);
--font-headings: 'Sniglet', cursive;
}
html[data-theme='matrix-red'] {
- --background: #000;
- --background-darker: #000;
- --primary: red;
- --outline-color: red;
- --curve-factor: 0px;
+ --background: var(--black);
+ --background-darker: var(--black);
+ --primary: #f00;
+ --outline-color: var(--primary);
+ --curve-factor: 0;
--font-body: 'Cutive Mono', monospace;
--font-headings: 'VT323', monospace;
}
html[data-theme='matrix'] {
- --background: #000;
- --background-darker: #000;
+ --background: var(--black);
+ --background-darker: var(--black);
--primary: #2bca2b;
- --outline-color: #2bca2b;
+ --outline-color: var(--primary);
--curve-factor: 0px;
--font-body: 'Cutive Mono', monospace;
--font-headings: 'VT323', monospace;
@@ -131,33 +136,34 @@ html[data-theme='blue-purple'] {
}
html[data-theme='hacker-girl'] {
- --background: #000;
- --background-darker: #000;
+ --background: var(--black);
+ --background-darker: var(--black);
--primary: #e435f1;
- --outline-color: #e435f1;
+ --outline-color: var(--primary);
--curve-factor: 0px;
--font-body: 'Cutive Mono', monospace;
--font-headings: 'VT323', monospace;
}
html[data-theme='high-contrast-light'] {
- --background: #fff;
- --background-darker: #fff;
- --item-group-background: #fff;
- --item-background: #fff;
- --primary: #000;
- --outline-color: #000;
+ --primary: var(--black);
+ --background: var(--white);
+ --background-darker: var(--white);
+ --item-group-background: var(--background-darker);
+ --item-background: var(--background);
+ --outline-color: var(--primary);
--curve-factor: 0px;
- --config-code-color: #000;
+ --config-code-color: var(--primary);
--font-headings: 'PTMono', 'Courier New', monospace;
}
html[data-theme='high-contrast-dark'] {
- --background: #000;
- --background-darker: #000;
- --item-group-background: #000;
- --primary: #fff;
- --outline-color: #fff;
+ --primary: var(--white);
+ --background: var(--black);
+ --background-darker: var(--black);
+ --item-group-background: var(--background-darker);
+ --item-background: var(--background);
+ --outline-color: var(--primary);
--curve-factor: 0px;
--font-headings: 'PTMono', 'Courier New', monospace;
}
@@ -189,38 +195,42 @@ html[data-theme='nord-frost'] {
html[data-theme='material-original'] {
--font-body: 'Roboto', serif;
--primary: #29B6F6;
- --settings-text-color: #01579b;
- --background: #e2e1e0;
+ --background: #f1f1f1;
--background-darker: #01579B;
- --settings-background: #01579B;
+ --settings-text-color: var(--background-darker);
+ --item-group-heading-text-color: var(--background-darker);
--item-group-shadow: none;
--item-group-outer-background: none;
--item-group-background: none;
- --item-background: #fff;
- --item-background-hover: #fff;
- --settings-background: #29B6F6;
- --search-container-background: #29B6F6;
+ --item-background: var(--white);
+ --item-background-hover: var(--white);
+ --settings-background: var(--primary);
+ --search-container-background: var(--primary);
--curve-factor: 2px;
--curve-factor-navbar: 0;
--item-group-padding: 5px 0 0;
+ --item-text-color: var(--background-darker);
--item-shadow: 0 1px 3px #0000001f, 0 1px 2px #0000003d;
--item-hover-shadow: 0 1px 4px #00000029, 0 2px 4px #0000002a;
--item-icon-transform: drop-shadow(1px 2px 1px var(--transparent-30)) saturate(0.65);
--item-icon-transform-hover: drop-shadow(1px 3px 2px var(--transparent-30)) saturate(2);
--settings-container-shadow: 0 1px 3px #0000005e, 0 1px 2px #00000085;
- --welcome-popup-background: #01579b;
+ --welcome-popup-background: var(--background-darker);
--welcome-popup-text-color: #ffffff;
- --config-code-color: #000;
- --item-group-heading-text-color-hover: #01579b;
- --config-settings-background: #01579b;
- --config-settings-color: #fff;
- --heading-text-color: #fff;
+ --config-code-color: var(--black);
+ --item-group-heading-text-color-hover: var(--background-darker);
+ --config-settings-background: var(--background-darker);
+ --config-settings-color: var(--white);
+ --interactive-editor-background: var(--background-darker);
+ --interactive-editor-color: var(--white);
+ --interactive-editor-background-darker: var(--primary);
+ --heading-text-color: var(--white);
--status-check-tooltip-background: #f2f2f2;
- --status-check-tooltip-color: #01579b;
+ --status-check-tooltip-color: var(--background-darker);
--description-tooltip-background: #f2f2f2;
- --description-tooltip-color: #01579b;
- --login-form-background: #fff;
- --about-page-accent: #000;
+ --description-tooltip-color: var(--background-darker);
+ --login-form-background: var(--white);
+ --about-page-accent: var(--black);
--about-page-color: var(--background-darker);
--about-page-background: var(--background);
--context-menu-background: var(--white);
@@ -233,21 +243,23 @@ html[data-theme='material-original'] {
html[data-theme='material-dark-original'] {
--primary: #08B0BB;
- --settings-text-color: #08B0BB;
--background: #39434C;
- --background-darker: #08B0BB;
+ --background-darker: var(--primary);
+ --material-dark: #131a1f;
+ --material-light: #41e2ed;
+ --settings-text-color: var(--primary);
--settings-background: #092b3a;
--item-group-background: #333C43;
--item-background: #414B55;
--item-background-hover: #414B55;
- --settings-background: #131a1f;
- --search-container-background: #131a1f;
- --search-field-background: #39434c;
- --heading-text-color: #131a1f;
- --nav-link-text-color: #08B0BB;
- --nav-link-background-color: #131a1f;
- --nav-link-text-color-hover: #08B0BB;
- --nav-link-background-color-hover: #131a1fc7;
+ --settings-background: var(--material-dark);
+ --search-container-background: var(--material-dark);
+ --search-field-background: var(--background);
+ --heading-text-color: var(--material-dark);
+ --nav-link-text-color: var(--primary);
+ --nav-link-background-color: var(--material-dark);
+ --nav-link-text-color-hover: var(--primary);
+ --nav-link-background-color-hover: var(--material-dark);
--nav-link-border-color-hover: transparent;
--curve-factor: 2px;
--curve-factor-navbar: 0;
@@ -256,22 +268,25 @@ html[data-theme='material-dark-original'] {
--item-hover-shadow: 4px 4px 3px #00000082, 0 1px 10px #00000040;
--item-icon-transform: drop-shadow(1px 2px 1px var(--transparent-30)) saturate(0.65);
--item-icon-transform-hover: drop-shadow(1px 3px 2px var(--transparent-30)) saturate(2);
- --welcome-popup-background: #131a1f;
+ --welcome-popup-background: var(--material-dark);
--welcome-popup-text-color: var(--primary);
- --config-settings-background: #131a1f;
- --config-settings-color: #41e2ed;
- --scroll-bar-color: #08B0BB;
- --scroll-bar-background: #131a1f;
- --status-check-tooltip-background: #131a1f;
- --status-check-tooltip-color: #08B0BB;
- --description-tooltip-background: #131a1f;
- --description-tooltip-color: #08B0BB;
+ --config-settings-background: var(--material-dark);
+ --config-settings-color: var(--material-light);
+ --interactive-editor-color: var(--material-light);
+ --interactive-editor-background: var(--material-dark);
+ --interactive-editor-background-darker: var(--material-dark);
+ --scroll-bar-color: var(--primary);
+ --scroll-bar-background: var(--material-dark);
+ --status-check-tooltip-background: var(--material-dark);
+ --status-check-tooltip-color: var(--primary);
+ --description-tooltip-background: var(--material-dark);
+ --description-tooltip-color: var(--primary);
&::-webkit-scrollbar-thumb {
- border-left: 1px solid #131a1f;
+ border-left: 1px solid var(--material-dark);
}
div.context-menu {
border: none;
- background: #131a1f;
+ background: var(--material-dark);
ul li:hover {
background: #333c43;
}
@@ -282,12 +297,15 @@ html[data-theme='colorful'] {
--font-headings: 'Podkova', monospace;
--primary: #e8eae1;
--background: #0b1021;
- --item-background: #05070e;
- --item-background-hover: #0b1021;
+ --background-darker: #05070e;
+ --item-background: var(--background-darker);
+ --item-background-hover: var(--background);
--item-group-background: transparent;
- --item-group-outer-background: #05070e;
- --item-group-heading-text-color: #e8eae1;
- --item-group-heading-text-color-hover: #fff;
+ --item-group-outer-background: var(--background-darker);
+ --item-group-heading-text-color: var(--primary);
+ --item-group-heading-text-color-hover: var(--primary);
+ --item-hover-shadow: 1px 4px 6px var(--black);
+ --nav-link-background-color: var(--background);
.item-wrapper:nth-child(1n) { .item { color: #eb5cad; border: 1px solid #eb5cad; } }
.item-wrapper:nth-child(2n) { .item { color: #985ceb; border: 1px solid #985ceb; } }
.item-wrapper:nth-child(3n) { .item { color: #5c90eb; border: 1px solid #5c90eb; } }
@@ -300,9 +318,12 @@ html[data-theme='colorful'] {
opacity: 0.85;
outline: none;
background: currentColor;
- span { color: #05070e; }
- svg path { fill: #05070e; }
- i.fas, i.fab, i.far, i.fal, i.fad { color: #05070e; }
+ span.text, p.description { color: var(--background-darker); }
+ i.fas, i.fab, i.far, i.fal, i.fad {
+ filter: drop-shadow(1px 3px 2px var(--transparent-50));
+ color: var(--background-darker);
+ }
+ svg path { fill: var(--background-darker); }
}
h1, h2, h3, h4 {
font-weight: normal;
@@ -354,6 +375,7 @@ html[data-theme='minimal-light'], html[data-theme='minimal-dark'], html[data-the
html[data-theme='material'], html[data-theme='material-dark'] {
--font-body: 'Raleway', serif;
--font-headings: 'Francois One', serif;
+ --footer-height: 140px;
--curve-factor: 4px;
--curve-factor-navbar: 8px;
--about-page-background: var(--background);
@@ -394,22 +416,21 @@ html[data-theme='material'], html[data-theme='material-dark'] {
white-space: pre-wrap;
font-size: .9em;
text-overflow: ellipsis;
+ min-height: 2rem;
}
}
- &.size-large {
- width: 18rem;
- min-width: 18rem;
- max-height: 5rem;
- margin: 0.4rem;
- img {
- padding: 0.2rem 0.5rem;
- }
- }
}
- .tooltip.item-description-tooltip {
+ .item-wrapper.add-new-item {
+ flex-grow: inherit;
+ }
+ .add-new-item a {
+ flex-grow: inherit;
+ flex-basis: inherit;
+ }
+ .tooltip.item-description-tooltip:not(.tooltip-is-small) {
display: none !important;
}
- .orientation-horizontal {
+ .orientation-horizontal:not(.single-section-view) {
display: flex;
flex-direction: column;
.there-are-items {
@@ -422,6 +443,11 @@ html[data-theme='material'], html[data-theme='material-dark'] {
@include big-screen { grid-template-columns: repeat(5, 1fr); }
@include big-screen-up { grid-template-columns: repeat(6, 1fr); }
}
+ .there-are-items .item-wrapper .item {
+ width: auto;
+ min-width: auto;
+ max-height: auto;
+ }
}
a.item {
position: relative;
@@ -470,15 +496,9 @@ html[data-theme='material'], html[data-theme='material-dark'] {
padding-left: 0.5rem;
min-width: 11rem;
}
- &.size-large {
- &:before {
- width: 1.5rem;
- }
- &:hover {
- div:nth-child(2) {
- text-indent: 1.5rem;
- }
- }
+ &.short:not(.size-large) {
+ min-height: 2rem;
+ height: auto;
}
}
}
@@ -490,31 +510,35 @@ html[data-theme='material'] {
--item-group-outer-background: none;
--item-group-shadow: none;
--item-group-background: none;
- --item-background: #fff;
- --item-background-hover: #fff;
+ --item-background: var(--white);
+ --item-background-hover: var(--white);
--item-shadow: 0 1px 3px #0000001f, 0 1px 2px #0000003d;
--item-hover-shadow: 0 1px 4px #00000029, 0 2px 4px #0000002a;
- --item-text-color: #363636;
- --item-group-heading-text-color-hover: #363636;
+ --item-text-color: var(--primary);
+ --item-group-heading-text-color-hover: var(--primary);
--item-icon-transform-hover: none;
--nav-link-background-color: #0c4eba;
- --nav-link-text-color: #fff;
+ --nav-link-text-color: var(--white);
--nav-link-border-color: #0c4eba;
- --settings-text-color: #363636;
- --config-code-color: #363636;
+ --settings-text-color: var(--primary);
+ --config-code-color: var(--primary);
--config-settings-background: #f5f5f5;
--config-settings-color: #473f3f;
- --heading-text-color: #fff;
+ --interactive-editor-color: #473f3f;
+ --interactive-editor-background: #f5f5f5;
+ --interactive-editor-background-darker: var(--white);
+ --heading-text-color: var(--white);
--curve-factor: 3px;
--curve-factor-navbar: 8px;
--search-container-background: #4285f4;
--welcome-popup-text-color: #f5f5f5;
--footer-text-color: #f5f5f5cc;
// --login-form-background-secondary: #f5f5f5cc;
+ --context-menu-background: var(--white);
--context-menu-secondary-color: #f5f5f5;
--transparent-white-50: #00000080;
- --status-check-tooltip-background: #fff;
- --description-tooltip-background: #fff;
+ --status-check-tooltip-background: var(--white);
+ --description-tooltip-background: var(--white);
--description-tooltip-color: #473f3f;
--side-bar-background-lighter: #0c4eba;
--side-bar-item-background: #f5f5f5;
@@ -524,10 +548,10 @@ html[data-theme='material'] {
--minimal-view-settings-color: var(--primary);
--minimal-view-section-heading-color: var(--primary);
--minimal-view-section-heading-background: #f6f6f6;
- --minimal-view-search-background: #fff;
+ --minimal-view-search-background: var(--white);
--minimal-view-search-color: var(--primary);
--minimal-view-group-color: var(--primary);
- --minimal-view-group-background: #fff;
+ --minimal-view-group-background: var(--white);
.minimal-section-inner.selected, div.minimal-section-heading {
border: none;
@@ -549,17 +573,17 @@ html[data-theme='material'] {
header {
background: #4285f4;
- color: #fff;
+ color: var(--white);
.page-titles span.subtitle {
text-shadow: none;
}
}
footer {
opacity: 1;
- color: #fff;
+ color: var(--white);
}
section.filter-container form label {
- color: #fff;
+ color: var(--white);
}
.prism-editor-wrapper {
background: #f5f5f5;
@@ -567,11 +591,6 @@ html[data-theme='material'] {
.item:focus {
outline-color: #4285f4cc;
}
- div.context-menu {
- border: none;
- background: var(--white);
- ul li:hover { svg path { fill: var(--background-darker); }}
- }
}
html[data-theme='material-dark'] {
@@ -612,13 +631,16 @@ html[data-theme='material-dark'] {
--description-tooltip-color: #e0e0e0;
--curve-factor: 2px;
--curve-factor-navbar: 0;
-
--side-bar-background: #131a1f;
-
--welcome-popup-background: #131a1f;
--welcome-popup-text-color: var(--primary);
+
--config-settings-background: #131a1f;
--config-settings-color: #41e2ed;
+ --interactive-editor-background: #242a2f;
+ --interactive-editor-background-darker: #131a1f;
+ --interactive-editor-color: #41e2ed;
+
--scroll-bar-color: #08B0BB;
--scroll-bar-background: #131a1f;
// --login-form-color: #131a1f;
@@ -633,6 +655,7 @@ html[data-theme='material-dark'] {
// --minimal-view-search-color: var(--primary);
// --minimal-view-group-color: var(--primary);
--minimal-view-group-background: #131a1f;
+ --context-menu-secondary-color: #131a1f;
div.minimal-section-heading h3, div.minimal-section-heading.selected h3 {
color: #d5d5d5;
@@ -651,13 +674,6 @@ html[data-theme='material-dark'] {
background: #131a1f !important;
}
}
- div.context-menu {
- border: none;
- background: var(--background);
- ul li:hover {
- background: #131a1f;
- }
- }
}
html[data-theme='minimal-light'] {
@@ -671,28 +687,28 @@ html[data-theme='minimal-light'] {
--item-background-hover: #f2f2f2;
--item-shadow: none;
--item-hover-shadow: none;
- --item-text-color: #101931;
- --item-group-heading-text-color-hover: #101931;
- --settings-text-color: #101931;
- --config-code-color: #101931;
+ --item-text-color: var(--background-darker);
+ --item-group-heading-text-color-hover: var(--background-darker);
+ --settings-text-color: var(--background-darker);
+ --config-code-color: var(--background-darker);
--nav-link-background-color: none;
- --search-container-background: #fff;
+ --search-container-background: var(--white);
--curve-factor: 4px;
--curve-factor-navbar: 8px;
--status-check-tooltip-background: #f2f2f2;
- --status-check-tooltip-color: #000;
+ --status-check-tooltip-color: var(--black);
--description-tooltip-background: #f2f2f2;
- --description-tooltip-color: #000;
- --login-form-color: #101931;
+ --description-tooltip-color: var(--black);
+ --login-form-color: var(--background-darker);
--about-page-background: var(--background);
--about-page-color: var(--background-darker);
--context-menu-color: var(--background-darker);
--context-menu-secondary-color: var(--primary);
section.filter-container {
- background: #fff;
+ background: var(--white);
border-bottom: 1px dashed #00000038;
input#filter-tiles {
- border: 1px solid #101931;
+ border: 1px solid var(--background-darker);
}
}
}
@@ -705,18 +721,18 @@ html[data-theme='minimal-dark'] {
--item-group-shadow: none;
--item-group-background: none;
--item-background: none;
- --item-background-hover: #090b0e;
+ --item-background-hover: var(--background-darker);
--item-shadow: none;
--item-hover-shadow: none;
- --item-text-color: #fff;
- --item-group-heading-text-color-hover: #fff;
- --settings-text-color: #fff;
- --config-code-color: #fff;
+ --item-text-color: var(--white);
+ --item-group-heading-text-color-hover: var(--white);
+ --settings-text-color: var(--white);
+ --config-code-color: var(--white);
--nav-link-background-color: none;
- --search-container-background: #14171e;
+ --search-container-background: var(--background);
--curve-factor: 4px;
--curve-factor-navbar: 8px;
- --item-group-heading-text-color: #fff;
+ --item-group-heading-text-color: var(--white);
--item-group-heading-text-color-hover: #ffffffbf;
--about-page-background: var(--background);
--about-page-color: var(--primary);
@@ -729,7 +745,7 @@ html[data-theme='minimal-dark'] {
background: #14171e;
border-bottom: 1px dashed #ffffff38;
input#filter-tiles {
- border: 1px solid #fff;
+ border: 1px solid var(--white);
}
}
@@ -741,29 +757,26 @@ html[data-theme='minimal-dark'] {
html[data-theme='vaporware'] {
--primary: #09bfe6;
--background: #100e2c;
- --background-darker: #6c27ea;
- --background-darker: linear-gradient(0deg, rgba(108,39,234,1) 0%, rgba(132,76,235,1) 80%);
- --settings-text-color: #6c27ea;
+ --background-darker: #7b2af1;
+ --settings-text-color: #8d51fc;
--item-group-outer-background: #096de6;
--item-group-outer-background: var(--primary);
- --item-group-background: #190e2c;
- --item-group-heading-text-color: #190e2c;
- --item-group-heading-text-color-hover: #5118b9;
+ --item-group-background: var(--background);
+ --item-group-heading-text-color: var(--background);
+ --item-group-heading-text-color-hover: var(--background-darker);
--item-text-color: var(--primary);
--item-background: #1a174d;
- --item-background-hover: #2b2670;
+ --item-background-hover: var(--background);;
--footer-text-color: var(--white);
--item-shadow: none;
--curve-factor: 2px;
--curve-factor-navbar: 6px;
- --login-form-color: #09bfe6;
- --config-settings-background: #100e2c;
- --status-check-tooltip-background: #100e2c;
- --description-tooltip-background: #100e2c;
-
- .home {
- background: linear-gradient(180deg, rgba(16,14,44,1) 10%, rgba(27,24,79,1) 40%, rgba(16,14,44,1) 100%);
- }
+ --login-form-color: var(--primary);
+ --config-settings-background: var(--background);
+ --status-check-tooltip-background: var(--background);
+ --description-tooltip-background: var(--background);
+ --heading-text-color: var(--background);
+ --search-label-color: var(--background);
div.item-group-container {
gap: 0.3rem;
@@ -808,16 +821,105 @@ html[data-theme='vaporware'] {
background: url('https://i.ibb.co/JqcJcGK/vaporwave-sunset-wallpaper.jpg');
background-size: cover;
}
- // body {
- // background: url('https://i.ibb.co/JqcJcGK/vaporwave-sunset-wallpaper.jpg');
- // background-size: cover;
- // div.home, div.options-outer, div.options-container, section.filter-container {
- // background: none;
- // }
- // }
+ body {
+ background: url('https://i.ibb.co/JqcJcGK/vaporwave-sunset-wallpaper.jpg');
+ background-size: cover;
+ background-repeat:no-repeat;
+ background-position: center center;
+ // Remove background from certain components
+ div.home, div.options-outer, div.options-container, section.filter-container,
+ section.settings-outer, div.show-hide-container.hide-btn, div.show-hide-container.show-btn {
+ background: none;
+ }
+ }
}
-html[data-theme='cyberpunk'] {
+html[data-theme='glow'], html[data-theme=glow-colorful] {
+ --primary: #5c6da9;
+ --background: #f6f6f6;
+ --background-darker: var(--white);
+ --curve-factor: 12px;
+ --item-group-background: var(--white);
+ --item-group-outer-background: var(--white);
+ --item-background: var(--white);
+ --font-headings: 'Sniglet', cursive;
+
+ --item-group-heading-text-color: var(--primary);
+ --item-group-heading-text-color-hover: var(--primary);
+ --item-group-shadow: 0 5px 16px 0 #9f72ff33;
+ --item-background-hover: var(--white);
+ --item-shadow: 0 1px 5px 0 #8656ef80;
+ --item-hover-shadow: 0 1px 8px 0 #8656efa6;
+ --item-icon-transform: drop-shadow(1px 2px 3px var(--transparent-50)) saturate(0.95);
+ --item-icon-transform-hover: drop-shadow(1px 2px 4px var(--transparent-50)) saturate(0.95);
+ --footer-height: 120px;
+ --transparent-50: #cfcfcf80;
+ header {
+ padding: 0.5rem;
+ .page-titles{
+ h1 {
+ font-size: 1.8rem;
+ }
+ span.subtitle {
+ font-size: 0.8rem;
+ text-shadow: none;
+
+ }
+ }
+ .nav .nav-item {
+ padding: 0.2rem 0.4rem;
+ box-shadow: none;
+ }
+ }
+ .settings-outer {
+ box-shadow: 0 4px 5px 0 #8656ef1a;
+ .options-container {
+ padding: 0.25rem 1.5rem 0.25rem 1rem;
+ background: var(--background-darker);
+ }
+ }
+ footer {
+ box-shadow: 0 -4px 5px 0 #8656ef1a;
+ }
+ .search-wrap input {
+ box-shadow: 0 1px 5px 0 #8656ef80;
+ }
+ div.collapsable:nth-child(1n) {
+ a.item { color: #5213dc; }
+ --item-group-shadow: 0 5px 16px 0 #9f72ff33;
+ --item-group-heading-text-color: #8656ef;
+ --item-group-heading-text-color-hover: #783cfb;
+ --item-background-hover: var(--white);
+ --item-shadow: 0 1px 5px 0 #8656ef80;
+ --item-hover-shadow: 0 1px 8px 0 #8656efa6;
+ --item-icon-transform: drop-shadow(1px 2px 3px #8656ef80) saturate(0.95);
+ --item-icon-transform-hover: drop-shadow(1px 2px 4px #8656ef80) saturate(0.95);
+ }
+ div.collapsable:nth-child(2n) {
+ a.item { color: #b514d8; }
+ --item-group-shadow: 0 5px 16px 0 #728cff33;
+ --item-group-heading-text-color: #d356ef;
+ --item-group-heading-text-color-hover: #d73bf9;
+ --item-background-hover: var(--white);
+ --item-shadow: 0 1px 5px 0 #d356ef80;
+ --item-hover-shadow: 0 1px 8px 0 #d356efa6;
+ --item-icon-transform: drop-shadow(1px 2px 3px #d356ef80) saturate(0.95);
+ --item-icon-transform-hover: drop-shadow(1px 2px 4px #d356ef80) saturate(0.95);
+ }
+ div.collapsable:nth-child(3n) {
+ a.item { color: #07b9d0; }
+ --item-group-shadow: 0 5px 16px 0 #728cff33;
+ --item-group-heading-text-color: #56ddef;
+ --item-group-heading-text-color-hover: #3cdefb;
+ --item-background-hover: var(--white);
+ --item-shadow: 0 1px 5px 0 #56ddef80;
+ --item-hover-shadow: 0 1px 8px 0 #56ddefa6;
+ --item-icon-transform: drop-shadow(1px 2px 3px #56ddef80) saturate(0.95);
+ --item-icon-transform-hover: drop-shadow(1px 2px 4px #56ddef80) saturate(0.95);
+ }
+}
+
+ html[data-theme='cyberpunk'] {
--pink: #ff2a6d;
--pale: #d1f7ff;
--aqua: #05d9e8;
@@ -834,6 +936,9 @@ html[data-theme='cyberpunk'] {
--nav-link-border-color-hover: var(--blue);
--config-settings-background: var(--blue);
--config-settings-color: var(--pink);
+--interactive-editor-background: var(--blue);
+--interactive-editor-background-darker: var(--blue);
+--interactive-editor-color: var(--pink);
--search-label-color: var(--blue);
--item-group-background: var(--blue);
--item-text-color: var(--pale);
@@ -883,23 +988,32 @@ html[data-theme="oblivion-scotch"] {
}
html[data-theme="dashy-docs"] {
+ // Base
--primary: #f5f6f7;
--background: #202020;
--background-darker: #121212;
- --item-group-background: none;
- --item-group-outer-background: #121212;
- --item-group-heading-text-color: var(--background);
- --item-group-heading-text-color-hover: var(--background);
+ // Items
--item-background: var(--background);
--item-background-hover: var(--background);
--item-text-color: var(--primary);
- --minimal-view-section-heading-color: var(--background);
+ // Sections
+ --item-group-background: none;
+ --item-group-outer-background: var(--background-darker);
+ --item-group-heading-text-color: var(--background);
+ --item-group-heading-text-color-hover: var(--background);
+ // Misc
--item-group-padding: 0;
--curve-factor: 3px;
--curve-factor-navbar: 6px;
--item-shadow: 4px 4px 6px #00000080, -2px -2px 4px rgb(0 0 0 / 40%);
--item-group-shadow: 0px 3px 2px #222222, 0px 0px 2px #3e3e3e;
--font-headings: 'PTMono', 'Courier New', monospace;
+ --minimal-view-section-heading-color: var(--background);
+ // Navbar Links
+ --nav-link-background-color-hover: none;
+ --nav-link-border-color-hover: none;
+ --nav-link-text-color: var(--background);
+ --nav-link-text-color-hover: var(--background-darker);
footer {
box-shadow: 0 -3px 4px #010101;
@@ -913,27 +1027,34 @@ html[data-theme="dashy-docs"] {
background: $first; box-shadow: 0 4px $second;
&:hover { box-shadow: 0 2px $second; }
}
-
// Section headings, nav bar items and minimal tabs
div.collapsable:nth-child(1n) label.lbl-toggle,
.minimal-section-heading:nth-child(1n),
a.nav-item:nth-child(1n) {
@include make-colors(#db78fc, #b83ddd);
+ --nav-link-background-color-hover: #db78fc;
+ --nav-link-border-color-hover: #db78fc;
}
div.collapsable:nth-child(2n) label.lbl-toggle,
.minimal-section-heading:nth-child(2n),
a.nav-item:nth-child(2n) {
@include make-colors(#5c85f7, #3d48dd);
+ --nav-link-background-color-hover: #5c85f7;
+ --nav-link-border-color-hover: #5c85f7;
}
div.collapsable:nth-child(3n) label.lbl-toggle,
.minimal-section-heading:nth-child(3n),
a.nav-item:nth-child(3n) {
@include make-colors(#41ef90, #1e9554);
+ --nav-link-background-color-hover: #41ef90;
+ --nav-link-border-color-hover: #41ef90;
}
div.collapsable:nth-child(4n) label.lbl-toggle,
.minimal-section-heading:nth-child(4n),
a.nav-item:nth-child(4n) {
@include make-colors(#dcff5a, #ceb73f);
+ --nav-link-background-color-hover: #dcff5a;
+ --nav-link-border-color-hover: #dcff5a;
}
nav.side-bar {
@@ -981,10 +1102,10 @@ html[data-theme="dashy-docs"] {
color: var(--background);
font-weight: bold;
svg path { fill: var(--background); }
- &:nth-child(1n) { @include make-colors(#db78fc, #b83ddd); }
- &:nth-child(2n) { @include make-colors(#41ef90, #1e9554); }
- &:nth-child(3n) { @include make-colors(#5c85f7, #3d48dd); }
- &:nth-child(4n) { @include make-colors(#dcff5a, #ceb73f); }
+ &:nth-child(4n + 1) { @include make-colors(#db78fc, #b83ddd); }
+ &:nth-child(4n + 2) { @include make-colors(#41ef90, #1e9554); }
+ &:nth-child(4n + 3) { @include make-colors(#5c85f7, #3d48dd); }
+ &:nth-child(4n + 4) { @include make-colors(#dcff5a, #ceb73f); }
}
}
@@ -1004,6 +1125,160 @@ html[data-theme="dashy-docs"] {
}
}
+html[data-theme="adventure"] {
+ // Main colors
+ --primary: #ffffffe6;
+ --background: #0b1021;
+ --background-darker: #181c3a;
+ // Typography
+ --font-headings: 'Podkova', 'Roboto', serif;
+ --font-body: 'Roboto', serif;
+ // Items
+ --item-background: #181c3a80;
+ --item-background-hover: #181c3a99;
+ --item-shadow: 1px 1px 2px #130f23;
+ --item-hover-shadow: 2px 2px 4px #130f23;
+ // Sections
+ --item-group-heading-text-color: var(--white);
+ --item-group-heading-text-color-hover: var(--primary);
+ --item-group-shadow: none;
+ --item-group-background: none;
+ --item-group-outer-background: none;
+ // Background Image
+ body {
+ background: url('https://i.ibb.co/wdqSsGh/adventure-bg.jpg');
+ background-size: cover;
+ }
+ // Remove background from certain components
+ div.home, div.options-outer, div.options-container, section.filter-container,
+ section.settings-outer, div.show-hide-container.hide-btn, div.show-hide-container.show-btn {
+ background: none;
+ }
+ // Style overides
+ label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; }
+ .content-inner { border-top: 1px dashed var(--primary); }
+ a.item.size-large:hover { border-left: 3px solid var(--white); }
+ .item.size-large .tile-title p.description { height: 3rem; }
+ .is-collapsed {
+ background: var(--item-background);
+ box-shadow: var(--item-shadow);
+ &:hover {
+ background: var(--item-background-hover);
+ box-shadow: var(--item-hover-shadow);
+ }
+ }
+}
+
+html[data-theme="color-block"] {
+ // Main colors
+ --primary: #E94560;
+ --background: #16213E;
+ --background-darker: #0e172b;
+ // Typography
+ --font-headings: 'Podkova', 'Roboto', serif;
+ --font-body: 'Roboto', serif;
+ // Items
+ --item-background: #1b294c;
+ --item-background-hover: var(--item-background);
+ --item-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black);
+ --item-hover-shadow: 6px 6px 0px var(--background-darker), -5px 0px 0px var(--primary), 2px 2px 9px var(--black);
+ // Sections
+ --item-group-heading-text-color: var(--white);
+ --item-group-heading-text-color-hover: var(--primary);
+ --item-group-shadow: none;
+ --item-group-background: none;
+ --item-group-outer-background: none;
+ // Nav Links
+ --nav-link-background-color: var(--background);
+ --nav-link-background-color-hover: var(--background);
+ --nav-link-border-color: transparent;
+ --nav-link-border-color-hover: transparent;
+ --nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black);
+ --nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black);
+ // Misc
+ --curve-factor: 4px;
+ --curve-factor-navbar: 8px;
+
+ // Style overrides
+ label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; }
+ .content-inner { border-top: 1px dashed var(--primary); }
+ .item.size-large .tile-title p.description { height: 3rem; }
+ .item, .nav-outer nav .nav-item { border-radius: 0; }
+ .item.size-large { margin: 0.5rem; }
+ // Show outline when collapsed
+ .is-collapsed {
+ background: var(--item-background);
+ box-shadow: var(--item-shadow);
+ &:hover {
+ background: var(--item-background-hover);
+ box-shadow: var(--item-hover-shadow);
+ }
+ }
+}
+
+html[data-theme="one-dark"] {
+
+ // Main colors
+ --primary: #c5cad3;
+ --background: #282c33;
+ --background-darker: #1c1f23;
+ // Typography
+ --font-headings: 'Podkova', 'Roboto', serif;
+ --font-body: 'Roboto', serif;
+ // Items
+ --item-background: var(--background-darker);
+ --item-background-hover: var(--item-background);
+ --item-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black);
+ --item-hover-shadow: 6px 6px 0px var(--background-darker), -5px 0px 0px var(--primary), 2px 2px 9px var(--black);
+ // Sections
+ --item-group-heading-text-color: var(--white);
+ --item-group-heading-text-color-hover: var(--primary);
+ --item-group-shadow: none;
+ --item-group-background: none;
+ --item-group-outer-background: none;
+ // Nav Links
+ --nav-link-background-color: var(--background);
+ --nav-link-background-color-hover: var(--background);
+ --nav-link-border-color: transparent;
+ --nav-link-border-color-hover: transparent;
+ --nav-link-shadow: 4px 4px 0px var(--background-darker), -3px 0px 0px var(--primary), 2px 2px 6px var(--black);
+ --nav-link-shadow-hover: 6px 6px 0px var(--background-darker), -4px 0px 0px var(--primary), 2px 2px 9px var(--black);
+ // Misc
+ --curve-factor: 4px;
+ --curve-factor-navbar: 6px;
+
+ // Style overrides
+ label.lbl-toggle h3 { font-size: 1.3rem; font-weight: bold; }
+ .content-inner { border-top: 1px dashed var(--primary); }
+ .item.size-large .tile-title p.description { height: 3rem; }
+ .item, .nav-outer nav .nav-item { border-radius: 0; }
+ .item.size-large { margin: 0.5rem; }
+ // Show outline when collapsed
+ .is-collapsed {
+ background: var(--item-background);
+ box-shadow: var(--item-shadow);
+ &:hover {
+ background: var(--item-background-hover);
+ box-shadow: var(--item-hover-shadow);
+ }
+ }
+ // Colored Item Accents
+ .item-wrapper:nth-child(1n) { --current: #e06b74; }
+ .item-wrapper:nth-child(2n) { --current: #98c379; }
+ .item-wrapper:nth-child(3n) { --current: #e5c07a; }
+ .item-wrapper:nth-child(4n) { --current: #62aeef; }
+ .item-wrapper:nth-child(5n) { --current: #c678dd; }
+ .item-wrapper:nth-child(6n) { --current: #55b6c2; }
+ .item-wrapper .item {
+ color: var(--current);
+ box-shadow: -3px 0px 0px var(--current), 1px 1px 3px #000000e6;
+ &:hover {
+ box-shadow: -5px 0px 0px var(--current), 2px 2px 3px #000000e6;
+ }
+ }
+}
+
+
html[data-theme="oblivion-blue"] {
--primary: #82a5f3;
}
diff --git a/src/styles/dimensions.scss b/src/styles/dimensions.scss
index 1bd7267d..739b17d0 100644
--- a/src/styles/dimensions.scss
+++ b/src/styles/dimensions.scss
@@ -10,7 +10,7 @@
/* Basic Page Components */
--scroll-bar-width: 8px;
--header-height: 6.3rem;
- --footer-height: 125px;
+ --footer-height: 128px;
/* Section & Item dimensions */
--item-group-padding: 5px; // Determines width of item-group outline
diff --git a/src/styles/global-styles.scss b/src/styles/global-styles.scss
index a5b170b2..710e78ad 100644
--- a/src/styles/global-styles.scss
+++ b/src/styles/global-styles.scss
@@ -154,7 +154,6 @@ html {
margin: var(--tooltip-arrow-size) 0;
}
}
-
&[aria-hidden='true'] {
visibility: hidden;
opacity: 0;
@@ -165,4 +164,5 @@ html {
opacity: 1;
transition: opacity .15s;
}
+ &.in-modal-tt { z-index: 999; }
}
diff --git a/src/styles/schema-editor.scss b/src/styles/schema-editor.scss
new file mode 100644
index 00000000..49ce3ddd
--- /dev/null
+++ b/src/styles/schema-editor.scss
@@ -0,0 +1,101 @@
+/* Form elements in the auto-schema form */
+.schema-form {
+ fieldset {
+ border: none;
+ display: flex;
+ flex-direction: column;
+ > div {
+ border-bottom: 1px dashed var(--interactive-editor-color);
+ margin: 0.5rem 0;
+ label {
+ font-size: 1rem;
+ text-decoration: underline;
+ }
+ }
+ div[data-fs-wrapper] {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: flex-start;
+ flex-direction: row-reverse;
+ justify-content: space-between;
+ padding: 0.5rem 0;
+ @include tablet-down {
+ flex-direction: column-reverse;
+ }
+ span {
+ font-style: italic;
+ margin-right: 0.5rem;
+ max-width: 20rem;
+ opacity: var(--dimming-factor);
+ }
+ input {
+ min-width: 15rem;
+ padding: 0.5rem 0.75rem;
+ margin: 0.5rem auto;
+ font-size: 1rem;
+ box-sizing: border-box;
+ color: var(--interactive-editor-color);
+ background: var(--interactive-editor-background);
+ border: 1px solid var(--interactive-editor-color);
+ border-radius: var(--curve-factor);
+ &[type=text]:focus, &[type=number]:focus {
+ box-shadow: 1px 1px 6px var(--interactive-editor-color);
+ outline: none;
+ }
+ }
+ input[type=checkbox] {
+ width: 1.2rem;
+ height: 1.2rem;
+ cursor: pointer;
+ }
+ input[type=radio] {
+ width: 1rem;
+ height: 1rem;
+ cursor: pointer;
+ }
+ div[data-fs-input=object], div[data-fs-input=array] {
+ width: 100%;
+ padding-left: 0.5rem;
+ border-left: 1px dashed var(--interactive-editor-color);
+ }
+ div[data-fs-kind="radio"] {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ label {
+ text-decoration: none;
+ text-transform: capitalize;
+ }
+ }
+ select {
+ width: 15rem;
+ height: 2rem;
+ padding: 0.2rem;
+ font-size: 1rem;
+ color: var(--interactive-editor-color);
+ background: var(--interactive-editor-background);
+ border: 1px solid var(--interactive-editor-color);
+ border-radius: var(--curve-factor);
+ &:focus {
+ box-shadow: 1px 1px 6px var(--interactive-editor-color);
+ }
+ }
+ div[data-fs-input=array] button {
+ font-size: 1rem;
+ margin: 0.25rem;
+ border-radius: var(--curve-factor);
+ color: var(--interactive-editor-color);
+ background: var(--interactive-editor-background);
+ border: 1px solid var(--interactive-editor-color);
+ &:hover {
+ color: var(--interactive-editor-background);
+ background: var(--interactive-editor-color);
+ }
+ &:focus {
+ box-shadow: 1px 1px 6px var(--interactive-editor-color);
+ }
+ }
+ }
+ }
+}
diff --git a/src/styles/style-helpers.scss b/src/styles/style-helpers.scss
index 7bac6d6d..6b73c9bc 100644
--- a/src/styles/style-helpers.scss
+++ b/src/styles/style-helpers.scss
@@ -1,3 +1,4 @@
+@import '@/styles/media-queries.scss';
/* Fancy scrollbar */
.scroll-bar {
@@ -34,6 +35,15 @@
background: var(--settings-text-color);
path { fill: var(--background); }
}
+ &.disabled {
+ opacity: var(--dimming-factor);
+ cursor: not-allowed;
+ &:hover {
+ border: 1px solid currentColor;
+ background: var(--background);
+ path { fill: var(--settings-text-color); }
+ }
+ }
}
}
@@ -49,7 +59,6 @@
}
}
-
/* Single-style helpers */
.bold { font-weight: bold; }
.light { font-weight: lighter; }
diff --git a/src/styles/typography.scss b/src/styles/typography.scss
index 1888a754..91133b76 100644
--- a/src/styles/typography.scss
+++ b/src/styles/typography.scss
@@ -38,7 +38,6 @@ html {
/* Monospace, for code and raw data output */
code, pre, pre *, .jsoneditor *, .mono * {
- font-family: var(--font-monospace);
font-weight: normal;
}
}
diff --git a/src/utils/Auth.js b/src/utils/Auth.js
index 49cc5ae2..a1ac8c90 100644
--- a/src/utils/Auth.js
+++ b/src/utils/Auth.js
@@ -16,9 +16,7 @@ const getAppConfig = () => {
* Support for old user structure will be removed in V 1.7.0
*/
const printWarning = () => {
- const msg = 'From V 1.6.5 onwards, the structure of the users object has changed.';
- // eslint-disable-next-line no-console
- console.warn(msg);
+ ErrorHandler('From V 1.6.5 onwards, the structure of the users object has changed.');
};
/* Returns true if keycloak is enabled */
@@ -48,7 +46,7 @@ const getUsers = () => {
// Check if the user is still using previous schema type
if (Array.isArray(auth)) {
printWarning(); // Print warning message
- return auth; // Let the user proceed anyway, will remove in V 1.7.0
+ return []; // Support for old data structure now removed
}
// Otherwise, return the users array, if available
return auth.users || [];
@@ -97,12 +95,7 @@ export const isAuthEnabled = () => {
/* Returns true if guest access is enabled */
export const isGuestAccessEnabled = () => {
const appConfig = getAppConfig();
- if (appConfig.enableGuestAccess) {
- // User is still using the old auth method
- printWarning();
- return true;
- }
- if (appConfig.auth && !Array.isArray(appConfig.auth)) {
+ if (appConfig.auth && typeof appConfig.auth === 'object') {
return appConfig.auth.enableGuestAccess || false;
}
return false;
diff --git a/src/utils/ConfigAccumalator.js b/src/utils/ConfigAccumalator.js
index 594cda79..041306e9 100644
--- a/src/utils/ConfigAccumalator.js
+++ b/src/utils/ConfigAccumalator.js
@@ -11,9 +11,9 @@ import {
pageInfo as defaultPageInfo,
iconSize as defaultIconSize,
layout as defaultLayout,
- // language as defaultLanguage,
} from '@/utils/defaults';
-
+import ErrorHandler from '@/utils/ErrorHandler';
+import { applyItemId } from '@/utils/MiscHelpers';
import conf from '../../public/conf.yml';
export default class ConfigAccumulator {
@@ -46,42 +46,36 @@ export default class ConfigAccumulator {
/* Page Info */
pageInfo() {
- const defaults = defaultPageInfo;
- let localPageInfo;
- try {
- localPageInfo = JSON.parse(localStorage[localStorageKeys.PAGE_INFO]);
- } catch (e) {
- localPageInfo = {};
+ let localPageInfo = {};
+ if (localStorage[localStorageKeys.PAGE_INFO]) {
+ // eslint-disable-next-line brace-style
+ try { localPageInfo = JSON.parse(localStorage[localStorageKeys.PAGE_INFO]); }
+ catch (e) { ErrorHandler('Malformed pageInfo data in local storage'); }
}
- let filePageInfo = {};
- if (this.conf) {
- filePageInfo = this.conf.pageInfo || {};
- }
- const pi = filePageInfo || defaults; // The page info object to return
- pi.title = localPageInfo.title || filePageInfo.title || defaults.title;
- pi.logo = localPageInfo.logo || filePageInfo.logo || defaults.logo;
- pi.description = localPageInfo.description || filePageInfo.description || defaults.description;
- pi.navLinks = localPageInfo.navLinks || filePageInfo.navLinks || defaults.navLinks;
- pi.footerText = localPageInfo.footerText || filePageInfo.footerText || defaults.footerText;
- return pi;
+ const filePageInfo = this.conf ? this.conf.pageInfo || {} : {};
+ return { ...defaultPageInfo, ...filePageInfo, ...localPageInfo };
}
/* Sections */
sections() {
+ let sections = [];
// If the user has stored sections in local storage, return those
const localSections = localStorage[localStorageKeys.CONF_SECTIONS];
if (localSections) {
try {
const json = JSON.parse(localSections);
- if (json.length >= 1) return json;
+ if (json.length >= 1) sections = json;
} catch (e) {
- // The data in local storage has been malformed, will return conf.sections instead
+ ErrorHandler('Malformed section data in local storage');
}
}
- // If the function hasn't yet returned, then return the config file sections
- let sectionsFile = [];
- if (this.conf) sectionsFile = this.conf.sections || [];
- return sectionsFile;
+ // If sections were not set from local data, then use config file instead
+ if (sections.length === 0) {
+ sections = this.conf ? this.conf.sections || [] : [];
+ }
+ // Apply a unique ID to each item
+ sections = applyItemId(sections);
+ return sections;
}
/* Complete config */
diff --git a/src/utils/ConfigHelpers.js b/src/utils/ConfigHelpers.js
index d8ce987f..974f9935 100644
--- a/src/utils/ConfigHelpers.js
+++ b/src/utils/ConfigHelpers.js
@@ -7,6 +7,8 @@ import {
theme as defaultTheme,
language as defaultLanguage,
} from '@/utils/defaults';
+import ErrorHandler from '@/utils/ErrorHandler';
+import ConfigSchema from '@/utils/ConfigSchema.json';
/**
* Initiates the Accumulator class and generates a complete config object
@@ -97,3 +99,17 @@ export const getUsersLanguage = () => {
const langObj = languages.find(lang => lang.code === langCode);
return langObj;
};
+
+/**
+ * validator for item target attribute
+ * Uses enum values from config schema, and shows warning if invalid
+ * @param {String} target
+ * @returns {Boolean} isValid
+ */
+export const targetValidator = (target) => {
+ const acceptedTargets = ConfigSchema.properties.sections.items
+ .properties.items.items.properties.target.enum;
+ const isTargetValid = acceptedTargets.indexOf(target) !== -1;
+ if (!isTargetValid) ErrorHandler(`Unknown target value: ${target}`);
+ return isTargetValid;
+};
diff --git a/src/utils/ConfigSchema.json b/src/utils/ConfigSchema.json
index acd9e10d..ccab89f9 100644
--- a/src/utils/ConfigSchema.json
+++ b/src/utils/ConfigSchema.json
@@ -9,16 +9,19 @@
"type": "object",
"properties": {
"title": {
+ "title": "Title",
"type": "string",
"description": "Title and heading for the app"
},
"description": {
+ "title": "Description",
"type": "string",
"description": "Sub-title, displayed in header"
},
"navLinks": {
"type": "array",
"maxItems": 6,
+ "title": "Navigation Links",
"description": "Quick access links, displayed in header",
"items": {
"type": "object",
@@ -38,12 +41,15 @@
}
},
"footerText": {
+ "title": "Footer Text",
+ "description": "Content to display within the global page footer",
"type": "string"
},
"logo": {
+ "title": "App Logo",
"type": "string",
"description": "Path to an optional image asset, to be displayed in the header",
- "pattern": "^(http|/)",
+ "pattern": "^(http|/)(.*?)",
"examples": [
"/web-icons/dashy-logo.png",
"https://i.ibb.co/yhbt6CY/dashy.png"
@@ -57,17 +63,10 @@
},
"appConfig": {
"type": "object",
- "description": "Application configuration",
"properties": {
- "backgroundImg": {
- "type": "string",
- "description": "A URL to an image asset to be displayed as background"
- },
- "language": {
- "type": "string",
- "description": "The ISO code of your desired language, must have translations present, check docs for more info"
- },
"startingView": {
+ "title": "Starting View",
+ "type": "string",
"enum": [
"default",
"minimal",
@@ -76,7 +75,39 @@
"default": "default",
"description": "Which page to load by default, and on the base page or domain root. You can still switch to different views from within the UI"
},
+ "defaultOpeningMethod": {
+ "title": "Default Opening Method",
+ "type": "string",
+ "enum": [
+ "newtab",
+ "sametab",
+ "parent",
+ "top",
+ "modal",
+ "workspace"
+ ],
+ "default": "newtab",
+ "description": "The default opening method for items. Only used if no item.target is specified"
+ },
+ "statusCheck": {
+ "title": "Enable Status Checks",
+ "type": "boolean",
+ "default": false,
+ "description": "Displays an online/ offline status for each of your services"
+ },
+ "statusCheckInterval": {
+ "title": "Status Check Interval",
+ "type": "number",
+ "default": 0,
+ "description": "How often to recheck statuses. If set to 0, status will only be checked on page load"
+ },
+ "language": {
+ "title": "Language",
+ "type": "string",
+ "description": "The ISO code of your desired language, must have translations present, check docs for more info"
+ },
"theme": {
+ "title": "Theme",
"type": "string",
"default": "callisto",
"description": "A theme to be applied by default on first load",
@@ -104,17 +135,14 @@
"high-contrast-light"
]
},
- "enableFontAwesome": {
- "type": "boolean",
- "default": true,
- "description": "Should load font-awesome assets"
- },
- "fontAwesomeKey": {
+ "backgroundImg": {
+ "title": "Background Image",
"type": "string",
- "pattern": "^[a-z0-9]{10}$",
- "description": "API key for font-awesome"
+ "description": "A URL to an image asset to be displayed as background"
},
"faviconApi": {
+ "title": "Favicon API",
+ "type": "string",
"enum": [
"local",
"faviconkit",
@@ -127,6 +155,8 @@
"description": "Which service to use to resolve favicons. Set to local to do this locally instead"
},
"layout": {
+ "title": "Default Layout",
+ "type": "string",
"enum": [
"horizontal",
"vertical",
@@ -137,6 +167,8 @@
"description": "Specifies sections layout orientation on the home screen"
},
"iconSize": {
+ "title": "Default Icon Size",
+ "type": "string",
"enum": [
"small",
"medium",
@@ -145,88 +177,48 @@
"default": "medium",
"description": "The size of each link item / icon"
},
- "hideComponents": {
- "type": "object",
- "description": "Hide individual parts of the page. If not set, all components are visible by default",
- "properties": {
- "hideHeading": {
- "type": "boolean",
- "default": "false",
- "description": "If set to true, the page heading & subtitle will be hidden"
- },
- "hideNav": {
- "type": "boolean",
- "default": "false",
- "description": "If set to true, the navigation menu will be hidden"
- },
- "hideSearch": {
- "type": "boolean",
- "default": "false",
- "description": "If set to true, the search bar will be hidden"
- },
- "hideSettings": {
- "type": "boolean",
- "default": "false",
- "description": "If set to true, the settings buttons will be hidden"
- },
- "hideFooter": {
- "type": "boolean",
- "default": "false",
- "description": "If set to true, the page footer will be hidden"
- },
- "hideSplashScreen": {
- "type": "boolean",
- "default": "true",
- "description": "If set to true, the loading / splash screen will not be shown"
- }
- }
+ "colCount": {
+ "title": "Column Count",
+ "type": "number",
+ "minimum": 1,
+ "maximum": 8,
+ "description": "Number of section columns for homepage. Leave blank for column count to be responsively calculated based on screen size"
},
- "cssThemes": {
- "type": "array",
- "description": "Theme names to be added to the dropdown",
- "items": {
- "type": "string"
- }
- },
- "customColors": {
- "type": "object",
- "description": "Set a custom color palette for any theme"
- },
- "externalStyleSheet": {
- "description": "URL or URLs of external stylesheets to add to dropdown/ load",
- "type": [
- "string",
- "array"
- ],
- "items": {
- "type": "string"
- }
- },
- "customCss": {
+ "routingMode": {
+ "title": "Routing Mode",
"type": "string",
- "description": "Any custom CSS overides, must be minified"
+ "enum": [
+ "hash",
+ "history"
+ ],
+ "default": "history",
+ "description": "The Vue routing mode to use, history mode will remove the annoying hash from the URL, but requires some extra config on some systems"
},
- "statusCheck": {
+ "workspaceLandingUrl": {
+ "title": "Workspace Landing URL",
+ "type": "string",
+ "description": "The URL of an app, service or website to render when the Workspace view is opened"
+ },
+ "enableMultiTasking": {
+ "title": "Enable Multi-Tasking",
"type": "boolean",
"default": false,
- "description": "Displays an online/ offline status for each of your services"
- },
- "statusCheckInterval": {
- "type": "number",
- "default": 0,
- "description": "How often to recheck statuses. If set to 0, status will only be checked on page load"
+ "description": "If set to true, will keep apps opened in the workspace open in the background. Useful for switching between sites, but comes at the cost of performance"
},
"webSearch": {
+ "title": "Web Search",
"type": "object",
"description": "Configure options for web search",
"additionalProperties": false,
"properties": {
"disableWebSearch": {
+ "title": "Disable Web Search?",
"type": "boolean",
"default": "false",
"description": "If set to true, web search will be disabled all together"
},
"searchEngine": {
+ "title": "Search Engine",
"type": "string",
"default": "duckduckgo",
"description": "Set your default search engine. Reference provider by key, see docs for all supported search engines, or set to custom to use your own",
@@ -248,10 +240,13 @@
]
},
"customSearchEngine": {
+ "title": "Custom Search Engine",
"type": "string",
"description": "Set the URL of a self-hosted or custom search engine, including GET query params. You must also set searchEngine: custom"
},
"openingMethod": {
+ "title": "Search Opening Method",
+ "type": "string",
"enum": [
"newtab",
"sametab",
@@ -262,6 +257,7 @@
"description": "Set where you would like search results to open to"
},
"searchBangs": {
+ "title": "Search Bangs",
"type": "object",
"additionalProperties": true,
"examples": [
@@ -274,17 +270,101 @@
}
}
},
+ "enableFontAwesome": {
+ "title": "Enable Font-Awesome?",
+ "type": "boolean",
+ "default": true,
+ "description": "Should load font-awesome assets"
+ },
+ "fontAwesomeKey": {
+ "title": "Font-Awesome API Key",
+ "type": "string",
+ "pattern": "^[a-z0-9]{10}$",
+ "description": "API key for font-awesome"
+ },
+ "cssThemes": {
+ "title": "Additional CSS Themes",
+ "type": "array",
+ "description": "Theme names to be added to the dropdown, once added you can then add custom CSS to style your theme",
+ "items": {
+ "type": "string"
+ }
+ },
+ "customColors": {
+ "title": "Custom Colors",
+ "type": "object",
+ "description": "Set a custom color palette for any theme, see docs for more info"
+ },
+ "externalStyleSheet": {
+ "title": "External Stylesheets",
+ "description": "List of URLs of external stylesheets to add to dropdown/ load",
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ },
+ "customCss": {
+ "title": "Custom CSS",
+ "type": "string",
+ "description": "Any custom CSS overides to be applied globally, should be minified"
+ },
+ "hideComponents": {
+ "title": "Hidden Components",
+ "type": "object",
+ "description": "Hide individual parts of the page. If not set, all components are visible by default",
+ "properties": {
+ "hideHeading": {
+ "title": "Hide Heading?",
+ "type": "boolean",
+ "default": "false",
+ "description": "If set to true, the page heading & subtitle will be hidden"
+ },
+ "hideNav": {
+ "title": "Hide Nav Bar?",
+ "type": "boolean",
+ "default": "false",
+ "description": "If set to true, the navigation menu will be hidden"
+ },
+ "hideSearch": {
+ "title": "Hide Search Bar?",
+ "type": "boolean",
+ "default": "false",
+ "description": "If set to true, the search bar will be hidden"
+ },
+ "hideSettings": {
+ "title": "Hide Settings?",
+ "type": "boolean",
+ "default": "false",
+ "description": "If set to true, the settings buttons will be hidden"
+ },
+ "hideFooter": {
+ "title": "Hide Footer?",
+ "type": "boolean",
+ "default": "false",
+ "description": "If set to true, the page footer will be hidden"
+ },
+ "hideSplashScreen": {
+ "title": "Hide Splash Screen?",
+ "type": "boolean",
+ "default": "true",
+ "description": "If set to true, the loading / splash screen will not be shown"
+ }
+ }
+ },
"auth": {
+ "title": "Authentication",
"type": "object",
"description": "Settings for enabling authentication",
"additionalProperties": false,
"properties": {
"enableGuestAccess": {
+ "title": "Enable Guest Mode?",
"type": "boolean",
"default": false,
"description": "If set to true, an unauthenticated user will be able to have read-only access to dashboard, without needing to login. Requires auth to be configured."
},
"users": {
+ "title": "Users",
"type": "array",
"description": "Usernames and hashed credentials for frontend authentication",
"items": {
@@ -296,16 +376,20 @@
],
"properties": {
"user": {
+ "title": "Username",
"type": "string",
"description": "The username for a user"
},
"hash": {
+ "title": "Hashed Pass",
"type": "string",
"description": "A SHA-256 hashed password for that user",
"minLength": 64,
"maxLength": 64
},
"type": {
+ "title": "Privileges",
+ "type": "string",
"enum": [
"admin",
"normal"
@@ -317,6 +401,7 @@
}
},
"enableKeycloak": {
+ "title": "Enable Keycloak?",
"type": "boolean",
"default": false,
"description": "If set to true, and auth.keycloak is also configured, then Keycloak will be used for app auth"
@@ -332,14 +417,17 @@
],
"properties": {
"serverUrl": {
+ "title": "Server URL",
"type": "string",
"description": "The URL (or URL/ IP + Port) where your keycloak server is running"
},
"realm": {
+ "title": "Realm",
"type": "string",
"description": "The name of the realm (must already be created) that you want to use"
},
"clientId": {
+ "title": "Client ID",
"type": "string",
"description": "The Client ID of the client you created for use with Dashy"
}
@@ -347,42 +435,44 @@
}
}
},
- "enableMultiTasking": {
- "type": "boolean",
- "default": false,
- "description": "If set to true, will keep apps opened in the workspace open in the background. Useful for switching between sites, but comes at the cost of performance"
- },
"allowConfigEdit": {
+ "title": "Allow Config Editing",
"type": "boolean",
"default": true,
"description": "Can user write changes to conf.yml file from the UI. If set to false, preferences are only stored locally"
},
"enableServiceWorker": {
+ "title": "Enable Service Worker",
"type": "boolean",
"default": false,
"description": "If set to true, then service workers will be used to cache page contents"
},
"disableContextMenu": {
+ "title": "Disable Context Menus",
"type": "boolean",
"default": false,
"description": "If set to true, custom right-click context menu will be disabled"
},
"disableUpdateChecks": {
+ "title": "Disable Update Checks",
"type": "boolean",
"default": false,
"description": "Prevents Dashy from checking for updates"
},
"disableSmartSort": {
+ "title": "Disable Smart-Sort",
"type": "boolean",
"default": false,
"description": "Prevents the app storing local click count, required for the last-used and most-used sort orders"
},
"enableErrorReporting": {
+ "title": "Enable Error Reporting",
"type": "boolean",
"default": false,
"description": "Enable anonymous crash reports. This helps bugs be found and fixed, in order to make Dashy more stable. Reporting is off by default, and no data will EVER be collected without your explicit and active concent."
},
"sentryDsn": {
+ "title": "Custom Sentry DSN",
"type": "string",
"description": "The DSN to your self-hosted Sentry server, if you need to collect bug reports. Only used if enableErrorReporting is enabled"
}
@@ -393,6 +483,7 @@
"type": "array",
"description": "Array of sections, containing items",
"items": {
+ "title": "Items",
"type": "object",
"required": [
"name",
@@ -401,19 +492,24 @@
"additionalProperties": false,
"properties": {
"name": {
+ "title": "Section Name",
"type": "string",
"description": "Title/ heading for a section"
},
"icon": {
+ "title": "Section Icon",
"type": "string",
"description": "Icon will be displayed next to title"
},
"displayData": {
+ "title": "Display Data",
"type": "object",
"additionalProperties": false,
"description": "Optional meta data for customizing a section",
"properties": {
"sortBy": {
+ "title": "Sort By",
+ "type": "string",
"enum": [
"default",
"most-used",
@@ -426,19 +522,24 @@
"description": "How to sort items within the section. By default items are displayed in the order in which they are listed in within the config"
},
"collapsed": {
+ "title": "Is Collapsed?",
"type": "boolean",
"default": false,
"description": "If true, section needs to be clicked to open"
},
"color": {
+ "title": "Color",
"type": "string",
"description": "Hex code, or HTML color for section fill"
},
"customStyles": {
+ "title": "Custom Styles",
"type": "string",
"description": "CSS overides for section container"
},
"itemSize": {
+ "title": "Item Size",
+ "type": "string",
"enum": [
"small",
"medium",
@@ -448,6 +549,7 @@
"description": "Size of items within the section"
},
"rows": {
+ "title": "Num Rows",
"type": "number",
"minimum": 1,
"maximum": 5,
@@ -455,6 +557,7 @@
"description": "The amount of space that the section spans vertically"
},
"cols": {
+ "title": "Num Cols",
"type": "number",
"minimum": 1,
"maximum": 5,
@@ -462,6 +565,8 @@
"description": "The amount of space that the section spans horizontally"
},
"sectionLayout": {
+ "title": "Layout Type",
+ "type": "string",
"enum": [
"grid",
"auto"
@@ -470,18 +575,21 @@
"description": "If set to grid, items have uniform width, and itemCount can be set"
},
"itemCountX": {
+ "title": "Item Count X",
"type": "number",
"minimum": 1,
"maximum": 12,
"description": "Number of items per column"
},
"itemCountY": {
+ "title": "Item Count Y",
"type": "number",
"minimum": 1,
"maximum": 12,
"description": "Number of items per row"
},
"hideForUsers": {
+ "title": "Hide for Users",
"type": "array",
"description": "Section will be visible to all users, except for those specified in this list",
"items": {
@@ -490,6 +598,7 @@
}
},
"showForUsers": {
+ "title": "Show for Users",
"type": "array",
"description": "Section will be hidden from all users, except for those specified in this list",
"items": {
@@ -498,6 +607,7 @@
}
},
"hideForGuests": {
+ "title": "Hide for Guests?",
"type": "boolean",
"default": false,
"description": "If set to true, section will be visible for logged in users, but not for guests"
@@ -505,6 +615,7 @@
}
},
"items": {
+ "title": "Items",
"type": "array",
"description": "Array of items to display with a section",
"items": {
@@ -515,70 +626,91 @@
],
"properties": {
"title": {
+ "title": "Item Text",
"type": "string",
- "description": "Text shown on the item"
+ "description": "Title of the item"
},
"description": {
+ "title": "Description",
"type": "string",
"nullable": true,
"description": "Short description, shown on hover or in a tooltip"
},
"icon": {
+ "title": "Icon",
"type": "string",
"nullable": true,
- "description": "An icon, either as a font-awesome identifier, local or remote URL, or the word favicon or generative"
+ "description": "An icon, either as a font-awesome, simple-icon or mdi identifier, emoji, favicon, generative or the URL/ path to a local or remote icon asset"
},
"url": {
+ "title": "Service URL",
"type": "string",
- "description": "The destination to navigate to when item is clicked"
+ "description": "The destination to navigate to when item is clicked, expressed as a valid URL, IP or hostname"
},
"target": {
+ "title": "Opening Method",
+ "type": "string",
"enum": [
"newtab",
"sametab",
+ "parent",
+ "top",
"modal",
"workspace"
],
"default": "newtab",
- "description": "Opening method, when item is clicked"
+ "description": "Where / how the item is opened when it's clicked"
},
"hotkey": {
+ "title": "Hot Key",
"type": "number",
"description": "A numeric shortcut key, between 0 and 9. Useful for quickly launching frequently used applications"
},
"tags": {
+ "title": "Tags",
"type": "array",
- "description": "Tags, which can be used for improved search",
+ "description": "A list of tags for improved search. Separate using a comma",
"maxItems": 12,
"items": {
"type": "string"
}
},
- "color": {
- "type": "string",
- "description": "A custom fill color of the item"
- },
"provider": {
+ "title": "Provider",
"type": "string",
- "description": "Provider name, e.g. Microsoft"
+ "description": "Provider name, e.g. Microsoft, Nebucasa, DigitalOcean, etc"
},
"statusCheck": {
+ "title": "Enable Status Check",
"type": "boolean",
"default": false,
"description": "Whether or not to display online/ offline status for this service. Will override appConfig.statusCheck"
},
"statusCheckUrl": {
+ "title": "Status Check URL",
"type": "string",
- "description": "If you've enabled statusCheck, and want to use a different URL to what is defined under the item, then specify it here"
+ "description": "Custom status check endpoint for this item. Useful if the default URL doesn't return 200, or if your service has a dedicated status check endpoint"
},
"statusCheckHeaders": {
+ "title": "Status Check Headers",
"type": "object",
- "description": " If you're endpoint requires any specific headers for the status checking, then define them here"
+ "description": " Custom headers for status checking, useful if your service requires authorization headers to return a 200"
},
"statusCheckAllowInsecure": {
+ "title": "Status Check Disable SSL",
"type": "boolean",
"default": false,
- "description": "Allows for running status checks on insecure content/ non-HTTPS apps"
+ "description": "Allows for running status checks on insecure content/ non-HTTPS apps. Prevents checks failing for non-SSL sites"
+ },
+ "color": {
+ "title": "Custom Color",
+ "type": "string",
+ "description": "A custom fill color of the item, expressed either as hex code or color name"
+ },
+ "id": {
+ "title": "Item ID",
+ "type": "string",
+ "description": "Unique ID for each item. Generated automatically, shouldn't need to be set manually."
}
}
}
diff --git a/src/utils/CoolConsole.js b/src/utils/CoolConsole.js
index 09efcd17..2871d0a5 100644
--- a/src/utils/CoolConsole.js
+++ b/src/utils/CoolConsole.js
@@ -28,7 +28,7 @@ export const statusMsg = (title, msg) => {
/* Prints status message, with a stack trace */
export const statusErrorMsg = (title, msg, errorLog) => {
console.log(
- `%c${title || ''}\n%c${msg} \n%c${errorLog}`,
+ `%c${title || ''}\n%c${msg} \n%c${errorLog || ''}`,
'font-weight: bold; color: #0dd8d8; text-decoration: underline;',
'color: #ff025a',
'color: #ff025a80;',
diff --git a/src/utils/ErrorHandler.js b/src/utils/ErrorHandler.js
index d0c96f08..280c4a0a 100644
--- a/src/utils/ErrorHandler.js
+++ b/src/utils/ErrorHandler.js
@@ -1,5 +1,5 @@
import * as Sentry from '@sentry/vue';
-import { warningMsg, statusMsg } from '@/utils/CoolConsole';
+import { warningMsg, statusMsg, statusErrorMsg } from '@/utils/CoolConsole';
import { sessionStorageKeys } from '@/utils/defaults';
/* Makes the current time, like hh:mm:ss */
@@ -33,4 +33,18 @@ export const InfoHandler = (msg, title) => {
statusMsg(title || 'Info', msg);
};
+/* Outputs warnings caused by the user, such as missing field */
+export const WarningInfoHandler = (msg, title, log) => {
+ statusErrorMsg(title || 'Warning', msg, log);
+};
+
+/* Titles for info logging */
+export const InfoKeys = {
+ AUTH: 'Authentication',
+ CLOUD_BACKUP: 'Cloud Backup & Restore',
+ EDITOR: 'Interactive Editor',
+ RAW_EDITOR: 'Raw Config Editor',
+ VISUAL: 'Layout & Styles',
+};
+
export default ErrorHandler;
diff --git a/src/utils/MiscHelpers.js b/src/utils/MiscHelpers.js
index 212e7495..da9a683f 100644
--- a/src/utils/MiscHelpers.js
+++ b/src/utils/MiscHelpers.js
@@ -3,4 +3,46 @@ import { hideFurnitureOn } from '@/utils/defaults';
/* Returns false if page furniture should be hidden on said route */
export const shouldBeVisible = (routeName) => !hideFurnitureOn.includes(routeName);
-export const x = () => null;
+/* Very rudimentary hash function for generative icons */
+export const asciiHash = (input) => {
+ const str = (!input || input.length === 0) ? Math.random().toString() : input;
+ const reducer = (previousHash, char) => (previousHash || 0) + char.charCodeAt(0);
+ const asciiSum = str.split('').reduce(reducer).toString();
+ const shortened = asciiSum.slice(0, 30) + asciiSum.slice(asciiSum.length - 30);
+ return window.btoa(shortened);
+};
+
+/* Encode potentially malicious characters from string */
+export const sanitize = (string) => {
+ const map = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": ''',
+ '/': '/',
+ };
+ const reg = /[&<>"'/]/ig;
+ return string.replace(reg, (match) => (map[match]));
+};
+
+/* Based on section title, item name and index, return a string value for ID */
+const makeItemId = (sectionStr, itemStr, index) => {
+ const charSum = sectionStr.split('').map((a) => a.charCodeAt(0)).reduce((x, y) => x + y);
+ const itemTitleStr = itemStr.replace(/\s+/g, '-').replace(/[^a-zA-Z ]/g, '').toLowerCase();
+ return `${index}_${charSum}_${itemTitleStr}`;
+};
+
+/* Given an array of sections, apply a unique ID to each item, and return modified array */
+export const applyItemId = (inputSections) => {
+ const sections = inputSections || [];
+ sections.forEach((sec, secIdx) => {
+ if (sec.items) {
+ sec.items.forEach((item, itemIdx) => {
+ sections[secIdx].items[itemIdx].id = makeItemId(sec.name, item.title, itemIdx);
+ // TODO: Check if ID already exists, and if so, modify it
+ });
+ }
+ });
+ return sections;
+};
diff --git a/src/utils/Search.js b/src/utils/Search.js
index f03078bc..50950183 100644
--- a/src/utils/Search.js
+++ b/src/utils/Search.js
@@ -24,7 +24,7 @@ const getDomainFromUrl = (url) => {
*/
const filterHelper = (compareStr, searchStr) => {
if (!compareStr) return false;
- const process = (input) => input.toString().toLowerCase().replace(/[^\w\s]/gi, '');
+ const process = (input) => input && input.toString().toLowerCase().replace(/[^\w\s]/gi, '');
return process(compareStr).includes(process(searchStr));
};
@@ -37,6 +37,7 @@ const filterHelper = (compareStr, searchStr) => {
* @returns A filtered array of tiles
*/
export const searchTiles = (allTiles, searchTerm) => {
+ if (!searchTerm) return allTiles; // If no search term, then return all
if (!allTiles) return []; // If no data, then skip
return allTiles.filter((tile) => {
const {
diff --git a/src/utils/StoreMutations.js b/src/utils/StoreMutations.js
new file mode 100644
index 00000000..07bbac10
--- /dev/null
+++ b/src/utils/StoreMutations.js
@@ -0,0 +1,29 @@
+// A list of mutation names
+const KEY_NAMES = [
+ 'INITIALIZE_CONFIG',
+ 'SET_CONFIG',
+ 'SET_MODAL_OPEN',
+ 'SET_LANGUAGE',
+ 'SET_EDIT_MODE',
+ 'SET_ITEM_LAYOUT',
+ 'SET_ITEM_SIZE',
+ 'SET_THEME',
+ 'SET_CUSTOM_COLORS',
+ 'UPDATE_ITEM',
+ 'SET_PAGE_INFO',
+ 'SET_APP_CONFIG',
+ 'SET_SECTIONS',
+ 'UPDATE_SECTION',
+ 'INSERT_SECTION',
+ 'REMOVE_SECTION',
+ 'COPY_ITEM',
+ 'REMOVE_ITEM',
+ 'INSERT_ITEM',
+ 'UPDATE_CUSTOM_CSS',
+ 'CONF_MENU_INDEX',
+];
+
+// Convert array of key names into an object, and export
+const MUTATIONS = {};
+KEY_NAMES.forEach((key) => { MUTATIONS[key] = key; });
+export default MUTATIONS;
diff --git a/src/utils/defaults.js b/src/utils/defaults.js
index 115cd82b..bf70fee3 100644
--- a/src/utils/defaults.js
+++ b/src/utils/defaults.js
@@ -24,7 +24,7 @@ module.exports = {
/* Default Font-Awesome API key, for FA icons (if used) */
fontAwesomeKey: '0821c65656',
/* Default API to use for fetching of user service favicon icons (if enabled) */
- faviconApi: 'faviconkit',
+ faviconApi: 'allesedv',
/* The default sort order for sections */
sortOrder: 'default',
/* The page paths for each route within the app for the router */
@@ -35,6 +35,7 @@ module.exports = {
about: '/about',
login: '/login',
download: '/download',
+ notFound: '/404',
},
/* Server Endpoints */
serviceEndpoints: {
@@ -49,17 +50,21 @@ module.exports = {
'oblivion',
'material',
'material-dark',
- 'dracula',
- 'colorful',
'dashy-docs',
+ 'colorful',
+ 'one-dark',
+ 'dracula',
+ 'adventure',
+ 'nord-frost',
+ 'nord',
'minimal-dark',
'minimal-light',
- 'nord',
- 'nord-frost',
'thebe',
'cyberpunk',
'matrix',
'matrix-red',
+ 'color-block',
+ 'glow',
'raspberry-jam',
'bee',
'tiger',
@@ -71,8 +76,9 @@ module.exports = {
],
/* Which structural components should be visible by default */
visibleComponents: {
- pageTitle: true,
+ splashScreen: false,
navigation: true,
+ pageTitle: true,
searchBar: true,
settings: true,
footer: true,
@@ -83,6 +89,7 @@ module.exports = {
'login',
'download',
'landing-page-minimal',
+ // '404',
],
/* Key names for local storage identifiers */
localStorageKeys: {
@@ -115,11 +122,15 @@ module.exports = {
/* Unique IDs of modals within the app */
modalNames: {
CONF_EDITOR: 'CONF_EDITOR',
- CLOUD_BACKUP: 'CLOUD_BACKUP',
REBUILD_APP: 'REBUILD_APP',
- THEME_MAKER: 'THEME_MAKER',
ABOUT_APP: 'ABOUT_APP',
LANG_SWITCHER: 'LANG_SWITCHER',
+ EDIT_ITEM: 'EDIT_ITEM',
+ EDIT_SECTION: 'EDIT_SECTION',
+ EDIT_PAGE_INFO: 'EDIT_PAGE_INFO',
+ EDIT_APP_CONFIG: 'EDIT_APP_CONFIG',
+ EXPORT_CONFIG_MENU: 'EXPORT_CONFIG_MENU',
+ MOVE_ITEM_TO: 'MOVE_ITEM_TO',
},
/* Key names for the top-level objects in conf.yml */
topLevelConfKeys: {
@@ -135,6 +146,8 @@ module.exports = {
metaTagData: [
{ name: 'description', content: 'A simple static homepage for you\'re server' },
],
+ /* If no 'target' specified, this is the default opening method */
+ openingMethod: 'newtab',
/* Default option for Toast messages */
toastedOptions: {
position: 'bottom-center',
@@ -158,21 +171,26 @@ module.exports = {
backupEndpoint: 'https://dashy-sync-service.as93.net',
/* Available services for fetching favicon icon for user apps */
faviconApiEndpoints: {
- mcapi: 'https://eu.mc-api.net/v3/server/favicon/$URL',
+ allesedv: 'https://f1.allesedv.com/128/$URL',
clearbit: 'https://logo.clearbit.com/$URL',
faviconkit: 'https://api.faviconkit.com/$URL/64',
+ duckduckgo: 'https://icons.duckduckgo.com/ip2/$URL.ico',
+ yandex: 'https://favicon.yandex.net/favicon/$URL',
google: 'https://www.google.com/s2/favicons?sz=128&domain_url=$URL',
- allesedv: 'https://f1.allesedv.com/128/$URL',
+ besticon: 'https://besticon-demo.herokuapp.com/icon?url=$URL&size=80..120..200',
webmasterapi: 'https://api.webmasterapi.com/v1/favicon/yEwx0ZFs0CSPshHq/$URL',
+ mcapi: 'https://eu.mc-api.net/v3/server/favicon/$URL',
},
/* The URL to CDNs used for external icons. These are only loaded when required */
iconCdns: {
fa: 'https://kit.fontawesome.com',
mdi: 'https://cdn.jsdelivr.net/npm/@mdi/font@5.9.55/css/materialdesignicons.min.css',
si: 'https://unpkg.com/simple-icons@v5/icons',
- generative: 'https://ipsicon.io',
- localPath: '/item-icons',
+ generative: 'https://avatars.dicebear.com/api/identicon/{icon}.svg',
+ generativeFallback: 'https://evatar.io/{icon}',
+ localPath: './item-icons',
faviconName: 'favicon.ico',
+ homeLabIcons: 'https://raw.githubusercontent.com/WalkxCode/dashboard-icons/master/png/{icon}.png',
},
/* URLs for web search engines */
searchEngineUrls: {
diff --git a/src/utils/languages.js b/src/utils/languages.js
index 0ef43e65..bea5b973 100644
--- a/src/utils/languages.js
+++ b/src/utils/languages.js
@@ -2,6 +2,7 @@
import en from '@/assets/locales/en.json';
import de from '@/assets/locales/de.json';
import nl from '@/assets/locales/nl.json';
+import pl from '@/assets/locales/pl.json';
import fr from '@/assets/locales/fr.json';
import sl from '@/assets/locales/sl.json';
import es from '@/assets/locales/es.json';
@@ -12,6 +13,8 @@ import hi from '@/assets/locales/hi.json';
import ja from '@/assets/locales/ja.json';
import pt from '@/assets/locales/pt.json';
import ru from '@/assets/locales/ru.json';
+import nb from '@/assets/locales/nb.json';
+import pirate from '@/assets/locales/zz-pirate.json';
// Language data - Next register your language by adding it to this list
export const languages = [
@@ -33,6 +36,12 @@ export const languages = [
locale: nl,
flag: '🇳🇱',
},
+ {
+ name: 'polski',
+ code: 'pl',
+ locale: pl,
+ flag: '🇵🇱',
+ },
{
name: 'Français',
code: 'fr',
@@ -93,6 +102,18 @@ export const languages = [
locale: ru,
flag: '🇷🇺',
},
+ { // Norwegian
+ name: 'Norsk',
+ code: 'nb',
+ locale: nb,
+ flag: '🇳🇴',
+ },
+ { // Joke Language - Pirate
+ name: 'Pirate',
+ code: 'pirate',
+ locale: pirate,
+ flag: '🏴☠️',
+ },
];
/**
diff --git a/src/views/404.vue b/src/views/404.vue
new file mode 100644
index 00000000..ef2c11f7
--- /dev/null
+++ b/src/views/404.vue
@@ -0,0 +1,90 @@
+
+
+ 404
+ :(
+ Page Not Found
+
+ Facing Issues?
+ Get Support .
+
+ Back Home
+
+
+
+
+
+
diff --git a/src/views/DownloadConfig.vue b/src/views/DownloadConfig.vue
index 9a695052..ef3bf58c 100644
--- a/src/views/DownloadConfig.vue
+++ b/src/views/DownloadConfig.vue
@@ -7,18 +7,13 @@ import JsonToYaml from '@/utils/JsonToYaml';
export default {
name: 'DownloadConfig',
- props: {
- sections: Array,
- appConfig: Object,
- pageInfo: Object,
+ computed: {
+ config() {
+ return this.$store.state.config;
+ },
},
data() {
return {
- config: {
- appConfig: this.appConfig,
- pageInfo: this.pageInfo,
- sections: this.sections,
- },
jsonParser: JsonToYaml,
};
},
diff --git a/src/views/Home.vue b/src/views/Home.vue
index 097a747f..85a8b9da 100644
--- a/src/views/Home.vue
+++ b/src/views/Home.vue
@@ -4,24 +4,33 @@
+
+
+
+
+ Back to All
+
+
+ :class="`item-group-container `
+ + `orientation-${layout} `
+ + `item-size-${itemSizeBound} `
+ + (isEditMode ? 'edit-mode ' : '')
+ + (singleSectionView ? 'single-section-view ' : '')
+ + (this.colCount ? `col-count-${this.colCount} ` : '')"
+ >
+
+
{{searchValue ? $t('home.no-results') : $t('home.no-data')}}
+
+
+
+
@@ -46,57 +61,80 @@
import SettingsContainer from '@/components/Settings/SettingsContainer.vue';
import Section from '@/components/LinkItems/Section.vue';
+import EditModeSaveMenu from '@/components/InteractiveEditor/EditModeSaveMenu.vue';
+import ExportConfigMenu from '@/components/InteractiveEditor/ExportConfigMenu.vue';
+import AddNewSection from '@/components/InteractiveEditor/AddNewSectionLauncher.vue';
import { searchTiles } from '@/utils/Search';
-import Defaults, { localStorageKeys, iconCdns } from '@/utils/defaults';
+import StoreKeys from '@/utils/StoreMutations';
+import Defaults, { localStorageKeys, iconCdns, modalNames } from '@/utils/defaults';
+import ErrorHandler from '@/utils/ErrorHandler';
+import BackIcon from '@/assets/interface-icons/back-arrow.svg';
export default {
name: 'home',
- props: {
- sections: Array, // Main site content
- appConfig: Object, // Main site configuation (optional)
- pageInfo: Object, // Page metadata (optional)
- },
components: {
SettingsContainer,
+ EditModeSaveMenu,
+ ExportConfigMenu,
+ AddNewSection,
Section,
+ BackIcon,
},
data: () => ({
searchValue: '',
layout: '',
itemSizeBound: '',
- modalOpen: false, // When true, keybindings are disabled
+ addNewSectionOpen: false,
}),
computed: {
- /* Combines sections from config file, with those in local storage */
- allSections() {
- // If the user has stored sections in local storage, return those
- const localSections = localStorage[localStorageKeys.CONF_SECTIONS];
- if (localSections) {
- const json = JSON.parse(localSections);
- if (json.length >= 1) return json;
- }
- // Otherwise, return the usuall data from conf.yml
- return this.sections;
+ sections() {
+ return this.$store.getters.sections;
},
+ appConfig() {
+ return this.$store.getters.appConfig;
+ },
+ pageInfo() {
+ return this.$store.getters.pageInfo;
+ },
+ modalOpen() {
+ return this.$store.state.modalOpen;
+ },
+ singleSectionView() {
+ return this.findSingleSection(this.$store.getters.sections, this.$route.params.section);
+ },
+ isEditMode() {
+ return this.$store.state.editMode;
+ },
+ /* Get class for num columns, if specified by user */
+ colCount() {
+ let { colCount } = this.appConfig;
+ if (!colCount) return null;
+ if (colCount < 1) colCount = 1;
+ if (colCount > 8) colCount = 8;
+ return colCount;
+ },
+ /* Return all sections, that match users search term */
filteredTiles() {
- const sections = this.allSections;
+ const sections = this.singleSectionView || this.sections;
return sections.filter((section) => this.filterTiles(section.items, this.searchValue));
},
/* Updates layout (when button clicked), and saves in local storage */
- layoutOrientation: {
- get() { return this.appConfig.layout || Defaults.layout; },
- set: function setLayout(layout) {
- localStorage.setItem(localStorageKeys.LAYOUT_ORIENTATION, layout);
- this.layout = layout;
- },
+ layoutOrientation() {
+ return this.$store.getters.layout;
},
/* Updates icon size (when button clicked), and saves in local storage */
- iconSize: {
- get() { return this.appConfig.iconSize || Defaults.iconSize; },
- set: function setIconSize(iconSize) {
- localStorage.setItem(localStorageKeys.ICON_SIZE, iconSize);
- this.itemSizeBound = iconSize;
- },
+ iconSize() {
+ return this.$store.getters.iconSize;
+ },
+ },
+ watch: {
+ layoutOrientation(layout) {
+ localStorage.setItem(localStorageKeys.LAYOUT_ORIENTATION, layout);
+ this.layout = layout;
+ },
+ iconSize(size) {
+ localStorage.setItem(localStorageKeys.ICON_SIZE, size);
+ this.itemSizeBound = size;
},
},
methods: {
@@ -121,17 +159,32 @@ export default {
getDisplayData(section) {
return !section.displayData ? {} : section.displayData;
},
- /* Sets layout attribute, which is used by Section */
- setLayoutOrientation(layout) {
- this.layoutOrientation = layout;
- },
- /* Sets item size attribute, which is used by Section */
- setItemSize(itemSize) {
- this.iconSize = itemSize;
- },
/* Update data when modal is open (so that key bindings can be disabled) */
updateModalVisibility(modalState) {
- this.modalOpen = modalState;
+ this.$store.commit('SET_MODAL_OPEN', modalState);
+ },
+ openAddNewSectionMenu() {
+ this.addNewSectionOpen = true;
+ this.$modal.show(modalNames.EDIT_SECTION);
+ this.$store.commit(StoreKeys.SET_MODAL_OPEN, true);
+ },
+ closeEditSection() {
+ this.addNewSectionOpen = false;
+ this.$modal.hide(modalNames.EDIT_SECTION);
+ this.$store.commit(StoreKeys.SET_MODAL_OPEN, false);
+ },
+ /* If on sub-route, and section exists, then return only that section */
+ findSingleSection: (allSections, sectionTitle) => {
+ if (!sectionTitle) return undefined;
+ let sectionToReturn;
+ const parse = (section) => section.replaceAll(' ', '-').toLowerCase().trim();
+ allSections.forEach((section) => {
+ if (parse(sectionTitle) === parse(section.name)) {
+ sectionToReturn = [section];
+ }
+ });
+ if (!sectionToReturn) ErrorHandler(`No section named '${sectionTitle}' was found`);
+ return sectionToReturn;
},
/* Returns an array of links to external CSS from the Config */
getExternalCSSLinks() {
@@ -154,8 +207,8 @@ export default {
/* Checks if any sections or items use icons from a given CDN */
checkIfIconLibraryNeeded(prefix) {
let isNeeded = false;
- if (!this.allSections) return false;
- this.allSections.forEach((section) => {
+ if (!this.sections) return false;
+ this.sections.forEach((section) => {
if (section.icon && section.icon.includes(prefix)) isNeeded = true;
section.items.forEach((item) => {
if (item.icon && item.icon.includes(prefix)) isNeeded = true;
@@ -194,10 +247,10 @@ export default {
},
/* Returns true if there is more than 1 sub-result visible during searching */
checkIfResults() {
- if (!this.allSections) return false;
+ if (!this.sections) return false;
else {
let itemsFound = true;
- this.allSections.forEach((section) => {
+ this.sections.forEach((section) => {
if (this.filterTiles(section.items, this.searchValue).length > 0) itemsFound = false;
});
return itemsFound;
@@ -227,10 +280,19 @@ export default {
.home {
padding-bottom: 1px;
background: var(--background);
- // min-height: calc(100vh - 126px);
min-height: calc(99.9vh - var(--footer-height));
}
+.back-to-all-link {
+ display: flex;
+ align-items: center;
+ padding: 0.25rem;
+ margin: 0.25rem;
+ @extend .svg-button;
+ svg { margin-right: 0.5rem; }
+ text-decoration: none;
+}
+
/* Outside container wrapping the item groups*/
.item-group-container {
display: grid;
@@ -255,29 +317,61 @@ export default {
flex-direction: row;
}
}
+ &.orientation-horizontal, &.orientation-vertical, &.single-section-view {
+ @include phone { --content-max-width: 100%; }
+ @include tablet { --content-max-width: 98%; }
+ @include laptop { --content-max-width: 90%; }
+ @include monitor { --content-max-width: 85%; }
+ @include big-screen { --content-max-width: 80%; }
+ @include big-screen-up { --content-max-width: 60%; }
+ max-width: var(--content-max-width, 90%);
+ }
- /* Specify number of columns, based on screen size */
- @include phone {
- grid-template-columns: repeat(1, 1fr);
- }
- @include tablet {
- grid-template-columns: repeat(2, 1fr);
- }
- @include laptop {
- grid-template-columns: repeat(2, 1fr);
- }
- @include monitor {
- grid-template-columns: repeat(3, 1fr);
- }
- @include big-screen {
- grid-template-columns: repeat(4, 1fr);
- }
- @include big-screen-up {
- grid-template-columns: repeat(5, 1fr);
+ /* Specify number of columns, based on screen size or user preference */
+ @include phone { --col-count: 1; }
+ @include tablet { --col-count: 2; }
+ @include laptop { --col-count: 2; }
+ @include monitor { --col-count: 3; }
+ @include big-screen { --col-count: 4; }
+ @include big-screen-up { --col-count: 5; }
+
+ @include tablet-up {
+ &.col-count-1 { --col-count: 1; }
+ &.col-count-2 { --col-count: 2; }
+ &.col-count-3 { --col-count: 3; }
+ &.col-count-4 { --col-count: 4; }
+ &.col-count-5 { --col-count: 5; }
+ &.col-count-6 { --col-count: 6; }
+ &.col-count-7 { --col-count: 7; }
+ &.col-count-8 { --col-count: 8; }
}
+ grid-template-columns: repeat(var(--col-count, 2), minmax(0, 1fr));
+
/* Hide when search term returns nothing */
.no-results { display: none; }
+
+ /* Additional spacing when in edit mode */
+ &.edit-mode {
+ margin-bottom: 12rem;
+ }
+
+ /* When in single-section view mode */
+ &.single-section-view {
+ display: block;
+ }
+ .add-new-section {
+ border: 2px dashed var(--primary);
+ border-radius: var(--curve-factor);
+ padding: var(--item-group-padding);
+ background: var(--item-group-background);
+ color: var(--primary);
+ font-size: 1.2rem;
+ cursor: pointer;
+ text-align: center;
+ height: fit-content;
+ margin: 10px;
+ }
}
/* Custom styles only applied when there is no sections in config */
diff --git a/src/views/Login.vue b/src/views/Login.vue
index 739867ed..a26685ec 100644
--- a/src/views/Login.vue
+++ b/src/views/Login.vue
@@ -76,7 +76,7 @@ import router from '@/router';
import Button from '@/components/FormElements/Button';
import Input from '@/components/FormElements/Input';
import Defaults, { localStorageKeys } from '@/utils/defaults';
-import { InfoHandler } from '@/utils/ErrorHandler';
+import { InfoHandler, WarningInfoHandler, InfoKeys } from '@/utils/ErrorHandler';
import {
checkCredentials,
login,
@@ -91,9 +91,6 @@ export default {
Button,
Input,
},
- props: {
- appConfig: Object,
- },
data() {
return {
username: '',
@@ -104,6 +101,9 @@ export default {
};
},
computed: {
+ appConfig() {
+ return this.$store.getters.appConfig;
+ },
/* Data for timeout dropdown menu, translated label + value in ms */
dropDownMenu() {
return [
@@ -159,9 +159,9 @@ export default {
if (response.correct) { // Yay, credentials were correct :)
login(this.username, this.password, timeout); // Login, to set the cookie
this.goHome();
- InfoHandler(`Succesfully signed in as ${this.username}`, 'Authentication');
+ InfoHandler(`Succesfully signed in as ${this.username}`, InfoKeys.AUTH);
} else {
- InfoHandler(`Unable to Sign In - ${this.message}`, 'Authentication');
+ WarningInfoHandler('Unable to Sign In', InfoKeys.AUTH, this.message);
}
},
/* Calls function to double-check guest access enabled, then log in as guest */
@@ -169,9 +169,11 @@ export default {
const isAllowed = this.isGuestAccessEnabled;
if (isAllowed) {
this.$toasted.show('Logged in as Guest, Redirecting...', { className: 'toast-success' });
+ InfoHandler('Logged in as Guest', InfoKeys.AUTH);
this.goHome();
} else {
- this.$toasted.show('Guest access not allowed', { className: 'toast-error' });
+ this.$toasted.show('Guest Access Not Allowed', { className: 'toast-error' });
+ WarningInfoHandler('Guest Access Not Allowed', InfoKeys.AUTH);
}
},
/* Calls logout, shows status message, and refreshed page */
diff --git a/src/views/Minimal.vue b/src/views/Minimal.vue
index cf2b9aa9..9f76020a 100644
--- a/src/views/Minimal.vue
+++ b/src/views/Minimal.vue
@@ -2,15 +2,16 @@
-
+
{{ pageInfo.title }}
- { this.searchValue = s; }" :active="!modalOpen" />
+ { this.searchValue = s; }"
+ :active="!modalOpen" ref="filterComp" />
@@ -60,11 +61,6 @@ import ConfigLauncher from '@/components/Settings/ConfigLauncher';
export default {
name: 'home',
- props: {
- sections: Array, // Main site content
- appConfig: Object, // Main site configuation (optional)
- pageInfo: Object,
- },
components: {
MinimalSection,
MinimalHeading,
@@ -79,10 +75,21 @@ export default {
tabbedView: true, // By default use tabs, when searching then show all instead
theme: GetTheme(),
}),
+ computed: {
+ sections() {
+ return this.$store.getters.sections;
+ },
+ appConfig() {
+ return this.$store.getters.appConfig;
+ },
+ pageInfo() {
+ return this.$store.getters.pageInfo;
+ },
+ },
watch: {
/* When the theme changes, then call the update method */
searchValue() {
- this.tabbedView = !(this.searchValue.length > 0);
+ this.tabbedView = !this.searchValue || this.searchValue.length === 0;
},
},
methods: {
@@ -111,7 +118,7 @@ export default {
},
/* Clears input field, once a searched item is opened */
finishedSearching() {
- this.$refs.filterComp.clearFilterInput();
+ this.$refs.filterComp.clearMinFilterInput();
},
/* Extracts the site name from domain, used for the searching functionality */
getDomainFromUrl(url) {
diff --git a/src/views/Workspace.vue b/src/views/Workspace.vue
index 2878885c..ea84c042 100644
--- a/src/views/Workspace.vue
+++ b/src/views/Workspace.vue
@@ -1,6 +1,6 @@
-
+
@@ -16,17 +16,19 @@ import { GetTheme, ApplyLocalTheme, ApplyCustomVariables } from '@/utils/ThemeHe
export default {
name: 'Workspace',
- props: {
- sections: Array,
- appConfig: Object,
- },
data: () => ({
- url: '', // this.$route.query.url || '',
+ url: '',
GetTheme,
ApplyLocalTheme,
ApplyCustomVariables,
}),
computed: {
+ sections() {
+ return this.$store.getters.sections;
+ },
+ appConfig() {
+ return this.$store.getters.appConfig;
+ },
isMultiTaskingEnabled() {
return this.appConfig.enableMultiTasking || false;
},
@@ -37,8 +39,12 @@ export default {
MultiTaskingWebComtent,
},
methods: {
- launchApp(url) {
- this.url = url;
+ launchApp(options) {
+ if (options.target === 'newtab') {
+ window.open(options.url, '_blank');
+ } else {
+ this.url = options.url;
+ }
},
setTheme() {
const theme = this.GetTheme();
@@ -51,16 +57,21 @@ export default {
fontAwesomeScript.setAttribute('src', `https://kit.fontawesome.com/${faKey}.js`);
document.head.appendChild(fontAwesomeScript);
},
- repositionFooter() {
- document.getElementsByTagName('footer')[0].style.position = 'fixed';
+ /* Returns a service URL, if set as a URL param, or if user has specified landing URL */
+ getInitialUrl() {
+ const route = this.$route;
+ if (route.query && route.query.url) {
+ return decodeURI(route.query.url);
+ } else if (this.appConfig.workspaceLandingUrl) {
+ return this.appConfig.workspaceLandingUrl;
+ }
+ return undefined;
},
},
mounted() {
- const route = this.$route;
- if (route.query && route.query.url) this.url = decodeURI(route.query.url);
this.setTheme();
this.initiateFontAwesome();
- // this.repositionFooter();
+ this.url = this.getInitialUrl();
},
};
diff --git a/yarn.lock b/yarn.lock
index edca2bb2..2d7bc162 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -102,32 +102,32 @@
dependencies:
"@babel/highlight" "^7.10.4"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
- integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431"
+ integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==
dependencies:
- "@babel/highlight" "^7.14.5"
+ "@babel/highlight" "^7.16.0"
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.7", "@babel/compat-data@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176"
- integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.0.tgz#ea269d7f78deb3a7826c39a4048eecda541ebdaa"
+ integrity sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==
"@babel/core@^7.11.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.0.tgz#749e57c68778b73ad8082775561f67f5196aafa8"
- integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4"
+ integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==
dependencies:
- "@babel/code-frame" "^7.14.5"
- "@babel/generator" "^7.15.0"
- "@babel/helper-compilation-targets" "^7.15.0"
- "@babel/helper-module-transforms" "^7.15.0"
- "@babel/helpers" "^7.14.8"
- "@babel/parser" "^7.15.0"
- "@babel/template" "^7.14.5"
- "@babel/traverse" "^7.15.0"
- "@babel/types" "^7.15.0"
+ "@babel/code-frame" "^7.16.0"
+ "@babel/generator" "^7.16.0"
+ "@babel/helper-compilation-targets" "^7.16.0"
+ "@babel/helper-module-transforms" "^7.16.0"
+ "@babel/helpers" "^7.16.0"
+ "@babel/parser" "^7.16.0"
+ "@babel/template" "^7.16.0"
+ "@babel/traverse" "^7.16.0"
+ "@babel/types" "^7.16.0"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
@@ -135,64 +135,64 @@
semver "^6.3.0"
source-map "^0.5.0"
-"@babel/generator@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15"
- integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==
+"@babel/generator@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2"
+ integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==
dependencies:
- "@babel/types" "^7.15.0"
+ "@babel/types" "^7.16.0"
jsesc "^2.5.1"
source-map "^0.5.0"
-"@babel/helper-annotate-as-pure@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61"
- integrity sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==
+"@babel/helper-annotate-as-pure@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d"
+ integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.16.0"
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191"
- integrity sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882"
+ integrity sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==
dependencies:
- "@babel/helper-explode-assignable-expression" "^7.14.5"
- "@babel/types" "^7.14.5"
+ "@babel/helper-explode-assignable-expression" "^7.16.0"
+ "@babel/types" "^7.16.0"
-"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.14.5", "@babel/helper-compilation-targets@^7.15.0", "@babel/helper-compilation-targets@^7.9.6":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818"
- integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.9.6":
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz#5b480cd13f68363df6ec4dc8ac8e2da11363cbf0"
+ integrity sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==
dependencies:
- "@babel/compat-data" "^7.15.0"
+ "@babel/compat-data" "^7.16.0"
"@babel/helper-validator-option" "^7.14.5"
- browserslist "^4.16.6"
+ browserslist "^4.17.5"
semver "^6.3.0"
-"@babel/helper-create-class-features-plugin@^7.14.5":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz#c9a137a4d137b2d0e2c649acf536d7ba1a76c0f7"
- integrity sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q==
+"@babel/helper-create-class-features-plugin@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b"
+ integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.14.5"
- "@babel/helper-function-name" "^7.14.5"
- "@babel/helper-member-expression-to-functions" "^7.15.0"
- "@babel/helper-optimise-call-expression" "^7.14.5"
- "@babel/helper-replace-supers" "^7.15.0"
- "@babel/helper-split-export-declaration" "^7.14.5"
+ "@babel/helper-annotate-as-pure" "^7.16.0"
+ "@babel/helper-function-name" "^7.16.0"
+ "@babel/helper-member-expression-to-functions" "^7.16.0"
+ "@babel/helper-optimise-call-expression" "^7.16.0"
+ "@babel/helper-replace-supers" "^7.16.0"
+ "@babel/helper-split-export-declaration" "^7.16.0"
-"@babel/helper-create-regexp-features-plugin@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4"
- integrity sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==
+"@babel/helper-create-regexp-features-plugin@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz#06b2348ce37fccc4f5e18dcd8d75053f2a7c44ff"
+ integrity sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.14.5"
+ "@babel/helper-annotate-as-pure" "^7.16.0"
regexpu-core "^4.7.1"
-"@babel/helper-define-polyfill-provider@^0.2.2":
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz#0525edec5094653a282688d34d846e4c75e9c0b6"
- integrity sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==
+"@babel/helper-define-polyfill-provider@^0.2.4":
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz#8867aed79d3ea6cade40f801efb7ac5c66916b10"
+ integrity sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==
dependencies:
"@babel/helper-compilation-targets" "^7.13.0"
"@babel/helper-module-imports" "^7.12.13"
@@ -203,303 +203,310 @@
resolve "^1.14.2"
semver "^6.1.2"
-"@babel/helper-explode-assignable-expression@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz#8aa72e708205c7bb643e45c73b4386cdf2a1f645"
- integrity sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==
+"@babel/helper-explode-assignable-expression@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz#753017337a15f46f9c09f674cff10cee9b9d7778"
+ integrity sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.16.0"
-"@babel/helper-function-name@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4"
- integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==
+"@babel/helper-function-name@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz#b7dd0797d00bbfee4f07e9c4ea5b0e30c8bb1481"
+ integrity sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==
dependencies:
- "@babel/helper-get-function-arity" "^7.14.5"
- "@babel/template" "^7.14.5"
- "@babel/types" "^7.14.5"
+ "@babel/helper-get-function-arity" "^7.16.0"
+ "@babel/template" "^7.16.0"
+ "@babel/types" "^7.16.0"
-"@babel/helper-get-function-arity@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815"
- integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==
+"@babel/helper-get-function-arity@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz#0088c7486b29a9cb5d948b1a1de46db66e089cfa"
+ integrity sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.16.0"
-"@babel/helper-hoist-variables@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d"
- integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==
+"@babel/helper-hoist-variables@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz#4c9023c2f1def7e28ff46fc1dbcd36a39beaa81a"
+ integrity sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.16.0"
-"@babel/helper-member-expression-to-functions@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b"
- integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==
+"@babel/helper-member-expression-to-functions@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz#29287040efd197c77636ef75188e81da8bccd5a4"
+ integrity sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==
dependencies:
- "@babel/types" "^7.15.0"
+ "@babel/types" "^7.16.0"
-"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5", "@babel/helper-module-imports@^7.8.3":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3"
- integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==
+"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.0", "@babel/helper-module-imports@^7.8.3":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz#90538e60b672ecf1b448f5f4f5433d37e79a3ec3"
+ integrity sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.16.0"
-"@babel/helper-module-transforms@^7.14.5", "@babel/helper-module-transforms@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08"
- integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==
+"@babel/helper-module-transforms@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5"
+ integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==
dependencies:
- "@babel/helper-module-imports" "^7.14.5"
- "@babel/helper-replace-supers" "^7.15.0"
- "@babel/helper-simple-access" "^7.14.8"
- "@babel/helper-split-export-declaration" "^7.14.5"
- "@babel/helper-validator-identifier" "^7.14.9"
- "@babel/template" "^7.14.5"
- "@babel/traverse" "^7.15.0"
- "@babel/types" "^7.15.0"
+ "@babel/helper-module-imports" "^7.16.0"
+ "@babel/helper-replace-supers" "^7.16.0"
+ "@babel/helper-simple-access" "^7.16.0"
+ "@babel/helper-split-export-declaration" "^7.16.0"
+ "@babel/helper-validator-identifier" "^7.15.7"
+ "@babel/template" "^7.16.0"
+ "@babel/traverse" "^7.16.0"
+ "@babel/types" "^7.16.0"
-"@babel/helper-optimise-call-expression@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c"
- integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==
+"@babel/helper-optimise-call-expression@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz#cecdb145d70c54096b1564f8e9f10cd7d193b338"
+ integrity sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.16.0"
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9"
integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==
-"@babel/helper-remap-async-to-generator@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz#51439c913612958f54a987a4ffc9ee587a2045d6"
- integrity sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==
+"@babel/helper-remap-async-to-generator@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz#d5aa3b086e13a5fe05238ff40c3a5a0c2dab3ead"
+ integrity sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.14.5"
- "@babel/helper-wrap-function" "^7.14.5"
- "@babel/types" "^7.14.5"
+ "@babel/helper-annotate-as-pure" "^7.16.0"
+ "@babel/helper-wrap-function" "^7.16.0"
+ "@babel/types" "^7.16.0"
-"@babel/helper-replace-supers@^7.14.5", "@babel/helper-replace-supers@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4"
- integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==
+"@babel/helper-replace-supers@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz#73055e8d3cf9bcba8ddb55cad93fedc860f68f17"
+ integrity sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==
dependencies:
- "@babel/helper-member-expression-to-functions" "^7.15.0"
- "@babel/helper-optimise-call-expression" "^7.14.5"
- "@babel/traverse" "^7.15.0"
- "@babel/types" "^7.15.0"
+ "@babel/helper-member-expression-to-functions" "^7.16.0"
+ "@babel/helper-optimise-call-expression" "^7.16.0"
+ "@babel/traverse" "^7.16.0"
+ "@babel/types" "^7.16.0"
-"@babel/helper-simple-access@^7.14.8":
- version "7.14.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924"
- integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==
+"@babel/helper-simple-access@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz#21d6a27620e383e37534cf6c10bba019a6f90517"
+ integrity sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==
dependencies:
- "@babel/types" "^7.14.8"
+ "@babel/types" "^7.16.0"
-"@babel/helper-skip-transparent-expression-wrappers@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4"
- integrity sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==
+"@babel/helper-skip-transparent-expression-wrappers@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09"
+ integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.16.0"
-"@babel/helper-split-export-declaration@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a"
- integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==
+"@babel/helper-split-export-declaration@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz#29672f43663e936df370aaeb22beddb3baec7438"
+ integrity sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==
dependencies:
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.16.0"
-"@babel/helper-validator-identifier@^7.14.5", "@babel/helper-validator-identifier@^7.14.9":
- version "7.14.9"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48"
- integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==
+"@babel/helper-validator-identifier@^7.15.7":
+ version "7.15.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389"
+ integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==
"@babel/helper-validator-option@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3"
integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==
-"@babel/helper-wrap-function@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz#5919d115bf0fe328b8a5d63bcb610f51601f2bff"
- integrity sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==
+"@babel/helper-wrap-function@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz#b3cf318afce774dfe75b86767cd6d68f3482e57c"
+ integrity sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==
dependencies:
- "@babel/helper-function-name" "^7.14.5"
- "@babel/template" "^7.14.5"
- "@babel/traverse" "^7.14.5"
- "@babel/types" "^7.14.5"
+ "@babel/helper-function-name" "^7.16.0"
+ "@babel/template" "^7.16.0"
+ "@babel/traverse" "^7.16.0"
+ "@babel/types" "^7.16.0"
-"@babel/helpers@^7.14.8":
- version "7.15.3"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.3.tgz#c96838b752b95dcd525b4e741ed40bb1dc2a1357"
- integrity sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==
+"@babel/helpers@^7.16.0":
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c"
+ integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==
dependencies:
- "@babel/template" "^7.14.5"
- "@babel/traverse" "^7.15.0"
- "@babel/types" "^7.15.0"
+ "@babel/template" "^7.16.0"
+ "@babel/traverse" "^7.16.3"
+ "@babel/types" "^7.16.0"
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
- integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
+"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a"
+ integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==
dependencies:
- "@babel/helper-validator-identifier" "^7.14.5"
+ "@babel/helper-validator-identifier" "^7.15.7"
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.14.5", "@babel/parser@^7.15.0", "@babel/parser@^7.7.0":
- version "7.15.3"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862"
- integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==
+"@babel/parser@^7.16.0", "@babel/parser@^7.16.3", "@babel/parser@^7.7.0":
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.3.tgz#271bafcb811080905a119222edbc17909c82261d"
+ integrity sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e"
- integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.0":
+ version "7.16.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz#2977fca9b212db153c195674e57cfab807733183"
+ integrity sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
- "@babel/plugin-proposal-optional-chaining" "^7.14.5"
-"@babel/plugin-proposal-async-generator-functions@^7.14.9":
- version "7.14.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz#7028dc4fa21dc199bbacf98b39bab1267d0eaf9a"
- integrity sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz#358972eaab006f5eb0826183b0c93cbcaf13e1e2"
+ integrity sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-remap-async-to-generator" "^7.14.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+ "@babel/plugin-proposal-optional-chaining" "^7.16.0"
+
+"@babel/plugin-proposal-async-generator-functions@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz#11425d47a60364352f668ad5fbc1d6596b2c5caf"
+ integrity sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-remap-async-to-generator" "^7.16.0"
"@babel/plugin-syntax-async-generators" "^7.8.4"
-"@babel/plugin-proposal-class-properties@^7.14.5", "@babel/plugin-proposal-class-properties@^7.8.3":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz#40d1ee140c5b1e31a350f4f5eed945096559b42e"
- integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==
+"@babel/plugin-proposal-class-properties@^7.16.0", "@babel/plugin-proposal-class-properties@^7.8.3":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz#c029618267ddebc7280fa286e0f8ca2a278a2d1a"
+ integrity sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.14.5"
+ "@babel/helper-create-class-features-plugin" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-proposal-class-static-block@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz#158e9e10d449c3849ef3ecde94a03d9f1841b681"
- integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==
+"@babel/plugin-proposal-class-static-block@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz#5296942c564d8144c83eea347d0aa8a0b89170e7"
+ integrity sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.14.5"
+ "@babel/helper-create-class-features-plugin" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
"@babel/plugin-proposal-decorators@^7.8.3":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.14.5.tgz#59bc4dfc1d665b5a6749cf798ff42297ed1b2c1d"
- integrity sha512-LYz5nvQcvYeRVjui1Ykn28i+3aUiXwQ/3MGoEy0InTaz1pJo/lAzmIDXX+BQny/oufgHzJ6vnEEiXQ8KZjEVFg==
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.16.0.tgz#515db5f6891611c0d176b63ede0844fbd9be797b"
+ integrity sha512-ttvhKuVnQwoNQrcTd1oe6o49ahaZ1kns1fsJKzTVOaS/FJDJoK4qzgVS68xzJhYUMgTnbXW6z/T6rlP3lL7tJw==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.14.5"
+ "@babel/helper-create-class-features-plugin" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/plugin-syntax-decorators" "^7.14.5"
+ "@babel/plugin-syntax-decorators" "^7.16.0"
-"@babel/plugin-proposal-dynamic-import@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz#0c6617df461c0c1f8fff3b47cd59772360101d2c"
- integrity sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==
+"@babel/plugin-proposal-dynamic-import@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz#783eca61d50526202f9b296095453977e88659f1"
+ integrity sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
-"@babel/plugin-proposal-export-namespace-from@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz#dbad244310ce6ccd083072167d8cea83a52faf76"
- integrity sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==
+"@babel/plugin-proposal-export-namespace-from@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz#9c01dee40b9d6b847b656aaf4a3976a71740f222"
+ integrity sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-"@babel/plugin-proposal-json-strings@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz#38de60db362e83a3d8c944ac858ddf9f0c2239eb"
- integrity sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==
+"@babel/plugin-proposal-json-strings@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz#cae35a95ed1d2a7fa29c4dc41540b84a72e9ab25"
+ integrity sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-json-strings" "^7.8.3"
-"@babel/plugin-proposal-logical-assignment-operators@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz#6e6229c2a99b02ab2915f82571e0cc646a40c738"
- integrity sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==
+"@babel/plugin-proposal-logical-assignment-operators@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz#a711b8ceb3ffddd3ef88d3a49e86dbd3cc7db3fd"
+ integrity sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6"
- integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz#44e1cce08fe2427482cf446a91bb451528ed0596"
+ integrity sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-"@babel/plugin-proposal-numeric-separator@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz#83631bf33d9a51df184c2102a069ac0c58c05f18"
- integrity sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==
+"@babel/plugin-proposal-numeric-separator@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz#5d418e4fbbf8b9b7d03125d3a52730433a373734"
+ integrity sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-proposal-object-rest-spread@^7.14.7":
- version "7.14.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363"
- integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==
+"@babel/plugin-proposal-object-rest-spread@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz#5fb32f6d924d6e6712810362a60e12a2609872e6"
+ integrity sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==
dependencies:
- "@babel/compat-data" "^7.14.7"
- "@babel/helper-compilation-targets" "^7.14.5"
+ "@babel/compat-data" "^7.16.0"
+ "@babel/helper-compilation-targets" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.14.5"
+ "@babel/plugin-transform-parameters" "^7.16.0"
-"@babel/plugin-proposal-optional-catch-binding@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz#939dd6eddeff3a67fdf7b3f044b5347262598c3c"
- integrity sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==
+"@babel/plugin-proposal-optional-catch-binding@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz#5910085811ab4c28b00d6ebffa4ab0274d1e5f16"
+ integrity sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-"@babel/plugin-proposal-optional-chaining@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603"
- integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==
+"@babel/plugin-proposal-optional-chaining@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz#56dbc3970825683608e9efb55ea82c2a2d6c8dc0"
+ integrity sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
-"@babel/plugin-proposal-private-methods@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz#37446495996b2945f30f5be5b60d5e2aa4f5792d"
- integrity sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==
+"@babel/plugin-proposal-private-methods@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz#b4dafb9c717e4301c5776b30d080d6383c89aff6"
+ integrity sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.14.5"
+ "@babel/helper-create-class-features-plugin" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-proposal-private-property-in-object@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636"
- integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==
+"@babel/plugin-proposal-private-property-in-object@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz#69e935b2c5c79d2488112d886f0c4e2790fee76f"
+ integrity sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.14.5"
- "@babel/helper-create-class-features-plugin" "^7.14.5"
+ "@babel/helper-annotate-as-pure" "^7.16.0"
+ "@babel/helper-create-class-features-plugin" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-"@babel/plugin-proposal-unicode-property-regex@^7.14.5", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz#0f95ee0e757a5d647f378daa0eca7e93faa8bbe8"
- integrity sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==
+"@babel/plugin-proposal-unicode-property-regex@^7.16.0", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz#890482dfc5ea378e42e19a71e709728cabf18612"
+ integrity sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.14.5"
+ "@babel/helper-create-regexp-features-plugin" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-async-generators@^7.8.4":
@@ -523,10 +530,10 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-decorators@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.14.5.tgz#eafb9c0cbe09c8afeb964ba3a7bbd63945a72f20"
- integrity sha512-c4sZMRWL4GSvP1EXy0woIP7m4jkVcEuG8R1TOZxPBPtp4FSM/kiPZub9UIs/Jrb5ZAOzvTUSGYrWsrSu1JvoPw==
+"@babel/plugin-syntax-decorators@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.16.0.tgz#eb8d811cdd1060f6ac3c00956bf3f6335505a32f"
+ integrity sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
@@ -552,9 +559,9 @@
"@babel/helper-plugin-utils" "^7.8.0"
"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.8.3":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz#000e2e25d8673cce49300517a3eda44c263e4201"
- integrity sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.0.tgz#f9624394317365a9a88c82358d3f8471154698f1"
+ integrity sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
@@ -614,291 +621,292 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-arrow-functions@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz#f7187d9588a768dd080bf4c9ffe117ea62f7862a"
- integrity sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==
+"@babel/plugin-transform-arrow-functions@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz#951706f8b449c834ed07bd474c0924c944b95a8e"
+ integrity sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-async-to-generator@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz#72c789084d8f2094acb945633943ef8443d39e67"
- integrity sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==
+"@babel/plugin-transform-async-to-generator@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz#df12637f9630ddfa0ef9d7a11bc414d629d38604"
+ integrity sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==
dependencies:
- "@babel/helper-module-imports" "^7.14.5"
+ "@babel/helper-module-imports" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-remap-async-to-generator" "^7.14.5"
+ "@babel/helper-remap-async-to-generator" "^7.16.0"
-"@babel/plugin-transform-block-scoped-functions@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz#e48641d999d4bc157a67ef336aeb54bc44fd3ad4"
- integrity sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==
+"@babel/plugin-transform-block-scoped-functions@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz#c618763233ad02847805abcac4c345ce9de7145d"
+ integrity sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-block-scoping@^7.14.5":
- version "7.15.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf"
- integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==
+"@babel/plugin-transform-block-scoping@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz#bcf433fb482fe8c3d3b4e8a66b1c4a8e77d37c16"
+ integrity sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-classes@^7.14.9":
- version "7.14.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz#2a391ffb1e5292710b00f2e2c210e1435e7d449f"
- integrity sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==
+"@babel/plugin-transform-classes@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz#54cf5ff0b2242c6573d753cd4bfc7077a8b282f5"
+ integrity sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.14.5"
- "@babel/helper-function-name" "^7.14.5"
- "@babel/helper-optimise-call-expression" "^7.14.5"
+ "@babel/helper-annotate-as-pure" "^7.16.0"
+ "@babel/helper-function-name" "^7.16.0"
+ "@babel/helper-optimise-call-expression" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-replace-supers" "^7.14.5"
- "@babel/helper-split-export-declaration" "^7.14.5"
+ "@babel/helper-replace-supers" "^7.16.0"
+ "@babel/helper-split-export-declaration" "^7.16.0"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz#1b9d78987420d11223d41195461cc43b974b204f"
- integrity sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==
+"@babel/plugin-transform-computed-properties@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz#e0c385507d21e1b0b076d66bed6d5231b85110b7"
+ integrity sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-destructuring@^7.14.7":
- version "7.14.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz#0ad58ed37e23e22084d109f185260835e5557576"
- integrity sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==
+"@babel/plugin-transform-destructuring@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz#ad3d7e74584ad5ea4eadb1e6642146c590dee33c"
+ integrity sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-dotall-regex@^7.14.5", "@babel/plugin-transform-dotall-regex@^7.4.4":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz#2f6bf76e46bdf8043b4e7e16cf24532629ba0c7a"
- integrity sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==
+"@babel/plugin-transform-dotall-regex@^7.16.0", "@babel/plugin-transform-dotall-regex@^7.4.4":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz#50bab00c1084b6162d0a58a818031cf57798e06f"
+ integrity sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.14.5"
+ "@babel/helper-create-regexp-features-plugin" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-duplicate-keys@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz#365a4844881bdf1501e3a9f0270e7f0f91177954"
- integrity sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==
+"@babel/plugin-transform-duplicate-keys@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz#8bc2e21813e3e89e5e5bf3b60aa5fc458575a176"
+ integrity sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-exponentiation-operator@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz#5154b8dd6a3dfe6d90923d61724bd3deeb90b493"
- integrity sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==
+"@babel/plugin-transform-exponentiation-operator@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz#a180cd2881e3533cef9d3901e48dad0fbeff4be4"
+ integrity sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5"
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-for-of@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb"
- integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==
+"@babel/plugin-transform-for-of@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz#f7abaced155260e2461359bbc7c7248aca5e6bd2"
+ integrity sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-function-name@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz#e81c65ecb900746d7f31802f6bed1f52d915d6f2"
- integrity sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==
+"@babel/plugin-transform-function-name@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz#02e3699c284c6262236599f751065c5d5f1f400e"
+ integrity sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==
dependencies:
- "@babel/helper-function-name" "^7.14.5"
+ "@babel/helper-function-name" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-literals@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz#41d06c7ff5d4d09e3cf4587bd3ecf3930c730f78"
- integrity sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==
+"@babel/plugin-transform-literals@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz#79711e670ffceb31bd298229d50f3621f7980cac"
+ integrity sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-member-expression-literals@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz#b39cd5212a2bf235a617d320ec2b48bcc091b8a7"
- integrity sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==
+"@babel/plugin-transform-member-expression-literals@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz#5251b4cce01eaf8314403d21aedb269d79f5e64b"
+ integrity sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-modules-amd@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7"
- integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==
+"@babel/plugin-transform-modules-amd@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz#09abd41e18dcf4fd479c598c1cef7bd39eb1337e"
+ integrity sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==
dependencies:
- "@babel/helper-module-transforms" "^7.14.5"
+ "@babel/helper-module-transforms" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-commonjs@^7.15.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz#3305896e5835f953b5cdb363acd9e8c2219a5281"
- integrity sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==
+"@babel/plugin-transform-modules-commonjs@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz#add58e638c8ddc4875bd9a9ecb5c594613f6c922"
+ integrity sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==
dependencies:
- "@babel/helper-module-transforms" "^7.15.0"
+ "@babel/helper-module-transforms" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-simple-access" "^7.14.8"
+ "@babel/helper-simple-access" "^7.16.0"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-systemjs@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz#c75342ef8b30dcde4295d3401aae24e65638ed29"
- integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==
+"@babel/plugin-transform-modules-systemjs@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz#a92cf240afeb605f4ca16670453024425e421ea4"
+ integrity sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==
dependencies:
- "@babel/helper-hoist-variables" "^7.14.5"
- "@babel/helper-module-transforms" "^7.14.5"
+ "@babel/helper-hoist-variables" "^7.16.0"
+ "@babel/helper-module-transforms" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-validator-identifier" "^7.14.5"
+ "@babel/helper-validator-identifier" "^7.15.7"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-umd@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz#fb662dfee697cce274a7cda525190a79096aa6e0"
- integrity sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==
+"@babel/plugin-transform-modules-umd@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz#195f26c2ad6d6a391b70880effce18ce625e06a7"
+ integrity sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==
dependencies:
- "@babel/helper-module-transforms" "^7.14.5"
+ "@babel/helper-module-transforms" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9":
- version "7.14.9"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2"
- integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz#d3db61cc5d5b97986559967cd5ea83e5c32096ca"
+ integrity sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.14.5"
+ "@babel/helper-create-regexp-features-plugin" "^7.16.0"
-"@babel/plugin-transform-new-target@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz#31bdae8b925dc84076ebfcd2a9940143aed7dbf8"
- integrity sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==
+"@babel/plugin-transform-new-target@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz#af823ab576f752215a49937779a41ca65825ab35"
+ integrity sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-object-super@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz#d0b5faeac9e98597a161a9cf78c527ed934cdc45"
- integrity sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==
+"@babel/plugin-transform-object-super@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz#fb20d5806dc6491a06296ac14ea8e8d6fedda72b"
+ integrity sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-replace-supers" "^7.14.5"
+ "@babel/helper-replace-supers" "^7.16.0"
-"@babel/plugin-transform-parameters@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3"
- integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==
+"@babel/plugin-transform-parameters@^7.16.0":
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz#fa9e4c874ee5223f891ee6fa8d737f4766d31d15"
+ integrity sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-property-literals@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz#0ddbaa1f83db3606f1cdf4846fa1dfb473458b34"
- integrity sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==
+"@babel/plugin-transform-property-literals@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz#a95c552189a96a00059f6776dc4e00e3690c78d1"
+ integrity sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-regenerator@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz#9676fd5707ed28f522727c5b3c0aa8544440b04f"
- integrity sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==
+"@babel/plugin-transform-regenerator@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz#eaee422c84b0232d03aea7db99c97deeaf6125a4"
+ integrity sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==
dependencies:
regenerator-transform "^0.14.2"
-"@babel/plugin-transform-reserved-words@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz#c44589b661cfdbef8d4300dcc7469dffa92f8304"
- integrity sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==
+"@babel/plugin-transform-reserved-words@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz#fff4b9dcb19e12619394bda172d14f2d04c0379c"
+ integrity sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-transform-runtime@^7.11.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz#d3aa650d11678ca76ce294071fda53d7804183b3"
- integrity sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.0.tgz#3fe0da36c2f0834bef7c4d3e7f2b2db0ee0c8909"
+ integrity sha512-zlPf1/XFn5+vWdve3AAhf+Sxl+MVa5VlwTwWgnLx23u4GlatSRQJ3Eoo9vllf0a9il3woQsT4SK+5Z7c06h8ag==
dependencies:
- "@babel/helper-module-imports" "^7.14.5"
+ "@babel/helper-module-imports" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
- babel-plugin-polyfill-corejs2 "^0.2.2"
- babel-plugin-polyfill-corejs3 "^0.2.2"
- babel-plugin-polyfill-regenerator "^0.2.2"
+ babel-plugin-polyfill-corejs2 "^0.2.3"
+ babel-plugin-polyfill-corejs3 "^0.3.0"
+ babel-plugin-polyfill-regenerator "^0.2.3"
semver "^6.3.0"
-"@babel/plugin-transform-shorthand-properties@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz#97f13855f1409338d8cadcbaca670ad79e091a58"
- integrity sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==
+"@babel/plugin-transform-shorthand-properties@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz#090372e3141f7cc324ed70b3daf5379df2fa384d"
+ integrity sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-spread@^7.14.6":
- version "7.14.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz#6bd40e57fe7de94aa904851963b5616652f73144"
- integrity sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==
+"@babel/plugin-transform-spread@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz#d21ca099bbd53ab307a8621e019a7bd0f40cdcfb"
+ integrity sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
-"@babel/plugin-transform-sticky-regex@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz#5b617542675e8b7761294381f3c28c633f40aeb9"
- integrity sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==
+"@babel/plugin-transform-sticky-regex@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz#c35ea31a02d86be485f6aa510184b677a91738fd"
+ integrity sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-template-literals@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz#a5f2bc233937d8453885dc736bdd8d9ffabf3d93"
- integrity sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==
+"@babel/plugin-transform-template-literals@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz#a8eced3a8e7b8e2d40ec4ec4548a45912630d302"
+ integrity sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-typeof-symbol@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz#39af2739e989a2bd291bf6b53f16981423d457d4"
- integrity sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==
+"@babel/plugin-transform-typeof-symbol@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz#8b19a244c6f8c9d668dca6a6f754ad6ead1128f2"
+ integrity sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-unicode-escapes@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b"
- integrity sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==
+"@babel/plugin-transform-unicode-escapes@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz#1a354064b4c45663a32334f46fa0cf6100b5b1f3"
+ integrity sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-unicode-regex@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz#4cd09b6c8425dd81255c7ceb3fb1836e7414382e"
- integrity sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==
+"@babel/plugin-transform-unicode-regex@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz#293b80950177c8c85aede87cef280259fb995402"
+ integrity sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.14.5"
+ "@babel/helper-create-regexp-features-plugin" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/preset-env@^7.11.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.0.tgz#e2165bf16594c9c05e52517a194bf6187d6fe464"
- integrity sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q==
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.0.tgz#97228393d217560d6a1c6c56f0adb9d12bca67f5"
+ integrity sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==
dependencies:
- "@babel/compat-data" "^7.15.0"
- "@babel/helper-compilation-targets" "^7.15.0"
+ "@babel/compat-data" "^7.16.0"
+ "@babel/helper-compilation-targets" "^7.16.0"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/helper-validator-option" "^7.14.5"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5"
- "@babel/plugin-proposal-async-generator-functions" "^7.14.9"
- "@babel/plugin-proposal-class-properties" "^7.14.5"
- "@babel/plugin-proposal-class-static-block" "^7.14.5"
- "@babel/plugin-proposal-dynamic-import" "^7.14.5"
- "@babel/plugin-proposal-export-namespace-from" "^7.14.5"
- "@babel/plugin-proposal-json-strings" "^7.14.5"
- "@babel/plugin-proposal-logical-assignment-operators" "^7.14.5"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5"
- "@babel/plugin-proposal-numeric-separator" "^7.14.5"
- "@babel/plugin-proposal-object-rest-spread" "^7.14.7"
- "@babel/plugin-proposal-optional-catch-binding" "^7.14.5"
- "@babel/plugin-proposal-optional-chaining" "^7.14.5"
- "@babel/plugin-proposal-private-methods" "^7.14.5"
- "@babel/plugin-proposal-private-property-in-object" "^7.14.5"
- "@babel/plugin-proposal-unicode-property-regex" "^7.14.5"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.0"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.0"
+ "@babel/plugin-proposal-async-generator-functions" "^7.16.0"
+ "@babel/plugin-proposal-class-properties" "^7.16.0"
+ "@babel/plugin-proposal-class-static-block" "^7.16.0"
+ "@babel/plugin-proposal-dynamic-import" "^7.16.0"
+ "@babel/plugin-proposal-export-namespace-from" "^7.16.0"
+ "@babel/plugin-proposal-json-strings" "^7.16.0"
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.16.0"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0"
+ "@babel/plugin-proposal-numeric-separator" "^7.16.0"
+ "@babel/plugin-proposal-object-rest-spread" "^7.16.0"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.16.0"
+ "@babel/plugin-proposal-optional-chaining" "^7.16.0"
+ "@babel/plugin-proposal-private-methods" "^7.16.0"
+ "@babel/plugin-proposal-private-property-in-object" "^7.16.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.16.0"
"@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"
@@ -913,50 +921,50 @@
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
"@babel/plugin-syntax-top-level-await" "^7.14.5"
- "@babel/plugin-transform-arrow-functions" "^7.14.5"
- "@babel/plugin-transform-async-to-generator" "^7.14.5"
- "@babel/plugin-transform-block-scoped-functions" "^7.14.5"
- "@babel/plugin-transform-block-scoping" "^7.14.5"
- "@babel/plugin-transform-classes" "^7.14.9"
- "@babel/plugin-transform-computed-properties" "^7.14.5"
- "@babel/plugin-transform-destructuring" "^7.14.7"
- "@babel/plugin-transform-dotall-regex" "^7.14.5"
- "@babel/plugin-transform-duplicate-keys" "^7.14.5"
- "@babel/plugin-transform-exponentiation-operator" "^7.14.5"
- "@babel/plugin-transform-for-of" "^7.14.5"
- "@babel/plugin-transform-function-name" "^7.14.5"
- "@babel/plugin-transform-literals" "^7.14.5"
- "@babel/plugin-transform-member-expression-literals" "^7.14.5"
- "@babel/plugin-transform-modules-amd" "^7.14.5"
- "@babel/plugin-transform-modules-commonjs" "^7.15.0"
- "@babel/plugin-transform-modules-systemjs" "^7.14.5"
- "@babel/plugin-transform-modules-umd" "^7.14.5"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9"
- "@babel/plugin-transform-new-target" "^7.14.5"
- "@babel/plugin-transform-object-super" "^7.14.5"
- "@babel/plugin-transform-parameters" "^7.14.5"
- "@babel/plugin-transform-property-literals" "^7.14.5"
- "@babel/plugin-transform-regenerator" "^7.14.5"
- "@babel/plugin-transform-reserved-words" "^7.14.5"
- "@babel/plugin-transform-shorthand-properties" "^7.14.5"
- "@babel/plugin-transform-spread" "^7.14.6"
- "@babel/plugin-transform-sticky-regex" "^7.14.5"
- "@babel/plugin-transform-template-literals" "^7.14.5"
- "@babel/plugin-transform-typeof-symbol" "^7.14.5"
- "@babel/plugin-transform-unicode-escapes" "^7.14.5"
- "@babel/plugin-transform-unicode-regex" "^7.14.5"
- "@babel/preset-modules" "^0.1.4"
- "@babel/types" "^7.15.0"
- babel-plugin-polyfill-corejs2 "^0.2.2"
- babel-plugin-polyfill-corejs3 "^0.2.2"
- babel-plugin-polyfill-regenerator "^0.2.2"
- core-js-compat "^3.16.0"
+ "@babel/plugin-transform-arrow-functions" "^7.16.0"
+ "@babel/plugin-transform-async-to-generator" "^7.16.0"
+ "@babel/plugin-transform-block-scoped-functions" "^7.16.0"
+ "@babel/plugin-transform-block-scoping" "^7.16.0"
+ "@babel/plugin-transform-classes" "^7.16.0"
+ "@babel/plugin-transform-computed-properties" "^7.16.0"
+ "@babel/plugin-transform-destructuring" "^7.16.0"
+ "@babel/plugin-transform-dotall-regex" "^7.16.0"
+ "@babel/plugin-transform-duplicate-keys" "^7.16.0"
+ "@babel/plugin-transform-exponentiation-operator" "^7.16.0"
+ "@babel/plugin-transform-for-of" "^7.16.0"
+ "@babel/plugin-transform-function-name" "^7.16.0"
+ "@babel/plugin-transform-literals" "^7.16.0"
+ "@babel/plugin-transform-member-expression-literals" "^7.16.0"
+ "@babel/plugin-transform-modules-amd" "^7.16.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.16.0"
+ "@babel/plugin-transform-modules-systemjs" "^7.16.0"
+ "@babel/plugin-transform-modules-umd" "^7.16.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.0"
+ "@babel/plugin-transform-new-target" "^7.16.0"
+ "@babel/plugin-transform-object-super" "^7.16.0"
+ "@babel/plugin-transform-parameters" "^7.16.0"
+ "@babel/plugin-transform-property-literals" "^7.16.0"
+ "@babel/plugin-transform-regenerator" "^7.16.0"
+ "@babel/plugin-transform-reserved-words" "^7.16.0"
+ "@babel/plugin-transform-shorthand-properties" "^7.16.0"
+ "@babel/plugin-transform-spread" "^7.16.0"
+ "@babel/plugin-transform-sticky-regex" "^7.16.0"
+ "@babel/plugin-transform-template-literals" "^7.16.0"
+ "@babel/plugin-transform-typeof-symbol" "^7.16.0"
+ "@babel/plugin-transform-unicode-escapes" "^7.16.0"
+ "@babel/plugin-transform-unicode-regex" "^7.16.0"
+ "@babel/preset-modules" "^0.1.5"
+ "@babel/types" "^7.16.0"
+ babel-plugin-polyfill-corejs2 "^0.2.3"
+ babel-plugin-polyfill-corejs3 "^0.3.0"
+ babel-plugin-polyfill-regenerator "^0.2.3"
+ core-js-compat "^3.19.0"
semver "^6.3.0"
-"@babel/preset-modules@^0.1.4":
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz#362f2b68c662842970fdb5e254ffc8fc1c2e415e"
- integrity sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==
+"@babel/preset-modules@^0.1.5":
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
+ integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
@@ -965,42 +973,42 @@
esutils "^2.0.2"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.0", "@babel/runtime@^7.13.10", "@babel/runtime@^7.3.4", "@babel/runtime@^7.8.4":
- version "7.15.3"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.15.3.tgz#2e1c2880ca118e5b2f9988322bd8a7656a32502b"
- integrity sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5"
+ integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/template@^7.0.0", "@babel/template@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4"
- integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==
+"@babel/template@^7.0.0", "@babel/template@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6"
+ integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==
dependencies:
- "@babel/code-frame" "^7.14.5"
- "@babel/parser" "^7.14.5"
- "@babel/types" "^7.14.5"
+ "@babel/code-frame" "^7.16.0"
+ "@babel/parser" "^7.16.0"
+ "@babel/types" "^7.16.0"
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5", "@babel/traverse@^7.15.0", "@babel/traverse@^7.7.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98"
- integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3", "@babel/traverse@^7.7.0":
+ version "7.16.3"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787"
+ integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==
dependencies:
- "@babel/code-frame" "^7.14.5"
- "@babel/generator" "^7.15.0"
- "@babel/helper-function-name" "^7.14.5"
- "@babel/helper-hoist-variables" "^7.14.5"
- "@babel/helper-split-export-declaration" "^7.14.5"
- "@babel/parser" "^7.15.0"
- "@babel/types" "^7.15.0"
+ "@babel/code-frame" "^7.16.0"
+ "@babel/generator" "^7.16.0"
+ "@babel/helper-function-name" "^7.16.0"
+ "@babel/helper-hoist-variables" "^7.16.0"
+ "@babel/helper-split-export-declaration" "^7.16.0"
+ "@babel/parser" "^7.16.3"
+ "@babel/types" "^7.16.0"
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@^7.0.0", "@babel/types@^7.14.5", "@babel/types@^7.14.8", "@babel/types@^7.15.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
- version "7.15.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd"
- integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==
+"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba"
+ integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==
dependencies:
- "@babel/helper-validator-identifier" "^7.14.9"
+ "@babel/helper-validator-identifier" "^7.15.7"
to-fast-properties "^2.0.0"
"@begin/hashid@~1.0.0":
@@ -1023,6 +1031,11 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
+"@formschema/native@^2.0.0-beta.5":
+ version "2.0.0-beta.6"
+ resolved "https://registry.yarnpkg.com/@formschema/native/-/native-2.0.0-beta.6.tgz#a0f87b6f13650c6c1539d432737f82bcf5899072"
+ integrity sha512-laXpuj1gYX9an/aBw6QJGyuAjYQZiRXkVQZkxo9AZrxUCpGX2wQA1v9eV+iCM6pvr7aF4hr9MzNyxYUaKrWsiQ==
+
"@hapi/address@2.x.x":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz#5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5"
@@ -1065,9 +1078,9 @@
minimatch "^3.0.4"
"@humanwhocodes/object-schema@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf"
- integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
"@intervolga/optimize-cssnano-plugin@^1.0.5":
version "1.0.6"
@@ -1091,79 +1104,79 @@
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
-"@sentry/browser@6.11.0":
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.11.0.tgz#9e90bbc0488ebcdd1e67937d8d5b4f13c3f6dee0"
- integrity sha512-Qr2QRA0t5/S9QQqxzYKvM9W8prvmiWuldfwRX4hubovXzcXLgUi4WK0/H612wSbYZ4dNAEcQbtlxFWJNN4wxdg==
+"@sentry/browser@6.14.1":
+ version "6.14.1"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.14.1.tgz#4d255caf9de6e07f12b6d9b350fe391439dd932e"
+ integrity sha512-xOrKt6jT6rGhJDVwUtHtD/lLrCOEDNYCtLAh8SoJH7jE0JRSI7WK0UDPQ56M8z3II11lEw3F0TOXoK1rZ9BdrQ==
dependencies:
- "@sentry/core" "6.11.0"
- "@sentry/types" "6.11.0"
- "@sentry/utils" "6.11.0"
+ "@sentry/core" "6.14.1"
+ "@sentry/types" "6.14.1"
+ "@sentry/utils" "6.14.1"
tslib "^1.9.3"
-"@sentry/core@6.11.0":
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.11.0.tgz#40e94043afcf6407a109be26655c77832c64e740"
- integrity sha512-09TB+f3pqEq8LFahFWHO6I/4DxHo+NcS52OkbWMDqEi6oNZRD7PhPn3i14LfjsYVv3u3AESU8oxSEGbFrr2UjQ==
+"@sentry/core@6.14.1":
+ version "6.14.1"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.14.1.tgz#cbb6eae808279ae2147dd5da22ce6ab5a1cd69d1"
+ integrity sha512-x2MOax+adphal0ytBsvQukwN5mcxZzb5zsPZ1YWzewQk3BY+2T/DFo50iVpaWdUXsJL2FtoZVVgtpTmf+/3JPw==
dependencies:
- "@sentry/hub" "6.11.0"
- "@sentry/minimal" "6.11.0"
- "@sentry/types" "6.11.0"
- "@sentry/utils" "6.11.0"
+ "@sentry/hub" "6.14.1"
+ "@sentry/minimal" "6.14.1"
+ "@sentry/types" "6.14.1"
+ "@sentry/utils" "6.14.1"
tslib "^1.9.3"
-"@sentry/hub@6.11.0":
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.11.0.tgz#ddf9ddb0577d1c8290dc02c0242d274fe84d6c16"
- integrity sha512-pT9hf+ZJfVFpoZopoC+yJmFNclr4NPqPcl2cgguqCHb69DklD1NxgBNWK8D6X05qjnNFDF991U6t1mxP9HrGuw==
+"@sentry/hub@6.14.1":
+ version "6.14.1"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.14.1.tgz#6a82cae35de834bd92bbcd3912a1e3029a5369de"
+ integrity sha512-IqANj5qKG1N+nqBsuYIwAZsXDMmO/Sc4H2zZ2MP7QvRyp0ptpJmu1oTE0r0fohIcGgIWbnIphJjw990Lp507eA==
dependencies:
- "@sentry/types" "6.11.0"
- "@sentry/utils" "6.11.0"
+ "@sentry/types" "6.14.1"
+ "@sentry/utils" "6.14.1"
tslib "^1.9.3"
-"@sentry/minimal@6.11.0":
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.11.0.tgz#806d5512658370e40827b3e3663061db708fff33"
- integrity sha512-XkZ7qrdlGp4IM/gjGxf1Q575yIbl5RvPbg+WFeekpo16Ufvzx37Mr8c2xsZaWosISVyE6eyFpooORjUlzy8EDw==
+"@sentry/minimal@6.14.1":
+ version "6.14.1"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.14.1.tgz#6fbce5b873fb096411dbb9a01ff6706ed684f2e8"
+ integrity sha512-rxS0YUggCSuA7EzS1ai5jU8XArk4FBHZ02gmSoSSLtwFXmeQIa9XBKY0OEFmG2LMQYNOpvcGsezDO51EB6/X9w==
dependencies:
- "@sentry/hub" "6.11.0"
- "@sentry/types" "6.11.0"
+ "@sentry/hub" "6.14.1"
+ "@sentry/types" "6.14.1"
tslib "^1.9.3"
-"@sentry/tracing@^6.10.0":
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.11.0.tgz#9bd9287addea1ebc12c75b226f71c7713c0fac4f"
- integrity sha512-9VA1/SY++WeoMQI4K6n/sYgIdRtCu9NLWqmGqu/5kbOtESYFgAt1DqSyqGCr00ZjQiC2s7tkDkTNZb38K6KytQ==
+"@sentry/tracing@^6.13.1":
+ version "6.14.1"
+ resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-6.14.1.tgz#fadea88b505078f61b949ecd99891ddb5538f08e"
+ integrity sha512-Bv/+S5Wn9OPxP7sA9VYMV1wpmXWptFVIMFoG4BuyV4aFYdIAMxSNE/ktqXwmqn+nkBic04nP9rF6lMJBLIvIaA==
dependencies:
- "@sentry/hub" "6.11.0"
- "@sentry/minimal" "6.11.0"
- "@sentry/types" "6.11.0"
- "@sentry/utils" "6.11.0"
+ "@sentry/hub" "6.14.1"
+ "@sentry/minimal" "6.14.1"
+ "@sentry/types" "6.14.1"
+ "@sentry/utils" "6.14.1"
tslib "^1.9.3"
-"@sentry/types@6.11.0":
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.11.0.tgz#5122685478d32ddacd3a891cbcf550012df85f7c"
- integrity sha512-gm5H9eZhL6bsIy/h3T+/Fzzz2vINhHhqd92CjHle3w7uXdTdFV98i2pDpErBGNTSNzbntqOMifYEB5ENtZAvcg==
+"@sentry/types@6.14.1":
+ version "6.14.1"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.14.1.tgz#0d562a7aa91253b7843723344b4ba03a010e6376"
+ integrity sha512-RIk3ZwQKZnASrYWfV5i4wbzVveHz8xLFAS2ySIMqh+hICKnB0N4/r8a1Of/84j7pj+iAbf5vPS85639eIf+9qg==
-"@sentry/utils@6.11.0":
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.11.0.tgz#d1dee4faf4d9c42c54bba88d5a66fb96b902a14c"
- integrity sha512-IOvyFHcnbRQxa++jO+ZUzRvFHEJ1cZjrBIQaNVc0IYF0twUOB5PTP6joTcix38ldaLeapaPZ9LGfudbvYvxkdg==
+"@sentry/utils@6.14.1":
+ version "6.14.1"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.14.1.tgz#cb746858665314c07cfe9b0f307b410e377032ad"
+ integrity sha512-GVvf0z18L4DN0a6vIBdHSlrK/Dj8QFhuiiJ8NtccSoY8xiKXQNz9FKN5d52NUNqm59aopAxcVAcs57yQSdxrZQ==
dependencies:
- "@sentry/types" "6.11.0"
+ "@sentry/types" "6.14.1"
tslib "^1.9.3"
-"@sentry/vue@^6.10.0":
- version "6.11.0"
- resolved "https://registry.yarnpkg.com/@sentry/vue/-/vue-6.11.0.tgz#e45a641a44b111340a81b93c7891ba5556399424"
- integrity sha512-K3Civ2r6R0ydPrvT3BO5UrVvpBO8+8HMZ05AzdB4rfj2BwC23cqO3p0w7Cc2TMBZ15D8qMAeE7mBiYUY189KAw==
+"@sentry/vue@^6.13.1":
+ version "6.14.1"
+ resolved "https://registry.yarnpkg.com/@sentry/vue/-/vue-6.14.1.tgz#2528d03e2068e28a6a5874f39a5686add509dd55"
+ integrity sha512-p5O8ZIlFp8Il8ageuIcbc6YHcv1y4SDlsorzJPDb9CUZi2KDa9Ok0IwCt6d2UJ5iosYAp4lxjLiwNO860Jcdkw==
dependencies:
- "@sentry/browser" "6.11.0"
- "@sentry/core" "6.11.0"
- "@sentry/minimal" "6.11.0"
- "@sentry/types" "6.11.0"
- "@sentry/utils" "6.11.0"
+ "@sentry/browser" "6.14.1"
+ "@sentry/core" "6.14.1"
+ "@sentry/minimal" "6.14.1"
+ "@sentry/types" "6.14.1"
+ "@sentry/utils" "6.14.1"
tslib "^1.9.3"
"@sindresorhus/is@^0.14.0":
@@ -1222,9 +1235,9 @@
"@types/node" "*"
"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18":
- version "4.17.24"
- resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.24.tgz#ea41f93bf7e0d59cd5a76665068ed6aab6815c07"
- integrity sha512-3UJuW+Qxhzwjq3xhwXm2onQcFHn76frIYVbTu+kn24LFxI+dEhdfISDFovPB8VpEgW8oQCTpRuCe+0zJxB7NEA==
+ version "4.17.25"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz#e42f7046adc65ece2eb6059b77aecfbe9e9f82e0"
+ integrity sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==
dependencies:
"@types/node" "*"
"@types/qs" "*"
@@ -1241,9 +1254,9 @@
"@types/serve-static" "*"
"@types/glob@^7.1.1":
- version "7.1.4"
- resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.4.tgz#ea59e21d2ee5c517914cb4bc8e4153b99e566672"
- integrity sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb"
+ integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
dependencies:
"@types/minimatch" "*"
"@types/node" "*"
@@ -1260,6 +1273,11 @@
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
+ integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4=
+
"@types/mime@^1":
version "1.3.2"
resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a"
@@ -1276,9 +1294,9 @@
integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
"@types/node@*":
- version "16.6.2"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.2.tgz#331b7b9f8621c638284787c5559423822fdffc50"
- integrity sha512-LSw8TZt12ZudbpHc6EkIyDM3nHVWKYrAvGy6EAJfNfjusbwnThqjqxUKKRwuV3iWYeW/LYMzNgaq3MaLffQ2xA==
+ version "16.11.7"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.7.tgz#36820945061326978c42a01e56b61cd223dfdc42"
+ integrity sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==
"@types/normalize-package-data@^2.4.0":
version "2.4.1"
@@ -1326,9 +1344,9 @@
source-map "^0.6.1"
"@types/webpack-dev-server@^3.11.0":
- version "3.11.5"
- resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.5.tgz#f4a254a3dd0667c8ee4af90d42afdb4ad1d607f3"
- integrity sha512-vjsbQBW3fE5FDICkF3w3ZWFRXNwQdKt7JRPLmRy5W0KXlcuew4wgpKWXhgHS71iLNv7Z2PlY9dSSIaYg+bk+9w==
+ version "3.11.6"
+ resolved "https://registry.yarnpkg.com/@types/webpack-dev-server/-/webpack-dev-server-3.11.6.tgz#d8888cfd2f0630203e13d3ed7833a4d11b8a34dc"
+ integrity sha512-XCph0RiiqFGetukCTC3KVnY1jwLcZ84illFRMbyFzCcWl90B/76ew0tSqF46oBhnLC4obNDG7dMO0JfTN0MgMQ==
dependencies:
"@types/connect-history-api-fallback" "*"
"@types/express" "*"
@@ -1346,9 +1364,9 @@
source-map "^0.7.3"
"@types/webpack@^4", "@types/webpack@^4.0.0":
- version "4.41.30"
- resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.30.tgz#fd3db6d0d41e145a8eeeafcd3c4a7ccde9068ddc"
- integrity sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA==
+ version "4.41.31"
+ resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.31.tgz#c35f252a3559ddf9c85c0d8b0b42019025e581aa"
+ integrity sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==
dependencies:
"@types/node" "*"
"@types/tapable" "^1"
@@ -1368,9 +1386,9 @@
integrity sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==
"@vue/babel-plugin-jsx@^1.0.3":
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.6.tgz#184bf3541ab6efdbe5079ab8b20c19e2af100bfb"
- integrity sha512-RzYsvBhzKUmY2YG6LoV+W5PnlnkInq0thh1AzCmewwctAgGN6e9UFon6ZrQQV1CO5G5PeME7MqpB+/vvGg0h4g==
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz#0c5bac27880d23f89894cd036a37b55ef61ddfc1"
+ integrity sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==
dependencies:
"@babel/helper-module-imports" "^7.0.0"
"@babel/plugin-syntax-jsx" "^7.0.0"
@@ -1394,10 +1412,10 @@
lodash.kebabcase "^4.1.1"
svg-tags "^1.0.0"
-"@vue/babel-preset-app@^4.5.13":
- version "4.5.13"
- resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-4.5.13.tgz#cb475321e4c73f7f110dac29a48c2a9cb80afeb6"
- integrity sha512-pM7CR3yXB6L8Gfn6EmX7FLNE3+V/15I3o33GkSNsWvgsMp6HVGXKkXgojrcfUUauyL1LZOdvTmu4enU2RePGHw==
+"@vue/babel-preset-app@^4.5.15":
+ version "4.5.15"
+ resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-4.5.15.tgz#f6bc08f8f674e98a260004234cde18b966d72eb0"
+ integrity sha512-J+YttzvwRfV1BPczf8r3qCevznYk+jh531agVF+5EYlHF4Sgh/cGXTz9qkkiux3LQgvhEGXgmCteg1n38WuuKg==
dependencies:
"@babel/core" "^7.11.0"
"@babel/helper-compilation-targets" "^7.9.6"
@@ -1479,30 +1497,30 @@
"@vue/babel-plugin-transform-vue-jsx" "^1.2.1"
camelcase "^5.0.0"
-"@vue/cli-overlay@^4.5.13":
- version "4.5.13"
- resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-4.5.13.tgz#4f1fd2161be8f69d6cba8079f3f0d7dc4dee47a7"
- integrity sha512-jhUIg3klgi5Cxhs8dnat5hi/W2tQJvsqCxR0u6hgfSob0ORODgUBlN+F/uwq7cKIe/pzedVUk1y07F13GQvPqg==
+"@vue/cli-overlay@^4.5.15":
+ version "4.5.15"
+ resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-4.5.15.tgz#0700fd6bad39336d4189ba3ff7d25e638e818c9c"
+ integrity sha512-0zI0kANAVmjFO2LWGUIzdGPMeE3+9k+KeRDXsUqB30YfRF7abjfiiRPq5BU9pOzlJbVdpRkisschBrvdJqDuDg==
"@vue/cli-plugin-babel@^4.5.12":
- version "4.5.13"
- resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.13.tgz#a89c482edcc4ea1d135645cec502a7f5fd4c30e7"
- integrity sha512-ykvEAfD8PgGs+dGMGqr7l/nRmIS39NRzWLhMluPLTvDV1L+IxcoB73HNLGA/aENDpl8CuWrTE+1VgydcOhp+wg==
+ version "4.5.15"
+ resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-4.5.15.tgz#ae4fb2ed54255fe3d84df381dab68509641179ed"
+ integrity sha512-hBLrwYfFkHldEe34op/YNgPhpOWI5n5DB2Qt9I/1Epeif4M4iFaayrgjvOR9AVM6WbD3Yx7WCFszYpWrQZpBzQ==
dependencies:
"@babel/core" "^7.11.0"
- "@vue/babel-preset-app" "^4.5.13"
- "@vue/cli-shared-utils" "^4.5.13"
+ "@vue/babel-preset-app" "^4.5.15"
+ "@vue/cli-shared-utils" "^4.5.15"
babel-loader "^8.1.0"
cache-loader "^4.1.0"
thread-loader "^2.1.3"
webpack "^4.0.0"
"@vue/cli-plugin-eslint@^4.5.12":
- version "4.5.13"
- resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.13.tgz#8baf22d0d96d76720c7506646b96f4f62c05bdfa"
- integrity sha512-yc2uXX6aBiy3vEf5TwaueaDqQbdIXIhk0x0KzEtpPo23jBdLkpOSoU5NCgE06g/ZiGAcettpmBSv73Hfp4wHEw==
+ version "4.5.15"
+ resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.15.tgz#5781824a941f34c26336a67b1f6584a06c6a24ff"
+ integrity sha512-/2Fl6wY/5bz3HD035oSnFRMsKNxDxU396KqBdpCQdwdvqk4mm6JAbXqihpcBRTNPeTO6w+LwGe6FE56PVbJdbg==
dependencies:
- "@vue/cli-shared-utils" "^4.5.13"
+ "@vue/cli-shared-utils" "^4.5.15"
eslint-loader "^2.2.1"
globby "^9.2.0"
inquirer "^7.1.0"
@@ -1510,30 +1528,30 @@
yorkie "^2.0.0"
"@vue/cli-plugin-pwa@^4.5.12":
- version "4.5.13"
- resolved "https://registry.yarnpkg.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.5.13.tgz#a800639814b6f62a38f04198c340cfaee7295c3f"
- integrity sha512-uU5pp94VU0YscfKq/mNRsKOdxG+CTqVlZWaYkRc+HCcwkJ/m/CnxgaEqQFr0QpHC8zmlX4gILO1RVYygJoR9tw==
+ version "4.5.15"
+ resolved "https://registry.yarnpkg.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.5.15.tgz#eb800c418d96b496deec9d063a1798fe6e9c2db8"
+ integrity sha512-yQzsspaIkjeQyN6btF8ATgbJFU023q1HC8uUpmiBa4QE9EyBlR8fSrKFhcJ0EmT6KnU7PMwlnOJ/OqjguFnufA==
dependencies:
- "@vue/cli-shared-utils" "^4.5.13"
+ "@vue/cli-shared-utils" "^4.5.15"
webpack "^4.0.0"
workbox-webpack-plugin "^4.3.1"
-"@vue/cli-plugin-router@^4.5.13":
- version "4.5.13"
- resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.13.tgz#0b67c8898a2bf132941919a2a2e5f3aacbd9ffbe"
- integrity sha512-tgtMDjchB/M1z8BcfV4jSOY9fZSMDTPgF9lsJIiqBWMxvBIsk9uIZHxp62DibYME4CCKb/nNK61XHaikFp+83w==
+"@vue/cli-plugin-router@^4.5.15":
+ version "4.5.15"
+ resolved "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-4.5.15.tgz#1e75c8c89df42c694f143b9f1028de3cf5d61e1e"
+ integrity sha512-q7Y6kP9b3k55Ca2j59xJ7XPA6x+iSRB+N4ac0ZbcL1TbInVQ4j5wCzyE+uqid40hLy4fUdlpl4X9fHJEwuVxPA==
dependencies:
- "@vue/cli-shared-utils" "^4.5.13"
+ "@vue/cli-shared-utils" "^4.5.15"
-"@vue/cli-plugin-vuex@^4.5.13":
- version "4.5.13"
- resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.13.tgz#98646d8bc1e69cf6c6a6cba2fed3eace0356c360"
- integrity sha512-I1S9wZC7iI0Wn8kw8Zh+A2Qkf6s1M6vTGBkx8boXjuzfwEEyEHRxadsVCecZc8Mkpydo0nykj+MyYF96TKFuVA==
+"@vue/cli-plugin-vuex@^4.5.15":
+ version "4.5.15"
+ resolved "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.5.15.tgz#466c1f02777d02fef53a9bb49a36cc3a3bcfec4e"
+ integrity sha512-fqap+4HN+w+InDxlA3hZTOGE0tzBTgXhKLoDydhywqgmhQ1D9JA6Feh94ze6tG8DsWX58/ujYUqA8jAz17FJtg==
"@vue/cli-service@^4.5.12":
- version "4.5.13"
- resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-4.5.13.tgz#a09e684a801684b6e24e5414ad30650970eec9ed"
- integrity sha512-CKAZN4iokMMsaUyJRU22oUAz3oS/X9sVBSKAF2/shFBV5xh3jqAlKl8OXZYz4cXGFLA6djNuYrniuLAo7Ku97A==
+ version "4.5.15"
+ resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-4.5.15.tgz#0e9a186d51550027d0e68e95042077eb4d115b45"
+ integrity sha512-sFWnLYVCn4zRfu45IcsIE9eXM0YpDV3S11vlM2/DVbIPAGoYo5ySpSof6aHcIvkeGsIsrHFpPHzNvDZ/efs7jA==
dependencies:
"@intervolga/optimize-cssnano-plugin" "^1.0.5"
"@soda/friendly-errors-webpack-plugin" "^1.7.1"
@@ -1541,10 +1559,10 @@
"@types/minimist" "^1.2.0"
"@types/webpack" "^4.0.0"
"@types/webpack-dev-server" "^3.11.0"
- "@vue/cli-overlay" "^4.5.13"
- "@vue/cli-plugin-router" "^4.5.13"
- "@vue/cli-plugin-vuex" "^4.5.13"
- "@vue/cli-shared-utils" "^4.5.13"
+ "@vue/cli-overlay" "^4.5.15"
+ "@vue/cli-plugin-router" "^4.5.15"
+ "@vue/cli-plugin-vuex" "^4.5.15"
+ "@vue/cli-shared-utils" "^4.5.15"
"@vue/component-compiler-utils" "^3.1.2"
"@vue/preload-webpack-plugin" "^1.1.0"
"@vue/web-component-wrapper" "^1.2.0"
@@ -1593,10 +1611,10 @@
optionalDependencies:
vue-loader-v16 "npm:vue-loader@^16.1.0"
-"@vue/cli-shared-utils@^4.5.13":
- version "4.5.13"
- resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.13.tgz#acd40f31b4790f1634292bdaa5fca95dc1e0ff50"
- integrity sha512-HpnOrkLg42RFUsQGMJv26oTG3J3FmKtO2WSRhKIIL+1ok3w9OjGCtA3nMMXN27f9eX14TqO64M36DaiSZ1fSiw==
+"@vue/cli-shared-utils@^4.5.15":
+ version "4.5.15"
+ resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.5.15.tgz#dba3858165dbe3465755f256a4890e69084532d6"
+ integrity sha512-SKaej9hHzzjKSOw1NlFmc6BSE0vcqUQMQiv1cxQ2DhVyy4QxZXBmzmiLBUBe+hYZZs1neXW7n//udeN9bCAY+Q==
dependencies:
"@hapi/joi" "^15.0.1"
chalk "^2.4.2"
@@ -1612,9 +1630,9 @@
strip-ansi "^6.0.0"
"@vue/component-compiler-utils@^3.1.0", "@vue/component-compiler-utils@^3.1.2":
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.2.2.tgz#2f7ed5feed82ff7f0284acc11d525ee7eff22460"
- integrity sha512-rAYMLmgMuqJFWAOb3Awjqqv5X3Q3hVr4jH/kgrFJpiU0j3a90tnNBplqbj+snzrgZhC9W128z+dtgMifOiMfJg==
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9"
+ integrity sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==
dependencies:
consolidate "^0.15.1"
hash-sum "^1.0.2"
@@ -1625,7 +1643,7 @@
source-map "~0.6.1"
vue-template-es2015-compiler "^1.9.0"
optionalDependencies:
- prettier "^1.18.2"
+ prettier "^1.18.2 || ^2.0.0"
"@vue/eslint-config-standard@^4.0.0":
version "4.0.0"
@@ -1833,10 +1851,10 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
mime-types "~2.1.24"
negotiator "0.6.2"
-ace-builds@^1.4.12:
- version "1.4.12"
- resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.4.12.tgz#888efa386e36f4345f40b5233fcc4fe4c588fae7"
- integrity sha512-G+chJctFPiiLGvs3+/Mly3apXTcfgE45dT5yp12BcWZ1kUs+gm0qd3/fv4gsz6fVag4mM0moHVpjHDIgph6Psg==
+ace-builds@^1.4.13:
+ version "1.4.13"
+ resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.4.13.tgz#186f42d3849ebcc6a48b93088a058489897514c1"
+ integrity sha512-SOLzdaQkY6ecPKYRDDg+MY1WoGgXA34cIvYJNNoBMGGUswHmlauU2Hy0UL96vW0Fs/LgFbMUjD+6vqzWTldIYQ==
acorn-jsx@^5.2.0, acorn-jsx@^5.3.1:
version "5.3.2"
@@ -1866,9 +1884,9 @@ acorn@^7.1.1, acorn@^7.4.0:
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.2.0:
- version "8.4.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c"
- integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2"
+ integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==
address@^1.1.2:
version "1.1.2"
@@ -1895,10 +1913,10 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.6:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^8.0.1, ajv@^8.6.2:
- version "8.6.2"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571"
- integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==
+ajv@^8.0.1, ajv@^8.6.3:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.7.1.tgz#52be6f1736b076074798124293618f132ad07a7e"
+ integrity sha512-gPpOObTO1QjbnN1sVMjJcp1TF9nggMfO4MBR5uQl6ZVTOaEPq5i4oq/6R9q2alMMPB3eg53wFv1RuJBLuxf3Hw==
dependencies:
fast-deep-equal "^3.1.1"
json-schema-traverse "^1.0.0"
@@ -1911,11 +1929,11 @@ alphanum-sort@^1.0.0:
integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
ansi-align@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
- integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59"
+ integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==
dependencies:
- string-width "^3.0.0"
+ string-width "^4.1.0"
ansi-colors@^3.0.0:
version "3.2.4"
@@ -1934,10 +1952,10 @@ ansi-escapes@^4.2.1:
dependencies:
type-fest "^0.21.3"
-ansi-html@0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
- integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4=
+ansi-html-community@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
+ integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==
ansi-regex@^2.0.0:
version "2.1.1"
@@ -1954,10 +1972,10 @@ ansi-regex@^4.1.0:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
-ansi-regex@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
- integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
@@ -2046,16 +2064,16 @@ array-flatten@^2.1.0:
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
-array-includes@^3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a"
- integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==
+array-includes@^3.1.4:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9"
+ integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
- es-abstract "^1.18.0-next.2"
+ es-abstract "^1.19.1"
get-intrinsic "^1.1.1"
- is-string "^1.0.5"
+ is-string "^1.0.7"
array-union@^1.0.1, array-union@^1.0.2:
version "1.0.2"
@@ -2074,14 +2092,14 @@ array-unique@^0.3.2:
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
-array.prototype.flat@^1.2.4:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123"
- integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==
+array.prototype.flat@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13"
+ integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==
dependencies:
- call-bind "^1.0.0"
+ call-bind "^1.0.2"
define-properties "^1.1.3"
- es-abstract "^1.18.0-next.1"
+ es-abstract "^1.19.0"
asn1.js@^5.2.0:
version "5.4.1"
@@ -2094,9 +2112,9 @@ asn1.js@^5.2.0:
safer-buffer "^2.1.0"
asn1@~0.2.3:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
- integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
+ integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
dependencies:
safer-buffer "~2.1.0"
@@ -2151,15 +2169,15 @@ atob@^2.1.2:
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
autoprefixer@^9.8.6:
- version "9.8.6"
- resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f"
- integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==
+ version "9.8.8"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a"
+ integrity sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==
dependencies:
browserslist "^4.12.0"
caniuse-lite "^1.0.30001109"
- colorette "^1.2.1"
normalize-range "^0.1.2"
num2fraction "^1.2.2"
+ picocolors "^0.2.1"
postcss "^7.0.32"
postcss-value-parser "^4.1.0"
@@ -2188,12 +2206,12 @@ aws4@^1.8.0:
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
-axios@^0.21.4:
- version "0.21.4"
- resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575"
- integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==
+axios@^0.24.0:
+ version "0.24.0"
+ resolved "https://registry.yarnpkg.com/axios/-/axios-0.24.0.tgz#804e6fa1e4b9c5288501dd9dff56a7a0940d20d6"
+ integrity sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==
dependencies:
- follow-redirects "^1.14.0"
+ follow-redirects "^1.14.4"
babel-eslint@^10.0.1:
version "10.1.0"
@@ -2215,9 +2233,9 @@ babel-extract-comments@^1.0.0:
babylon "^6.18.0"
babel-loader@^8.1.0:
- version "8.2.2"
- resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81"
- integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==
+ version "8.2.3"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d"
+ integrity sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==
dependencies:
find-cache-dir "^3.3.1"
loader-utils "^1.4.0"
@@ -2231,29 +2249,29 @@ babel-plugin-dynamic-import-node@^2.3.3:
dependencies:
object.assign "^4.1.0"
-babel-plugin-polyfill-corejs2@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz#e9124785e6fd94f94b618a7954e5693053bf5327"
- integrity sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==
+babel-plugin-polyfill-corejs2@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz#6ed8e30981b062f8fe6aca8873a37ebcc8cc1c0f"
+ integrity sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==
dependencies:
"@babel/compat-data" "^7.13.11"
- "@babel/helper-define-polyfill-provider" "^0.2.2"
+ "@babel/helper-define-polyfill-provider" "^0.2.4"
semver "^6.1.1"
-babel-plugin-polyfill-corejs3@^0.2.2:
- version "0.2.4"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz#68cb81316b0e8d9d721a92e0009ec6ecd4cd2ca9"
- integrity sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==
+babel-plugin-polyfill-corejs3@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz#fa7ca3d1ee9ddc6193600ffb632c9785d54918af"
+ integrity sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.2.2"
- core-js-compat "^3.14.0"
+ "@babel/helper-define-polyfill-provider" "^0.2.4"
+ core-js-compat "^3.18.0"
-babel-plugin-polyfill-regenerator@^0.2.2:
- version "0.2.2"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz#b310c8d642acada348c1fa3b3e6ce0e851bee077"
- integrity sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==
+babel-plugin-polyfill-regenerator@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz#2e9808f5027c4336c994992b48a4262580cb8d6d"
+ integrity sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.2.2"
+ "@babel/helper-define-polyfill-provider" "^0.2.4"
babel-plugin-syntax-object-rest-spread@^6.8.0:
version "6.13.0"
@@ -2373,7 +2391,7 @@ bn.js@^5.0.0, bn.js@^5.1.1:
resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002"
integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==
-body-parser@1.19.0, body-parser@^1.19.0, body-parser@~1.19.0:
+body-parser@1.19.0, body-parser@~1.19.0:
version "1.19.0"
resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
@@ -2407,15 +2425,15 @@ boolbase@^1.0.0, boolbase@~1.0.0:
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
boxen@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.0.1.tgz#657528bdd3f59a772b8279b831f27ec2c744664b"
- integrity sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50"
+ integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==
dependencies:
ansi-align "^3.0.0"
camelcase "^6.2.0"
chalk "^4.1.0"
cli-boxes "^2.2.1"
- string-width "^4.2.0"
+ string-width "^4.2.2"
type-fest "^0.20.2"
widest-line "^3.1.0"
wrap-ansi "^7.0.0"
@@ -2517,16 +2535,16 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
-browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.16.7:
- version "4.16.8"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.8.tgz#cb868b0b554f137ba6e33de0ecff2eda403c4fb0"
- integrity sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==
+browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.17.5, browserslist@^4.17.6:
+ version "4.17.6"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.6.tgz#c76be33e7786b497f66cad25a73756c8b938985d"
+ integrity sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==
dependencies:
- caniuse-lite "^1.0.30001251"
- colorette "^1.3.0"
- electron-to-chromium "^1.3.811"
+ caniuse-lite "^1.0.30001274"
+ electron-to-chromium "^1.3.886"
escalade "^3.1.1"
- node-releases "^1.1.75"
+ node-releases "^2.0.1"
+ picocolors "^1.0.0"
buffer-crc32@^0.2.13:
version "0.2.13"
@@ -2711,10 +2729,10 @@ caniuse-api@^3.0.0:
lodash.memoize "^4.1.2"
lodash.uniq "^4.5.0"
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001251:
- version "1.0.30001251"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001251.tgz#6853a606ec50893115db660f82c094d18f096d85"
- integrity sha512-HOe1r+9VkU4TFmnU70z+r7OLmtR+/chB1rdcJUeQlAinjEeb0cKL20tlAtOagNZhbrtLnCvV19B4FmF1rgzl6A==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001274:
+ version "1.0.30001279"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001279.tgz#eb06818da481ef5096a3b3760f43e5382ed6b0ce"
+ integrity sha512-VfEHpzHEXj6/CxggTwSFoZBBYGQfQv9Cf42KPlO79sWXCD1QNKWKsKzFeWL7QpZHJQYAvocqV6Rty1yJMkqWLQ==
case-sensitive-paths-webpack-plugin@^2.3.0:
version "2.4.0"
@@ -2834,9 +2852,9 @@ class-utils@^0.3.5:
static-extend "^0.1.1"
clean-css@4.2.x:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
- integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.4.tgz#733bf46eba4e607c6891ea57c24a989356831178"
+ integrity sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==
dependencies:
source-map "~0.6.0"
@@ -2872,9 +2890,9 @@ cli-highlight@^2.1.4:
yargs "^16.0.0"
cli-spinners@^2.0.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939"
- integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d"
+ integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==
cli-width@^3.0.0:
version "3.0.0"
@@ -2995,11 +3013,6 @@ color@^3.0.0:
color-convert "^1.9.3"
color-string "^1.6.0"
-colorette@^1.2.1, colorette@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af"
- integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==
-
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -3094,16 +3107,6 @@ connect-history-api-fallback@^1.6.0:
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
-connect@^3.7.0:
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8"
- integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==
- dependencies:
- debug "2.6.9"
- finalhandler "1.1.2"
- parseurl "~1.3.3"
- utils-merge "1.0.1"
-
console-browserify@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
@@ -3185,12 +3188,12 @@ copy-webpack-plugin@^5.1.1:
serialize-javascript "^4.0.0"
webpack-log "^2.0.0"
-core-js-compat@^3.14.0, core-js-compat@^3.16.0, core-js-compat@^3.6.5:
- version "3.16.2"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.16.2.tgz#442ef1d933ca6fc80859bd5a1db7a3ba716aaf56"
- integrity sha512-4lUshXtBXsdmp8cDWh6KKiHUg40AjiuPD3bOWkNVsr1xkAhpUqCjaZ8lB1bKx9Gb5fXcbRbFJ4f4qpRIRTuJqQ==
+core-js-compat@^3.18.0, core-js-compat@^3.19.0, core-js-compat@^3.6.5:
+ version "3.19.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.19.1.tgz#fe598f1a9bf37310d77c3813968e9f7c7bb99476"
+ integrity sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==
dependencies:
- browserslist "^4.16.7"
+ browserslist "^4.17.6"
semver "7.0.0"
core-js@^2.4.0:
@@ -3199,15 +3202,20 @@ core-js@^2.4.0:
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-js@^3.6.5:
- version "3.16.2"
- resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.16.2.tgz#3f485822889c7fc48ef463e35be5cc2a4a01a1f4"
- integrity sha512-P0KPukO6OjMpjBtHSceAZEWlDD1M2Cpzpg6dBbrjFqFhBHe/BwhxaP820xKOjRn/lZRQirrCusIpLS/n2sgXLQ==
+ version "3.19.1"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.1.tgz#f6f173cae23e73a7d88fa23b6e9da329276c6641"
+ integrity sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==
-core-util-is@1.0.2, core-util-is@~1.0.0:
+core-util-is@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
cosmiconfig@^5.0.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
@@ -3395,9 +3403,9 @@ css-what@^3.2.1:
integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==
css-what@^5.0.0:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.0.1.tgz#3efa820131f4669a8ac2408f9c32e7c7de9f4cad"
- integrity sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe"
+ integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==
cssesc@^3.0.0:
version "3.0.0"
@@ -3552,9 +3560,9 @@ deep-extend@^0.6.0:
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
deep-is@^0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
- integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
deepmerge@^1.5.2:
version "1.5.2"
@@ -3768,9 +3776,9 @@ domelementtype@^2.0.1, domelementtype@^2.2.0:
integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==
domhandler@^4.0.0, domhandler@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.0.tgz#f9768a5f034be60a89a27c2e4d0f74eba0d8b059"
- integrity sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.2.2.tgz#e825d721d19a86b8c201a35264e226c678ee755f"
+ integrity sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==
dependencies:
domelementtype "^2.2.0"
@@ -3783,9 +3791,9 @@ domutils@^1.7.0:
domelementtype "1"
domutils@^2.5.2, domutils@^2.6.0:
- version "2.7.0"
- resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.7.0.tgz#8ebaf0c41ebafcf55b0b72ec31c56323712c5442"
- integrity sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135"
+ integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
dependencies:
dom-serializer "^1.0.1"
domelementtype "^2.2.0"
@@ -3874,10 +3882,10 @@ ejs@^2.6.1:
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
-electron-to-chromium@^1.3.811:
- version "1.3.812"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.812.tgz#4c4fb407e0e1335056097f172e9f2c0a09efe77d"
- integrity sha512-7KiUHsKAWtSrjVoTSzxQ0nPLr/a+qoxNZwkwd9LkylTOgOXSVXkQbpIVT0WAUQcI5gXq3SwOTCrK+WfINHOXQg==
+electron-to-chromium@^1.3.886:
+ version "1.3.893"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.893.tgz#9d804c68953b05ede35409dba0d73dd54c077b4d"
+ integrity sha512-ChtwF7qB03INq1SyMpue08wc6cve+ktj2UC/Y7se9vB+JryfzziJeYwsgb8jLaCA5GMkHCdn5M62PfSMWhifZg==
elliptic@^6.5.3:
version "6.5.4"
@@ -3976,22 +3984,25 @@ error-stack-parser@^2.0.2:
dependencies:
stackframe "^1.1.1"
-es-abstract@^1.17.2, es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2:
- version "1.18.5"
- resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.5.tgz#9b10de7d4c206a3581fd5b2124233e04db49ae19"
- integrity sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==
+es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.19.1:
+ version "1.19.1"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3"
+ integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==
dependencies:
call-bind "^1.0.2"
es-to-primitive "^1.2.1"
function-bind "^1.1.1"
get-intrinsic "^1.1.1"
+ get-symbol-description "^1.0.0"
has "^1.0.3"
has-symbols "^1.0.2"
internal-slot "^1.0.3"
- is-callable "^1.2.3"
+ is-callable "^1.2.4"
is-negative-zero "^2.0.1"
- is-regex "^1.1.3"
- is-string "^1.0.6"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.1"
+ is-string "^1.0.7"
+ is-weakref "^1.0.1"
object-inspect "^1.11.0"
object-keys "^1.1.1"
object.assign "^4.1.2"
@@ -4056,7 +4067,7 @@ eslint-config-standard@^12.0.0:
resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz#638b4c65db0bd5a41319f96bba1f15ddad2107d9"
integrity sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==
-eslint-import-resolver-node@^0.3.5:
+eslint-import-resolver-node@^0.3.6:
version "0.3.6"
resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd"
integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==
@@ -4075,12 +4086,13 @@ eslint-loader@^2.2.1:
object-hash "^1.1.4"
rimraf "^2.6.1"
-eslint-module-utils@^2.6.2:
- version "2.6.2"
- resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534"
- integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==
+eslint-module-utils@^2.7.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c"
+ integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==
dependencies:
debug "^3.2.7"
+ find-up "^2.1.0"
pkg-dir "^2.0.0"
eslint-plugin-es@^1.3.1:
@@ -4092,25 +4104,23 @@ eslint-plugin-es@^1.3.1:
regexpp "^2.0.1"
eslint-plugin-import@^2.14.0:
- version "2.24.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.0.tgz#697ffd263e24da5e84e03b282f5fb62251777177"
- integrity sha512-Kc6xqT9hiYi2cgybOc0I2vC9OgAYga5o/rAFinam/yF/t5uBqxQbauNPMC6fgb640T/89P0gFoO27FOilJ/Cqg==
+ version "2.25.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.25.3.tgz#a554b5f66e08fb4f6dc99221866e57cfff824766"
+ integrity sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==
dependencies:
- array-includes "^3.1.3"
- array.prototype.flat "^1.2.4"
+ array-includes "^3.1.4"
+ array.prototype.flat "^1.2.5"
debug "^2.6.9"
doctrine "^2.1.0"
- eslint-import-resolver-node "^0.3.5"
- eslint-module-utils "^2.6.2"
- find-up "^2.0.0"
+ eslint-import-resolver-node "^0.3.6"
+ eslint-module-utils "^2.7.1"
has "^1.0.3"
- is-core-module "^2.4.0"
+ is-core-module "^2.8.0"
+ is-glob "^4.0.3"
minimatch "^3.0.4"
- object.values "^1.1.3"
- pkg-up "^2.0.0"
- read-pkg-up "^3.0.0"
+ object.values "^1.1.5"
resolve "^1.20.0"
- tsconfig-paths "^3.9.0"
+ tsconfig-paths "^3.11.0"
eslint-plugin-node@^8.0.0:
version "8.0.1"
@@ -4135,9 +4145,9 @@ eslint-plugin-standard@^4.0.0:
integrity sha512-ZL7+QRixjTR6/528YNGyDotyffm5OQst/sGxKDwGb9Uqs4In5Egi4+jbobhqJoyoCM6/7v/1A5fhQ7ScMtDjaQ==
eslint-plugin-vue@^7.9.0:
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.16.0.tgz#7fe9fea039a190b108319c1380adf543ef57707d"
- integrity sha512-0E2dVvVC7I2Xm1HXyx+ZwPj9CNX4NJjs4K4r+GVsHWyt5Pew3JLD4fI7A91b2jeL0TXE7LlszrwLSTJU9eqehw==
+ version "7.20.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.20.0.tgz#98c21885a6bfdf0713c3a92957a5afeaaeed9253"
+ integrity sha512-oVNDqzBC9h3GO+NTgWeLMhhGigy6/bQaQbHS+0z7C4YEu/qK/yxHvca/2PTZtGNPsCrHwOTgKMrwu02A9iPBmw==
dependencies:
eslint-utils "^2.1.0"
natural-compare "^1.4.0"
@@ -4273,9 +4283,9 @@ estraverse@^4.1.1:
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
estraverse@^5.1.0, estraverse@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
- integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
esutils@^2.0.2:
version "2.0.3"
@@ -4462,9 +4472,9 @@ extsprintf@1.3.0:
integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
extsprintf@^1.2.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
- integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
+ integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
@@ -4554,7 +4564,7 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
-finalhandler@1.1.2, finalhandler@~1.1.2:
+finalhandler@~1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
@@ -4586,9 +4596,9 @@ find-cache-dir@^2.1.0:
pkg-dir "^3.0.0"
find-cache-dir@^3.0.0, find-cache-dir@^3.3.1:
- version "3.3.1"
- resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880"
- integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
+ integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
dependencies:
commondir "^1.0.1"
make-dir "^3.0.2"
@@ -4602,7 +4612,7 @@ find-up@^1.0.0:
path-exists "^2.0.0"
pinkie-promise "^2.0.0"
-find-up@^2.0.0, find-up@^2.1.0:
+find-up@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c=
@@ -4633,9 +4643,9 @@ flat-cache@^3.0.4:
rimraf "^3.0.2"
flatted@^3.1.0:
- version "3.2.2"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561"
- integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2"
+ integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==
flush-write-stream@^1.0.0:
version "1.1.1"
@@ -4645,15 +4655,10 @@ flush-write-stream@^1.0.0:
inherits "^2.0.3"
readable-stream "^2.3.6"
-follow-redirects@^1.0.0:
- version "1.14.2"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.2.tgz#cecb825047c00f5e66b142f90fed4f515dec789b"
- integrity sha512-yLR6WaE2lbF0x4K2qE2p9PEXKLDjUjnR/xmjS3wHAYxtlsI9MLLBJUZirAHKzUZDGLxje7w/cXR49WOUo4rbsA==
-
-follow-redirects@^1.14.0:
- version "1.14.3"
- resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.3.tgz#6ada78118d8d24caee595595accdc0ac6abd022e"
- integrity sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==
+follow-redirects@^1.0.0, follow-redirects@^1.14.4:
+ version "1.14.5"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.5.tgz#f09a5848981d3c772b5392309778523f8d85c381"
+ integrity sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==
for-in@^1.0.2:
version "1.0.2"
@@ -4798,6 +4803,14 @@ get-stream@^5.0.0, get-stream@^5.1.0:
dependencies:
pump "^3.0.0"
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -4830,7 +4843,19 @@ glob-to-regexp@^0.3.0:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
-glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@~7.1.7:
+glob@^7.0.3, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@~7.1.7:
version "7.1.7"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90"
integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
@@ -4855,9 +4880,9 @@ globals@^11.1.0:
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globals@^13.6.0, globals@^13.9.0:
- version "13.11.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7"
- integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==
+ version "13.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e"
+ integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==
dependencies:
type-fest "^0.20.2"
@@ -5284,9 +5309,9 @@ ignore@^4.0.3, ignore@^4.0.6:
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
ignore@^5.0.2:
- version "5.1.8"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
- integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+ version "5.1.9"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb"
+ integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==
immediate@^3.2.3:
version "3.3.0"
@@ -5516,7 +5541,7 @@ is-buffer@^1.1.5:
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-is-callable@^1.1.4, is-callable@^1.2.3:
+is-callable@^1.1.4, is-callable@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
@@ -5547,10 +5572,10 @@ is-color-stop@^1.0.0:
rgb-regex "^1.0.1"
rgba-regex "^1.0.0"
-is-core-module@^2.2.0, is-core-module@^2.4.0:
- version "2.6.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19"
- integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==
+is-core-module@^2.2.0, is-core-module@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
+ integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
dependencies:
has "^1.0.3"
@@ -5637,10 +5662,10 @@ is-glob@^3.1.0:
dependencies:
is-extglob "^2.1.0"
-is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
- integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
dependencies:
is-extglob "^2.1.1"
@@ -5732,7 +5757,7 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
-is-regex@^1.0.4, is-regex@^1.1.3:
+is-regex@^1.0.4, is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
@@ -5750,6 +5775,11 @@ is-resolvable@^1.0.0:
resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+is-shared-array-buffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
+ integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==
+
is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@@ -5760,7 +5790,7 @@ is-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
-is-string@^1.0.5, is-string@^1.0.6:
+is-string@^1.0.5, is-string@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
@@ -5779,6 +5809,13 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0:
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+is-weakref@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2"
+ integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==
+ dependencies:
+ call-bind "^1.0.0"
+
is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@@ -5969,7 +6006,7 @@ json5@^1.0.1:
dependencies:
minimist "^1.2.0"
-json5@^2.1.2, json5@^2.2.0:
+json5@^2.1.2:
version "2.2.0"
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
@@ -5977,11 +6014,11 @@ json5@^2.1.2, json5@^2.2.0:
minimist "^1.2.5"
jsoneditor@^9.5.3:
- version "9.5.3"
- resolved "https://registry.yarnpkg.com/jsoneditor/-/jsoneditor-9.5.3.tgz#a44cce2556a21e13db360865ed4d4224908df3da"
- integrity sha512-KW893jRnh/s41n7Is4aNFg5Gh2h4HhE9W8L2rP1Okue3aW5Aov9SRqXs/5rmAABmlBGx1yzyPMlj4Oqw5nXQcQ==
+ version "9.5.7"
+ resolved "https://registry.yarnpkg.com/jsoneditor/-/jsoneditor-9.5.7.tgz#b74d0c2cf64febe102b1b0a91d693f48d1f90917"
+ integrity sha512-RWI1YqIhb2XzLcnSHMta7LROItQg49FhSd7KNPWr81HyCj2pc0m25no4BpzygmxW9320r9PnYKJwZsqL2PpdrQ==
dependencies:
- ace-builds "^1.4.12"
+ ace-builds "^1.4.13"
ajv "^6.12.6"
javascript-natural-sort "^0.7.1"
jmespath "^0.15.0"
@@ -5989,7 +6026,7 @@ jsoneditor@^9.5.3:
jsonrepair "^2.2.1"
mobius1-selectr "^2.4.13"
picomodal "^3.0.0"
- vanilla-picker "^2.11.2"
+ vanilla-picker "^2.12.1"
jsonfile@^4.0.0:
version "4.0.0"
@@ -6207,9 +6244,9 @@ loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2
json5 "^1.0.1"
loader-utils@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
- integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129"
+ integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==
dependencies:
big.js "^5.2.2"
emojis-list "^3.0.0"
@@ -6248,11 +6285,6 @@ lodash._reinterpolate@^3.0.0:
resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
-lodash.clonedeep@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
- integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
-
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@@ -6313,7 +6345,7 @@ lodash.uniq@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
-lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3:
+lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.17.4:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -6518,17 +6550,17 @@ miller-rabin@^4.0.0:
bn.js "^4.0.0"
brorand "^1.0.1"
-mime-db@1.49.0, "mime-db@>= 1.43.0 < 2":
- version "1.49.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed"
- integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==
+mime-db@1.51.0, "mime-db@>= 1.43.0 < 2":
+ version "1.51.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
+ integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
- version "2.1.32"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5"
- integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==
+ version "2.1.34"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
+ integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
dependencies:
- mime-db "1.49.0"
+ mime-db "1.51.0"
mime@1.6.0:
version "1.6.0"
@@ -6536,9 +6568,9 @@ mime@1.6.0:
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
mime@^2.4.4:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
- integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
+ integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
mimic-fn@^1.0.0:
version "1.2.0"
@@ -6588,9 +6620,9 @@ minimist@^1.2.0, minimist@^1.2.5:
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
minipass@^3.1.1:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd"
- integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732"
+ integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==
dependencies:
yallist "^4.0.0"
@@ -6791,15 +6823,15 @@ node-libs-browser@^2.2.1:
util "^0.11.0"
vm-browserify "^1.0.1"
-node-releases@^1.1.75:
- version "1.1.75"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
- integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==
+node-releases@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
+ integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==
node-watch@~0.7.1:
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.1.tgz#0caaa6a6833b0d533487f953c52a6c787769ba7c"
- integrity sha512-UWblPYuZYrkCQCW5PxAwYSxaELNBLUckrTBBk8xr1/bUgyOkYYTsUcV4e3ytcazFEOyiRyiUrsG37pu6I0I05g==
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.7.2.tgz#545f057da8500487eb8287adcb4cb5a7338d7e21"
+ integrity sha512-g53VjSARRv1JdST0LZRIg8RiuLr1TaBbVPsVvxh0/0Ymvi0xYUjDuoqQQAWtHJQUXhiShowPT/aXKNeHBcyQsw==
normalize-package-data@^2.3.2, normalize-package-data@^2.5.0:
version "2.5.0"
@@ -6890,9 +6922,9 @@ nth-check@^1.0.2:
boolbase "~1.0.0"
nth-check@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.0.tgz#1bb4f6dac70072fc313e8c9cd1417b5074c0a125"
- integrity sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2"
+ integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==
dependencies:
boolbase "^1.0.0"
@@ -6961,22 +6993,22 @@ object.assign@^4.1.0, object.assign@^4.1.2:
object-keys "^1.1.1"
object.entries@^1.1.2:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.4.tgz#43ccf9a50bc5fd5b649d45ab1a579f24e088cafd"
- integrity sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861"
+ integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
- es-abstract "^1.18.2"
+ es-abstract "^1.19.1"
object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7"
- integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e"
+ integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
- es-abstract "^1.18.0-next.2"
+ es-abstract "^1.19.1"
object.pick@^1.3.0:
version "1.3.0"
@@ -6985,14 +7017,14 @@ object.pick@^1.3.0:
dependencies:
isobject "^3.0.1"
-object.values@^1.1.0, object.values@^1.1.3:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30"
- integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==
+object.values@^1.1.0, object.values@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac"
+ integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
- es-abstract "^1.18.2"
+ es-abstract "^1.19.1"
obuf@^1.0.0, obuf@^1.1.2:
version "1.1.2"
@@ -7343,6 +7375,16 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+picocolors@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
+ integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
version "2.3.0"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972"
@@ -7413,13 +7455,6 @@ pkg-dir@^4.1.0:
dependencies:
find-up "^4.0.0"
-pkg-up@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f"
- integrity sha1-yBmscoBZpGHKscOImivjxJoATX8=
- dependencies:
- find-up "^2.1.0"
-
pnp-webpack-plugin@^1.6.4:
version "1.7.0"
resolved "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz#65741384f6d8056f36e2255a8d67ffc20866f5c9"
@@ -7771,13 +7806,12 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6:
- version "7.0.36"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb"
- integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==
+ version "7.0.39"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
+ integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
dependencies:
- chalk "^2.4.2"
+ picocolors "^0.2.1"
source-map "^0.6.1"
- supports-color "^6.1.0"
prelude-ls@^1.2.1:
version "1.2.1"
@@ -7794,10 +7828,10 @@ prepend-http@^2.0.0:
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
-prettier@^1.18.2:
- version "1.19.1"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
- integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
+"prettier@^1.18.2 || ^2.0.0":
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c"
+ integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==
pretty-bytes@^5.1.0:
version "5.6.0"
@@ -8010,14 +8044,6 @@ reachdown@^1.1.0:
resolved "https://registry.yarnpkg.com/reachdown/-/reachdown-1.1.0.tgz#c3b85b459dbd0fe2c79782233a0a38e66a9b5454"
integrity sha512-6LsdRe4cZyOjw4NnvbhUd/rGG7WQ9HMopPr+kyL018Uci4kijtxcGR5kVb5Ln13k4PEE+fEFQbjfOvNw7cnXmA==
-read-pkg-up@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07"
- integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=
- dependencies:
- find-up "^2.0.0"
- read-pkg "^3.0.0"
-
read-pkg@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
@@ -8075,14 +8101,14 @@ readdirp@~3.6.0:
dependencies:
picomatch "^2.2.1"
-regenerate-unicode-properties@^8.2.0:
- version "8.2.0"
- resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec"
- integrity sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==
+regenerate-unicode-properties@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326"
+ integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==
dependencies:
- regenerate "^1.4.0"
+ regenerate "^1.4.2"
-regenerate@^1.4.0:
+regenerate@^1.4.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
@@ -8131,16 +8157,16 @@ regexpp@^3.1.0:
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
regexpu-core@^4.7.1:
- version "4.7.1"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6"
- integrity sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0"
+ integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==
dependencies:
- regenerate "^1.4.0"
- regenerate-unicode-properties "^8.2.0"
- regjsgen "^0.5.1"
- regjsparser "^0.6.4"
- unicode-match-property-ecmascript "^1.0.4"
- unicode-match-property-value-ecmascript "^1.2.0"
+ regenerate "^1.4.2"
+ regenerate-unicode-properties "^9.0.0"
+ regjsgen "^0.5.2"
+ regjsparser "^0.7.0"
+ unicode-match-property-ecmascript "^2.0.0"
+ unicode-match-property-value-ecmascript "^2.0.0"
register-service-worker@^1.6.2:
version "1.7.2"
@@ -8161,15 +8187,15 @@ registry-url@^5.0.0:
dependencies:
rc "^1.2.8"
-regjsgen@^0.5.1:
+regjsgen@^0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
-regjsparser@^0.6.4:
- version "0.6.9"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.9.tgz#b489eef7c9a2ce43727627011429cf833a7183e6"
- integrity sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==
+regjsparser@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968"
+ integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==
dependencies:
jsesc "~0.5.0"
@@ -8443,9 +8469,9 @@ sass-loader@^7.1.0:
semver "^6.3.0"
sass@^1.38.0:
- version "1.38.0"
- resolved "https://registry.yarnpkg.com/sass/-/sass-1.38.0.tgz#2f3e60a1efdcdc910586fa79dc89d3399a145b4f"
- integrity sha512-WBccZeMigAGKoI+NgD7Adh0ab1HUq+6BmyBUEaGxtErbUtWUevEbdgo5EZiJQofLUGcKtlNaO2IdN73AHEua5g==
+ version "1.43.4"
+ resolved "https://registry.yarnpkg.com/sass/-/sass-1.43.4.tgz#68c7d6a1b004bef49af0d9caf750e9b252105d1f"
+ integrity sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==
dependencies:
chokidar ">=3.0.0 <4.0.0"
@@ -8557,7 +8583,7 @@ serve-index@^1.9.1:
mime-types "~2.1.17"
parseurl "~1.3.2"
-serve-static@1.14.1, serve-static@^1.14.1:
+serve-static@1.14.1:
version "1.14.1"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
@@ -8654,9 +8680,9 @@ shebang-regex@^3.0.0:
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
shell-quote@^1.6.1:
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2"
- integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123"
+ integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==
side-channel@^1.0.4:
version "1.0.4"
@@ -8668,14 +8694,14 @@ side-channel@^1.0.4:
object-inspect "^1.9.0"
signal-exit@^3.0.0, signal-exit@^3.0.2:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
- integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f"
+ integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==
-simple-icons@^5.12.0:
- version "5.12.0"
- resolved "https://registry.yarnpkg.com/simple-icons/-/simple-icons-5.12.0.tgz#8f514005f1aef02464a014706cc8e5b07d4d72c8"
- integrity sha512-iF5ZJuv/jPU2tdkc5aNXsirQg2kOggvcOUw2kMafCrelrr3Sj0ywRJkr+0uVniD1Kj6ayT1yb1IquBRHrYw10g==
+simple-icons@^5.19.0:
+ version "5.22.0"
+ resolved "https://registry.yarnpkg.com/simple-icons/-/simple-icons-5.22.0.tgz#c987aeea658828e858b774ab334264dabbe0344c"
+ integrity sha512-crEorhti73Sh88EZbw9mG/toCEoSQexf8HJCFFloz2V7bP7/lDpgcEmoWrW3SAh9tOQL8sWau4DSSRBVvRIRew==
simple-swizzle@^0.2.2:
version "0.2.2"
@@ -8734,16 +8760,16 @@ snapdragon@^0.8.1:
use "^3.1.0"
sockjs-client@^1.5.0:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.1.tgz#256908f6d5adfb94dabbdbd02c66362cca0f9ea6"
- integrity sha512-VnVAb663fosipI/m6pqRXakEOw7nvd7TUgdr3PlR/8V2I95QIdwT8L4nMxhyU8SmDBHYXU1TOElaKOmKLfYzeQ==
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.2.tgz#4bc48c2da9ce4769f19dc723396b50f5c12330a3"
+ integrity sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==
dependencies:
debug "^3.2.6"
eventsource "^1.0.7"
faye-websocket "^0.11.3"
inherits "^2.0.4"
json3 "^3.3.3"
- url-parse "^1.5.1"
+ url-parse "^1.5.3"
sockjs@^0.3.21:
version "0.3.21"
@@ -8778,9 +8804,9 @@ source-map-resolve@^0.5.0:
urix "^0.1.0"
source-map-support@~0.5.12:
- version "0.5.19"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
- integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ version "0.5.20"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9"
+ integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
@@ -8972,23 +8998,23 @@ string-width@^3.0.0, string-width@^3.1.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
-string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0:
- version "4.2.2"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
- integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.0"
+ strip-ansi "^6.0.1"
string.prototype.padend@^3.0.0:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz#6858ca4f35c5268ebd5e8615e1327d55f59ee311"
- integrity sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1"
+ integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==
dependencies:
call-bind "^1.0.2"
define-properties "^1.1.3"
- es-abstract "^1.18.0-next.2"
+ es-abstract "^1.19.1"
string.prototype.trimend@^1.0.4:
version "1.0.4"
@@ -9050,12 +9076,12 @@ strip-ansi@^5, strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies:
ansi-regex "^4.1.0"
-strip-ansi@^6.0.0, strip-ansi@~6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
- integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+strip-ansi@^6.0.0, strip-ansi@^6.0.1, strip-ansi@~6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
- ansi-regex "^5.0.0"
+ ansi-regex "^5.0.1"
strip-bom@^3.0.0:
version "3.0.0"
@@ -9174,16 +9200,15 @@ symlink-or-copy@~1.3.1:
integrity sha512-0K91MEXFpBUaywiwSSkmKjnGcasG/rVBXFLJz5DrgGabpYD6N+3yZrfD6uUIfpuTu65DZLHi7N8CizHc07BPZA==
table@^6.0.9:
- version "6.7.1"
- resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2"
- integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==
+ version "6.7.3"
+ resolved "https://registry.yarnpkg.com/table/-/table-6.7.3.tgz#255388439715a738391bd2ee4cbca89a4d05a9b7"
+ integrity sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==
dependencies:
ajv "^8.0.1"
- lodash.clonedeep "^4.5.0"
lodash.truncate "^4.4.2"
slice-ansi "^4.0.0"
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
+ string-width "^4.2.3"
+ strip-ansi "^6.0.1"
tapable@^1.0.0, tapable@^1.1.3:
version "1.1.3"
@@ -9359,12 +9384,13 @@ ts-pnp@^1.1.6:
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92"
integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==
-tsconfig-paths@^3.9.0:
- version "3.10.1"
- resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.10.1.tgz#79ae67a68c15289fdf5c51cb74f397522d795ed7"
- integrity sha512-rETidPDgCpltxF7MjBZlAFPUHv5aHH2MymyPvh+vEyWAED4Eb/WeMbsnD/JDr4OKPOA1TssDHgIcpTN5Kh0p6Q==
+tsconfig-paths@^3.11.0:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36"
+ integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==
dependencies:
- json5 "^2.2.0"
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.1"
minimist "^1.2.0"
strip-bom "^3.0.0"
@@ -9450,28 +9476,28 @@ unbox-primitive@^1.0.1:
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
-unicode-canonical-property-names-ecmascript@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
- integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==
+unicode-canonical-property-names-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
+ integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
-unicode-match-property-ecmascript@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
- integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==
+unicode-match-property-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
+ integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
dependencies:
- unicode-canonical-property-names-ecmascript "^1.0.4"
- unicode-property-aliases-ecmascript "^1.0.4"
+ unicode-canonical-property-names-ecmascript "^2.0.0"
+ unicode-property-aliases-ecmascript "^2.0.0"
-unicode-match-property-value-ecmascript@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz#0d91f600eeeb3096aa962b1d6fc88876e64ea531"
- integrity sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==
+unicode-match-property-value-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
+ integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
-unicode-property-aliases-ecmascript@^1.0.4:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz#dd57a99f6207bedff4628abefb94c50db941c8f4"
- integrity sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==
+unicode-property-aliases-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
+ integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
union-value@^1.0.0:
version "1.0.1"
@@ -9595,7 +9621,7 @@ url-parse-lax@^3.0.0:
dependencies:
prepend-http "^2.0.0"
-url-parse@^1.4.3, url-parse@^1.5.1:
+url-parse@^1.4.3, url-parse@^1.5.3:
version "1.5.3"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.3.tgz#71c1303d38fb6639ade183c2992c8cc0686df862"
integrity sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==
@@ -9711,10 +9737,10 @@ validate-npm-package-license@^3.0.1:
spdx-correct "^3.0.0"
spdx-expression-parse "^3.0.0"
-vanilla-picker@^2.11.2:
- version "2.11.2"
- resolved "https://registry.yarnpkg.com/vanilla-picker/-/vanilla-picker-2.11.2.tgz#eaa24efa68c27e7ee9e0776df55d6913b855f133"
- integrity sha512-2cP7LlUnxHxwOf06ReUVtd2RFJMnJGaxN2s0p8wzBH3In5b00Le7fFZ9VrIoBE0svZkSq/BC/Pwq/k/9n+AA2g==
+vanilla-picker@^2.12.1:
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/vanilla-picker/-/vanilla-picker-2.12.1.tgz#6e619eecf553891b8d2d042b745a23c91f19f34c"
+ integrity sha512-2qrEP9VYylKXbyzXKsbu2dferBTvqnlsr29XjHwFE+/MEp0VNj6oEUESLDtKZ7DWzGdSv1x/+ujqFZF+KsO3cg==
dependencies:
"@sphinxxxx/color-conversion" "^2.2.2"
@@ -9751,9 +9777,9 @@ vue-cli-plugin-yaml@^1.0.2:
yaml-loader "^0.6.0"
vue-eslint-parser@^7.10.0:
- version "7.10.0"
- resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.10.0.tgz#ea4e4b10fd10aa35c8a79ac783488d8abcd29be8"
- integrity sha512-7tc/ewS9Vq9Bn741pvpg8op2fWJPH3k32aL+jcIcWGCTzh/zXSdh7pZ5FV3W2aJancP9+ftPAv292zY5T5IPCg==
+ version "7.11.0"
+ resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.11.0.tgz#214b5dea961007fcffb2ee65b8912307628d0daf"
+ integrity sha512-qh3VhDLeh773wjgNTl7ss0VejY9bMMa0GoDG2fQVyDzRFdiU3L7fw74tWZDHNQXdZqxO3EveQroa9ct39D2nqg==
dependencies:
debug "^4.1.1"
eslint-scope "^5.1.1"
@@ -9768,10 +9794,10 @@ vue-hot-reload-api@^2.3.0:
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
-vue-i18n@^8.25.0:
- version "8.25.0"
- resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.25.0.tgz#1037d9295fa2845a230b771de473481edb2cfc4c"
- integrity sha512-ynhcL+PmTxuuSE1T10htiSXzjBozxYIE3ffbM1RfgAkVbr/v1SP+9Mi/7/uv8ZVV1yGuKjFAYp9BXq+X7op6MQ==
+vue-i18n@^8.25.1:
+ version "8.26.7"
+ resolved "https://registry.yarnpkg.com/vue-i18n/-/vue-i18n-8.26.7.tgz#adfd48373449fe31438c48e3b3bd43044dc3a681"
+ integrity sha512-7apa5PvRg1YCLoraE3lOgpCG8hJGupLCtywQWedWsgBbvF0TOgFvhitqK9xRH0PBGG1G8aiJz9oklyNDFfDxLg==
vue-js-modal@^2.0.0-rc.6:
version "2.0.1"
@@ -9780,10 +9806,18 @@ vue-js-modal@^2.0.0-rc.6:
dependencies:
resize-observer-polyfill "^1.5.1"
+vue-json-tree-view@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/vue-json-tree-view/-/vue-json-tree-view-2.1.6.tgz#a153ac1b18432b8671c65930f545ce134e38cf2d"
+ integrity sha512-gs7VDd1dC5SFQmyMdIq3O0w2IsITZfzyNFe6lsTeQwhFkh0nwWxhKWrS6opNmdOYFYmy52D9DVto78v8mF7IXQ==
+ dependencies:
+ lodash "^4.17.4"
+ vue "^2.5.16"
+
"vue-loader-v16@npm:vue-loader@^16.1.0":
- version "16.5.0"
- resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.5.0.tgz#09c4e0712466899e34b99a686524f19165fb2892"
- integrity sha512-WXh+7AgFxGTgb5QAkQtFeUcHNIEq3PGVQ8WskY5ZiFbWBkOwcCPRs4w/2tVyTbh2q6TVRlO3xfvIukUtjsu62A==
+ version "16.8.3"
+ resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.8.3.tgz#d43e675def5ba9345d6c7f05914c13d861997087"
+ integrity sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==
dependencies:
chalk "^4.1.0"
hash-sum "^2.0.0"
@@ -9813,14 +9847,14 @@ vue-resize@^1.0.1:
"@babel/runtime" "^7.13.10"
vue-router@^3.0.3:
- version "3.5.2"
- resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.5.2.tgz#5f55e3f251970e36c3e8d88a7cd2d67a350ade5c"
- integrity sha512-807gn82hTnjCYGrnF3eNmIw/dk7/GE4B5h69BlyCK9KHASwSloD1Sjcn06zg9fVG4fYH2DrsNBZkpLtb25WtaQ==
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.5.3.tgz#041048053e336829d05dafacf6a8fb669a2e7999"
+ integrity sha512-FUlILrW3DGitS2h+Xaw8aRNvGTwtuaxrRkNSHWTizOfLUie7wuYwezeZ50iflRn8YPV5kxmU2LQuu3nM/b3Zsg==
-vue-select@^3.12.1:
- version "3.12.2"
- resolved "https://registry.yarnpkg.com/vue-select/-/vue-select-3.12.2.tgz#b0dd89233d673dcbee567418667b1bfd5c139b64"
- integrity sha512-KWIXQ50pC+B1wpBmaUXwuHm8yevPIL8YsZin9Hi2qCdK7C0KMbztRk6adgpIJ99bqaiccrGFQIPuXsuUNeegPw==
+vue-select@^3.15.0:
+ version "3.16.0"
+ resolved "https://registry.yarnpkg.com/vue-select/-/vue-select-3.16.0.tgz#db2ee2ddf80bd8876ce57738107b8a1a741862f4"
+ integrity sha512-F0x7HXTUc5eq7YSjR0uX77RGA+Yk2+I8aMW+NePyPqRX9OPSiDtKpezFIFhnhxqrOvMh4uVR0jHkXIDmzs6nYQ==
vue-style-loader@^4.1.0, vue-style-loader@^4.1.2:
version "4.1.3"
@@ -9861,11 +9895,16 @@ vue-toasted@^1.1.28:
resolved "https://registry.yarnpkg.com/vue-toasted/-/vue-toasted-1.1.28.tgz#dbabb83acc89f7a9e8765815e491d79f0dc65c26"
integrity sha512-UUzr5LX51UbbiROSGZ49GOgSzFxaMHK6L00JV8fir/CYNJCpIIvNZ5YmS4Qc8Y2+Z/4VVYRpeQL2UO0G800Raw==
-vue@^2.6.10:
+vue@^2.5.16, vue@^2.6.10:
version "2.6.14"
resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235"
integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==
+vuex@^3.6.2:
+ version "3.6.2"
+ resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.6.2.tgz#236bc086a870c3ae79946f107f16de59d5895e71"
+ integrity sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==
+
watchpack-chokidar2@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"
@@ -9937,11 +9976,11 @@ webpack-dev-middleware@^3.7.2:
webpack-log "^2.0.0"
webpack-dev-server@^3.11.0:
- version "3.11.2"
- resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz#695ebced76a4929f0d5de7fd73fafe185fe33708"
- integrity sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==
+ version "3.11.3"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz#8c86b9d2812bf135d3c9bce6f07b718e30f7c3d3"
+ integrity sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA==
dependencies:
- ansi-html "0.0.7"
+ ansi-html-community "0.0.8"
bonjour "^3.5.0"
chokidar "^2.1.8"
compression "^1.7.4"
@@ -10275,9 +10314,9 @@ ws@^6.0.0, ws@^6.2.1:
async-limiter "~1.0.0"
ws@~7.5.0:
- version "7.5.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.3.tgz#160835b63c7d97bfab418fc1b8a9fced2ac01a74"
- integrity sha512-kQ/dHIzuLrS6Je9+uv81ueZomEwH0qVYstcAQ4/Z93K8zeko9gtAbttJWzoC5ukqXY1PpoouV3+VSOqEAFt5wg==
+ version "7.5.5"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881"
+ integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==
xdg-basedir@^4.0.0:
version "4.0.0"