Resolved merge conflict

This commit is contained in:
2020-06-07 16:34:00 +02:00
10 changed files with 599 additions and 8 deletions

View File

@@ -8,6 +8,7 @@
},
"dependencies": {
"express": "^4.17.1",
"mongoose": "^5.9.17",
"nodemailer": "^6.4.6",
"puppeteer": "^3.0.4"
}

33
src/db.js Normal file
View File

@@ -0,0 +1,33 @@
const mongoose = require('mongoose');
mongoose.connect("mongodb://localhost:27017/ispmonitor", {
useNewUrlParser: true
});
const Event = require('./schemas/Event');
const commitServiceEventToDatabase = async (serviceMessages, pdfFilename) => {
try {
// we only care about the second message
const message = serviceMessages[1]
const event = new Event({
date: new Date(),
isOk: message.isOk,
message: message.statusText,
pdfFilename
})
await event.save();
return serviceMessages
} catch (err) {
console.error('error from mongoose:')
console.error(err)
return serviceMessages
}
}
const getAllEvents = () => Event.find().exec()
module.exports = {
commitServiceEventToDatabase,
getAllEvents
}

View File

@@ -6,13 +6,17 @@ const config = require('../config')
const Mail = require( './mail.js');
const mail = new Mail();
const { commitServiceEventToDatabase, getAllEvents } = require('./db.js');
let browser = undefined;
if (config.debug == false)
console.log = () => {}
const pdfFilename = config['pdfFilename'] || 'telenor-downtime.pdf';
const savePageToPDF = page => {
const pdfOptions = {
path: `telenor-downtime.pdf`,
path: pdfFilename,
format: "A4",
printBackground: true,
displayHeaderFooter: true,
@@ -51,8 +55,7 @@ const exitWithError = (err, message=undefined) => {
if (config.debug === true)
console.error(err)
closeBrowser();
process.exit(1);
closeBrowserAndExit(1);
}
const dismissCookiePrompt = page => {
@@ -110,8 +113,9 @@ const webscraper = async pageURL => {
.catch(err => exitWithError(err, `Unable to reach url: ${pageURL}`))
}
function closeBrowser() {
function closeBrowserAndExit(status=0) {
browser.close();
process.exit(status);
}
@@ -120,8 +124,9 @@ function run() {
.then(page => dismissCookiePrompt(page))
.then(page => savePageToPDF(page))
.then(page => getServiceMessages(page))
.then(serviceMessages => commitServiceEventToDatabase(serviceMessages, pdfFilename))
.then(serviceMessages => notifyIfDown(serviceMessages))
.then(closeBrowser)
.then(closeBrowserAndExit)
}
run();

11
src/schemas/Event.js Normal file
View File

@@ -0,0 +1,11 @@
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const Event = new Schema({
date: Date,
isOk: Boolean,
message: String,
pdfFilename: String
})
module.exports = mongoose.model('Event', Event);

BIN
src/site/SF-Pro-Rounded-Light.otf Executable file

Binary file not shown.

View File

@@ -0,0 +1,52 @@
let indicentLogs = [
{
id: 1,
date: new Date('2020/05/30 01:20:38').toISOString(),
message: 'Vi har en feil i mobilnettet på denne adressen. Vi jobber med å løse problemet.',
duration: '6d 4t 32min'
}, {
id: 2,
date: new Date('2020/04/22 13:47:25').toISOString(),
message: 'Vi har en feil i internett på denne adressen. Vi jobber med å løse problemet.',
duration: '1d 2t 54min'
}
]
indicentLogs = indicentLogs.reverse()
const newDiv = () => document.createElement('div');
const closePopover = () => document.getElementById('popover').remove();
const tableRowFromLog = (log, table) => {
const row = table.insertRow(0);
row.setAttribute('incident-id', log.id)
row.onclick = clickRowPopupIncident;
row.insertCell(0).innerHTML = log.date;
row.insertCell(1).innerHTML = log.message;
row.insertCell(2).innerHTML = log.duration;
}
const clickRowPopupIncident = (event) => {
const cell = event.toElement;
const row = cell.parentElement;
const indicentId = row.getAttribute('incident-id');
const popover = newDiv()
const container = newDiv()
popover.id = 'popover'
popover.onclick = closePopover;
container.className = 'container'
container.innerText = Object.values(indicentLogs[indicentId]).join('\n')
popover.appendChild(container)
document.body.appendChild(popover);
}
function fetchLogsAndGenerateTable() {
const table = document.getElementById('log-table');
const tableBody = table.tBodies[0];
indicentLogs.map(log => tableRowFromLog(log, tableBody))
}
fetchLogsAndGenerateTable()

View File

@@ -0,0 +1,28 @@
const createEvent = () => {
const event = document.createElement('div')
event.className = 'event';
const tooltip = document.createElement('span');
tooltip.className = 'tooltip';
const tooltipContent = new Date().toLocaleString()
tooltip.innerText = tooltipContent;
event.appendChild(tooltip);
return event;
}
function fetchUptimeAndGenerateBarGraph(instances=10) {
const graph = document.getElementById('bar-graph');
const event = createEvent()
for (var i = instances; i >= 0; i--) {
const clone = event.cloneNode(true)
Math.random() > 0.95 ? clone.className += ' error' : null;
graph.appendChild(clone)
}
}
// fetchUptimeAndGenerateBarGraph(20)
fetchUptimeAndGenerateBarGraph(60)

57
src/site/index.html Normal file
View File

@@ -0,0 +1,57 @@
<!DOCTYPE html>
<html>
<head>
<title>ISP downtime monitor</title>
<meta charset="UTF-8">
<link href="style.css" type="text/css" rel="stylesheet">
</head>
<body>
<h1>Nedetid rapport</h1>
<div class="page-container">
<h2>Oppetid</h2>
<div class="container" id="bar-graph">
<!-- BAR GRAPH -->
</div>
<div class="color-indicators">
<label class="color-indicator-box green"></label>
<span>Uptime</span>
<label class="color-indicator-box red"></label>
<span>Downtime</span>
</div>
<hr />
<h2>Indicent log</h2>
<div class="container" id="indicent-logs">
<table id="log-table">
<thead><tr>
<th>Date</th>
<th>Incident message</th>
<th>Duration</th>
</tr></thead>
<tbody><tr>
<td>31 Mai 2020 22:34</td>
<td>OK</td>
<td>6d 4t 32min</td>
</tr>
<tr>
<td>31 Mai 2020 22:34</td>
<td>OK</td>
<td>6d 4t 32min</td>
</tr>
<tr>
<td>31 Mai 2020 22:34</td>
<td>OK</td>
<td>6d 4t 32min</td>
</tr></tbody>
</table>
</div>
</div>
</body>
<script src="fetchLogsAndGenerateTable.js" type="text/javascript"></script>
<script src="fetchUptimeAndGenerateBarGraph.js" type="text/javascript"></script>
</html>

216
src/site/style.css Normal file
View File

@@ -0,0 +1,216 @@
/**/
:root {
color-scheme: light;
--text-color: black;
--background-color: white;
--page-background-color: #ebeceb;
--page-background-color-40: rgba(247,249,249,0.4);
--page-background-color-80: rgba(247,249,249,0.8);
--green: #7bed9f;
--red: #ff4757;
}
@media (prefers-color-scheme: dark) {
:root {
color-scheme: light dark;
--text-color: white;
--background-color: #1c1d1e;
--page-background-color: black;
--page-background-color-40: rgba(0,0,0,0.4);
--page-background-color-80: rgba(0,0,0,0.8);
}
}
@font-face {
font-family: AppleSF;
src: url(SF-Pro-Rounded-Light.otf);
}
body {
font-family: AppleSF;
background-color: var(--page-background-color);
padding: 0 1rem;
margin: 1rem;
}
.page-container {
background-color: var(--background-color);
border-radius: 0.5rem;
min-height: 60vh;
height: 100%;
padding: .1px 2rem 1.5rem 2rem;
}
h1,h2,h3,h4 {
margin: 1.5rem 0;
padding: 0;
}
h1 {
font-size: 3rem;
}
h2 {
font-size: 2rem;
}
.container {
border-radius: 0.5rem;
}
hr {
margin: 2.5rem 1rem;
height: 1px;
background-color: var(--text-color);
border: none
}
#bar-graph {
position: relative;
width: 100%;
height: 55px;
display: flex;
flex-direction: row-reverse;
border-radius: 0.4rem;
/*overflow: hidden;*/
/*margin: 2rem 0;*/
background-color: var(--page-background-color-40);
}
.event.error {
/* position: absolute;
height: 100%;
width: 0.5rem;*/
background-color: var(--red);
}
.event {
height: 100%;
width: 1rem;
background-color: var(--green);
position: relative;
transition: transform 0.1s ease;
}
.event:not(:last-of-type) {
margin-left: 1px;
}
.event .tooltip {
visibility: hidden;
background-color: var(--page-background-color-80);
text-align: center;
padding: 0.4rem;
border-radius: 0.2rem;
position: absolute;
width: max-content;
top: calc(100% + 1rem);
left: 50%;
margin-left: -5rem;
}
.event:hover {
transform: scale(1.2);
z-index: 1;
box-shadow: -2px -2px 4px rgba(0,0,0,0.4),
2px 2px 4px rgba(0,0,0,0.4);
}
.event:hover .tooltip {
visibility: visible;
}
/*.error:nth-of-type(1) {
left: 2rem;
}
.error:nth-of-type(2) {
left: 22rem;
}
.error:nth-of-type(3) {
right: 12rem;
}*/
.color-indicators {
display: flex;
flex-direction: row;
margin: 1rem 0;
}
.color-indicator-box {
display: block;
width: 1.1rem;
height: 1.1rem;
border-radius: 0.2rem;
margin-right: 0.5rem;
}
.color-indicators .color-indicator-box:not(:first-of-type) {
margin-left: 1.5rem;
}
.color-indicators span {
font-size: 1.1rem;
font-weight: 500;
letter-spacing: 1.5px;
}
/*.color-indicator-box:first-child) {
background-color: red;
}*/
.green {
background-color: var(--green);
}
.red {
background-color: var(--red);
}
#log-table {
width: 100%;
}
th {
text-align: left;
padding: 0.2rem 0.4rem;
}
tr {
font-size: 1.2rem;
margin: 0.3rem 0;
transition: transform 0.3s ease;
}
td {
padding: 0.6rem 0.4rem;
}
tr td:first-child {
border-radius: 0.3rem 0 0 0.3rem;
}
tr td:last-child {
border-radius: 0 0.3rem 0.3rem 0;
}
tbody tr:hover {
background-color: var(--page-background-color);
transform: scale(1.01);
cursor: pointer;
}
#popover {
position: absolute;
top: 0;
left: 0;
display: flex;
justify-content: center;
align-items: center;
width: 100vw;
height: 100vh;
background-color: var(--page-background-color-40);
}
#popover .container {
width: 70%;
height: 80%;
background-color: var(--background-color);
border-radius: 0.75rem;
}

194
yarn.lock
View File

@@ -29,6 +29,14 @@ base64-js@^1.0.2:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
bl@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.0.tgz#e1a574cdf528e4053019bb800b041c0ac88da493"
integrity sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==
dependencies:
readable-stream "^2.3.5"
safe-buffer "^5.1.1"
bl@^4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/bl/-/bl-4.0.2.tgz#52b71e9088515d0606d9dd9cc7aa48dc1f98e73a"
@@ -38,6 +46,11 @@ bl@^4.0.1:
inherits "^2.0.4"
readable-stream "^3.4.0"
bluebird@3.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -46,6 +59,11 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
bson@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/bson/-/bson-1.1.4.tgz#f76870d799f15b854dffb7ee32f0a874797f7e89"
integrity sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==
buffer-crc32@~0.2.3:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
@@ -69,6 +87,18 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
debug@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
dependencies:
ms "2.0.0"
debug@4, debug@^4.1.0, debug@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
@@ -76,6 +106,11 @@ debug@4, debug@^4.1.0, debug@^4.1.1:
dependencies:
ms "^2.1.1"
denque@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf"
integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==
end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -151,11 +186,26 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
inherits@2, inherits@^2.0.3, inherits@^2.0.4:
inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
kareem@2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.1.tgz#def12d9c941017fabfb00f873af95e9c99e1be87"
integrity sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==
memory-pager@^1.0.2:
version "1.5.0"
resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5"
integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==
mime@^2.0.3:
version "2.4.5"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.5.tgz#d8de2ecb92982dedbb6541c9b6841d7f218ea009"
@@ -173,7 +223,63 @@ mkdirp-classic@^0.5.2:
resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
ms@^2.1.1:
mongodb@3.5.8:
version "3.5.8"
resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.5.8.tgz#34550856449b745d145873734bf922c12d6b9caa"
integrity sha512-jz7mR58z66JKL8Px4ZY+FXbgB7d0a0hEGCT7kw8iye46/gsqPrOEpZOswwJ2BQlfzsrCLKdsF9UcaUfGVN2HrQ==
dependencies:
bl "^2.2.0"
bson "^1.1.4"
denque "^1.4.1"
require_optional "^1.0.1"
safe-buffer "^5.1.2"
optionalDependencies:
saslprep "^1.0.0"
mongoose-legacy-pluralize@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz#3ba9f91fa507b5186d399fb40854bff18fb563e4"
integrity sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==
mongoose@^5.9.17:
version "5.9.17"
resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-5.9.17.tgz#9b74659481807cd9ff5b9c120cdb5087cbbd92bd"
integrity sha512-9EDmTiKrOu/41twlPWUA1aOsdxSN6PRIdFwTpLu4MjyNcJ/vuBE+VewKrN1jsD4oXO5rB8bMYtYxVmJQ02SrPg==
dependencies:
bson "^1.1.4"
kareem "2.3.1"
mongodb "3.5.8"
mongoose-legacy-pluralize "1.0.2"
mpath "0.7.0"
mquery "3.2.2"
ms "2.1.2"
regexp-clone "1.0.0"
safe-buffer "5.1.2"
sift "7.0.1"
sliced "1.0.1"
mpath@0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.7.0.tgz#20e8102e276b71709d6e07e9f8d4d0f641afbfb8"
integrity sha512-Aiq04hILxhz1L+f7sjGyn7IxYzWm1zLNNXcfhDtx04kZ2Gk7uvFdgZ8ts1cWa/6d0TQmag2yR8zSGZUmp0tFNg==
mquery@3.2.2:
version "3.2.2"
resolved "https://registry.yarnpkg.com/mquery/-/mquery-3.2.2.tgz#e1383a3951852ce23e37f619a9b350f1fb3664e7"
integrity sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==
dependencies:
bluebird "3.5.1"
debug "3.1.0"
regexp-clone "^1.0.0"
safe-buffer "5.1.2"
sliced "1.0.1"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
ms@2.1.2, ms@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
@@ -200,6 +306,11 @@ pend@~1.2.0:
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
process-nextick-args@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
progress@^2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
@@ -234,6 +345,19 @@ puppeteer@^3.0.4:
unbzip2-stream "^1.3.3"
ws "^7.2.3"
readable-stream@^2.3.5:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.3"
isarray "~1.0.0"
process-nextick-args "~2.0.0"
safe-buffer "~5.1.1"
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
readable-stream@^3.1.1, readable-stream@^3.4.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
@@ -243,6 +367,24 @@ readable-stream@^3.1.1, readable-stream@^3.4.0:
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
regexp-clone@1.0.0, regexp-clone@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63"
integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==
require_optional@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/require_optional/-/require_optional-1.0.1.tgz#4cf35a4247f64ca3df8c2ef208cc494b1ca8fc2e"
integrity sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==
dependencies:
resolve-from "^2.0.0"
semver "^5.1.0"
resolve-from@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57"
integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=
rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
@@ -250,11 +392,50 @@ rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@^5.1.1, safe-buffer@^5.1.2:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
safe-buffer@~5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
saslprep@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226"
integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==
dependencies:
sparse-bitfield "^3.0.3"
semver@^5.1.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
sift@7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/sift/-/sift-7.0.1.tgz#47d62c50b159d316f1372f8b53f9c10cd21a4b08"
integrity sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==
sliced@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41"
integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=
sparse-bitfield@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11"
integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE=
dependencies:
memory-pager "^1.0.2"
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@@ -262,6 +443,13 @@ string_decoder@^1.1.1:
dependencies:
safe-buffer "~5.2.0"
string_decoder@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
dependencies:
safe-buffer "~5.1.0"
tar-fs@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.1.tgz#e44086c1c60d31a4f0cf893b1c4e155dabfae9e2"
@@ -296,7 +484,7 @@ unbzip2-stream@^1.3.3:
buffer "^5.2.1"
through "^2.3.8"
util-deprecate@^1.0.1:
util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=