aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--docs/customservices.md41
-rw-r--r--src/assets/app.scss11
-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
9 files changed, 704 insertions, 46 deletions
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 48c60ae..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;
@@ -224,7 +224,6 @@ body {
224 } 224 }
225 225
226 .card { 226 .card {
227 border-radius: 5px;
228 border: none; 227 border: none;
229 box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1); 228 box-shadow: 0 2px 15px 0 rgba(0, 0, 0, 0.1);
230 transition: cubic-bezier(0.165, 0.84, 0.44, 1) 300ms; 229 transition: cubic-bezier(0.165, 0.84, 0.44, 1) 300ms;
@@ -260,11 +259,13 @@ body {
260 } 259 }
261 260
262 .column div:first-of-type .card { 261 .column div:first-of-type .card {
263 border-radius: 5px 5px 0 0; 262 border-top-left-radius: 0.25rem;
263 border-top-right-radius: 0.25rem;
264 } 264 }
265 265
266 .column div:last-child .card { 266 .column div:last-child .card {
267 border-radius: 0 0 5px 5px; 267 border-bottom-left-radius: 0.25rem;
268 border-bottom-right-radius: 0.25rem;
268 } 269 }
269 } 270 }
270 271
@@ -348,4 +349,4 @@ body {
348 349
349.group-logo { 350.group-logo {
350 float: left; 351 float: left;
351} \ No newline at end of file 352}
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