Nicer and more subtle version notifications (#711)

This commit is contained in:
Michael Geers 2021-03-01 09:42:01 +01:00 • committed by GitHub
parent 91327a9225
commit 4f04f017b9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 359 additions and 285 deletions

9
.storybook/middleware.js Normal file
View file

@ -0,0 +1,9 @@
const express = require("express");
const expressMiddleWare = (router) => {
router.post("/update", function (req, res) {
res.status(200).send("ok");
});
};
module.exports = expressMiddleWare;

View file

@ -30,21 +30,5 @@
<div id="app"></div>
<div id="toasts"></div>
<footer class="pt-4 pb-2 pt-md-5 pb-md-4 mt-3 mt-md-5 border-top">
<div class="container">
<div class="row">
<div class="col-6">
<small class="text-muted">
<a href="https://github.com/andig/evcc/releases/tag/[[.Version]]">[[.Version]]</a>
(<a href="https://github.com/andig/evcc/commit/[[.Commit]]">[[.Commit]]</a>)
</small>
</div>
<div class="col-6 text-right">
<small class="text-muted">&copy; 2020</small>
</div>
</div>
</div>
</footer>
</body>
</html>

View file

@ -0,0 +1,45 @@
import Footer from "./Footer.vue";
export default {
title: "Main/Footer",
component: Footer,
argTypes: {},
};
const Template = (args, { argTypes }) => ({
props: Object.keys(argTypes),
components: { Footer },
template: '<Footer v-bind="$props"></Footer>',
});
export const KeinUpdate = Template.bind({});
KeinUpdate.args = {
version: { installed: "0.40" },
};
export const UpdateVerfuegbar = Template.bind({});
UpdateVerfuegbar.args = {
version: {
installed: "0.36",
available: "0.40",
releaseNotes: "Lorem ipsum dolor sit amet consectetur",
},
};
export const Updater = Template.bind({});
Updater.args = {
version: {
installed: "0.36",
available: "0.40",
releaseNotes: "Lorem ipsum dolor sit amet consectetur",
hasUpdater: true,
},
};
export const Upgrade = Template.bind({});
Upgrade.args = {
version: {
installed: "0.36",
available: "0.40",
hasUpdater: true,
},
};

View file

@ -0,0 +1,40 @@
<template>
<footer class="py-3 py-md-5 mt-3 mt-md-5 border-top">
<div class="container">
<div class="row">
<div class="col-6">
<Version v-bind="version" />
</div>
<div class="col-6 text-right">
<small class="text-black">
<a href="https://github.com/sponsors/andig" target="_blank" class="link">
<fa-icon icon="heart" class="icon mr-1"></fa-icon
><span class="d-none d-sm-inline">Projekt</span> unterstützen
</a>
</small>
</div>
</div>
</div>
</footer>
</template>
<script>
import Version from "./Version";
export default {
name: "Footer",
components: { Version },
props: {
version: Object,
},
};
</script>
<style scoped>
.icon {
color: #0fdd42;
}
.text-black a {
color: #18191a;
}
</style>

View file

@ -12,28 +12,32 @@ const Template = (args, { argTypes }) => ({
template: '<Version v-bind="$props"></Version>',
});
export const Base = Template.bind({});
Base.args = {
installed: "0.36",
available: "0.40",
const releaseNotes =
'<h1>0.48</h1><p>Bug fixes:</p><ul><li>Withdraw Kia and Hyundai apis (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="817450535" data-permission-text="Title is private" data-url="https://github.com/andig/evcc/issues/699" data-hovercard-type="pull_request" data-hovercard-url="/andig/evcc/pull/699/hovercard" href="https://github.com/andig/evcc/pull/699">#699</a>)</li><li>Simplify Tesla integration and fix upstream changes (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="817525274" data-permission-text="Title is private" data-url="https://github.com/andig/evcc/issues/700" data-hovercard-type="pull_request" data-hovercard-url="/andig/evcc/pull/700/hovercard" href="https://github.com/andig/evcc/pull/700">#700</a>)</li><li>SHM: Check connected status (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="811567860" data-permission-text="Title is private" data-url="https://github.com/andig/evcc/issues/673" data-hovercard-type="pull_request" data-hovercard-url="/andig/evcc/pull/673/hovercard" href="https://github.com/andig/evcc/pull/673">#673</a>)</li></ul><p>Enhancements:</p><ul><li>Add Seat api (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="812885392" data-permission-text="Title is private" data-url="https://github.com/andig/evcc/issues/681" data-hovercard-type="pull_request" data-hovercard-url="/andig/evcc/pull/681/hovercard" href="https://github.com/andig/evcc/pull/681">#681</a>)</li><li>Add Skoda api (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="812883796" data-permission-text="Title is private" data-url="https://github.com/andig/evcc/issues/680" data-hovercard-type="pull_request" data-hovercard-url="/andig/evcc/pull/680/hovercard" href="https://github.com/andig/evcc/pull/680">#680</a>)</li><li>Add Peugeot/Opel/Citroen api (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="815612446" data-permission-text="Title is private" data-url="https://github.com/andig/evcc/issues/692" data-hovercard-type="pull_request" data-hovercard-url="/andig/evcc/pull/692/hovercard" href="https://github.com/andig/evcc/pull/692">#692</a>)</li><li>KEBA: Support mA current resolution adjustments (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="801358501" data-permission-text="Title is private" data-url="https://github.com/andig/evcc/issues/646" data-hovercard-type="pull_request" data-hovercard-url="/andig/evcc/pull/646/hovercard" href="https://github.com/andig/evcc/pull/646">#646</a>)</li></ul>';
export const AktuelleVersion = Template.bind({});
AktuelleVersion.args = {
installed: "0.48",
available: "0.48",
};
export const ReleaseNotes = Template.bind({});
ReleaseNotes.args = {
installed: "0.36",
available: "0.40",
releaseNotes: "Lorem ipsum dolor sit amet consectetur",
export const Download = Template.bind({});
Download.args = {
installed: "0.47",
available: "0.48",
releaseNotes,
};
export const Updater = Template.bind({});
Updater.args = {
installed: "0.36",
available: "0.40",
releaseNotes: "Lorem ipsum dolor sit amet consectetur",
installed: "0.47",
available: "0.48",
releaseNotes,
hasUpdater: true,
};
export const Upgrade = Template.bind({});
Upgrade.args = {
export const KeineReleaseNotes = Template.bind({});
KeineReleaseNotes.args = {
installed: "0.36",
available: "0.40",
hasUpdater: true,

View file

@ -1,112 +1,103 @@
<template>
<transition name="fade">
<div v-if="active">
<div class="row p-3 bg-warning">
<div class="col-12">
Neue Version verfügbar! Installiert: {{ installed }}. Verfügbar:
{{ available }}.
<b class="px-3" v-if="releaseNotes">
<a href="#" class="text-body" @click="toggleReleaseNotes">
Release notes
<fa-icon
icon="chevron-down"
class="expand-icon"
:class="{ 'expand-icon-rotated': releaseNotesShown }"
>
</fa-icon>
</a>
</b>
<b class="px-3">
<button
type="button"
class="btn btn-primary"
data-toggle="modal"
data-target="#updateModal"
v-if="hasUpdater"
@click="toggleUpdater"
>
Aktualisieren
</button>
<a
:href="'https://github.com/andig/evcc/releases/tag/' + available"
class="text-body"
v-else
>
Download <fa-icon icon="chevron-down"></fa-icon>
</a>
</b>
<button
type="button"
class="close float-right"
style="margin-top: -2px"
aria-label="Close"
@click="dismiss"
>
<span aria-hidden="true">&times;</span>
</button>
</div>
</div>
<transition name="fade">
<div class="row p-3 bg-light" v-if="releaseNotesShown">
<div class="col-12" v-html="releaseNotes"></div>
</div>
</transition>
<transition name="display">
<div
id="updateModal"
class="dialog"
tabindex="-1"
role="dialog"
v-if="updaterShown"
<div>
<small class="text-black">
<a href="#" @click.prevent="showModal" v-if="newVersionAvailable">
<fa-icon icon="gift" class="icon mr-1"></fa-icon>Update<span
class="d-none d-sm-inline"
>
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title font-weight-bold">
Aktualisierung durchführen
</h4>
<button type="button" class="close" @click="toggleUpdater">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p class="font-weight-bold">
Nach Aktualisierung wird evcc neu gestartet.
</p>
<div
class="progress"
style="margin-top: 16px; margin-bottom: 16px"
v-if="updateStarted"
>
verfügbar</span
>:
{{ available }}
</a>
<a :href="releaseNotesUrl(installed)" target="_blank" v-else>
Version {{ installed }}
</a>
</small>
<transition name="fade">
<div id="updateModal" class="dialog" tabindex="-1" role="dialog" v-if="modalActive">
<div
class="modal-dialog modal-dialog-centered modal-dialog-scrollable"
role="document"
>
<div class="modal-content">
<div class="modal-header">
<h4 class="modal-title font-weight-bold">Update verfügbar</h4>
<button
type="button"
class="close"
:disabled="updateStarted"
@click="closeModal"
>
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<div v-if="updateStarted">
<p>Nach der Aktualisierung wird evcc neu gestartet.</p>
<div class="progress my-3">
<div
class="progress-bar"
class="progress-bar progress-bar-striped progress-bar-animated"
role="progressbar"
:style="{ width: uploadProgress + '%' }"
></div>
</div>
<p>{{ updateStatus }}{{ uploadMessage }}</p>
</div>
<div class="modal-footer">
<div v-else>
<p>
<small>Aktuell installierte Version: {{ installed }}</small>
</p>
<div v-if="releaseNotes" v-html="releaseNotes"></div>
<p v-else>
Keine Releasenotes verfügbar. Mehr Informationen zur neuen
Version findest du
<a :href="releaseNotesUrl(available)">hier</a>.
</p>
</div>
</div>
<div class="modal-footer d-flex justify-content-between">
<button
type="button"
class="btn btn-outline-secondary"
:disabled="updateStarted"
@click="closeModal"
>
Abbrechen
</button>
<div>
<button
type="button"
class="btn btn-secondary"
:class="{ disabled: updateStarted }"
@click="toggleUpdater"
class="btn btn-primary"
v-if="hasUpdater"
:disabled="updateStarted"
@click="update"
>
Abbrechen
</button>
<button type="button" class="btn btn-danger" @click="update">
Installieren
<span v-if="updateStarted">
<span
class="spinner-border spinner-border-sm"
role="status"
aria-hidden="true"
>
</span>
Akualisieren
</span>
<span v-else>Jetzt aktualisieren</span>
</button>
<a
:href="releaseNotesUrl(available)"
class="btn btn-primary"
v-else
>
Download
</a>
</div>
</div>
</div>
</div>
</transition>
</div>
</transition>
</div>
</transition>
</div>
</template>
<script>
@ -125,26 +116,17 @@ export default {
},
data: function () {
return {
dismissed: false,
releaseNotesShown: false,
updaterShown: false,
modalActive: false,
updateStarted: false,
updateStatus: "",
};
},
methods: {
dismiss: function () {
this.dismissed = true;
showModal: function () {
this.modalActive = true;
},
toggleReleaseNotes: function (e) {
e.preventDefault();
this.releaseNotesShown = !this.releaseNotesShown;
},
toggleUpdater: function (e) {
e.preventDefault();
if (!this.updateStarted) {
this.updaterShown = !this.updaterShown;
}
closeModal: function () {
this.modalActive = false;
},
update: async function () {
try {
@ -155,24 +137,20 @@ export default {
this.updateStatus = "Aktualisierung nicht möglich: " + e;
}
},
releaseNotesUrl: function (version) {
return `https://github.com/andig/evcc/releases/tag/${version}`;
},
},
computed: {
active: function () {
newVersionAvailable: function () {
return (
this.available && // available version already computed?
this.installed != "[[.Version]]" && // go template parsed?
this.installed != "0.0.1-alpha" && // make used?
this.available != this.installed &&
this.dismissed === false
this.available != this.installed
);
},
},
watch: {
available: function () {
this.dismissed = false;
this.releaseNotesShown = false;
},
},
};
</script>
@ -185,7 +163,6 @@ export default {
.fade-leave-to {
opacity: 0;
}
.dialog {
position: fixed;
top: 0;
@ -196,15 +173,10 @@ export default {
overflow: hidden;
outline: 0;
}
.display-enter-active {
display: block !important;
.icon {
color: #0fdd42;
}
.expand-icon {
transition: transform 0.25s ease-in;
transform: rotate(0);
}
.expand-icon-rotated {
transform: rotate(-180deg);
.text-black a {
color: #18191a;
}
</style>

View file

@ -18,6 +18,9 @@ import { faSun } from "@fortawesome/free-solid-svg-icons/faSun";
import { faTemperatureHigh } from "@fortawesome/free-solid-svg-icons/faTemperatureHigh";
import { faTemperatureLow } from "@fortawesome/free-solid-svg-icons/faTemperatureLow";
import { faThermometerHalf } from "@fortawesome/free-solid-svg-icons/faThermometerHalf";
import { faHeart } from "@fortawesome/free-solid-svg-icons/faHeart";
import { faGift } from "@fortawesome/free-solid-svg-icons/faGift";
import { faBox } from "@fortawesome/free-solid-svg-icons/faBox";
library.add(
faArrowDown,
@ -35,7 +38,10 @@ library.add(
faSun,
faTemperatureHigh,
faTemperatureLow,
faThermometerHalf
faThermometerHalf,
faHeart,
faGift,
faBox
);
Vue.component("fa-icon", FontAwesomeIcon);

View file

@ -1,58 +1,53 @@
<template>
<div>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="https://github.com/andig/evcc"
><fa-icon icon="leaf" class="text-primary mr-2"></fa-icon>evcc</a
>
<button
class="navbar-toggler"
type="button"
data-toggle="collapse"
data-target="#navbarNavAltMarkup"
aria-controls="navbarNavAltMarkup"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
<div class="navbar-nav">
<router-link class="nav-item nav-link pb-1" to="/">Laden</router-link>
<router-link class="nav-item nav-link pb-1" to="/config"
>Konfiguration</router-link
<div class="app d-flex flex-column justify-content-between">
<div>
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="container">
<a class="navbar-brand" href="https://github.com/andig/evcc"
><fa-icon icon="leaf" class="text-primary mr-2"></fa-icon>evcc</a
>
<a
class="nav-item nav-link pb-1"
href="https://github.com/andig/evcc/discussions"
target="_blank"
>Community Support</a
<button
class="navbar-toggler"
type="button"
data-toggle="collapse"
data-target="#navbarNavAltMarkup"
aria-controls="navbarNavAltMarkup"
aria-expanded="false"
aria-label="Toggle navigation"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
<div class="navbar-nav">
<router-link class="nav-item nav-link pb-1" to="/">Laden</router-link>
<router-link class="nav-item nav-link pb-1" to="/config"
>Konfiguration</router-link
>
<a
class="nav-item nav-link pb-1"
href="https://github.com/andig/evcc/discussions"
target="_blank"
>Community Support</a
>
</div>
</div>
</div>
</div>
</nav>
</nav>
<Version
id="version-bar"
:installed="installedVersion"
:available="store.state.availableVersion"
:releaseNotes="store.state.releaseNotes"
:hasUpdater="store.state.hasUpdater"
:uploadMessage="store.state.uploadMessage"
:uploadProgress="store.state.uploadProgress"
></Version>
<router-view></router-view>
<router-view></router-view>
</div>
<Footer :version="version" />
</div>
</template>
<script>
import "../icons";
import Version from "../components/Version";
import Footer from "../components/Footer";
import store from "../store";
export default {
name: "App",
components: { Version },
components: { Footer },
data: function () {
return {
compact: false,
@ -89,6 +84,18 @@ export default {
};
},
},
computed: {
version: function () {
return {
installed: this.installedVersion,
available: this.store.state.availableVersion,
releaseNotes: this.store.state.releaseNotes,
hasUpdater: this.store.state.hasUpdater,
uploadMessage: this.store.state.uploadMessage,
uploadProgress: this.store.state.uploadProgress,
};
},
},
created: function () {
const urlParams = new URLSearchParams(window.location.search);
this.compact = urlParams.get("compact");
@ -96,3 +103,8 @@ export default {
},
};
</script>
<style scoped>
.app {
min-height: 100vh;
}
</style>

View file

@ -1 +1 @@
.progress-bar-animated{animation-direction:reverse}.btn.caption{opacity:1}.btn.first{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}.value,input[type=radio],label.btn{white-space:nowrap!important}.text-muted a,.text-muted a:hover{color:#6c757d!important;text-decoration:none}.bg-muted{opacity:.25}.fade-enter-active[data-v-4b17e482],.fade-leave-active[data-v-4b17e482]{transition:opacity .25s ease-in}.fade-enter[data-v-4b17e482],.fade-leave-to[data-v-4b17e482]{opacity:0}.dialog[data-v-4b17e482]{position:fixed;top:0;left:0;z-index:1050;width:100%;height:100%;overflow:hidden;outline:0}.display-enter-active[data-v-4b17e482]{display:block!important}.expand-icon[data-v-4b17e482]{transition:transform .25s ease-in;transform:rotate(0)}.expand-icon-rotated[data-v-4b17e482]{transform:rotate(-180deg)}
.progress-bar-animated{animation-direction:reverse}.btn.caption{opacity:1}.btn.first{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}code{font-size:87.5%;color:#e83e8c;word-wrap:break-word}.value,input[type=radio],label.btn{white-space:nowrap!important}.text-muted a,.text-muted a:hover{color:#6c757d!important;text-decoration:none}.bg-muted{opacity:.25}.fade-enter-active[data-v-a6ded36e],.fade-leave-active[data-v-a6ded36e]{transition:opacity .25s ease-in}.fade-enter[data-v-a6ded36e],.fade-leave-to[data-v-a6ded36e]{opacity:0}.dialog[data-v-a6ded36e]{position:fixed;top:0;left:0;z-index:1050;width:100%;height:100%;overflow:hidden;outline:0}.icon[data-v-a6ded36e]{color:#0fdd42}.text-black a[data-v-a6ded36e]{color:#18191a}.icon[data-v-b6dbe422]{color:#0fdd42}.text-black a[data-v-b6dbe422]{color:#18191a}.app[data-v-2052a870]{min-height:100vh}

4
dist/index.html vendored
View file

@ -1,4 +1,4 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="description" content="EV Charge Controller"><meta name="author" content="andig"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><link rel="apple-touch-icon" sizes="180x180" href="ico/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="ico/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="ico/favicon-16x16.png"><link rel="manifest" href="ico/site.webmanifest"><link rel="mask-icon" href="ico/safari-pinned-tab.svg" color="#5bbad5"><link rel="shortcut icon" href="ico/favicon.ico"><meta name="msapplication-TileColor" content="#2b5797"><meta name="msapplication-config" content="ico/browserconfig.xml"><meta name="theme-color" content="#ffffff"><title>evcc</title><link href="css/chunk-vendors.c5b0137c.css" rel="preload" as="style"><link href="css/index.4716cdc1.css" rel="preload" as="style"><link href="js/chunk-vendors.7c84295f.js" rel="preload" as="script"><link href="js/index.bf403928.js" rel="preload" as="script"><link href="css/chunk-vendors.c5b0137c.css" rel="stylesheet"><link href="css/index.4716cdc1.css" rel="stylesheet"></head><body><script>window.evcc = {
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="description" content="EV Charge Controller"><meta name="author" content="andig"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-status-bar-style" content="black"><link rel="apple-touch-icon" sizes="180x180" href="ico/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="ico/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="ico/favicon-16x16.png"><link rel="manifest" href="ico/site.webmanifest"><link rel="mask-icon" href="ico/safari-pinned-tab.svg" color="#5bbad5"><link rel="shortcut icon" href="ico/favicon.ico"><meta name="msapplication-TileColor" content="#2b5797"><meta name="msapplication-config" content="ico/browserconfig.xml"><meta name="theme-color" content="#ffffff"><title>evcc</title><link href="css/chunk-vendors.c5b0137c.css" rel="preload" as="style"><link href="css/index.9eccec4b.css" rel="preload" as="style"><link href="js/chunk-vendors.a1c300d6.js" rel="preload" as="script"><link href="js/index.9f86ca25.js" rel="preload" as="script"><link href="css/chunk-vendors.c5b0137c.css" rel="stylesheet"><link href="css/index.9eccec4b.css" rel="stylesheet"></head><body><script>window.evcc = {
version: "[[.Version]]",
configured: "[[.Configured]]",
};</script><div id="app"></div><div id="toasts"></div><footer class="pt-4 pb-2 pt-md-5 pb-md-4 mt-3 mt-md-5 border-top"><div class="container"><div class="row"><div class="col-6"><small class="text-muted"><a href="https://github.com/andig/evcc/releases/tag/[[.Version]]">[[.Version]]</a> (<a href="https://github.com/andig/evcc/commit/[[.Commit]]">[[.Commit]]</a>)</small></div><div class="col-6 text-right"><small class="text-muted">&copy; 2020</small></div></div></div></footer><script src="js/chunk-vendors.7c84295f.js"></script><script src="js/index.bf403928.js"></script></body></html>
};</script><div id="app"></div><div id="toasts"></div><script src="js/chunk-vendors.a1c300d6.js"></script><script src="js/index.9f86ca25.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
dist/js/chunk-vendors.a1c300d6.js.map vendored Normal file

File diff suppressed because one or more lines are too long

2
dist/js/index.9f86ca25.js vendored Normal file

File diff suppressed because one or more lines are too long

1
dist/js/index.9f86ca25.js.map vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

150
package-lock.json generated
View file

@ -3061,16 +3061,6 @@
"webpack-merge": "^4.2.2"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"cacache": {
"version": "13.0.1",
"resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz",
@ -3097,40 +3087,12 @@
"unique-filename": "^1.1.1"
}
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"chownr": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
"dev": true
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"dotenv": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz",
@ -3365,42 +3327,6 @@
"schema-utils": "^2.5.0"
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.1.2",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.2.tgz",
"integrity": "sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"json5": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
"integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
"dev": true,
"optional": true,
"requires": {
"minimist": "^1.2.5"
}
},
"loader-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"dev": true,
"optional": true,
"requires": {
"big.js": "^5.2.2",
"emojis-list": "^3.0.0",
"json5": "^2.1.2"
}
}
}
},
"yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
@ -18564,6 +18490,82 @@
}
}
},
"vue-loader-v16": {
"version": "npm:vue-loader@16.1.2",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.1.2.tgz",
"integrity": "sha512-8QTxh+Fd+HB6fiL52iEVLKqE9N1JSlMXLR92Ijm6g8PZrwIxckgpqjPDWRP5TWxdiPaHR+alUWsnu1ShQOwt+Q==",
"dev": true,
"optional": true,
"requires": {
"chalk": "^4.1.0",
"hash-sum": "^2.0.0",
"loader-utils": "^2.0.0"
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dev": true,
"optional": true,
"requires": {
"color-convert": "^2.0.1"
}
},
"chalk": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
"dev": true,
"optional": true,
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dev": true,
"optional": true,
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true,
"optional": true
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true,
"optional": true
},
"hash-sum": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
"integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==",
"dev": true,
"optional": true
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dev": true,
"optional": true,
"requires": {
"has-flag": "^4.0.0"
}
}
}
},
"vue-router": {
"version": "3.4.9",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-3.4.9.tgz",