aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--docs/configuration.md13
-rw-r--r--docs/customservices.md41
-rw-r--r--src/assets/app.scss2
-rw-r--r--src/components/Message.vue2
-rw-r--r--src/components/services/Medusa.vue128
-rw-r--r--src/components/services/PaperlessNG.vue81
-rw-r--r--src/components/services/Ping.vue93
-rw-r--r--src/components/services/Radarr.vue157
-rw-r--r--src/components/services/Sonarr.vue157
-rw-r--r--yarn.lock80
10 files changed, 712 insertions, 42 deletions
diff --git a/docs/configuration.md b/docs/configuration.md
index a472b41..ce36c51 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -167,3 +167,16 @@ In order to easily generate all required icon preset for the PWA to work, a tool
167```bash 167```bash
168npx vue-pwa-asset-generator -a {your_512x512_source_png} -o {your_output_folder} 168npx vue-pwa-asset-generator -a {your_512x512_source_png} -o {your_output_folder}
169``` 169```
170
171### Supported services
172
173Currently the following services are supported for showing quick infos on the card. They can be used by setting the type to one of the following values at the item.
174
175- PiHole
176- AdGuardHome
177- PaperlessNG
178
179### Additional configuration
180
181#### Paperless
182For Paperless you need an API-Key which you have to store at the item in the field `apikey`. \ No newline at end of file
diff --git a/docs/customservices.md b/docs/customservices.md
new file mode 100644
index 0000000..d2deff4
--- /dev/null
+++ b/docs/customservices.md
@@ -0,0 +1,41 @@
1# Custom Services
2
3Here is an overview of all custom services that are available within Homer.
4
5## PiHole
6
7Using the PiHole service you can display info about your local PiHole instance right on your Homer dashboard.
8
9The following configuration is available for the PiHole service.
10
11```
12 items:
13 - name: "Pi-hole"
14 logo: "assets/tools/sample.png"
15 # subtitle: "Network-wide Ad Blocking" # optional, if no subtitle is defined, PiHole statistics will be shown
16 url: "http://192.168.0.151/admin"
17 type: "PiHole"
18```
19
20## Medusa
21
22This service displays News (grey), Warning (orange) or Error (red) notifications bubbles from the Medusa application.
23Two lines are needed in the config.yml :
24```
25type: "Medusa"
26apikey: "01234deb70424befb1f4ef6a23456789"
27```
28The url must be the root url of Medusa application.
29The Medusa API key can be found in General configuration > Interface. It is needed to access Medusa API.
30
31
32## Sonarr/Radarr
33
34This service displays Activity (blue), Warning (orange) or Error (red) notifications bubbles from the Radarr/Sonarr application.
35Two lines are needed in the config.yml :
36```
37type: "Radarr" or "Sonarr"
38apikey: "01234deb70424befb1f4ef6a23456789"
39```
40The url must be the root url of Radarr/Sonarr application.
41The Radarr/Sonarr API key can be found in Settings > General. It is needed to access the API.
diff --git a/src/assets/app.scss b/src/assets/app.scss
index 924b85a..6bb5068 100644
--- a/src/assets/app.scss
+++ b/src/assets/app.scss
@@ -211,7 +211,7 @@ body {
211 color: var(--highlight-secondary); 211 color: var(--highlight-secondary);
212 background-color: var(--highlight-secondary); 212 background-color: var(--highlight-secondary);
213 position: absolute; 213 position: absolute;
214 top: 1rem; 214 bottom: 1rem;
215 right: -0.2rem; 215 right: -0.2rem;
216 width: 3px; 216 width: 3px;
217 overflow: hidden; 217 overflow: hidden;
diff --git a/src/components/Message.vue b/src/components/Message.vue
index 6cc649a..00ce158 100644
--- a/src/components/Message.vue
+++ b/src/components/Message.vue
@@ -54,7 +54,7 @@ export default {
54 54
55 // keep the original config value if no value is provided by the endpoint 55 // keep the original config value if no value is provided by the endpoint
56 const message = this.message; 56 const message = this.message;
57 for (const prop of ["title", "style", "content"]) { 57 for (const prop of ["title", "style", "content", "icon"]) {
58 if (prop in fetchedMessage && fetchedMessage[prop] !== null) { 58 if (prop in fetchedMessage && fetchedMessage[prop] !== null) {
59 message[prop] = fetchedMessage[prop]; 59 message[prop] = fetchedMessage[prop];
60 } 60 }
diff --git a/src/components/services/Medusa.vue b/src/components/services/Medusa.vue
new file mode 100644
index 0000000..5720649
--- /dev/null
+++ b/src/components/services/Medusa.vue
@@ -0,0 +1,128 @@
1<template>
2 <div>
3 <div class="card" :class="item.class">
4 <a :href="item.url" :target="item.target" rel="noreferrer">
5 <div class="card-content">
6 <div class="media">
7 <div v-if="item.logo" class="media-left">
8 <figure class="image is-48x48">
9 <img :src="item.logo" :alt="`${item.name} logo`" />
10 </figure>
11 </div>
12 <div v-if="item.icon" class="media-left">
13 <figure class="image is-48x48">
14 <i style="font-size: 35px" :class="['fa-fw', item.icon]"></i>
15 </figure>
16 </div>
17 <div class="media-content">
18 <p class="title is-4">{{ item.name }}</p>
19 <p class="subtitle is-6">{{ item.subtitle }}</p>
20 </div>
21 <div class="notifs">
22 <strong
23 v-if="config !== null && config.system.news.unread > 0"
24 class="notif news"
25 title="News"
26 >{{ config.system.news.unread }}</strong
27 >
28 <strong
29 v-if="config !== null && config.main.logs.numWarnings > 0"
30 class="notif warnings"
31 title="Warning"
32 >{{ config.main.logs.numWarnings }}</strong
33 >
34 <strong
35 v-if="config !== null && config.main.logs.numErrors > 0"
36 class="notif errors"
37 title="Error"
38 >{{ config.main.logs.numErrors }}</strong
39 >
40 <strong
41 v-if="serverError"
42 class="notif errors"
43 title="Connection error to Medusa API, check url and apikey in config.yml"
44 >?</strong
45 >
46 </div>
47 </div>
48 <div class="tag" :class="item.tagstyle" v-if="item.tag">
49 <strong class="tag-text">#{{ item.tag }}</strong>
50 </div>
51 </div>
52 </a>
53 </div>
54 </div>
55</template>
56
57<script>
58export default {
59 name: "Medusa",
60 props: {
61 item: Object,
62 },
63 data: () => {
64 return {
65 config: null,
66 serverError: false,
67 };
68 },
69 created: function () {
70 this.fetchConfig();
71 },
72 methods: {
73 fetchConfig: function () {
74 fetch(`${this.item.url}/api/v2/config`, {
75 credentials: "include",
76 headers: { "X-Api-Key": `${this.item.apikey}` },
77 })
78 .then((response) => {
79 if (response.status != 200) {
80 throw new Error(response.statusText);
81 }
82 return response.json();
83 })
84 .then((conf) => {
85 this.config = conf;
86 })
87 .catch((e) => {
88 console.log(e);
89 this.serverError = true;
90 });
91 },
92 },
93};
94</script>
95
96<style scoped lang="scss">
97.media-left img {
98 max-height: 100%;
99}
100.notifs {
101 position: absolute;
102 color: white;
103 font-family: sans-serif;
104 top: 0.3em;
105 right: 0.5em;
106}
107.notif {
108 padding-right: 0.35em;
109 padding-left: 0.35em;
110 padding-top: 0.2em;
111 padding-bottom: 0.2em;
112 border-radius: 0.25em;
113 position: relative;
114 margin-left: 0.3em;
115 font-size: 0.8em;
116}
117.news {
118 background-color: #777777;
119}
120
121.warnings {
122 background-color: #d08d2e;
123}
124
125.errors {
126 background-color: #e51111;
127}
128</style>
diff --git a/src/components/services/PaperlessNG.vue b/src/components/services/PaperlessNG.vue
new file mode 100644
index 0000000..c4f50eb
--- /dev/null
+++ b/src/components/services/PaperlessNG.vue
@@ -0,0 +1,81 @@
1<template>
2 <div>
3 <div class="card" :class="item.class">
4 <a :href="item.url" :target="item.target" rel="noreferrer">
5 <div class="card-content">
6 <div class="media">
7 <div v-if="item.logo" class="media-left">
8 <figure class="image is-48x48">
9 <img :src="item.logo" :alt="`${item.name} logo`" />
10 </figure>
11 </div>
12 <div v-if="item.icon" class="media-left">
13 <figure class="image is-48x48">
14 <i style="font-size: 35px" :class="['fa-fw', item.icon]"></i>
15 </figure>
16 </div>
17 <div class="media-content">
18 <p class="title is-4">{{ item.name }}</p>
19 <p class="subtitle is-6">
20 <template v-if="item.subtitle">
21 {{ item.subtitle }}
22 </template>
23 <template v-else-if="api">
24 happily storing {{ api.count }} documents
25 </template>
26 </p>
27 </div>
28 </div>
29 <div class="tag" :class="item.tagstyle" v-if="item.tag">
30 <strong class="tag-text">#{{ item.tag }}</strong>
31 </div>
32 </div>
33 </a>
34 </div>
35 </div>
36</template>
37
38<script>
39export default {
40 name: "Paperless",
41 props: {
42 item: Object,
43 },
44 data: () => ({
45 api: null,
46 }),
47 created() {
48 this.fetchStatus();
49 },
50 methods: {
51 fetchStatus: async function () {
52 if (this.item.subtitle != null) return; // omitting unnecessary ajax call as the subtitle is showing
53 var apikey = this.item.apikey;
54 if (!apikey) {
55 console.error("apikey is not present in config.yml for the paperless entry!");
56 return;
57 }
58 const url = `${this.item.url}/api/documents/`;
59 this.api = await fetch(url, {
60 headers: {
61 "Authorization": "Token " + this.item.apikey
62 }
63 })
64 .then(function(response) {
65 if (!response.ok) {
66 throw new Error("Not 2xx response")
67 } else {
68 return response.json()
69 }
70 })
71 .catch((e) => console.log(e));
72 },
73 },
74};
75</script>
76
77<style scoped lang="scss">
78.media-left img {
79 max-height: 100%;
80}
81</style>
diff --git a/src/components/services/Ping.vue b/src/components/services/Ping.vue
new file mode 100644
index 0000000..a9114a8
--- /dev/null
+++ b/src/components/services/Ping.vue
@@ -0,0 +1,93 @@
1<template>
2 <div>
3 <div class="card" :class="item.class">
4 <a :href="item.url" :target="item.target" rel="noreferrer">
5 <div class="card-content">
6 <div class="media">
7 <div v-if="item.logo" class="media-left">
8 <figure class="image is-48x48">
9 <img :src="item.logo" :alt="`${item.name} logo`" />
10 </figure>
11 </div>
12 <div v-if="item.icon" class="media-left">
13 <figure class="image is-48x48">
14 <i style="font-size: 35px" :class="['fa-fw', item.icon]"></i>
15 </figure>
16 </div>
17 <div class="media-content">
18 <p class="title is-4">{{ item.name }}</p>
19 <p class="subtitle is-6">
20 <template v-if="item.subtitle">
21 {{ item.subtitle }}
22 </template>
23 </p>
24 </div>
25 <div v-if="api" class="status" :class="api.status">
26 {{ api.status }}
27 </div>
28 </div>
29 <div class="tag" :class="item.tagstyle" v-if="item.tag">
30 <strong class="tag-text">#{{ item.tag }}</strong>
31 </div>
32 </div>
33 </a>
34 </div>
35 </div>
36</template>
37
38<script>
39export default {
40 name: "Ping",
41 props: {
42 item: Object,
43 },
44 data: () => ({
45 api: {
46 status: "",
47 },
48 }),
49 created() {
50 this.fetchStatus();
51 },
52 methods: {
53 fetchStatus: async function () {
54 const url = `${this.item.url}`;
55 this.api.status = await fetch(url)
56 .then((response) => "enabled")
57 .catch((e) => "disabled");
58 },
59 },
60};
61</script>
62
63<style scoped lang="scss">
64.media-left img {
65 max-height: 100%;
66}
67.status {
68 font-size: 0.8rem;
69 color: var(--text-title);
70
71 &.enabled:before {
72 background-color: #94e185;
73 border-color: #78d965;
74 box-shadow: 0 0 4px 1px #94e185;
75 }
76
77 &.disabled:before {
78 background-color: #c9404d;
79 border-color: #c42c3b;
80 box-shadow: 0 0 4px 1px #c9404d;
81 }
82
83 &:before {
84 content: " ";
85 display: inline-block;
86 width: 7px;
87 height: 7px;
88 margin-right: 10px;
89 border: 1px solid #000;
90 border-radius: 7px;
91 }
92}
93</style>
diff --git a/src/components/services/Radarr.vue b/src/components/services/Radarr.vue
new file mode 100644
index 0000000..93831a7
--- /dev/null
+++ b/src/components/services/Radarr.vue
@@ -0,0 +1,157 @@
1<template>
2 <div>
3 <div class="card" :class="item.class">
4 <a :href="item.url" :target="item.target" rel="noreferrer">
5 <div class="card-content">
6 <div class="media">
7 <div v-if="item.logo" class="media-left">
8 <figure class="image is-48x48">
9 <img :src="item.logo" :alt="`${item.name} logo`" />
10 </figure>
11 </div>
12 <div v-if="item.icon" class="media-left">
13 <figure class="image is-48x48">
14 <i style="font-size: 35px" :class="['fa-fw', item.icon]"></i>
15 </figure>
16 </div>
17 <div class="media-content">
18 <p class="title is-4">{{ item.name }}</p>
19 <p class="subtitle is-6">{{ item.subtitle }}</p>
20 </div>
21 <div class="notifs">
22 <strong
23 v-if="activity > 0"
24 class="notif activity"
25 title="Activity"
26 >{{ activity }}</strong
27 >
28 <strong
29 v-if="warnings > 0"
30 class="notif warnings"
31 title="Warning"
32 >{{ warnings }}</strong
33 >
34 <strong v-if="errors > 0" class="notif errors" title="Error">{{
35 errors
36 }}</strong>
37 <strong
38 v-if="serverError"
39 class="notif errors"
40 title="Connection error to Radarr API, check url and apikey in config.yml"
41 >?</strong
42 >
43 </div>
44 </div>
45 <div class="tag" :class="item.tagstyle" v-if="item.tag">
46 <strong class="tag-text">#{{ item.tag }}</strong>
47 </div>
48 </div>
49 </a>
50 </div>
51 </div>
52</template>
53
54<script>
55export default {
56 name: "Radarr",
57 props: {
58 item: Object,
59 },
60 data: () => {
61 return {
62 activity: null,
63 warnings: null,
64 errors: null,
65 serverError: false,
66 };
67 },
68 created: function () {
69 this.fetchConfig();
70 },
71 methods: {
72 fetchConfig: function () {
73 fetch(`${this.item.url}/api/health`, {
74 credentials: "include",
75 headers: { "X-Api-Key": `${this.item.apikey}` },
76 })
77 .then((response) => {
78 if (response.status != 200) {
79 throw new Error(response.statusText);
80 }
81 return response.json();
82 })
83 .then((health) => {
84 this.warnings = 0;
85 this.errors = 0;
86 for (var i = 0; i < health.length; i++) {
87 if (health[i].type == "warning") {
88 this.warnings++;
89 } else if (health[i].type == "error") {
90 this.errors++;
91 }
92 }
93 })
94 .catch((e) => {
95 console.error(e);
96 this.serverError = true;
97 });
98 fetch(`${this.item.url}/api/queue`, {
99 credentials: "include",
100 headers: { "X-Api-Key": `${this.item.apikey}` },
101 })
102 .then((response) => {
103 if (response.status != 200) {
104 throw new Error(response.statusText);
105 }
106 return response.json();
107 })
108 .then((queue) => {
109 this.activity = 0;
110 for (var i = 0; i < queue.length; i++) {
111 if (queue[i].movie) {
112 this.activity++;
113 }
114 }
115 })
116 .catch((e) => {
117 console.error(e);
118 this.serverError = true;
119 });
120 },
121 },
122};
123</script>
124
125<style scoped lang="scss">
126.media-left img {
127 max-height: 100%;
128}
129.notifs {
130 position: absolute;
131 color: white;
132 font-family: sans-serif;
133 top: 0.3em;
134 right: 0.5em;
135}
136.notif {
137 padding-right: 0.35em;
138 padding-left: 0.35em;
139 padding-top: 0.2em;
140 padding-bottom: 0.2em;
141 border-radius: 0.25em;
142 position: relative;
143 margin-left: 0.3em;
144 font-size: 0.8em;
145}
146.activity {
147 background-color: #4fb5d6;
148}
149
150.warnings {
151 background-color: #d08d2e;
152}
153
154.errors {
155 background-color: #e51111;
156}
157</style>
diff --git a/src/components/services/Sonarr.vue b/src/components/services/Sonarr.vue
new file mode 100644
index 0000000..8cebac4
--- /dev/null
+++ b/src/components/services/Sonarr.vue
@@ -0,0 +1,157 @@
1<template>
2 <div>
3 <div class="card" :class="item.class">
4 <a :href="item.url" :target="item.target" rel="noreferrer">
5 <div class="card-content">
6 <div class="media">
7 <div v-if="item.logo" class="media-left">
8 <figure class="image is-48x48">
9 <img :src="item.logo" :alt="`${item.name} logo`" />
10 </figure>
11 </div>
12 <div v-if="item.icon" class="media-left">
13 <figure class="image is-48x48">
14 <i style="font-size: 35px" :class="['fa-fw', item.icon]"></i>
15 </figure>
16 </div>
17 <div class="media-content">
18 <p class="title is-4">{{ item.name }}</p>
19 <p class="subtitle is-6">{{ item.subtitle }}</p>
20 </div>
21 <div class="notifs">
22 <strong
23 v-if="activity > 0"
24 class="notif activity"
25 title="Activity"
26 >{{ activity }}</strong
27 >
28 <strong
29 v-if="warnings > 0"
30 class="notif warnings"
31 title="Warning"
32 >{{ warnings }}</strong
33 >
34 <strong v-if="errors > 0" class="notif errors" title="Error">{{
35 errors
36 }}</strong>
37 <strong
38 v-if="serverError"
39 class="notif errors"
40 title="Connection error to Sonarr API, check url and apikey in config.yml"
41 >?</strong
42 >
43 </div>
44 </div>
45 <div class="tag" :class="item.tagstyle" v-if="item.tag">
46 <strong class="tag-text">#{{ item.tag }}</strong>
47 </div>
48 </div>
49 </a>
50 </div>
51 </div>
52</template>
53
54<script>
55export default {
56 name: "Sonarr",
57 props: {
58 item: Object,
59 },
60 data: () => {
61 return {
62 activity: null,
63 warnings: null,
64 errors: null,
65 serverError: false,
66 };
67 },
68 created: function () {
69 this.fetchConfig();
70 },
71 methods: {
72 fetchConfig: function () {
73 fetch(`${this.item.url}/api/health`, {
74 credentials: "include",
75 headers: { "X-Api-Key": `${this.item.apikey}` },
76 })
77 .then((response) => {
78 if (response.status != 200) {
79 throw new Error(response.statusText);
80 }
81 return response.json();
82 })
83 .then((health) => {
84 this.warnings = 0;
85 this.errors = 0;
86 for (var i = 0; i < health.length; i++) {
87 if (health[i].type == "warning") {
88 this.warnings++;
89 } else if (health[i].type == "error") {
90 this.errors++;
91 }
92 }
93 })
94 .catch((e) => {
95 console.error(e);
96 this.serverError = true;
97 });
98 fetch(`${this.item.url}/api/queue`, {
99 credentials: "include",
100 headers: { "X-Api-Key": `${this.item.apikey}` },
101 })
102 .then((response) => {
103 if (response.status != 200) {
104 throw new Error(response.statusText);
105 }
106 return response.json();
107 })
108 .then((queue) => {
109 this.activity = 0;
110 for (var i = 0; i < queue.length; i++) {
111 if (queue[i].series) {
112 this.activity++;
113 }
114 }
115 })
116 .catch((e) => {
117 console.error(e);
118 this.serverError = true;
119 });
120 },
121 },
122};
123</script>
124
125<style scoped lang="scss">
126.media-left img {
127 max-height: 100%;
128}
129.notifs {
130 position: absolute;
131 color: white;
132 font-family: sans-serif;
133 top: 0.3em;
134 right: 0.5em;
135}
136.notif {
137 padding-right: 0.35em;
138 padding-left: 0.35em;
139 padding-top: 0.2em;
140 padding-bottom: 0.2em;
141 border-radius: 0.25em;
142 position: relative;
143 margin-left: 0.3em;
144 font-size: 0.8em;
145}
146.activity {
147 background-color: #4fb5d6;
148}
149
150.warnings {
151 background-color: #d08d2e;
152}
153
154.errors {
155 background-color: #e51111;
156}
157</style>
diff --git a/yarn.lock b/yarn.lock
index d3c30d1..12bfbc6 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1650,7 +1650,7 @@ ansi-regex@^5.0.0:
1650 1650
1651ansi-styles@^3.2.0, ansi-styles@^3.2.1: 1651ansi-styles@^3.2.0, ansi-styles@^3.2.1:
1652 version "3.2.1" 1652 version "3.2.1"
1653 resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 1653 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
1654 integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 1654 integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
1655 dependencies: 1655 dependencies:
1656 color-convert "^1.9.0" 1656 color-convert "^1.9.0"
@@ -1794,7 +1794,7 @@ async-each@^1.0.1:
1794 1794
1795async-limiter@~1.0.0: 1795async-limiter@~1.0.0:
1796 version "1.0.1" 1796 version "1.0.1"
1797 resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" 1797 resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
1798 integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== 1798 integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
1799 1799
1800async@^2.6.2: 1800async@^2.6.2:
@@ -2141,13 +2141,13 @@ browserify-zlib@^0.2.0:
2141 pako "~1.0.5" 2141 pako "~1.0.5"
2142 2142
2143browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.4: 2143browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.4:
2144 version "4.16.4" 2144 version "4.16.6"
2145 resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz" 2145 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2"
2146 integrity sha512-d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ== 2146 integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==
2147 dependencies: 2147 dependencies:
2148 caniuse-lite "^1.0.30001208" 2148 caniuse-lite "^1.0.30001219"
2149 colorette "^1.2.2" 2149 colorette "^1.2.2"
2150 electron-to-chromium "^1.3.712" 2150 electron-to-chromium "^1.3.723"
2151 escalade "^3.1.1" 2151 escalade "^3.1.1"
2152 node-releases "^1.1.71" 2152 node-releases "^1.1.71"
2153 2153
@@ -2337,10 +2337,10 @@ caniuse-api@^3.0.0:
2337 lodash.memoize "^4.1.2" 2337 lodash.memoize "^4.1.2"
2338 lodash.uniq "^4.5.0" 2338 lodash.uniq "^4.5.0"
2339 2339
2340caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001208: 2340caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219:
2341 version "1.0.30001214" 2341 version "1.0.30001230"
2342 resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz" 2342 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz#8135c57459854b2240b57a4a6786044bdc5a9f71"
2343 integrity sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg== 2343 integrity sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==
2344 2344
2345case-sensitive-paths-webpack-plugin@^2.3.0: 2345case-sensitive-paths-webpack-plugin@^2.3.0:
2346 version "2.4.0" 2346 version "2.4.0"
@@ -2354,7 +2354,7 @@ caseless@~0.12.0:
2354 2354
2355chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: 2355chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
2356 version "2.4.2" 2356 version "2.4.2"
2357 resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 2357 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
2358 integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 2358 integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
2359 dependencies: 2359 dependencies:
2360 ansi-styles "^3.2.1" 2360 ansi-styles "^3.2.1"
@@ -2563,7 +2563,7 @@ collection-visit@^1.0.0:
2563 2563
2564color-convert@^1.9.0, color-convert@^1.9.1: 2564color-convert@^1.9.0, color-convert@^1.9.1:
2565 version "1.9.3" 2565 version "1.9.3"
2566 resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 2566 resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
2567 integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 2567 integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
2568 dependencies: 2568 dependencies:
2569 color-name "1.1.3" 2569 color-name "1.1.3"
@@ -2577,7 +2577,7 @@ color-convert@^2.0.1:
2577 2577
2578color-name@1.1.3, color-name@^1.0.0: 2578color-name@1.1.3, color-name@^1.0.0:
2579 version "1.1.3" 2579 version "1.1.3"
2580 resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 2580 resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
2581 integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 2581 integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
2582 2582
2583color-name@~1.1.4: 2583color-name@~1.1.4:
@@ -2603,7 +2603,7 @@ color@^3.0.0:
2603 2603
2604colorette@^1.2.1, colorette@^1.2.2: 2604colorette@^1.2.1, colorette@^1.2.2:
2605 version "1.2.2" 2605 version "1.2.2"
2606 resolved "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz" 2606 resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
2607 integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== 2607 integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
2608 2608
2609combined-stream@^1.0.6, combined-stream@~1.0.6: 2609combined-stream@^1.0.6, combined-stream@~1.0.6:
@@ -3206,9 +3206,9 @@ dns-equal@^1.0.0:
3206 integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= 3206 integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
3207 3207
3208dns-packet@^1.3.1: 3208dns-packet@^1.3.1:
3209 version "1.3.1" 3209 version "1.3.4"
3210 resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz" 3210 resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f"
3211 integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== 3211 integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==
3212 dependencies: 3212 dependencies:
3213 ip "^1.1.0" 3213 ip "^1.1.0"
3214 safe-buffer "^5.0.1" 3214 safe-buffer "^5.0.1"
@@ -3327,10 +3327,10 @@ ejs@^2.6.1:
3327 resolved "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz" 3327 resolved "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz"
3328 integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== 3328 integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
3329 3329
3330electron-to-chromium@^1.3.712: 3330electron-to-chromium@^1.3.723:
3331 version "1.3.719" 3331 version "1.3.739"
3332 resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.719.tgz" 3332 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz#f07756aa92cabd5a6eec6f491525a64fe62f98b9"
3333 integrity sha512-heM78GKSqrIzO9Oz0/y22nTBN7bqSP1Pla2SyU9DiSnQD+Ea9SyyN5RWWlgqsqeBLNDkSlE9J9EHFmdMPzxB/g== 3333 integrity sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==
3334 3334
3335elliptic@^6.5.3: 3335elliptic@^6.5.3:
3336 version "6.5.4" 3336 version "6.5.4"
@@ -3450,7 +3450,7 @@ es-to-primitive@^1.2.1:
3450 3450
3451escalade@^3.1.1: 3451escalade@^3.1.1:
3452 version "3.1.1" 3452 version "3.1.1"
3453 resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" 3453 resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
3454 integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 3454 integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
3455 3455
3456escape-html@~1.0.3: 3456escape-html@~1.0.3:
@@ -3460,7 +3460,7 @@ escape-html@~1.0.3:
3460 3460
3461escape-string-regexp@^1.0.5: 3461escape-string-regexp@^1.0.5:
3462 version "1.0.5" 3462 version "1.0.5"
3463 resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 3463 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
3464 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 3464 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
3465 3465
3466eslint-config-prettier@^6.0.0: 3466eslint-config-prettier@^6.0.0:
@@ -4254,7 +4254,7 @@ has-bigints@^1.0.1:
4254 4254
4255has-flag@^3.0.0: 4255has-flag@^3.0.0:
4256 version "3.0.0" 4256 version "3.0.0"
4257 resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 4257 resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
4258 integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 4258 integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
4259 4259
4260has-flag@^4.0.0: 4260has-flag@^4.0.0:
@@ -5776,9 +5776,9 @@ node-libs-browser@^2.2.1:
5776 vm-browserify "^1.0.1" 5776 vm-browserify "^1.0.1"
5777 5777
5778node-releases@^1.1.71: 5778node-releases@^1.1.71:
5779 version "1.1.71" 5779 version "1.1.72"
5780 resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz" 5780 resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe"
5781 integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== 5781 integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==
5782 5782
5783normalize-package-data@^2.5.0: 5783normalize-package-data@^2.5.0:
5784 version "2.5.0" 5784 version "2.5.0"
@@ -6654,9 +6654,9 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0:
6654 integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== 6654 integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
6655 6655
6656postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6: 6656postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.5, postcss@^7.0.6:
6657 version "7.0.35" 6657 version "7.0.36"
6658 resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz" 6658 resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb"
6659 integrity sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg== 6659 integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==
6660 dependencies: 6660 dependencies:
6661 chalk "^2.4.2" 6661 chalk "^2.4.2"
6662 source-map "^0.6.1" 6662 source-map "^0.6.1"
@@ -7179,14 +7179,14 @@ rxjs@^6.6.0:
7179 dependencies: 7179 dependencies:
7180 tslib "^1.9.0" 7180 tslib "^1.9.0"
7181 7181
7182safe-buffer@5.1.2, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 7182safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
7183 version "5.1.2" 7183 version "5.1.2"
7184 resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" 7184 resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
7185 integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 7185 integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
7186 7186
7187safe-buffer@^5.2.0: 7187safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0:
7188 version "5.2.1" 7188 version "5.2.1"
7189 resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 7189 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
7190 integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 7190 integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
7191 7191
7192safe-regex@^1.1.0: 7192safe-regex@^1.1.0:
@@ -7526,7 +7526,7 @@ source-map@^0.5.0, source-map@^0.5.6:
7526 7526
7527source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: 7527source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
7528 version "0.6.1" 7528 version "0.6.1"
7529 resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" 7529 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
7530 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 7530 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
7531 7531
7532source-map@^0.7.3: 7532source-map@^0.7.3:
@@ -7810,14 +7810,14 @@ stylehacks@^4.0.0:
7810 7810
7811supports-color@^5.3.0: 7811supports-color@^5.3.0:
7812 version "5.5.0" 7812 version "5.5.0"
7813 resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 7813 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
7814 integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 7814 integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
7815 dependencies: 7815 dependencies:
7816 has-flag "^3.0.0" 7816 has-flag "^3.0.0"
7817 7817
7818supports-color@^6.1.0: 7818supports-color@^6.1.0:
7819 version "6.1.0" 7819 version "6.1.0"
7820 resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz" 7820 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
7821 integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== 7821 integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
7822 dependencies: 7822 dependencies:
7823 has-flag "^3.0.0" 7823 has-flag "^3.0.0"
@@ -8783,9 +8783,9 @@ write@1.0.3:
8783 mkdirp "^0.5.1" 8783 mkdirp "^0.5.1"
8784 8784
8785ws@^6.0.0, ws@^6.2.1: 8785ws@^6.0.0, ws@^6.2.1:
8786 version "6.2.1" 8786 version "6.2.2"
8787 resolved "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz" 8787 resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.2.tgz#dd5cdbd57a9979916097652d78f1cc5faea0c32e"
8788 integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== 8788 integrity sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==
8789 dependencies: 8789 dependencies:
8790 async-limiter "~1.0.0" 8790 async-limiter "~1.0.0"
8791 8791