diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 3695a8b1..c8c4e486 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -9,10 +9,6 @@ jobs:
strategy:
matrix:
include:
- # EOL: April 2021
- - os: ubuntu-latest
- node_version: 10.x
-
# EOL: April 2022
- os: ubuntu-latest
node_version: 12.x
@@ -20,15 +16,19 @@ jobs:
# EOL: April 2023
- os: ubuntu-latest
node_version: 14.x
- - os: macOS-latest
- node_version: 14.x
- - os: windows-latest
- node_version: 14.x
# EOL: June 2021
- os: ubuntu-latest
node_version: 15.x
+ # EOL: April 2024
+ - os: ubuntu-latest
+ node_version: 16.x
+ - os: macOS-latest
+ node_version: 16.x
+ - os: windows-latest
+ node_version: 16.x
+
runs-on: ${{ matrix.os }}
steps:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a6df656e..5babfce6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,36 @@ All notable changes to this project will be documented in this file.
+## v4.3.0-pre.6 - 2021-11-04 [Pre-release]
+
+[See the full changelog](https://github.com/thelounge/thelounge/compare/v4.3.0-pre.5...v4.3.0-pre.6)
+
+This is a pre-release for v4.3.0 to offer latest changes without having to wait for a stable release.
+At this stage, features may still be added or modified until the first release candidate for this version gets released.
+
+Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
+
+As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
+
+```sh
+yarn global add thelounge@next
+```
+
+## v4.3.0-pre.5 - 2021-11-03 [Pre-release]
+
+[See the full changelog](https://github.com/thelounge/thelounge/compare/v4.3.0-pre.4...v4.3.0-pre.5)
+
+This is a pre-release for v4.3.0 to offer latest changes without having to wait for a stable release.
+At this stage, features may still be added or modified until the first release candidate for this version gets released.
+
+Please refer to the commit list given above for a complete list of changes, or wait for the stable release to get a thoroughly prepared change log entry.
+
+As with all pre-releases, this version requires explicit use of the `next` tag to be installed:
+
+```sh
+yarn global add thelounge@next
+```
+
## v4.3.0-pre.4 - 2021-07-01 [Pre-release]
[See the full changelog](https://github.com/thelounge/thelounge/compare/v4.3.0-pre.3...v4.3.0-pre.4)
diff --git a/client/components/Chat.vue b/client/components/Chat.vue
index 1761d4bc..c0d665d7 100644
--- a/client/components/Chat.vue
+++ b/client/components/Chat.vue
@@ -35,7 +35,11 @@
- 0) {
+ } else if (key === "down" && channel.inputHistoryPosition > 0 && onRow === totalRows) {
channel.inputHistoryPosition--;
+ } else {
+ return;
}
channel.pendingMessage = channel.inputHistory[channel.inputHistoryPosition];
- this.$refs.input.value = channel.pendingMessage;
+ const newValue = channel.pendingMessage;
+ this.$refs.input.value = newValue;
+
+ let newPosition;
+
+ if (key === "up") {
+ const lastIndexOfNewLine = newValue.lastIndexOf("\n");
+ const lastLine = newValue.slice(null, lastIndexOfNewLine);
+ newPosition =
+ oldPosition > lastLine.length
+ ? newValue.length
+ : lastIndexOfNewLine + oldPosition + 1;
+ } else {
+ const lastPositionOnFirstLine =
+ newValue.indexOf("\n") === -1 ? newValue.length + 1 : newValue.indexOf("\n");
+ const relativeRowPos = oldPosition - oldValue.lastIndexOf("\n") - 1;
+ newPosition =
+ relativeRowPos > lastPositionOnFirstLine
+ ? lastPositionOnFirstLine
+ : relativeRowPos;
+ }
+
+ this.$refs.input.setSelectionRange(newPosition, newPosition);
this.setInputSize();
return false;
diff --git a/client/components/ContextMenu.vue b/client/components/ContextMenu.vue
index bab07a43..041d5b19 100644
--- a/client/components/ContextMenu.vue
+++ b/client/components/ContextMenu.vue
@@ -2,6 +2,7 @@
@@ -37,11 +37,14 @@
c.id),
});
},
+ isTouchEvent(event) {
+ // This is the same way Sortable.js detects a touch event. See
+ // SortableJS/Sortable@daaefeda:/src/Sortable.js#L465
+ return (
+ (event.touches && event.touches[0]) ||
+ (event.pointerType && event.pointerType === "touch")
+ );
+ },
+ onDraggableChoose(event) {
+ const original = event.originalEvent;
+
+ if (this.isTouchEvent(original)) {
+ // onDrag is only triggered when the user actually moves the
+ // dragged object but onChoose is triggered as soon as the
+ // item is eligible for dragging. This gives us an opportunity
+ // to tell the user they've held the touch long enough.
+ event.item.classList.add("ui-sortable-dragging-touch-cue");
+
+ if (original instanceof TouchEvent && original.touches.length > 0) {
+ this.startDrag = [original.touches[0].clientX, original.touches[0].clientY];
+ } else if (original instanceof PointerEvent) {
+ this.startDrag = [original.clientX, original.clientY];
+ }
+ }
+ },
+ onDraggableUnchoose(event) {
+ event.item.classList.remove("ui-sortable-dragging-touch-cue");
+ this.startDrag = null;
+ },
+ onDraggableTouchStart() {
+ if (event.touches.length === 1) {
+ // This prevents an iOS long touch default behavior: selecting
+ // the nearest selectable text.
+ document.body.classList.add("force-no-select");
+ }
+ },
+ onDraggableTouchMove(event) {
+ if (this.startDrag && event.touches.length > 0) {
+ const touch = event.touches[0];
+ const currentPosition = [touch.clientX, touch.clientY];
+
+ if (distance(this.startDrag, currentPosition) > 10) {
+ // Context menu is shown on Android after long touch.
+ // Dismiss it now that we're sure the user is dragging.
+ eventbus.emit("contextmenu:cancel");
+ }
+ }
+ },
+ onDraggableTouchEnd(event) {
+ if (event.touches.length === 0) {
+ document.body.classList.remove("force-no-select");
+ }
+ },
toggleSearch(event) {
if (isIgnoredKeybind(event)) {
return true;
diff --git a/client/components/Sidebar.vue b/client/components/Sidebar.vue
index bb056215..6a7a23f7 100644
--- a/client/components/Sidebar.vue
+++ b/client/components/Sidebar.vue
@@ -195,6 +195,9 @@ export default {
document.body.addEventListener("touchstart", this.onTouchStart, {passive: true});
},
+ destroyed() {
+ document.body.removeEventListener("touchstart", this.onTouchStart, {passive: true});
+ },
methods: {
isPublic: () => document.body.classList.contains("public"),
},
diff --git a/client/components/Windows/Help.vue b/client/components/Windows/Help.vue
index 95067dff..b7558c02 100644
--- a/client/components/Windows/Help.vue
+++ b/client/components/Windows/Help.vue
@@ -87,6 +87,36 @@
+ Gestures
+
+
+
Single-Finger Swipe Left
+
+
+
+
+
Single-Finger Swipe Right
+
+
+
+
+
Two-Finger Swipe Left
+
+
Switch to the next window in the channel list.
+
+
+
+
+
Two-Finger Swipe Right
+
+
Switch to the previous window in the channel list.
+
+
+
Keyboard Shortcuts
@@ -199,6 +229,16 @@
+
+
+ Alt /
+ ⌥ /
+
+
+
Switch to the help menu.
+
+
+
Esc
@@ -764,6 +804,7 @@ export default {
data() {
return {
isApple: navigator.platform.match(/(Mac|iPhone|iPod|iPad)/i) || false,
+ isTouch: navigator.maxTouchPoints > 0,
};
},
};
diff --git a/client/components/Windows/SearchResults.vue b/client/components/Windows/SearchResults.vue
index 08ce21ff..159b702c 100644
--- a/client/components/Windows/SearchResults.vue
+++ b/client/components/Windows/SearchResults.vue
@@ -124,7 +124,7 @@ export default {
return [];
}
- return this.search.results.slice().reverse();
+ return this.search.results;
},
chan() {
const chanId = parseInt(this.$route.params.id, 10);
diff --git a/client/components/Windows/Settings.vue b/client/components/Windows/Settings.vue
index 898e1613..ce90a66b 100644
--- a/client/components/Windows/Settings.vue
+++ b/client/components/Windows/Settings.vue
@@ -248,11 +248,18 @@
- Remove metadata from uploaded images
+ Attempt to remove metadata from images before uploading
+
+
+
@@ -306,6 +313,7 @@
@@ -316,6 +324,14 @@
>
Warning : Notifications are not supported by your browser.
+
+ Warning : Notifications are only supported over HTTPS
+ connections.
+
@@ -370,6 +386,7 @@ expressions, it will trigger a highlight."
type="text"
name="highlights"
class="input"
+ autocomplete="off"
placeholder="Comma-separated, e.g.: word, some more words, anotherword"
/>
@@ -381,8 +398,8 @@ expressions, it will trigger a highlight."
Highlight exceptions
@@ -394,6 +411,7 @@ your nickname or expressions defined in custom highlights."
type="text"
name="highlightExceptions"
class="input"
+ autocomplete="off"
placeholder="Comma-separated, e.g.: word, some more words, anotherword"
/>
diff --git a/client/css/style.css b/client/css/style.css
index 16673295..1ce106b6 100644
--- a/client/css/style.css
+++ b/client/css/style.css
@@ -107,6 +107,10 @@ body {
overflow: hidden; /* iOS Safari requires overflow rather than overflow-y */
}
+body.force-no-select * {
+ user-select: none !important;
+}
+
a,
a:hover,
a:focus {
@@ -333,6 +337,7 @@ p {
.channel-list-item .not-connected-icon::before,
.channel-list-item .parted-channel-icon::before,
.jump-to-input::before,
+.password-container .reveal-password span,
#sidebar .collapse-network-icon::before {
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit; /* Can't have font-size inherit on line above, so need to override */
@@ -707,14 +712,19 @@ background on hover (unless active) */
/* Remove background on hovered/active channel when sorting/drag-and-dropping */
.ui-sortable-ghost,
-.channel-list-item.ui-sortable-dragged,
-.ui-sortable-dragged .channel-list-item,
-.ui-sortable-active .channel-list-item:hover,
-.ui-sortable-active .channel-list-item.active {
+.ui-sortable-dragging .channel-list-item,
+.ui-sortable-dragging,
+.ui-sortable-dragging:hover,
+.ui-sortable-dragging.active,
+.ui-sortable-dragging-touch-cue .channel-list-item,
+.ui-sortable-dragging-touch-cue,
+.ui-sortable-dragging-touch-cue:hover,
+.ui-sortable-dragging-touch-cue.active {
background: transparent;
}
-.ui-sortable-ghost::after {
+.ui-sortable-ghost::after,
+.ui-sortable-dragging-touch-cue:not(.ui-sortable-dragging)::after {
background: var(--body-bg-color);
border: 1px dashed #99a2b4;
border-radius: 6px;
@@ -727,6 +737,10 @@ background on hover (unless active) */
right: 10px;
}
+.ui-sortable-dragging-touch-cue:not(.ui-sortable-ghost)::after {
+ background: transparent;
+}
+
#sidebar .network {
position: relative;
margin-bottom: 20px;
@@ -1038,7 +1052,10 @@ textarea.input {
.header .title {
font-size: 15px;
padding-left: 6px;
- flex-shrink: 0;
+ flex-shrink: 1;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
.topic-container {
@@ -1054,6 +1071,12 @@ textarea.input {
flex-grow: 1;
overflow: hidden;
font-size: 14px;
+ flex-shrink: 99999999;
+ min-width: 25px;
+}
+
+.header .topic.empty {
+ min-width: 0;
}
.header .topic-input {
@@ -1067,6 +1090,7 @@ textarea.input {
height: 35px;
overflow: hidden;
font-size: 14px;
+ line-height: normal;
outline: none;
}
@@ -1689,6 +1713,7 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */
#chat .userlist .search {
color: var(--body-color);
+ appearance: none;
border: 0;
background: none;
font: inherit;
@@ -1979,7 +2004,6 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */
}
.password-container .reveal-password span {
- font: normal normal normal 14px/1 FontAwesome;
font-size: 16px;
color: #607992;
width: 35px;
@@ -2024,6 +2048,10 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */
padding-right: 15px;
}
+#help .help-item .subject.gesture {
+ font-weight: bold;
+}
+
#help .help-item .description p {
margin-bottom: 0;
}
@@ -2234,6 +2262,14 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */
background: transparent;
}
+#context-menu-container.passthrough {
+ pointer-events: none;
+}
+
+#context-menu-container.passthrough > * {
+ pointer-events: auto;
+}
+
.mentions-popup,
#context-menu,
.textcomplete-menu {
@@ -2635,6 +2671,7 @@ part/quit messages where we don't load previews (adds a blank line otherwise) */
right: 0;
transform: translateX(180px);
transition: transform 0.2s;
+ z-index: 1;
}
#viewport.userlist-open #chat .userlist {
diff --git a/client/js/helpers/contextMenu.js b/client/js/helpers/contextMenu.js
index feadd15c..b17c3794 100644
--- a/client/js/helpers/contextMenu.js
+++ b/client/js/helpers/contextMenu.js
@@ -252,22 +252,30 @@ export function generateUserContextMenu($root, channel, network, user) {
return items;
}
- // Names of the modes we are able to change
- const modes = {
- "~": ["owner", "q"],
- "&": ["admin", "a"],
- "@": ["operator", "o"],
- "%": ["half-op", "h"],
- "+": ["voice", "v"],
+ // Names of the standard modes we are able to change
+ const modeCharToName = {
+ "~": "owner",
+ "&": "admin",
+ "@": "operator",
+ "%": "half-op",
+ "+": "voice",
};
- // Labels for the mode changes. For example .rev(['admin', 'a']) => 'Revoke admin (-a)'
+ // Labels for the mode changes. For example .rev({mode: "a", symbol: "&"}) => 'Revoke admin (-a)'
const modeTextTemplate = {
- revoke: (m) => `Revoke ${m[0]} (-${m[1]})`,
- give: (m) => `Give ${m[0]} (+${m[1]})`,
+ revoke(m) {
+ const name = modeCharToName[m.symbol];
+ const res = name ? `Revoke ${name} (-${m.mode})` : `Mode -${m.mode}`;
+ return res;
+ },
+ give(m) {
+ const name = modeCharToName[m.symbol];
+ const res = name ? `Give ${name} (+${m.mode})` : `Mode +${m.mode}`;
+ return res;
+ },
};
- const networkModes = network.serverOptions.PREFIX;
+ const networkModeSymbols = network.serverOptions.PREFIX.symbols;
/**
* Determine whether the prefix of mode p1 has access to perform actions on p2.
@@ -284,38 +292,38 @@ export function generateUserContextMenu($root, channel, network, user) {
function compare(p1, p2) {
// The modes ~ and @ can perform actions on their own mode. The others on modes below.
return "~@".indexOf(p1) > -1
- ? networkModes.indexOf(p1) <= networkModes.indexOf(p2)
- : networkModes.indexOf(p1) < networkModes.indexOf(p2);
+ ? networkModeSymbols.indexOf(p1) <= networkModeSymbols.indexOf(p2)
+ : networkModeSymbols.indexOf(p1) < networkModeSymbols.indexOf(p2);
}
- networkModes.forEach((prefix) => {
- if (!compare(currentChannelUser.modes[0], prefix)) {
+ network.serverOptions.PREFIX.prefix.forEach((mode) => {
+ if (!compare(currentChannelUser.modes[0], mode.symbol)) {
// Our highest mode is below the current mode. Bail.
return;
}
- if (!user.modes.includes(prefix)) {
+ if (!user.modes.includes(mode.symbol)) {
// The target doesn't already have this mode, therefore we can set it.
items.push({
- label: modeTextTemplate.give(modes[prefix]),
+ label: modeTextTemplate.give(mode),
type: "item",
class: "action-set-mode",
action() {
socket.emit("input", {
target: channel.id,
- text: "/mode +" + modes[prefix][1] + " " + user.nick,
+ text: "/mode +" + mode.mode + " " + user.nick,
});
},
});
} else {
items.push({
- label: modeTextTemplate.revoke(modes[prefix]),
+ label: modeTextTemplate.revoke(mode),
type: "item",
class: "action-revoke-mode",
action() {
socket.emit("input", {
target: channel.id,
- text: "/mode -" + modes[prefix][1] + " " + user.nick,
+ text: "/mode -" + mode.mode + " " + user.nick,
});
},
});
@@ -323,9 +331,9 @@ export function generateUserContextMenu($root, channel, network, user) {
});
// Determine if we are half-op or op depending on the network modes so we can kick.
- if (!compare(networkModes.indexOf("%") > -1 ? "%" : "@", currentChannelUser.modes[0])) {
+ if (!compare(networkModeSymbols.indexOf("%") > -1 ? "%" : "@", currentChannelUser.modes[0])) {
+ // Check if the target user has no mode or a mode lower than ours.
if (user.modes.length === 0 || compare(currentChannelUser.modes[0], user.modes[0])) {
- // Check if the target user has no mode or a mode lower than ours.
items.push({
label: "Kick",
type: "item",
diff --git a/client/js/helpers/distance.js b/client/js/helpers/distance.js
new file mode 100644
index 00000000..4a9c01df
--- /dev/null
+++ b/client/js/helpers/distance.js
@@ -0,0 +1,5 @@
+function distance([x1, y1], [x2, y2]) {
+ return Math.hypot(x1 - x2, y1 - y2);
+}
+
+export default distance;
diff --git a/client/js/helpers/listenForTwoFingerSwipes.js b/client/js/helpers/listenForTwoFingerSwipes.js
new file mode 100644
index 00000000..8689f083
--- /dev/null
+++ b/client/js/helpers/listenForTwoFingerSwipes.js
@@ -0,0 +1,106 @@
+"use strict";
+
+import distance from "./distance";
+
+// onTwoFingerSwipe will be called with a cardinal direction ("n", "e", "s" or
+// "w") as its only argument.
+function listenForTwoFingerSwipes(onTwoFingerSwipe) {
+ let history = [];
+
+ document.body.addEventListener(
+ "touchmove",
+ function (event) {
+ if (event.touches.length !== 2) {
+ return;
+ }
+
+ const a = event.touches.item(0);
+ const b = event.touches.item(1);
+
+ const timestamp = window.performance.now();
+ const center = [(a.screenX + b.screenX) / 2, (a.screenY + b.screenY) / 2];
+
+ if (history.length > 0) {
+ const last = history[history.length - 1];
+ const centersAreEqual =
+ last.center[0] === center[0] && last.center[1] === center[1];
+
+ if (last.timestamp === timestamp || centersAreEqual) {
+ // Touches with the same timestamps or center don't help us
+ // see the speed of movement. Ignore them.
+ return;
+ }
+ }
+
+ history.push({timestamp, center});
+ },
+ {passive: true}
+ );
+
+ document.body.addEventListener(
+ "touchend",
+ function () {
+ if (event.touches.length >= 2) {
+ return;
+ }
+
+ try {
+ const direction = getSwipe(history);
+
+ if (direction) {
+ onTwoFingerSwipe(direction);
+ }
+ } finally {
+ history = [];
+ }
+ },
+ {passive: true}
+ );
+
+ document.body.addEventListener(
+ "touchcancel",
+ function () {
+ history = [];
+ },
+ {passive: true}
+ );
+}
+
+// Returns the cardinal direction of the swipe or null if there is no swipe.
+function getSwipe(hist) {
+ // Speed is in pixels/millisecond. Must be maintained throughout swipe.
+ const MIN_SWIPE_SPEED = 0.2;
+
+ if (hist.length < 2) {
+ return null;
+ }
+
+ for (let i = 1; i < hist.length; ++i) {
+ const previous = hist[i - 1];
+ const current = hist[i];
+
+ const speed =
+ distance(previous.center, current.center) /
+ Math.abs(previous.timestamp - current.timestamp);
+
+ if (speed < MIN_SWIPE_SPEED) {
+ return null;
+ }
+ }
+
+ return getCardinalDirection(hist[0].center, hist[hist.length - 1].center);
+}
+
+function getCardinalDirection([x1, y1], [x2, y2]) {
+ // If θ is the angle of the vector then this is tan(θ)
+ const tangent = (y2 - y1) / (x2 - x1);
+
+ // All values of |tan(-45° to 45°)| are less than 1, same for 145° to 225°
+ if (Math.abs(tangent) < 1) {
+ return x1 < x2 ? "e" : "w";
+ }
+
+ return y1 < y2 ? "s" : "n";
+}
+
+export default listenForTwoFingerSwipes;
diff --git a/client/js/helpers/parse.js b/client/js/helpers/parse.js
index 9097d96f..675dd0b0 100644
--- a/client/js/helpers/parse.js
+++ b/client/js/helpers/parse.js
@@ -79,7 +79,7 @@ function parse(createElement, text, message = undefined, network = undefined) {
// arrays of objects containing start and end markers, as well as metadata
// depending on what was found (channel or link).
const channelPrefixes = network ? network.serverOptions.CHANTYPES : ["#", "&"];
- const userModes = network ? network.serverOptions.PREFIX : ["!", "@", "%", "+"];
+ const userModes = network?.serverOptions?.PREFIX.symbols || ["!", "@", "%", "+"];
const channelParts = findChannels(cleanText, channelPrefixes, userModes);
const linkParts = findLinks(cleanText);
const emojiParts = findEmoji(cleanText);
diff --git a/client/js/helpers/simplemap.json b/client/js/helpers/simplemap.json
index 4b917733..b71c8819 100644
--- a/client/js/helpers/simplemap.json
+++ b/client/js/helpers/simplemap.json
@@ -1238,8 +1238,8 @@
"credit_card": "💳",
"receipt": "🧾",
"chart": "💹",
- "email": "✉️",
"envelope": "✉️",
+ "email": "📧",
"e_mail": "📧",
"incoming_envelope": "📨",
"envelope_with_arrow": "📩",
diff --git a/client/js/keybinds.js b/client/js/keybinds.js
index daee796f..2fbb3311 100644
--- a/client/js/keybinds.js
+++ b/client/js/keybinds.js
@@ -3,9 +3,10 @@
import Mousetrap from "mousetrap";
import store from "./store";
-import {switchToChannel} from "./router";
+import {switchToChannel, router, navigate} from "./router";
import isChannelCollapsed from "./helpers/isChannelCollapsed";
import isIgnoredKeybind from "./helpers/isIgnoredKeybind";
+import listenForTwoFingerSwipes from "./helpers/listenForTwoFingerSwipes";
// Switch to the next/previous window in the channel list.
Mousetrap.bind(["alt+up", "alt+down"], function (e, keys) {
@@ -13,11 +14,22 @@ Mousetrap.bind(["alt+up", "alt+down"], function (e, keys) {
return true;
}
+ navigateWindow(keys.split("+").pop() === "up" ? -1 : 1);
+
+ return false;
+});
+
+listenForTwoFingerSwipes(function (cardinalDirection) {
+ if (cardinalDirection === "e" || cardinalDirection === "w") {
+ navigateWindow(cardinalDirection === "e" ? -1 : 1);
+ }
+});
+
+function navigateWindow(direction) {
if (store.state.networks.length === 0) {
- return false;
+ return;
}
- const direction = keys.split("+").pop() === "up" ? -1 : 1;
const flatChannels = [];
let index = -1;
@@ -44,9 +56,7 @@ Mousetrap.bind(["alt+up", "alt+down"], function (e, keys) {
index = (((index + direction) % length) + length) % length;
jumpToChannel(flatChannels[index]);
-
- return false;
-});
+}
// Switch to the next/previous lobby in the channel list
Mousetrap.bind(["alt+shift+up", "alt+shift+down"], function (e, keys) {
@@ -107,6 +117,17 @@ Mousetrap.bind(["alt+a"], function (e) {
return false;
});
+// Show the help menu.
+Mousetrap.bind(["alt+/"], function (e) {
+ if (isIgnoredKeybind(e)) {
+ return true;
+ }
+
+ navigate("Help");
+
+ return false;
+});
+
function jumpToChannel(targetChannel) {
switchToChannel(targetChannel);
@@ -156,6 +177,12 @@ const ignoredKeys = {
};
document.addEventListener("keydown", (e) => {
+ // Allow navigating back to the previous page when on the help screen.
+ if (e.key === "Escape" && router.currentRoute.name === "Help") {
+ router.go(-1);
+ return;
+ }
+
// Ignore any key that uses alt modifier
// Ignore keys defined above
if (e.altKey || ignoredKeys[e.which]) {
diff --git a/client/js/settings.js b/client/js/settings.js
index 403db792..3e3e5581 100644
--- a/client/js/settings.js
+++ b/client/js/settings.js
@@ -98,7 +98,7 @@ export const config = normalizeConfig({
media: {
default: true,
},
- removeImageMetadata: {
+ uploadCanvas: {
default: true,
},
userStyles: {
diff --git a/client/js/store-settings.js b/client/js/store-settings.js
index abcc3e4f..bed36968 100644
--- a/client/js/store-settings.js
+++ b/client/js/store-settings.js
@@ -86,15 +86,6 @@ function loadFromLocalStorage() {
storedSettings.highlights = storedSettings.highlights.join(", ");
}
- // Convert deprecated uploadCanvas to removeImageMetadata
- if (
- storedSettings.uploadCanvas !== undefined &&
- storedSettings.removeImageMetadata === undefined
- ) {
- storedSettings.removeImageMetadata = storedSettings.uploadCanvas;
- delete storedSettings.uploadCanvas;
- }
-
return storedSettings;
}
diff --git a/client/js/store.js b/client/js/store.js
index 4c32ce15..83ce7f86 100644
--- a/client/js/store.js
+++ b/client/js/store.js
@@ -12,6 +12,8 @@ function detectDesktopNotificationState() {
return "unsupported";
} else if (Notification.permission === "granted") {
return "granted";
+ } else if (!window.isSecureContext) {
+ return "nohttps";
}
return "blocked";
diff --git a/client/js/upload.js b/client/js/upload.js
index e5e3e6f9..fb68746d 100644
--- a/client/js/upload.js
+++ b/client/js/upload.js
@@ -142,7 +142,46 @@ class Uploader {
// This issue only happens if The Lounge is proxied through other software
// as it may buffer the upload before the upload request will be processed by The Lounge.
this.tokenKeepAlive = setInterval(() => socket.emit("upload:ping", token), 40 * 1000);
- this.performUpload(token, file);
+
+ if (
+ store.state.settings.uploadCanvas &&
+ file.type.startsWith("image/") &&
+ !file.type.includes("svg") &&
+ file.type !== "image/gif"
+ ) {
+ this.renderImage(file, (newFile) => this.performUpload(token, newFile));
+ } else {
+ this.performUpload(token, file);
+ }
+ }
+
+ renderImage(file, callback) {
+ const fileReader = new FileReader();
+
+ fileReader.onabort = () => callback(file);
+ fileReader.onerror = () => fileReader.abort();
+
+ fileReader.onload = () => {
+ const img = new Image();
+
+ img.onerror = () => callback(file);
+
+ img.onload = () => {
+ const canvas = document.createElement("canvas");
+ canvas.width = img.width;
+ canvas.height = img.height;
+ const ctx = canvas.getContext("2d");
+ ctx.drawImage(img, 0, 0);
+
+ canvas.toBlob((blob) => {
+ callback(new File([blob], file.name));
+ }, file.type);
+ };
+
+ img.src = fileReader.result;
+ };
+
+ fileReader.readAsDataURL(file);
}
performUpload(token, file) {
@@ -185,7 +224,6 @@ class Uploader {
};
const formData = new FormData();
- formData.append("removeMetadata", store.state.settings.removeImageMetadata);
formData.append("file", file);
this.xhr.open("POST", `uploads/new/${token}`);
this.xhr.send(formData);
diff --git a/defaults/config.js b/defaults/config.js
index 390f732d..691d5e65 100644
--- a/defaults/config.js
+++ b/defaults/config.js
@@ -152,8 +152,9 @@ module.exports = {
// ### prefetchMaxSearchSize
//
- // This value sets the maximum request size made to find the Open Graph tags
- // for link previews. For some sites like YouTube this can easily exceed 300
+ // This value sets the maximum response size allowed when finding the Open
+ // Graph tags for link previews. The entire response is temporarily stored
+ // in memory and for some sites like YouTube this can easily exceed 300
// kilobytes.
//
// This value is set to `50` kilobytes by default.
diff --git a/package.json b/package.json
index 78140e01..b0981b7d 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"name": "thelounge",
"description": "The self-hosted Web IRC client",
- "version": "4.3.0-pre.4",
+ "version": "4.3.0-pre.6",
"preferGlobal": true,
"bin": {
"thelounge": "index.js"
@@ -37,45 +37,44 @@
],
"license": "MIT",
"engines": {
- "node": ">=10.15.0"
+ "node": ">=12.0.0"
},
"dependencies": {
"bcryptjs": "2.4.3",
"busboy": "0.3.1",
- "chalk": "4.1.1",
+ "chalk": "4.1.2",
"cheerio": "1.0.0-rc.10",
"commander": "7.2.0",
"content-disposition": "0.5.3",
"express": "4.17.1",
"file-type": "16.2.0",
"filenamify": "4.2.0",
- "got": "11.8.1",
+ "got": "11.8.2",
"irc-framework": "4.11.0",
"is-utf8": "0.2.1",
- "ldapjs": "2.2.3",
- "linkify-it": "3.0.2",
+ "ldapjs": "2.3.1",
+ "linkify-it": "3.0.3",
"lodash": "4.17.21",
- "mime-types": "2.1.28",
+ "mime-types": "2.1.33",
"node-forge": "0.10.0",
"package-json": "6.5.0",
"read": "1.0.7",
"read-chunk": "3.2.0",
- "semver": "7.3.4",
- "sharp": "0.28.0",
+ "semver": "7.3.5",
"socket.io": "3.1.2",
"tlds": "1.216.0",
- "ua-parser-js": "0.7.24",
+ "ua-parser-js": "0.7.30",
"uuid": "8.3.2",
- "web-push": "3.4.4",
+ "web-push": "3.4.5",
"yarn": "1.22.10"
},
"optionalDependencies": {
"sqlite3": "5.0.2"
},
"devDependencies": {
- "@babel/core": "7.14.6",
- "@babel/preset-env": "7.14.7",
- "@fortawesome/fontawesome-free": "5.15.3",
+ "@babel/core": "7.15.5",
+ "@babel/preset-env": "7.15.6",
+ "@fortawesome/fontawesome-free": "5.15.4",
"@vue/server-test-utils": "1.1.3",
"@vue/test-utils": "1.1.3",
"babel-loader": "8.2.2",
@@ -84,13 +83,13 @@
"copy-webpack-plugin": "7.0.0",
"css-loader": "5.1.1",
"cssnano": "4.1.11",
- "dayjs": "1.10.5",
- "emoji-regex": "9.2.1",
+ "dayjs": "1.10.7",
+ "emoji-regex": "9.2.2",
"eslint": "7.23.0",
"eslint-config-prettier": "6.15.0",
"eslint-plugin-vue": "7.5.0",
"fuzzy": "0.1.3",
- "husky": "4.3.5",
+ "husky": "4.3.8",
"mini-css-extract-plugin": "1.3.6",
"mocha": "8.2.1",
"mousetrap": "1.6.5",
@@ -98,15 +97,15 @@
"npm-run-all": "4.1.5",
"nyc": "15.1.0",
"postcss": "8.2.10",
- "postcss-import": "14.0.0",
+ "postcss-import": "14.0.2",
"postcss-loader": "5.0.0",
"postcss-preset-env": "6.7.0",
"prettier": "2.2.1",
- "pretty-quick": "3.1.0",
+ "pretty-quick": "3.1.1",
"primer-tooltips": "2.0.0",
"sinon": "9.2.4",
- "socket.io-client": "3.1.1",
- "stylelint": "13.9.0",
+ "socket.io-client": "3.1.3",
+ "stylelint": "13.13.1",
"stylelint-config-standard": "20.0.0",
"textcomplete": "0.18.2",
"undate": "0.3.0",
@@ -120,11 +119,14 @@
"webpack": "5.21.2",
"webpack-cli": "4.5.0",
"webpack-dev-middleware": "4.1.0",
- "webpack-hot-middleware": "2.25.0"
+ "webpack-hot-middleware": "2.25.1"
},
"husky": {
"hooks": {
"pre-commit": "pretty-quick --staged"
}
+ },
+ "resolutions": {
+ "sortablejs": "git+https://github.com/itsjohncs/Sortable.git"
}
}
diff --git a/scripts/generate-emoji.js b/scripts/generate-emoji.js
old mode 100644
new mode 100755
diff --git a/src/client.js b/src/client.js
index fe905c81..4a8aa080 100644
--- a/src/client.js
+++ b/src/client.js
@@ -104,11 +104,6 @@ function Client(manager, name, config = {}) {
delete client.config.awayMessage;
}
- if (client.config.uploadCanvas) {
- client.config.clientSettings.removeImageMetadata = client.config.uploadCanvas;
- delete client.config.uploadCanvas;
- }
-
if (client.config.clientSettings.awayMessage) {
client.awayMessage = client.config.clientSettings.awayMessage;
}
diff --git a/src/helper.js b/src/helper.js
index c12fde10..27352b53 100644
--- a/src/helper.js
+++ b/src/helper.js
@@ -43,6 +43,7 @@ const Helper = {
getDefaultNick,
parseHostmask,
compareHostmask,
+ compareWithWildcard,
password: {
hash: passwordHash,
@@ -314,8 +315,27 @@ function parseHostmask(hostmask) {
function compareHostmask(a, b) {
return (
- (a.nick.toLowerCase() === b.nick.toLowerCase() || a.nick === "*") &&
- (a.ident.toLowerCase() === b.ident.toLowerCase() || a.ident === "*") &&
- (a.hostname.toLowerCase() === b.hostname.toLowerCase() || a.hostname === "*")
+ compareWithWildcard(a.nick, b.nick) &&
+ compareWithWildcard(a.ident, b.ident) &&
+ compareWithWildcard(a.hostname, b.hostname)
);
}
+
+function compareWithWildcard(a, b) {
+ // we allow '*' and '?' wildcards in our comparison.
+ // this is mostly aligned with https://modern.ircdocs.horse/#wildcard-expressions
+ // but we do not support the escaping. The ABNF does not seem to be clear as to
+ // how to escape the escape char '\', which is valid in a nick,
+ // whereas the wildcards tend not to be (as per RFC1459).
+
+ // The "*" wildcard is ".*" in regex, "?" is "."
+ // so we tokenize and join with the proper char back together,
+ // escaping any other regex modifier
+ const wildmany_split = a.split("*").map((sub) => {
+ const wildone_split = sub.split("?").map((p) => _.escapeRegExp(p));
+ return wildone_split.join(".");
+ });
+ const user_regex = wildmany_split.join(".*");
+ const re = new RegExp(`^${user_regex}$`, "i"); // case insensitive
+ return re.test(b);
+}
diff --git a/src/models/network.js b/src/models/network.js
index 13879fb2..264642b9 100644
--- a/src/models/network.js
+++ b/src/models/network.js
@@ -5,6 +5,7 @@ const {v4: uuidv4} = require("uuid");
const IrcFramework = require("irc-framework");
const Chan = require("./chan");
const Msg = require("./msg");
+const Prefix = require("./prefix");
const Helper = require("../helper");
const STSPolicies = require("../plugins/sts");
const ClientCertificate = require("../plugins/clientCertificate");
@@ -43,7 +44,12 @@ function Network(attr) {
irc: null,
serverOptions: {
CHANTYPES: ["#", "&"],
- PREFIX: ["!", "@", "%", "+"],
+ PREFIX: new Prefix([
+ {symbol: "!", mode: "Y"},
+ {symbol: "@", mode: "o"},
+ {symbol: "%", mode: "h"},
+ {symbol: "+", mode: "v"},
+ ]),
NETWORK: "",
},
@@ -532,6 +538,7 @@ Network.prototype.export = function () {
"proxyPort",
"proxyUsername",
"proxyEnabled",
+ "proxyPassword",
]);
network.channels = this.channels
diff --git a/src/models/prefix.js b/src/models/prefix.js
new file mode 100644
index 00000000..331efdff
--- /dev/null
+++ b/src/models/prefix.js
@@ -0,0 +1,33 @@
+"use strict";
+
+class Prefix {
+ constructor(prefix) {
+ this.prefix = prefix || []; // [{symbol: "@", mode: "o"}, ... ]
+ this.modeToSymbol = {};
+ this.symbols = [];
+ this._update_internals();
+ }
+
+ _update_internals() {
+ // clean out the old cruft
+ this.modeToSymbol = {};
+ this.symbols = [];
+
+ const that = this;
+ this.prefix.forEach(function (p) {
+ that.modeToSymbol[p.mode] = p.symbol;
+ that.symbols.push(p.symbol);
+ });
+ }
+
+ update(prefix) {
+ this.prefix = prefix || [];
+ this._update_internals();
+ }
+
+ forEach(f) {
+ return this.prefix.forEach(f);
+ }
+}
+
+module.exports = Prefix;
diff --git a/src/models/user.js b/src/models/user.js
index 591ebddd..dee1e9d0 100644
--- a/src/models/user.js
+++ b/src/models/user.js
@@ -4,7 +4,7 @@ const _ = require("lodash");
module.exports = User;
-function User(attr, prefixLookup) {
+function User(attr, prefix) {
_.defaults(this, attr, {
modes: [],
away: "",
@@ -18,12 +18,12 @@ function User(attr, prefixLookup) {
},
});
- this.setModes(this.modes, prefixLookup);
+ this.setModes(this.modes, prefix);
}
-User.prototype.setModes = function (modes, prefixLookup) {
+User.prototype.setModes = function (modes, prefix) {
// irc-framework sets character mode, but The Lounge works with symbols
- this.modes = modes.map((mode) => prefixLookup[mode]);
+ this.modes = modes.map((mode) => prefix.modeToSymbol[mode]);
};
User.prototype.toJSON = function () {
diff --git a/src/plugins/inputs/mode.js b/src/plugins/inputs/mode.js
index 074629ef..1503b54b 100644
--- a/src/plugins/inputs/mode.js
+++ b/src/plugins/inputs/mode.js
@@ -23,7 +23,9 @@ exports.input = function ({irc, nick}, chan, cmd, args) {
return;
}
- if (args.length === 0) {
+ const target = args.filter((arg) => arg !== "");
+
+ if (target.length === 0) {
chan.pushMessage(
this,
new Msg({
@@ -44,9 +46,13 @@ exports.input = function ({irc, nick}, chan, cmd, args) {
devoice: "-v",
}[cmd];
- args.forEach(function (target) {
- irc.raw("MODE", chan.name, mode, target);
- });
+ const limit = parseInt(irc.network.supports("MODES")) || target.length;
+
+ for (let i = 0; i < target.length; i += limit) {
+ const targets = target.slice(i, i + limit);
+ const amode = `${mode[0]}${mode[1].repeat(targets.length)}`;
+ irc.raw("MODE", chan.name, amode, ...targets);
+ }
return;
}
diff --git a/src/plugins/irc-events/connection.js b/src/plugins/irc-events/connection.js
index 029eefc2..3ef3000a 100644
--- a/src/plugins/irc-events/connection.js
+++ b/src/plugins/irc-events/connection.js
@@ -63,10 +63,9 @@ module.exports = function (irc, network) {
});
irc.on("socket connected", function () {
- network.prefixLookup = {};
- irc.network.options.PREFIX.forEach(function (mode) {
- network.prefixLookup[mode.mode] = mode.symbol;
- });
+ if (irc.network.options.PREFIX) {
+ network.serverOptions.PREFIX.update(irc.network.options.PREFIX);
+ }
network.channels[0].pushMessage(
client,
@@ -197,20 +196,12 @@ module.exports = function (irc, network) {
});
irc.on("server options", function (data) {
- network.prefixLookup = {};
-
- data.options.PREFIX.forEach((mode) => {
- network.prefixLookup[mode.mode] = mode.symbol;
- });
+ network.serverOptions.PREFIX.update(data.options.PREFIX);
if (data.options.CHANTYPES) {
network.serverOptions.CHANTYPES = data.options.CHANTYPES;
}
- if (network.serverOptions.PREFIX) {
- network.serverOptions.PREFIX = data.options.PREFIX.map((p) => p.symbol);
- }
-
network.serverOptions.NETWORK = data.options.NETWORK;
client.emit("network:options", {
diff --git a/src/plugins/irc-events/message.js b/src/plugins/irc-events/message.js
index e86fc9b7..0d67ff61 100644
--- a/src/plugins/irc-events/message.js
+++ b/src/plugins/irc-events/message.js
@@ -11,12 +11,6 @@ module.exports = function (irc, network) {
const client = this;
irc.on("notice", function (data) {
- // Some servers send notices without any nickname
- if (!data.nick) {
- data.from_server = true;
- data.nick = data.hostname || network.host;
- }
-
data.type = Msg.Type.NOTICE;
handleMessage(data);
});
@@ -44,6 +38,12 @@ module.exports = function (irc, network) {
let showInActive = false;
const self = data.nick === irc.user.nick;
+ // Some servers send messages without any nickname
+ if (!data.nick) {
+ data.from_server = true;
+ data.nick = data.hostname || network.host;
+ }
+
// Check if the sender is in our ignore list
const shouldIgnore =
!self &&
diff --git a/src/plugins/irc-events/mode.js b/src/plugins/irc-events/mode.js
index b07f0954..9c9bf6b2 100644
--- a/src/plugins/irc-events/mode.js
+++ b/src/plugins/irc-events/mode.js
@@ -107,7 +107,7 @@ module.exports = function (irc, network) {
return;
}
- const changedMode = network.prefixLookup[char];
+ const changedMode = network.serverOptions.PREFIX.modeToSymbol[char];
if (!add) {
_.pull(user.modes, changedMode);
diff --git a/src/plugins/irc-events/names.js b/src/plugins/irc-events/names.js
index 2e0a7db8..8368b281 100644
--- a/src/plugins/irc-events/names.js
+++ b/src/plugins/irc-events/names.js
@@ -14,7 +14,7 @@ module.exports = function (irc, network) {
data.users.forEach((user) => {
const newUser = chan.getUser(user.nick);
- newUser.setModes(user.modes, network.prefixLookup);
+ newUser.setModes(user.modes, network.serverOptions.PREFIX);
newUsers.set(user.nick.toLowerCase(), newUser);
});
diff --git a/src/plugins/messageStorage/sqlite.js b/src/plugins/messageStorage/sqlite.js
index cc8ccdf8..981a28b5 100644
--- a/src/plugins/messageStorage/sqlite.js
+++ b/src/plugins/messageStorage/sqlite.js
@@ -236,7 +236,7 @@ class MessageStorage {
target: query.channelName,
networkUuid: query.networkUuid,
offset: query.offset,
- results: parseSearchRowsToMessages(query.offset, rows),
+ results: parseSearchRowsToMessages(query.offset, rows).reverse(),
};
resolve(response);
}
diff --git a/src/plugins/packages/index.js b/src/plugins/packages/index.js
index ea1ed2cd..6db96280 100644
--- a/src/plugins/packages/index.js
+++ b/src/plugins/packages/index.js
@@ -46,6 +46,13 @@ const packageApis = function (packageInfo) {
},
Config: {
getConfig: () => Helper.config,
+ getPersistentStorageDir: getPersistentStorageDir.bind(this, packageInfo.packageName),
+ },
+ Logger: {
+ error: (...args) => log.error(`[${packageInfo.packageName}]`, ...args),
+ warn: (...args) => log.warn(`[${packageInfo.packageName}]`, ...args),
+ info: (...args) => log.info(`[${packageInfo.packageName}]`, ...args),
+ debug: (...args) => log.debug(`[${packageInfo.packageName}]`, ...args),
},
};
};
@@ -81,6 +88,12 @@ function getEnabledPackages(packageJson) {
return [];
}
+function getPersistentStorageDir(packageName) {
+ const dir = path.join(Helper.getPackagesPath(), packageName);
+ fs.mkdirSync(dir, {recursive: true}); // we don't care if it already exists or not
+ return dir;
+}
+
function loadPackage(packageName) {
let packageInfo;
let packageFile;
diff --git a/src/plugins/uploader.js b/src/plugins/uploader.js
index e803690f..eec8b6d6 100644
--- a/src/plugins/uploader.js
+++ b/src/plugins/uploader.js
@@ -11,7 +11,6 @@ const crypto = require("crypto");
const isUtf8 = require("is-utf8");
const log = require("../log");
const contentDisposition = require("content-disposition");
-const sharp = require("sharp");
// Map of allowed mime types to their respecive default filenames
// that will be rendered in browser without forcing them to be downloaded
@@ -134,7 +133,6 @@ class Uploader {
let destDir;
let destPath;
let streamWriter;
- let removeMetadata;
const doneCallback = () => {
// detach the stream and drain any remaining data
@@ -153,19 +151,6 @@ class Uploader {
}
};
- const successfullCompletion = () => {
- doneCallback();
-
- if (!uploadUrl) {
- return res.status(400).json({error: "Missing file"});
- }
-
- // upload was done, send the generated file url to the client
- res.status(200).json({
- url: uploadUrl,
- });
- };
-
const abortWithError = (err) => {
doneCallback();
@@ -212,11 +197,6 @@ class Uploader {
busboyInstance.on("partsLimit", () => abortWithError(Error("Parts limit reached")));
busboyInstance.on("filesLimit", () => abortWithError(Error("Files limit reached")));
busboyInstance.on("fieldsLimit", () => abortWithError(Error("Fields limit reached")));
- busboyInstance.on("field", (fieldname, val) => {
- if (fieldname === "removeMetadata") {
- removeMetadata = val === "true";
- }
- });
// generate a random output filename for the file
// we use do/while loop to prevent the rare case of generating a file name
@@ -237,7 +217,11 @@ class Uploader {
return abortWithError(err);
}
- busboyInstance.on("file", (fieldname, fileStream, filename, encoding, contentType) => {
+ // Open a file stream for writing
+ streamWriter = fs.createWriteStream(destPath);
+ streamWriter.on("error", abortWithError);
+
+ busboyInstance.on("file", (fieldname, fileStream, filename) => {
uploadUrl = `${randomName}/${encodeURIComponent(filename)}`;
if (Helper.config.fileUpload.baseUrl) {
@@ -246,55 +230,31 @@ class Uploader {
uploadUrl = `uploads/${uploadUrl}`;
}
- // Sharps prebuilt libvips does not include gif support, but that is not a problem,
- // as GIFs don't support EXIF metadata or anything alike
- const isImage = contentType.startsWith("image/") && !contentType.endsWith("gif");
-
// if the busboy data stream errors out or goes over the file size limit
// abort the processing with an error
fileStream.on("error", abortWithError);
fileStream.on("limit", () => {
- if (!isImage) {
- fileStream.unpipe(streamWriter);
- }
-
+ fileStream.unpipe(streamWriter);
fileStream.on("readable", fileStream.read.bind(fileStream));
abortWithError(Error("File size limit reached"));
});
- if (isImage) {
- let sharpInstance = sharp({
- animated: true,
- pages: -1,
- sequentialRead: true,
- });
+ // Attempt to write the stream to file
+ fileStream.pipe(streamWriter);
+ });
- if (!removeMetadata) {
- sharpInstance = sharpInstance.withMetadata();
- }
+ busboyInstance.on("finish", () => {
+ doneCallback();
- sharpInstance
- .rotate() // auto-orient based on the EXIF Orientation tag
- .toFile(destPath, (err) => {
- // Removes metadata by default https://sharp.pixelplumbing.com/api-output#tofile if no `withMetadata` is present
- if (err) {
- abortWithError(err);
- } else {
- successfullCompletion();
- }
- });
-
- fileStream.pipe(sharpInstance);
- } else {
- // Open a file stream for writing
- streamWriter = fs.createWriteStream(destPath);
- streamWriter.on("error", abortWithError);
- streamWriter.on("finish", successfullCompletion);
-
- // Attempt to write the stream to file
- fileStream.pipe(streamWriter);
+ if (!uploadUrl) {
+ return res.status(400).json({error: "Missing file"});
}
+
+ // upload was done, send the generated file url to the client
+ res.status(200).json({
+ url: uploadUrl,
+ });
});
// pipe request body to busboy for processing
diff --git a/src/server.js b/src/server.js
index f50ee078..16028b07 100644
--- a/src/server.js
+++ b/src/server.js
@@ -50,6 +50,7 @@ module.exports = function (options = {}) {
app.set("env", "production")
.disable("x-powered-by")
.use(allRequests)
+ .use(addSecurityHeaders)
.get("/", indexRequest)
.get("/service-worker.js", forceNoCacheRequest)
.get("/js/bundle.js.map", forceNoCacheRequest)
@@ -286,14 +287,7 @@ function allRequests(req, res, next) {
return next();
}
-function forceNoCacheRequest(req, res, next) {
- // Intermittent proxies must not cache the following requests,
- // browsers must fetch the latest version of these files (service worker, source maps)
- res.setHeader("Cache-Control", "no-cache, no-transform");
- return next();
-}
-
-function indexRequest(req, res) {
+function addSecurityHeaders(req, res, next) {
const policies = [
"default-src 'none'", // default to nothing
"base-uri 'none'", // disallow , has no fallback to default-src
@@ -317,10 +311,22 @@ function indexRequest(req, res) {
policies.push("img-src http: https: data:");
}
- res.setHeader("Content-Type", "text/html");
res.setHeader("Content-Security-Policy", policies.join("; "));
res.setHeader("Referrer-Policy", "no-referrer");
+ return next();
+}
+
+function forceNoCacheRequest(req, res, next) {
+ // Intermittent proxies must not cache the following requests,
+ // browsers must fetch the latest version of these files (service worker, source maps)
+ res.setHeader("Cache-Control", "no-cache, no-transform");
+ return next();
+}
+
+function indexRequest(req, res) {
+ res.setHeader("Content-Type", "text/html");
+
return fs.readFile(
path.join(__dirname, "..", "client", "index.html.tpl"),
"utf-8",
@@ -538,7 +544,7 @@ function initializeClient(socket, client, token, lastMessage, openChannel) {
socket.emit("mentions:list", client.mentions);
});
- socket.on("mentions:hide", (msgId) => {
+ socket.on("mentions:dismiss", (msgId) => {
if (typeof msgId !== "number") {
return;
}
@@ -549,7 +555,7 @@ function initializeClient(socket, client, token, lastMessage, openChannel) {
);
});
- socket.on("mentions:hide_all", () => {
+ socket.on("mentions:dismiss_all", () => {
client.mentions = [];
});
diff --git a/test/commands/mode.js b/test/commands/mode.js
index ab27a9a4..a6ea9bad 100644
--- a/test/commands/mode.js
+++ b/test/commands/mode.js
@@ -17,15 +17,38 @@ describe("Commands", function () {
});
const testableNetwork = {
+ firstCommand: null,
lastCommand: null,
nick: "xPaw",
irc: {
+ network: {
+ supports(type) {
+ if (type.toUpperCase() === "MODES") {
+ return "4";
+ }
+ },
+ },
raw(...args) {
+ testableNetwork.firstCommand = testableNetwork.lastCommand;
testableNetwork.lastCommand = args.join(" ");
},
},
};
+ const testableNetworkNoSupports = Object.assign({}, testableNetwork, {
+ irc: {
+ network: {
+ supports() {
+ return null;
+ },
+ },
+ raw(...args) {
+ testableNetworkNoSupports.firstCommand = testableNetworkNoSupports.lastCommand;
+ testableNetworkNoSupports.lastCommand = args.join(" ");
+ },
+ },
+ });
+
it("should not mess with the given target", function () {
const test = function (expected, args) {
ModeCommand.input(testableNetwork, channel, "mode", Array.from(args));
@@ -81,10 +104,34 @@ describe("Commands", function () {
ModeCommand.input(testableNetwork, channel, "devoice", ["xPaw"]);
expect(testableNetwork.lastCommand).to.equal("MODE #thelounge -v xPaw");
+ });
- // Multiple arguments are supported, sent as separate commands
- ModeCommand.input(testableNetwork, channel, "devoice", ["xPaw", "Max-P"]);
- expect(testableNetwork.lastCommand).to.equal("MODE #thelounge -v Max-P");
+ it("should use ISUPPORT MODES on shorthand commands", function () {
+ ModeCommand.input(testableNetwork, channel, "voice", ["xPaw", "Max-P"]);
+ expect(testableNetwork.lastCommand).to.equal("MODE #thelounge +vv xPaw Max-P");
+
+ // since the limit for modes on tests is 4, it should send two commands
+ ModeCommand.input(testableNetwork, channel, "devoice", [
+ "xPaw",
+ "Max-P",
+ "hey",
+ "idk",
+ "thelounge",
+ ]);
+ expect(testableNetwork.firstCommand).to.equal(
+ "MODE #thelounge -vvvv xPaw Max-P hey idk"
+ );
+ expect(testableNetwork.lastCommand).to.equal("MODE #thelounge -v thelounge");
+ });
+
+ it("should fallback to all modes at once for shorthand commands", function () {
+ ModeCommand.input(testableNetworkNoSupports, channel, "voice", ["xPaw"]);
+ expect(testableNetworkNoSupports.lastCommand).to.equal("MODE #thelounge +v xPaw");
+
+ ModeCommand.input(testableNetworkNoSupports, channel, "devoice", ["xPaw", "Max-P"]);
+ expect(testableNetworkNoSupports.lastCommand).to.equal(
+ "MODE #thelounge -vv xPaw Max-P"
+ );
});
});
});
diff --git a/test/models/chan.js b/test/models/chan.js
index 33ee41e5..613bece3 100644
--- a/test/models/chan.js
+++ b/test/models/chan.js
@@ -20,10 +20,10 @@ describe("Chan", function () {
},
};
- const prefixLookup = {};
+ const prefixLookup = {modeToSymbol: {}};
network.network.options.PREFIX.forEach((mode) => {
- prefixLookup[mode.mode] = mode.symbol;
+ prefixLookup.modeToSymbol[mode.mode] = mode.symbol;
});
describe("#findMessage(id)", function () {
diff --git a/test/models/msg.js b/test/models/msg.js
index 3c7d59b7..7690754a 100644
--- a/test/models/msg.js
+++ b/test/models/msg.js
@@ -8,7 +8,7 @@ const User = require("../../src/models/user");
describe("Msg", function () {
["from", "target"].forEach((prop) => {
it(`should keep a copy of the original user in the \`${prop}\` property`, function () {
- const prefixLookup = {a: "&", o: "@"};
+ const prefixLookup = {modeToSymbol: {a: "&", o: "@"}};
const user = new User(
{
modes: ["o"],
diff --git a/test/models/network.js b/test/models/network.js
index ec6ab543..e45f846e 100644
--- a/test/models/network.js
+++ b/test/models/network.js
@@ -49,6 +49,7 @@ describe("Network", function () {
proxyEnabled: false,
proxyHost: "",
proxyPort: 1080,
+ proxyPassword: "",
proxyUsername: "",
channels: [
{name: "#thelounge", key: ""},
diff --git a/test/plugins/sqlite.js b/test/plugins/sqlite.js
index 0971d00f..e886d64e 100644
--- a/test/plugins/sqlite.js
+++ b/test/plugins/sqlite.js
@@ -37,10 +37,9 @@ describe("SQLite Message Storage", function () {
fs.rmdir(path.join(Helper.getHomePath(), "logs"), done);
});
- it("should resolve an empty array when disabled", function (done) {
- store.getMessages(null, null).then((messages) => {
+ it("should resolve an empty array when disabled", function () {
+ return store.getMessages(null, null).then((messages) => {
expect(messages).to.be.empty;
- done();
});
});
@@ -54,91 +53,134 @@ describe("SQLite Message Storage", function () {
});
it("should create tables", function (done) {
- store.database.serialize(() =>
- store.database.all(
- "SELECT name, tbl_name, sql FROM sqlite_master WHERE type = 'table'",
- (err, row) => {
- expect(err).to.be.null;
- expect(row).to.deep.equal([
- {
- name: "options",
- tbl_name: "options",
- sql:
- "CREATE TABLE options (name TEXT, value TEXT, CONSTRAINT name_unique UNIQUE (name))",
- },
- {
- name: "messages",
- tbl_name: "messages",
- sql:
- "CREATE TABLE messages (network TEXT, channel TEXT, time INTEGER, type TEXT, msg TEXT)",
- },
- ]);
+ store.database.all(
+ "SELECT name, tbl_name, sql FROM sqlite_master WHERE type = 'table'",
+ (err, row) => {
+ expect(err).to.be.null;
+ expect(row).to.deep.equal([
+ {
+ name: "options",
+ tbl_name: "options",
+ sql:
+ "CREATE TABLE options (name TEXT, value TEXT, CONSTRAINT name_unique UNIQUE (name))",
+ },
+ {
+ name: "messages",
+ tbl_name: "messages",
+ sql:
+ "CREATE TABLE messages (network TEXT, channel TEXT, time INTEGER, type TEXT, msg TEXT)",
+ },
+ ]);
- done();
- }
- )
+ done();
+ }
);
});
it("should insert schema version to options table", function (done) {
- store.database.serialize(() =>
- store.database.get(
- "SELECT value FROM options WHERE name = 'schema_version'",
- (err, row) => {
- expect(err).to.be.null;
+ store.database.get(
+ "SELECT value FROM options WHERE name = 'schema_version'",
+ (err, row) => {
+ expect(err).to.be.null;
- // Should be sqlite.currentSchemaVersion,
- // compared as string because it's returned as such from the database
- expect(row.value).to.equal("1520239200");
+ // Should be sqlite.currentSchemaVersion,
+ // compared as string because it's returned as such from the database
+ expect(row.value).to.equal("1520239200");
- done();
- }
- )
+ done();
+ }
);
});
- it("should store a message", function (done) {
- store.database.serialize(() => {
- store.index(
+ it("should store a message", function () {
+ store.index(
+ {
+ uuid: "this-is-a-network-guid",
+ },
+ {
+ name: "#thisISaCHANNEL",
+ },
+ new Msg({
+ time: 123456789,
+ text: "Hello from sqlite world!",
+ })
+ );
+ });
+
+ it("should retrieve previously stored message", function () {
+ return store
+ .getMessages(
{
uuid: "this-is-a-network-guid",
},
{
- name: "#thisISaCHANNEL",
- },
- new Msg({
- time: 123456789,
- text: "Hello from sqlite world!",
- })
- );
+ name: "#thisisaCHANNEL",
+ }
+ )
+ .then((messages) => {
+ expect(messages).to.have.lengthOf(1);
- done();
- });
+ const msg = messages[0];
+
+ expect(msg.text).to.equal("Hello from sqlite world!");
+ expect(msg.type).to.equal(Msg.Type.MESSAGE);
+ expect(msg.time.getTime()).to.equal(123456789);
+ });
});
- it("should retrieve previously stored message", function (done) {
- store.database.serialize(() =>
- store
- .getMessages(
- {
- uuid: "this-is-a-network-guid",
- },
- {
- name: "#thisisaCHANNEL",
- }
- )
+ it("should retrieve latest LIMIT messages in order", function () {
+ const originalMaxHistory = Helper.config.maxHistory;
+
+ try {
+ Helper.config.maxHistory = 2;
+
+ for (let i = 0; i < 200; ++i) {
+ store.index(
+ {uuid: "retrieval-order-test-network"},
+ {name: "#channel"},
+ new Msg({
+ time: 123456789 + i,
+ text: `msg ${i}`,
+ })
+ );
+ }
+
+ return store
+ .getMessages({uuid: "retrieval-order-test-network"}, {name: "#channel"})
.then((messages) => {
- expect(messages).to.have.lengthOf(1);
+ expect(messages).to.have.lengthOf(2);
+ expect(messages.map((i) => i.text)).to.deep.equal(["msg 198", "msg 199"]);
+ });
+ } finally {
+ Helper.config.maxHistory = originalMaxHistory;
+ }
+ });
- const msg = messages[0];
+ it("should search messages", function () {
+ const originalMaxHistory = Helper.config.maxHistory;
- expect(msg.text).to.equal("Hello from sqlite world!");
- expect(msg.type).to.equal(Msg.Type.MESSAGE);
- expect(msg.time.getTime()).to.equal(123456789);
+ try {
+ Helper.config.maxHistory = 2;
- done();
+ return store
+ .search({
+ searchTerm: "msg",
+ networkUuid: "retrieval-order-test-network",
})
- );
+ .then((messages) => {
+ expect(messages.results).to.have.lengthOf(100);
+
+ const expectedMessages = [];
+
+ for (let i = 100; i < 200; ++i) {
+ expectedMessages.push(`msg ${i}`);
+ }
+
+ expect(messages.results.map((i) => i.text)).to.deep.equal(expectedMessages);
+ });
+ } finally {
+ Helper.config.maxHistory = originalMaxHistory;
+ }
});
it("should close database", function (done) {
diff --git a/test/tests/hostmask.js b/test/tests/hostmask.js
index 406238c2..b1e84c5e 100644
--- a/test/tests/hostmask.js
+++ b/test/tests/hostmask.js
@@ -48,7 +48,14 @@ describe("Hostmask", function () {
it(".compareHostmask (wildcard)", function () {
const a = Helper.parseHostmask("nick!user@host");
- const b = Helper.parseHostmask("nick!*@*");
+ const b = Helper.parseHostmask("n?ck!*@*");
+ expect(Helper.compareHostmask(b, a)).to.be.true;
+ expect(Helper.compareHostmask(a, b)).to.be.false;
+ });
+
+ it(".compareHostmask (wildcard - partial)", function () {
+ const a = Helper.parseHostmask("nicky!user@host");
+ const b = Helper.parseHostmask("nick*!*e?@?os*");
expect(Helper.compareHostmask(b, a)).to.be.true;
expect(Helper.compareHostmask(a, b)).to.be.false;
});
@@ -60,3 +67,47 @@ describe("Hostmask", function () {
expect(Helper.compareHostmask(a, b)).to.be.true;
});
});
+
+describe("compareWithWildcard", function () {
+ const goodPairs = [
+ ["asdf", "asdf"],
+ ["AsDf", "asdf"],
+ ["a?df*", "asdf"],
+ ["*asdf*", "asdf"],
+ ["*asdf", "asdf"],
+ ["asd?", "asdf"],
+ ["asd?*", "asdf"],
+ ["a??f", "asdf"],
+ ["a*", "asdf"],
+ ["*f", "asdf"],
+ ["*s*", "asdf"],
+ ["*", ""],
+ ["**", ""],
+ ];
+
+ for (const t of goodPairs) {
+ it(`("${t[0]}", "${t[1]}")`, function () {
+ expect(Helper.compareWithWildcard(t[0], t[1])).to.be.true;
+ });
+ }
+
+ const badPairs = [
+ ["asdf", "fdsa"],
+ ["a?df*", "adfg"],
+ ["?", ""],
+ ["?asdf", "asdf"],
+ ["?*", ""],
+ ["*?*", ""],
+ ["*?", ""],
+ ["asd", "asdf"],
+ ["sdf", "asdf"],
+ ["sd", "asdf"],
+ ["", "asdf"],
+ ];
+
+ for (const t of badPairs) {
+ it(`("${t[0]}", "${t[1]}")`, function () {
+ expect(Helper.compareWithWildcard(t[0], t[1])).to.be.false;
+ });
+ }
+});
diff --git a/webpack.config.js b/webpack.config.js
index e9ed55e1..4475e52d 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -85,7 +85,6 @@ const config = {
},
externals: {
json3: "JSON", // socket.io uses json3.js, but we do not target any browsers that need it
- sharp: "commonjs sharp",
},
plugins: [
new VueLoaderPlugin(),
diff --git a/yarn.lock b/yarn.lock
index a926adac..c40f9247 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -16,12 +16,38 @@
dependencies:
"@babel/highlight" "^7.14.5"
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5", "@babel/compat-data@^7.14.7":
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.14.5":
version "7.14.7"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08"
integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==
-"@babel/core@7.14.6", "@babel/core@>=7.9.0", "@babel/core@^7.7.5":
+"@babel/compat-data@^7.15.0":
+ version "7.15.0"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176"
+ integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==
+
+"@babel/core@7.15.5":
+ version "7.15.5"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.15.5.tgz#f8ed9ace730722544609f90c9bb49162dc3bf5b9"
+ integrity sha512-pYgXxiwAgQpgM1bNkZsDEq85f0ggXMA5L7c+o3tskGMh2BunCI9QUwB9Z4jpvXUOuMdyGKiGKQiRe11VS6Jzvg==
+ dependencies:
+ "@babel/code-frame" "^7.14.5"
+ "@babel/generator" "^7.15.4"
+ "@babel/helper-compilation-targets" "^7.15.4"
+ "@babel/helper-module-transforms" "^7.15.4"
+ "@babel/helpers" "^7.15.4"
+ "@babel/parser" "^7.15.5"
+ "@babel/template" "^7.15.4"
+ "@babel/traverse" "^7.15.4"
+ "@babel/types" "^7.15.4"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.1.2"
+ semver "^6.3.0"
+ source-map "^0.5.0"
+
+"@babel/core@>=7.9.0", "@babel/core@^7.7.5":
version "7.14.6"
resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab"
integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==
@@ -51,6 +77,15 @@
jsesc "^2.5.1"
source-map "^0.5.0"
+"@babel/generator@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.15.4.tgz#85acb159a267ca6324f9793986991ee2022a05b0"
+ integrity sha512-d3itta0tu+UayjEORPNz6e1T3FtvWlP5N4V5M+lhp/CxT4oAA7/NcScnpRyspUMLK6tu9MNHmQHxRykuN2R7hw==
+ dependencies:
+ "@babel/types" "^7.15.4"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
"@babel/helper-annotate-as-pure@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz#7bf478ec3b71726d56a8ca5775b046fc29879e61"
@@ -58,6 +93,13 @@
dependencies:
"@babel/types" "^7.14.5"
+"@babel/helper-annotate-as-pure@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz#3d0e43b00c5e49fdb6c57e421601a7a658d5f835"
+ integrity sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==
+ dependencies:
+ "@babel/types" "^7.15.4"
+
"@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz#b939b43f8c37765443a19ae74ad8b15978e0a191"
@@ -76,6 +118,16 @@
browserslist "^4.16.6"
semver "^6.3.0"
+"@babel/helper-compilation-targets@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz#cf6d94f30fbefc139123e27dd6b02f65aeedb7b9"
+ integrity sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==
+ dependencies:
+ "@babel/compat-data" "^7.15.0"
+ "@babel/helper-validator-option" "^7.14.5"
+ browserslist "^4.16.6"
+ semver "^6.3.0"
+
"@babel/helper-create-class-features-plugin@^7.14.5":
version "7.14.6"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.6.tgz#f114469b6c06f8b5c59c6c4e74621f5085362542"
@@ -88,6 +140,18 @@
"@babel/helper-replace-supers" "^7.14.5"
"@babel/helper-split-export-declaration" "^7.14.5"
+"@babel/helper-create-class-features-plugin@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz#7f977c17bd12a5fba363cb19bea090394bf37d2e"
+ integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.15.4"
+ "@babel/helper-function-name" "^7.15.4"
+ "@babel/helper-member-expression-to-functions" "^7.15.4"
+ "@babel/helper-optimise-call-expression" "^7.15.4"
+ "@babel/helper-replace-supers" "^7.15.4"
+ "@babel/helper-split-export-declaration" "^7.15.4"
+
"@babel/helper-create-regexp-features-plugin@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz#c7d5ac5e9cf621c26057722fb7a8a4c5889358c4"
@@ -126,6 +190,15 @@
"@babel/template" "^7.14.5"
"@babel/types" "^7.14.5"
+"@babel/helper-function-name@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz#845744dafc4381a4a5fb6afa6c3d36f98a787ebc"
+ integrity sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.15.4"
+ "@babel/template" "^7.15.4"
+ "@babel/types" "^7.15.4"
+
"@babel/helper-get-function-arity@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815"
@@ -133,6 +206,13 @@
dependencies:
"@babel/types" "^7.14.5"
+"@babel/helper-get-function-arity@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz#098818934a137fce78b536a3e015864be1e2879b"
+ integrity sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==
+ dependencies:
+ "@babel/types" "^7.15.4"
+
"@babel/helper-hoist-variables@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d"
@@ -140,6 +220,13 @@
dependencies:
"@babel/types" "^7.14.5"
+"@babel/helper-hoist-variables@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz#09993a3259c0e918f99d104261dfdfc033f178df"
+ integrity sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==
+ dependencies:
+ "@babel/types" "^7.15.4"
+
"@babel/helper-member-expression-to-functions@^7.14.5":
version "7.14.7"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz#97e56244beb94211fe277bd818e3a329c66f7970"
@@ -147,6 +234,13 @@
dependencies:
"@babel/types" "^7.14.5"
+"@babel/helper-member-expression-to-functions@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz#bfd34dc9bba9824a4658b0317ec2fd571a51e6ef"
+ integrity sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==
+ dependencies:
+ "@babel/types" "^7.15.4"
+
"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3"
@@ -154,6 +248,13 @@
dependencies:
"@babel/types" "^7.14.5"
+"@babel/helper-module-imports@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz#e18007d230632dea19b47853b984476e7b4e103f"
+ integrity sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==
+ dependencies:
+ "@babel/types" "^7.15.4"
+
"@babel/helper-module-transforms@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e"
@@ -168,6 +269,20 @@
"@babel/traverse" "^7.14.5"
"@babel/types" "^7.14.5"
+"@babel/helper-module-transforms@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.15.4.tgz#962cc629a7f7f9a082dd62d0307fa75fe8788d7c"
+ integrity sha512-9fHHSGE9zTC++KuXLZcB5FKgvlV83Ox+NLUmQTawovwlJ85+QMhk1CnVk406CQVj97LaWod6KVjl2Sfgw9Aktw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.15.4"
+ "@babel/helper-replace-supers" "^7.15.4"
+ "@babel/helper-simple-access" "^7.15.4"
+ "@babel/helper-split-export-declaration" "^7.15.4"
+ "@babel/helper-validator-identifier" "^7.14.9"
+ "@babel/template" "^7.15.4"
+ "@babel/traverse" "^7.15.4"
+ "@babel/types" "^7.15.4"
+
"@babel/helper-optimise-call-expression@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c"
@@ -175,6 +290,13 @@
dependencies:
"@babel/types" "^7.14.5"
+"@babel/helper-optimise-call-expression@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz#f310a5121a3b9cc52d9ab19122bd729822dee171"
+ integrity sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==
+ dependencies:
+ "@babel/types" "^7.15.4"
+
"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9"
@@ -189,6 +311,15 @@
"@babel/helper-wrap-function" "^7.14.5"
"@babel/types" "^7.14.5"
+"@babel/helper-remap-async-to-generator@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz#2637c0731e4c90fbf58ac58b50b2b5a192fc970f"
+ integrity sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.15.4"
+ "@babel/helper-wrap-function" "^7.15.4"
+ "@babel/types" "^7.15.4"
+
"@babel/helper-replace-supers@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94"
@@ -199,6 +330,16 @@
"@babel/traverse" "^7.14.5"
"@babel/types" "^7.14.5"
+"@babel/helper-replace-supers@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz#52a8ab26ba918c7f6dee28628b07071ac7b7347a"
+ integrity sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.15.4"
+ "@babel/helper-optimise-call-expression" "^7.15.4"
+ "@babel/traverse" "^7.15.4"
+ "@babel/types" "^7.15.4"
+
"@babel/helper-simple-access@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4"
@@ -206,6 +347,13 @@
dependencies:
"@babel/types" "^7.14.5"
+"@babel/helper-simple-access@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz#ac368905abf1de8e9781434b635d8f8674bcc13b"
+ integrity sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==
+ dependencies:
+ "@babel/types" "^7.15.4"
+
"@babel/helper-skip-transparent-expression-wrappers@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz#96f486ac050ca9f44b009fbe5b7d394cab3a0ee4"
@@ -213,6 +361,13 @@
dependencies:
"@babel/types" "^7.14.5"
+"@babel/helper-skip-transparent-expression-wrappers@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz#707dbdba1f4ad0fa34f9114fc8197aec7d5da2eb"
+ integrity sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==
+ dependencies:
+ "@babel/types" "^7.15.4"
+
"@babel/helper-split-export-declaration@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a"
@@ -220,11 +375,23 @@
dependencies:
"@babel/types" "^7.14.5"
+"@babel/helper-split-export-declaration@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz#aecab92dcdbef6a10aa3b62ab204b085f776e257"
+ integrity sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==
+ dependencies:
+ "@babel/types" "^7.15.4"
+
"@babel/helper-validator-identifier@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8"
integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg==
+"@babel/helper-validator-identifier@^7.14.9":
+ version "7.14.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48"
+ integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==
+
"@babel/helper-validator-option@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3"
@@ -240,6 +407,16 @@
"@babel/traverse" "^7.14.5"
"@babel/types" "^7.14.5"
+"@babel/helper-wrap-function@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz#6f754b2446cfaf3d612523e6ab8d79c27c3a3de7"
+ integrity sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==
+ dependencies:
+ "@babel/helper-function-name" "^7.15.4"
+ "@babel/template" "^7.15.4"
+ "@babel/traverse" "^7.15.4"
+ "@babel/types" "^7.15.4"
+
"@babel/helpers@^7.14.6":
version "7.14.6"
resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.6.tgz#5b58306b95f1b47e2a0199434fa8658fa6c21635"
@@ -249,6 +426,15 @@
"@babel/traverse" "^7.14.5"
"@babel/types" "^7.14.5"
+"@babel/helpers@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.15.4.tgz#5f40f02050a3027121a3cf48d497c05c555eaf43"
+ integrity sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==
+ dependencies:
+ "@babel/template" "^7.15.4"
+ "@babel/traverse" "^7.15.4"
+ "@babel/types" "^7.15.4"
+
"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
@@ -263,22 +449,27 @@
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.7.tgz#6099720c8839ca865a2637e6c85852ead0bdb595"
integrity sha512-X67Z5y+VBJuHB/RjwECp8kSl5uYi0BvRbNeWqkaJCVh+LiTPl19WBUfG627psSgp9rSf6ojuXghQM3ha6qHHdA==
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz#4b467302e1548ed3b1be43beae2cc9cf45e0bb7e"
- integrity sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==
+"@babel/parser@^7.15.4", "@babel/parser@^7.15.5":
+ version "7.15.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.15.6.tgz#043b9aa3c303c0722e5377fef9197f4cf1796549"
+ integrity sha512-S/TSCcsRuCkmpUuoWijua0Snt+f3ewU/8spLo+4AXJCZfT0bVCzLD5MuOKdrx0mlAptbKzn5AdgEIIKXxXkz9Q==
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz#dbdeabb1e80f622d9f0b583efb2999605e0a567e"
+ integrity sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.14.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.15.4"
"@babel/plugin-proposal-optional-chaining" "^7.14.5"
-"@babel/plugin-proposal-async-generator-functions@^7.14.7":
- version "7.14.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.7.tgz#784a48c3d8ed073f65adcf30b57bcbf6c8119ace"
- integrity sha512-RK8Wj7lXLY3bqei69/cc25gwS5puEc3dknoFPFbqfy3XxYQBQFvu4ioWpafMBAB+L9NyptQK4nMOa5Xz16og8Q==
+"@babel/plugin-proposal-async-generator-functions@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.4.tgz#f82aabe96c135d2ceaa917feb9f5fca31635277e"
+ integrity sha512-2zt2g5vTXpMC3OmK6uyjvdXptbhBXfA77XGrd3gh93zwG8lZYBLOBImiGBEG0RANu3JqKEACCz5CGk73OJROBw==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-remap-async-to-generator" "^7.14.5"
+ "@babel/helper-remap-async-to-generator" "^7.15.4"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-proposal-class-properties@^7.14.5":
@@ -289,12 +480,12 @@
"@babel/helper-create-class-features-plugin" "^7.14.5"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-proposal-class-static-block@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz#158e9e10d449c3849ef3ecde94a03d9f1841b681"
- integrity sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==
+"@babel/plugin-proposal-class-static-block@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz#3e7ca6128453c089e8b477a99f970c63fc1cb8d7"
+ integrity sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.14.5"
+ "@babel/helper-create-class-features-plugin" "^7.15.4"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
@@ -346,16 +537,16 @@
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-proposal-object-rest-spread@^7.14.7":
- version "7.14.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz#5920a2b3df7f7901df0205974c0641b13fd9d363"
- integrity sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==
+"@babel/plugin-proposal-object-rest-spread@^7.15.6":
+ version "7.15.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz#ef68050c8703d07b25af402cb96cf7f34a68ed11"
+ integrity sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==
dependencies:
- "@babel/compat-data" "^7.14.7"
- "@babel/helper-compilation-targets" "^7.14.5"
+ "@babel/compat-data" "^7.15.0"
+ "@babel/helper-compilation-targets" "^7.15.4"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.14.5"
+ "@babel/plugin-transform-parameters" "^7.15.4"
"@babel/plugin-proposal-optional-catch-binding@^7.14.5":
version "7.14.5"
@@ -382,13 +573,13 @@
"@babel/helper-create-class-features-plugin" "^7.14.5"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-proposal-private-property-in-object@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz#9f65a4d0493a940b4c01f8aa9d3f1894a587f636"
- integrity sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==
+"@babel/plugin-proposal-private-property-in-object@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz#55c5e3b4d0261fd44fe637e3f624cfb0f484e3e5"
+ integrity sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.14.5"
- "@babel/helper-create-class-features-plugin" "^7.14.5"
+ "@babel/helper-annotate-as-pure" "^7.15.4"
+ "@babel/helper-create-class-features-plugin" "^7.15.4"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
@@ -521,24 +712,24 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-block-scoping@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939"
- integrity sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw==
+"@babel/plugin-transform-block-scoping@^7.15.3":
+ version "7.15.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz#94c81a6e2fc230bcce6ef537ac96a1e4d2b3afaf"
+ integrity sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-classes@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.5.tgz#0e98e82097b38550b03b483f9b51a78de0acb2cf"
- integrity sha512-J4VxKAMykM06K/64z9rwiL6xnBHgB1+FVspqvlgCdwD1KUbQNfszeKVVOMh59w3sztHYIZDgnhOC4WbdEfHFDA==
+"@babel/plugin-transform-classes@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz#50aee17aaf7f332ae44e3bce4c2e10534d5d3bf1"
+ integrity sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.14.5"
- "@babel/helper-function-name" "^7.14.5"
- "@babel/helper-optimise-call-expression" "^7.14.5"
+ "@babel/helper-annotate-as-pure" "^7.15.4"
+ "@babel/helper-function-name" "^7.15.4"
+ "@babel/helper-optimise-call-expression" "^7.15.4"
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-replace-supers" "^7.14.5"
- "@babel/helper-split-export-declaration" "^7.14.5"
+ "@babel/helper-replace-supers" "^7.15.4"
+ "@babel/helper-split-export-declaration" "^7.15.4"
globals "^11.1.0"
"@babel/plugin-transform-computed-properties@^7.14.5":
@@ -578,10 +769,10 @@
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.14.5"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-for-of@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz#dae384613de8f77c196a8869cbf602a44f7fc0eb"
- integrity sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==
+"@babel/plugin-transform-for-of@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz#25c62cce2718cfb29715f416e75d5263fb36a8c2"
+ integrity sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
@@ -616,25 +807,25 @@
"@babel/helper-plugin-utils" "^7.14.5"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-commonjs@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz#7aaee0ea98283de94da98b28f8c35701429dad97"
- integrity sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==
+"@babel/plugin-transform-modules-commonjs@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz#8201101240eabb5a76c08ef61b2954f767b6b4c1"
+ integrity sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==
dependencies:
- "@babel/helper-module-transforms" "^7.14.5"
+ "@babel/helper-module-transforms" "^7.15.4"
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-simple-access" "^7.14.5"
+ "@babel/helper-simple-access" "^7.15.4"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-systemjs@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz#c75342ef8b30dcde4295d3401aae24e65638ed29"
- integrity sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==
+"@babel/plugin-transform-modules-systemjs@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz#b42890c7349a78c827719f1d2d0cd38c7d268132"
+ integrity sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==
dependencies:
- "@babel/helper-hoist-variables" "^7.14.5"
- "@babel/helper-module-transforms" "^7.14.5"
+ "@babel/helper-hoist-variables" "^7.15.4"
+ "@babel/helper-module-transforms" "^7.15.4"
"@babel/helper-plugin-utils" "^7.14.5"
- "@babel/helper-validator-identifier" "^7.14.5"
+ "@babel/helper-validator-identifier" "^7.14.9"
babel-plugin-dynamic-import-node "^2.3.3"
"@babel/plugin-transform-modules-umd@^7.14.5":
@@ -645,10 +836,10 @@
"@babel/helper-module-transforms" "^7.14.5"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.14.7":
- version "7.14.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.7.tgz#60c06892acf9df231e256c24464bfecb0908fd4e"
- integrity sha512-DTNOTaS7TkW97xsDMrp7nycUVh6sn/eq22VaxWfEdzuEbRsiaOU0pqU7DlyUGHVsbQbSghvjKRpEl+nUCKGQSg==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.14.9":
+ version "7.14.9"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz#c68f5c5d12d2ebaba3762e57c2c4f6347a46e7b2"
+ integrity sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==
dependencies:
"@babel/helper-create-regexp-features-plugin" "^7.14.5"
@@ -667,10 +858,10 @@
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/helper-replace-supers" "^7.14.5"
-"@babel/plugin-transform-parameters@^7.14.5":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz#49662e86a1f3ddccac6363a7dfb1ff0a158afeb3"
- integrity sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==
+"@babel/plugin-transform-parameters@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz#5f2285cc3160bf48c8502432716b48504d29ed62"
+ integrity sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
@@ -746,30 +937,30 @@
"@babel/helper-create-regexp-features-plugin" "^7.14.5"
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/preset-env@7.14.7":
- version "7.14.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.14.7.tgz#5c70b22d4c2d893b03d8c886a5c17422502b932a"
- integrity sha512-itOGqCKLsSUl0Y+1nSfhbuuOlTs0MJk2Iv7iSH+XT/mR8U1zRLO7NjWlYXB47yhK4J/7j+HYty/EhFZDYKa/VA==
+"@babel/preset-env@7.15.6":
+ version "7.15.6"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.15.6.tgz#0f3898db9d63d320f21b17380d8462779de57659"
+ integrity sha512-L+6jcGn7EWu7zqaO2uoTDjjMBW+88FXzV8KvrBl2z6MtRNxlsmUNRlZPaNNPUTgqhyC5DHNFk/2Jmra+ublZWw==
dependencies:
- "@babel/compat-data" "^7.14.7"
- "@babel/helper-compilation-targets" "^7.14.5"
+ "@babel/compat-data" "^7.15.0"
+ "@babel/helper-compilation-targets" "^7.15.4"
"@babel/helper-plugin-utils" "^7.14.5"
"@babel/helper-validator-option" "^7.14.5"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.14.5"
- "@babel/plugin-proposal-async-generator-functions" "^7.14.7"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.15.4"
+ "@babel/plugin-proposal-async-generator-functions" "^7.15.4"
"@babel/plugin-proposal-class-properties" "^7.14.5"
- "@babel/plugin-proposal-class-static-block" "^7.14.5"
+ "@babel/plugin-proposal-class-static-block" "^7.15.4"
"@babel/plugin-proposal-dynamic-import" "^7.14.5"
"@babel/plugin-proposal-export-namespace-from" "^7.14.5"
"@babel/plugin-proposal-json-strings" "^7.14.5"
"@babel/plugin-proposal-logical-assignment-operators" "^7.14.5"
"@babel/plugin-proposal-nullish-coalescing-operator" "^7.14.5"
"@babel/plugin-proposal-numeric-separator" "^7.14.5"
- "@babel/plugin-proposal-object-rest-spread" "^7.14.7"
+ "@babel/plugin-proposal-object-rest-spread" "^7.15.6"
"@babel/plugin-proposal-optional-catch-binding" "^7.14.5"
"@babel/plugin-proposal-optional-chaining" "^7.14.5"
"@babel/plugin-proposal-private-methods" "^7.14.5"
- "@babel/plugin-proposal-private-property-in-object" "^7.14.5"
+ "@babel/plugin-proposal-private-property-in-object" "^7.15.4"
"@babel/plugin-proposal-unicode-property-regex" "^7.14.5"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-syntax-class-properties" "^7.12.13"
@@ -788,25 +979,25 @@
"@babel/plugin-transform-arrow-functions" "^7.14.5"
"@babel/plugin-transform-async-to-generator" "^7.14.5"
"@babel/plugin-transform-block-scoped-functions" "^7.14.5"
- "@babel/plugin-transform-block-scoping" "^7.14.5"
- "@babel/plugin-transform-classes" "^7.14.5"
+ "@babel/plugin-transform-block-scoping" "^7.15.3"
+ "@babel/plugin-transform-classes" "^7.15.4"
"@babel/plugin-transform-computed-properties" "^7.14.5"
"@babel/plugin-transform-destructuring" "^7.14.7"
"@babel/plugin-transform-dotall-regex" "^7.14.5"
"@babel/plugin-transform-duplicate-keys" "^7.14.5"
"@babel/plugin-transform-exponentiation-operator" "^7.14.5"
- "@babel/plugin-transform-for-of" "^7.14.5"
+ "@babel/plugin-transform-for-of" "^7.15.4"
"@babel/plugin-transform-function-name" "^7.14.5"
"@babel/plugin-transform-literals" "^7.14.5"
"@babel/plugin-transform-member-expression-literals" "^7.14.5"
"@babel/plugin-transform-modules-amd" "^7.14.5"
- "@babel/plugin-transform-modules-commonjs" "^7.14.5"
- "@babel/plugin-transform-modules-systemjs" "^7.14.5"
+ "@babel/plugin-transform-modules-commonjs" "^7.15.4"
+ "@babel/plugin-transform-modules-systemjs" "^7.15.4"
"@babel/plugin-transform-modules-umd" "^7.14.5"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.7"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.14.9"
"@babel/plugin-transform-new-target" "^7.14.5"
"@babel/plugin-transform-object-super" "^7.14.5"
- "@babel/plugin-transform-parameters" "^7.14.5"
+ "@babel/plugin-transform-parameters" "^7.15.4"
"@babel/plugin-transform-property-literals" "^7.14.5"
"@babel/plugin-transform-regenerator" "^7.14.5"
"@babel/plugin-transform-reserved-words" "^7.14.5"
@@ -818,11 +1009,11 @@
"@babel/plugin-transform-unicode-escapes" "^7.14.5"
"@babel/plugin-transform-unicode-regex" "^7.14.5"
"@babel/preset-modules" "^0.1.4"
- "@babel/types" "^7.14.5"
+ "@babel/types" "^7.15.6"
babel-plugin-polyfill-corejs2 "^0.2.2"
babel-plugin-polyfill-corejs3 "^0.2.2"
babel-plugin-polyfill-regenerator "^0.2.2"
- core-js-compat "^3.15.0"
+ core-js-compat "^3.16.0"
semver "^6.3.0"
"@babel/preset-modules@^0.1.4":
@@ -852,6 +1043,15 @@
"@babel/parser" "^7.14.5"
"@babel/types" "^7.14.5"
+"@babel/template@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.15.4.tgz#51898d35dcf3faa670c4ee6afcfd517ee139f194"
+ integrity sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==
+ dependencies:
+ "@babel/code-frame" "^7.14.5"
+ "@babel/parser" "^7.15.4"
+ "@babel/types" "^7.15.4"
+
"@babel/traverse@^7.13.0", "@babel/traverse@^7.14.5":
version "7.14.7"
resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.7.tgz#64007c9774cfdc3abd23b0780bc18a3ce3631753"
@@ -867,6 +1067,21 @@
debug "^4.1.0"
globals "^11.1.0"
+"@babel/traverse@^7.15.4":
+ version "7.15.4"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.15.4.tgz#ff8510367a144bfbff552d9e18e28f3e2889c22d"
+ integrity sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==
+ dependencies:
+ "@babel/code-frame" "^7.14.5"
+ "@babel/generator" "^7.15.4"
+ "@babel/helper-function-name" "^7.15.4"
+ "@babel/helper-hoist-variables" "^7.15.4"
+ "@babel/helper-split-export-declaration" "^7.15.4"
+ "@babel/parser" "^7.15.4"
+ "@babel/types" "^7.15.4"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
"@babel/types@^7.14.5", "@babel/types@^7.4.4":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff"
@@ -875,6 +1090,14 @@
"@babel/helper-validator-identifier" "^7.14.5"
to-fast-properties "^2.0.0"
+"@babel/types@^7.15.4", "@babel/types@^7.15.6":
+ version "7.15.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.15.6.tgz#99abdc48218b2881c058dd0a7ab05b99c9be758f"
+ integrity sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.14.9"
+ to-fast-properties "^2.0.0"
+
"@csstools/convert-colors@^1.4.0":
version "1.4.0"
resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7"
@@ -900,10 +1123,10 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
-"@fortawesome/fontawesome-free@5.15.3":
- version "5.15.3"
- resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.3.tgz#c36ffa64a2a239bf948541a97b6ae8d729e09a9a"
- integrity sha512-rFnSUN/QOtnOAgqFRooTA3H57JLDm0QEG/jPdk+tLQNL/eWd+Aok8g3qCI+Q1xuDPWpGW/i9JySpJVsq8Q0s9w==
+"@fortawesome/fontawesome-free@5.15.4":
+ version "5.15.4"
+ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.15.4.tgz#ecda5712b61ac852c760d8b3c79c96adca5554e5"
+ integrity sha512-eYm8vijH/hpzr/6/1CJ/V/Eb1xQFW2nnUKArb3z+yUWv7HTwj6M7SP957oMjfZjAHU6qpoNc2wQvIxBLWYa/Jg==
"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
@@ -1420,10 +1643,10 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1:
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
-ansi-html@0.0.7:
- version "0.0.7"
- resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
- integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4=
+ansi-html-community@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
+ integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==
ansi-regex@^2.0.0:
version "2.1.1"
@@ -1668,6 +1891,11 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+balanced-match@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9"
+ integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==
+
base64-arraybuffer@0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812"
@@ -1705,15 +1933,6 @@ binary-extensions@^2.0.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
-bl@^4.0.3:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
- integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
- dependencies:
- buffer "^5.5.0"
- inherits "^2.0.4"
- readable-stream "^3.4.0"
-
block-stream@*:
version "0.0.9"
resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
@@ -1783,6 +2002,17 @@ browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4
escalade "^3.1.1"
node-releases "^1.1.71"
+browserslist@^4.17.0:
+ version "4.17.0"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.0.tgz#1fcd81ec75b41d6d4994fb0831b92ac18c01649c"
+ integrity sha512-g2BJ2a0nEYvEFQC208q8mVAhfNwpZ5Mu8BwgtCdZKO3qx98HChmeg448fPdUzld8aFmfLgVh7yymqV+q1lJZ5g==
+ dependencies:
+ caniuse-lite "^1.0.30001254"
+ colorette "^1.3.0"
+ electron-to-chromium "^1.3.830"
+ escalade "^3.1.1"
+ node-releases "^1.1.75"
+
buffer-equal-constant-time@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
@@ -1793,14 +2023,6 @@ buffer-from@^1.0.0:
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
-buffer@^5.5.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
- integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
- dependencies:
- base64-js "^1.3.1"
- ieee754 "^1.1.13"
-
buffer@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6"
@@ -1928,6 +2150,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001109, can
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001241.tgz#cd3fae47eb3d7691692b406568d7a3e5b23c7598"
integrity sha512-1uoSZ1Pq1VpH0WerIMqwptXHNNGfdl7d1cJUFs80CwQ/lVzdhTvsFZCeNFslze7AjsQnb4C85tzclPa1VShbeQ==
+caniuse-lite@^1.0.30001254:
+ version "1.0.30001257"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001257.tgz#150aaf649a48bee531104cfeda57f92ce587f6e5"
+ integrity sha512-JN49KplOgHSXpIsVSF+LUyhD8PUp6xPpAXeRrrcBh4KBeP7W864jHn6RvzJgDlrReyeVjMFJL3PLpPvKIxlIHA==
+
caseless@~0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -1945,10 +2172,10 @@ chai@4.3.4:
pathval "^1.1.1"
type-detect "^4.0.5"
-chalk@4.1.1, chalk@^4.0.0, chalk@^4.1.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
- integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+chalk@4.1.2, chalk@^4.1.1:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
@@ -1981,6 +2208,14 @@ chalk@^3.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+chalk@^4.0.0, chalk@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad"
+ integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
character-entities-legacy@^1.0.0:
version "1.1.4"
resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
@@ -2147,7 +2382,7 @@ color-string@^1.5.4:
color-name "^1.0.0"
simple-swizzle "^0.2.2"
-color@^3.0.0, color@^3.1.3:
+color@^3.0.0:
version "3.1.3"
resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e"
integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==
@@ -2160,6 +2395,11 @@ colorette@^1.2.1, colorette@^1.2.2:
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
+colorette@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.4.0.tgz#5190fbb87276259a86ad700bff2c6d6faa3fca40"
+ integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==
+
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -2274,7 +2514,7 @@ copy-webpack-plugin@7.0.0:
schema-utils "^3.0.0"
serialize-javascript "^5.0.1"
-core-js-compat@^3.14.0, core-js-compat@^3.15.0:
+core-js-compat@^3.14.0:
version "3.15.2"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.15.2.tgz#47272fbb479880de14b4e6081f71f3492f5bd3cb"
integrity sha512-Wp+BJVvwopjI+A1EFqm2dwUmWYXrvucmtIB2LgXn/Rb+gWPKYxtmb4GKHGKG/KGF1eK9jfjzT38DITbTOCX/SQ==
@@ -2282,6 +2522,14 @@ core-js-compat@^3.14.0, core-js-compat@^3.15.0:
browserslist "^4.16.6"
semver "7.0.0"
+core-js-compat@^3.16.0:
+ version "3.17.3"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.17.3.tgz#b39c8e4dec71ecdc735c653ce5233466e561324e"
+ integrity sha512-+in61CKYs4hQERiADCJsdgewpdl/X0GhEX77pjKgbeibXviIt2oxEjTc8O2fqHX8mDdBrDvX8MYD/RYsBv4OiA==
+ dependencies:
+ browserslist "^4.17.0"
+ semver "7.0.0"
+
core-js@^3.15.1:
version "3.15.2"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.15.2.tgz#740660d2ff55ef34ce664d7e2455119c5bdd3d61"
@@ -2543,10 +2791,10 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
-dayjs@1.10.5:
- version "1.10.5"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.5.tgz#5600df4548fc2453b3f163ebb2abbe965ccfb986"
- integrity sha512-BUFis41ikLz+65iH6LHQCDm4YPMj5r1YFLdupPIyM4SGcXMmtiLQ7U37i+hGS8urIuqe7I/ou3IS1jVc4nbN4g==
+dayjs@1.10.7:
+ version "1.10.7"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468"
+ integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==
de-indent@^1.0.2:
version "1.0.2"
@@ -2606,13 +2854,6 @@ decompress-response@^3.3.0:
dependencies:
mimic-response "^1.0.0"
-decompress-response@^4.2.0:
- version "4.2.1"
- resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986"
- integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==
- dependencies:
- mimic-response "^2.0.0"
-
decompress-response@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
@@ -2681,7 +2922,7 @@ destroy@~1.0.4:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
-detect-libc@^1.0.2, detect-libc@^1.0.3:
+detect-libc@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
@@ -2822,10 +3063,15 @@ electron-to-chromium@^1.3.723:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.762.tgz#3fa4e3bcbda539b50e3aa23041627063a5cffe61"
integrity sha512-LehWjRpfPcK8F1Lf/NZoAwWLWnjJVo0SZeQ9j/tvnBWYcT99qDqgo4raAfS2oTKZjPrR/jxruh85DGgDUmywEA==
-emoji-regex@9.2.1:
- version "9.2.1"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.1.tgz#c9b25604256bb3428964bead3ab63069d736f7ee"
- integrity sha512-117l1H6U4X3Krn+MrzYrL57d5H7siRHWraBs7s+LjRuFK7Fe7hJqnJ0skWlinqsycVLU5YAo6L8CsEYQ0V5prg==
+electron-to-chromium@^1.3.830:
+ version "1.3.839"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.839.tgz#27a5b21468e9fefb0e328a029403617f20acec9c"
+ integrity sha512-0O7uPs9LJNjQ/U5mW78qW8gXv9H6Ba3DHZ5/yt8aBsvomOWDkV3MddT7enUYvLQEUVOURjWmgJJWVZ3K98tIwQ==
+
+emoji-regex@9.2.2:
+ version "9.2.2"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
+ integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
emoji-regex@^7.0.1:
version "7.0.3"
@@ -2847,7 +3093,7 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
-end-of-stream@^1.1.0, end-of-stream@^1.4.1:
+end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -3182,11 +3428,6 @@ execall@^2.0.0:
dependencies:
clone-regexp "^2.1.0"
-expand-template@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
- integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
-
express@4.17.1:
version "4.17.1"
resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
@@ -3288,7 +3529,7 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
-file-entry-cache@^6.0.0, file-entry-cache@^6.0.1:
+file-entry-cache@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
@@ -3348,7 +3589,7 @@ find-cache-dir@^3.2.0, find-cache-dir@^3.3.1:
make-dir "^3.0.2"
pkg-dir "^4.1.0"
-find-up@5.0.0:
+find-up@5.0.0, find-up@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc"
integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==
@@ -3371,12 +3612,12 @@ find-up@^4.0.0, find-up@^4.1.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
-find-versions@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-3.2.0.tgz#10297f98030a786829681690545ef659ed1d254e"
- integrity sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==
+find-versions@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/find-versions/-/find-versions-4.0.0.tgz#3c57e573bf97769b8cb8df16934b627915da4965"
+ integrity sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==
dependencies:
- semver-regex "^2.0.0"
+ semver-regex "^3.1.2"
flat-cache@^3.0.4:
version "3.0.4"
@@ -3443,11 +3684,6 @@ fromentries@^1.2.0:
resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a"
integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==
-fs-constants@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
- integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
-
fs-minipass@^1.2.5:
version "1.2.7"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7"
@@ -3574,12 +3810,14 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
-github-from-package@0.0.0:
- version "0.0.0"
- resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
- integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=
+glob-parent@^5.0.0, glob-parent@^5.1.1, glob-parent@~5.1.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
+ integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+ dependencies:
+ is-glob "^4.0.1"
-glob-parent@^5.0.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0:
+glob-parent@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
@@ -3643,7 +3881,7 @@ globals@^13.6.0, globals@^13.9.0:
dependencies:
type-fest "^0.20.2"
-globby@^11.0.1, globby@^11.0.2:
+globby@^11.0.1, globby@^11.0.3:
version "11.0.4"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==
@@ -3667,10 +3905,10 @@ gonzales-pe@^4.3.0:
dependencies:
minimist "^1.2.5"
-got@11.8.1:
- version "11.8.1"
- resolved "https://registry.yarnpkg.com/got/-/got-11.8.1.tgz#df04adfaf2e782babb3daabc79139feec2f7e85d"
- integrity sha512-9aYdZL+6nHmvJwHALLwKSUZ0hMwGaJGYv3hoPLPgnT8BoBXm1SjnZeky+91tfwJaDzun2s4RsBRy48IEYv2q2Q==
+got@11.8.2:
+ version "11.8.2"
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.2.tgz#7abb3959ea28c31f3576f1576c1effce23f33599"
+ integrity sha512-D0QywKgIe30ODs+fm8wMZiAcZjypcCodPNuMz5H9Mny7RJ+IjJ10BdmGW7OM7fHXP+O7r6ZwapQ/YQmMSvB0UQ==
dependencies:
"@sindresorhus/is" "^4.0.0"
"@szmarczak/http-timer" "^4.0.5"
@@ -3823,10 +4061,10 @@ hsla-regex@^1.0.0:
resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg=
-html-entities@^1.2.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc"
- integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==
+html-entities@^2.1.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488"
+ integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==
html-escaper@^2.0.0:
version "2.0.2"
@@ -3929,18 +4167,18 @@ human-signals@^2.1.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
-husky@4.3.5:
- version "4.3.5"
- resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.5.tgz#ab8d2a0eb6b62fef2853ee3d442c927d89290902"
- integrity sha512-E5S/1HMoDDaqsH8kDF5zeKEQbYqe3wL9zJDyqyYqc8I4vHBtAoxkDBGXox0lZ9RI+k5GyB728vZdmnM4bYap+g==
+husky@4.3.8:
+ version "4.3.8"
+ resolved "https://registry.yarnpkg.com/husky/-/husky-4.3.8.tgz#31144060be963fd6850e5cc8f019a1dfe194296d"
+ integrity sha512-LCqqsB0PzJQ/AlCgfrfzRe3e3+NvmefAdKQhRYpxS4u6clblBoDdzzvHi8fmxKRzvMxPY/1WZWzomPZww0Anow==
dependencies:
chalk "^4.0.0"
ci-info "^2.0.0"
compare-versions "^3.6.0"
cosmiconfig "^7.0.0"
- find-versions "^3.2.0"
+ find-versions "^4.0.0"
opencollective-postinstall "^2.0.2"
- pkg-dir "^4.2.0"
+ pkg-dir "^5.0.0"
please-upgrade-node "^3.2.0"
slash "^3.0.0"
which-pm-runs "^1.0.0"
@@ -3964,7 +4202,7 @@ icss-utils@^5.0.0, icss-utils@^5.1.0:
resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
-ieee754@^1.1.13, ieee754@^1.2.1:
+ieee754@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
@@ -4038,7 +4276,7 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.3, inherits@~2.0.4:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3, inherits@~2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -4611,10 +4849,10 @@ klona@^2.0.4:
resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
-known-css-properties@^0.20.0:
- version "0.20.0"
- resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.20.0.tgz#0570831661b47dd835293218381166090ff60e96"
- integrity sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==
+known-css-properties@^0.21.0:
+ version "0.21.0"
+ resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.21.0.tgz#15fbd0bbb83447f3ce09d8af247ed47c68ede80d"
+ integrity sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==
ldap-filter@^0.3.3:
version "0.3.3"
@@ -4623,10 +4861,10 @@ ldap-filter@^0.3.3:
dependencies:
assert-plus "^1.0.0"
-ldapjs@2.2.3:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/ldapjs/-/ldapjs-2.2.3.tgz#7ae42c601911c2809f126355a2595ee1d1e21edf"
- integrity sha512-143MayI+cSo1PEngge0HMVj3Fb0TneX4Qp9yl9bKs45qND3G64B75GMSxtZCfNuVsvg833aOp1UWG8peFu1LrQ==
+ldapjs@2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/ldapjs/-/ldapjs-2.3.1.tgz#04136815fb1f21d692ac87fab5961a04d86e8b04"
+ integrity sha512-kf0tHHLrpwKaBAQOhYHXgdeh2PkFuCCxWgLb1MRn67ZQVo787D2pij3mmHVZx193GIdM8xcfi8HF6AIYYnj0fQ==
dependencies:
abstract-logging "^2.0.0"
asn1 "^0.2.4"
@@ -4650,10 +4888,10 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
-linkify-it@3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8"
- integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==
+linkify-it@3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e"
+ integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==
dependencies:
uc.micro "^1.0.1"
@@ -4767,7 +5005,7 @@ lodash.uniq@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=
-lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21:
+lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.21:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -4779,7 +5017,7 @@ log-symbols@4.0.0:
dependencies:
chalk "^4.0.0"
-log-symbols@^4.0.0:
+log-symbols@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503"
integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==
@@ -4962,7 +5200,7 @@ micromark@~2.11.0:
debug "^4.0.0"
parse-entities "^2.0.0"
-micromatch@^4.0.2, micromatch@^4.0.4:
+micromatch@^4.0.4:
version "4.0.4"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
@@ -4975,22 +5213,22 @@ middleware-handler@^0.2.0:
resolved "https://registry.yarnpkg.com/middleware-handler/-/middleware-handler-0.2.0.tgz#bf02af7e6b577c0230609b2ae58df0e446f3fd02"
integrity sha1-vwKvfmtXfAIwYJsq5Y3w5Ebz/QI=
-mime-db@1.45.0:
- version "1.45.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea"
- integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==
-
mime-db@1.48.0:
version "1.48.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d"
integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ==
-mime-types@2.1.28:
- version "2.1.28"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd"
- integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==
+mime-db@1.50.0:
+ version "1.50.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.50.0.tgz#abd4ac94e98d3c0e185016c67ab45d5fde40c11f"
+ integrity sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==
+
+mime-types@2.1.33:
+ version "2.1.33"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.33.tgz#1fa12a904472fafd068e48d9e8401f74d3f70edb"
+ integrity sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==
dependencies:
- mime-db "1.45.0"
+ mime-db "1.50.0"
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.28, mime-types@~2.1.19, mime-types@~2.1.24:
version "2.1.31"
@@ -5019,11 +5257,6 @@ mimic-response@^1.0.0, mimic-response@^1.0.1:
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
-mimic-response@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43"
- integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
-
mimic-response@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
@@ -5064,7 +5297,7 @@ minimist-options@4.1.0:
is-plain-obj "^1.1.0"
kind-of "^6.0.3"
-minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5:
+minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -5084,11 +5317,6 @@ minizlib@^1.2.1:
dependencies:
minipass "^2.9.0"
-mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
- version "0.5.3"
- resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
- integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
-
"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
@@ -5183,11 +5411,6 @@ nanoid@^3.1.22, nanoid@^3.1.23:
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81"
integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==
-napi-build-utils@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
- integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==
-
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -5228,17 +5451,10 @@ nise@^4.0.4:
just-extend "^4.0.2"
path-to-regexp "^1.7.0"
-node-abi@^2.21.0:
- version "2.30.0"
- resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.30.0.tgz#8be53bf3e7945a34eea10e0fc9a5982776cf550b"
- integrity sha512-g6bZh3YCKQRdwuO/tSZZYJAw622SjsRfJ2X0Iy4sSOHZ34/sPPdVBn8fev2tj7njzLwuqPw9uMtGsGkO5kIQvg==
- dependencies:
- semver "^5.4.1"
-
-node-addon-api@^3.0.0, node-addon-api@^3.1.0:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
- integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
+node-addon-api@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239"
+ integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==
node-forge@0.10.0:
version "0.10.0"
@@ -5291,6 +5507,11 @@ node-releases@^1.1.71:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.73.tgz#dd4e81ddd5277ff846b80b52bb40c49edf7a7b20"
integrity sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==
+node-releases@^1.1.75:
+ version "1.1.75"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.75.tgz#6dd8c876b9897a1b8e5a02de26afa79bb54ebbfe"
+ integrity sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==
+
"nopt@2 || 3":
version "3.0.6"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
@@ -5411,7 +5632,7 @@ npm-run-path@^4.0.0, npm-run-path@^4.0.1:
dependencies:
path-key "^3.0.0"
-"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.1, npmlog@^4.0.2:
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -5834,6 +6055,13 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0:
dependencies:
find-up "^4.0.0"
+pkg-dir@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760"
+ integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==
+ dependencies:
+ find-up "^5.0.0"
+
please-upgrade-node@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942"
@@ -6037,10 +6265,10 @@ postcss-image-set-function@^3.0.1:
postcss "^7.0.2"
postcss-values-parser "^2.0.0"
-postcss-import@14.0.0:
- version "14.0.0"
- resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.0.tgz#3ed1dadac5a16650bde3f4cdea6633b9c3c78296"
- integrity sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg==
+postcss-import@14.0.2:
+ version "14.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-14.0.2.tgz#60eff77e6be92e7b67fe469ec797d9424cae1aa1"
+ integrity sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==
dependencies:
postcss-value-parser "^4.0.0"
read-cache "^1.0.0"
@@ -6445,7 +6673,7 @@ postcss-selector-parser@^5.0.0-rc.3, postcss-selector-parser@^5.0.0-rc.4:
indexes-of "^1.0.1"
uniq "^1.0.1"
-postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4:
+postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5:
version "6.0.6"
resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz#2c5bba8174ac2f6981ab631a42ab0ee54af332ea"
integrity sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==
@@ -6522,25 +6750,6 @@ postcss@^8.2.6:
nanoid "^3.1.23"
source-map-js "^0.6.2"
-prebuild-install@^6.0.1:
- version "6.1.3"
- resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.1.3.tgz#8ea1f9d7386a0b30f7ef20247e36f8b2b82825a2"
- integrity sha512-iqqSR84tNYQUQHRXalSKdIaM8Ov1QxOVuBNWI7+BzZWv6Ih9k75wOnH1rGQ9WWTaaLkTpxWKIciOF0KyfM74+Q==
- dependencies:
- detect-libc "^1.0.3"
- expand-template "^2.0.3"
- github-from-package "0.0.0"
- minimist "^1.2.3"
- mkdirp-classic "^0.5.3"
- napi-build-utils "^1.0.1"
- node-abi "^2.21.0"
- npmlog "^4.0.1"
- pump "^3.0.0"
- rc "^1.2.7"
- simple-get "^3.0.3"
- tar-fs "^2.0.0"
- tunnel-agent "^0.6.0"
-
precond@0.2:
version "0.2.3"
resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
@@ -6566,10 +6775,10 @@ prettier@^1.18.2:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==
-pretty-quick@3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.0.tgz#cb172e9086deb57455dea7c7e8f136cd0a4aef6c"
- integrity sha512-DtxIxksaUWCgPFN7E1ZZk4+Aav3CCuRdhrDSFZENb404sYMtuo9Zka823F+Mgeyt8Zt3bUiCjFzzWYE9LYqkmQ==
+pretty-quick@3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/pretty-quick/-/pretty-quick-3.1.1.tgz#93ca4e2dd38cc4e970e3f54a0ead317a25454688"
+ integrity sha512-ZYLGiMoV2jcaas3vTJrLvKAYsxDoXQBUn8OSTxkl67Fyov9lyXivJTl0+2WVh+y6EovGcw7Lm5ThYpH+Sh3XxQ==
dependencies:
chalk "^3.0.0"
execa "^4.0.0"
@@ -6782,7 +6991,7 @@ readable-stream@^2.0.6:
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
-readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0:
+readable-stream@^3.1.1, readable-stream@^3.5.0, readable-stream@^3.6.0:
version "3.6.0"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
@@ -7092,12 +7301,12 @@ semver-compare@^1.0.0:
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
-semver-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
- integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
+semver-regex@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-3.1.2.tgz#34b4c0d361eef262e07199dbef316d0f2ab11807"
+ integrity sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==
-"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0:
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -7107,10 +7316,10 @@ semver@7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
-semver@7.3.4:
- version "7.3.4"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97"
- integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==
+semver@7.3.5, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4:
+ version "7.3.5"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+ integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
dependencies:
lru-cache "^6.0.0"
@@ -7119,13 +7328,6 @@ semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
- version "7.3.5"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
- integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
- dependencies:
- lru-cache "^6.0.0"
-
semver@~5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@@ -7198,20 +7400,6 @@ shallow-clone@^3.0.0:
dependencies:
kind-of "^6.0.2"
-sharp@0.28.0:
- version "0.28.0"
- resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.28.0.tgz#93297cec530b3709e11677cf41565d9a654075a0"
- integrity sha512-kGTaWLNMCkLYxkH2Pv7s+5LQBnWQ4mRKXs1XD19AWOxShWvU8b78qaWqTR/4ryNcPORO+qBoBnFF/Lzda5HgkQ==
- dependencies:
- color "^3.1.3"
- detect-libc "^1.0.3"
- node-addon-api "^3.1.0"
- prebuild-install "^6.0.1"
- semver "^7.3.5"
- simple-get "^3.1.0"
- tar-fs "^2.1.1"
- tunnel-agent "^0.6.0"
-
shebang-command@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
@@ -7251,20 +7439,6 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
-simple-concat@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
- integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
-
-simple-get@^3.0.3, simple-get@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
- integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
- dependencies:
- decompress-response "^4.2.0"
- once "^1.3.1"
- simple-concat "^1.0.0"
-
simple-swizzle@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
@@ -7308,10 +7482,10 @@ socket.io-adapter@~2.1.0:
resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz#edc5dc36602f2985918d631c1399215e97a1b527"
integrity sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==
-socket.io-client@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-3.1.1.tgz#43dfc3feddbb675b274a724f685d6b6af319b3e3"
- integrity sha512-BLgIuCjI7Sf3mDHunKddX9zKR/pbkP7IACM3sJS3jha+zJ6/pGKRV6Fz5XSBHCfUs9YzT8kYIqNwOOuFNLtnYA==
+socket.io-client@3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-3.1.3.tgz#57ddcefea58cfab71f0e94c21124de8e3c5aa3e2"
+ integrity sha512-4sIGOGOmCg3AOgGi7EEr6ZkTZRkrXwub70bBB/F0JSkMOUFpA77WsL87o34DffQQ31PkbMUIadGOk+3tx1KGbw==
dependencies:
"@types/component-emitter" "^1.2.10"
backo2 "~1.0.2"
@@ -7353,10 +7527,9 @@ socks@^2.6.1:
ip "^1.1.5"
smart-buffer "^4.1.0"
-sortablejs@1.10.2:
- version "1.10.2"
- resolved "https://registry.yarnpkg.com/sortablejs/-/sortablejs-1.10.2.tgz#6e40364d913f98b85a14f6678f92b5c1221f5290"
- integrity sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A==
+sortablejs@1.10.2, "sortablejs@git+https://github.com/itsjohncs/Sortable.git":
+ version "1.14.0"
+ resolved "git+https://github.com/itsjohncs/Sortable.git#21053e18ea6501e2aac8cac9029872115ab82844"
source-list-map@^2.0.0, source-list-map@^2.0.1:
version "2.0.1"
@@ -7518,7 +7691,7 @@ string-width@^3.0.0, string-width@^3.1.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
-string-width@^4.1.0, string-width@^4.2.0:
+string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2:
version "4.2.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
@@ -7668,36 +7841,36 @@ stylelint-config-standard@20.0.0:
dependencies:
stylelint-config-recommended "^3.0.0"
-stylelint@13.9.0:
- version "13.9.0"
- resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.9.0.tgz#93921ee6e11d4556b9f31131f485dc813b68e32a"
- integrity sha512-VVWH2oixOAxpWL1vH+V42ReCzBjW2AeqskSAbi8+3OjV1Xg3VZkmTcAqBZfRRvJeF4BvYuDLXebW3tIHxgZDEg==
+stylelint@13.13.1:
+ version "13.13.1"
+ resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-13.13.1.tgz#fca9c9f5de7990ab26a00f167b8978f083a18f3c"
+ integrity sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==
dependencies:
"@stylelint/postcss-css-in-js" "^0.37.2"
"@stylelint/postcss-markdown" "^0.36.2"
autoprefixer "^9.8.6"
- balanced-match "^1.0.0"
- chalk "^4.1.0"
+ balanced-match "^2.0.0"
+ chalk "^4.1.1"
cosmiconfig "^7.0.0"
debug "^4.3.1"
execall "^2.0.0"
fast-glob "^3.2.5"
fastest-levenshtein "^1.0.12"
- file-entry-cache "^6.0.0"
+ file-entry-cache "^6.0.1"
get-stdin "^8.0.0"
global-modules "^2.0.0"
- globby "^11.0.2"
+ globby "^11.0.3"
globjoin "^0.1.4"
html-tags "^3.1.0"
ignore "^5.1.8"
import-lazy "^4.0.0"
imurmurhash "^0.1.4"
- known-css-properties "^0.20.0"
- lodash "^4.17.20"
- log-symbols "^4.0.0"
+ known-css-properties "^0.21.0"
+ lodash "^4.17.21"
+ log-symbols "^4.1.0"
mathml-tag-names "^2.1.3"
meow "^9.0.0"
- micromatch "^4.0.2"
+ micromatch "^4.0.4"
normalize-selector "^0.2.0"
postcss "^7.0.35"
postcss-html "^0.36.0"
@@ -7707,19 +7880,19 @@ stylelint@13.9.0:
postcss-safe-parser "^4.0.2"
postcss-sass "^0.4.4"
postcss-scss "^2.1.1"
- postcss-selector-parser "^6.0.4"
+ postcss-selector-parser "^6.0.5"
postcss-syntax "^0.36.2"
postcss-value-parser "^4.1.0"
resolve-from "^5.0.0"
slash "^3.0.0"
specificity "^0.4.1"
- string-width "^4.2.0"
+ string-width "^4.2.2"
strip-ansi "^6.0.0"
style-search "^0.1.0"
sugarss "^2.0.0"
svg-tags "^1.0.0"
- table "^6.0.7"
- v8-compile-cache "^2.2.0"
+ table "^6.6.0"
+ v8-compile-cache "^2.3.0"
write-file-atomic "^3.0.3"
sugarss@^2.0.0:
@@ -7786,7 +7959,7 @@ svgo@^1.0.0:
unquote "~1.1.1"
util.promisify "~1.0.0"
-table@^6.0.4, table@^6.0.7:
+table@^6.0.4, table@^6.6.0:
version "6.7.1"
resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2"
integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==
@@ -7803,27 +7976,6 @@ tapable@^2.1.1, tapable@^2.2.0:
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b"
integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==
-tar-fs@^2.0.0, tar-fs@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
- integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
- dependencies:
- chownr "^1.1.1"
- mkdirp-classic "^0.5.2"
- pump "^3.0.0"
- tar-stream "^2.1.4"
-
-tar-stream@^2.1.4:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
- integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
- dependencies:
- bl "^4.0.3"
- end-of-stream "^1.4.1"
- fs-constants "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^3.1.1"
-
tar@^2.0.0:
version "2.2.2"
resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.2.tgz#0ca8848562c7299b8b446ff6a4d60cdbb23edc40"
@@ -8024,10 +8176,10 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
-ua-parser-js@0.7.24:
- version "0.7.24"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.24.tgz#8d3ecea46ed4f1f1d63ec25f17d8568105dc027c"
- integrity sha512-yo+miGzQx5gakzVK3QFfN0/L9uVhosXBBO7qmnk7c2iw1IhL212wfA3zbnI54B0obGwC/5NWub/iT9sReMx+Fw==
+ua-parser-js@0.7.30:
+ version "0.7.30"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.30.tgz#4cf5170e8b55ac553fe8b38df3a82f0669671f0b"
+ integrity sha512-uXEtSresNUlXQ1QL4/3dQORcGv7+J2ookOG2ybA/ga9+HYEXueT2o+8dUJQkpedsyTyCJ6jCCirRcKtdtx1kbg==
uc.micro@^1.0.1:
version "1.0.6"
@@ -8189,7 +8341,7 @@ uuid@^3.3.2, uuid@^3.3.3:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
-v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0:
+v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0, v8-compile-cache@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
@@ -8339,10 +8491,10 @@ watchpack@^2.0.0:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
-web-push@3.4.4:
- version "3.4.4"
- resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.4.4.tgz#b11523ada0f4b8c2481f65d1d059acd45ba27ca0"
- integrity sha512-tB0F+ccobsfw5jTWBinWJKyd/YdCdRbKj+CFSnsJeEgFYysOULvWFYyeCxn9KuQvG/3UF1t3cTAcJzBec5LCWA==
+web-push@3.4.5:
+ version "3.4.5"
+ resolved "https://registry.yarnpkg.com/web-push/-/web-push-3.4.5.tgz#f94074ff150538872c7183e4d8881c8305920cf1"
+ integrity sha512-2njbTqZ6Q7ZqqK14YpK1GGmaZs3NmuGYF5b7abCXulUIWFSlSYcZ3NBJQRFcMiQDceD7vQknb8FUuvI1F7Qe/g==
dependencies:
asn1.js "^5.3.0"
http_ece "1.1.0"
@@ -8383,15 +8535,15 @@ webpack-dev-middleware@4.1.0:
range-parser "^1.2.1"
schema-utils "^3.0.0"
-webpack-hot-middleware@2.25.0:
- version "2.25.0"
- resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.0.tgz#4528a0a63ec37f8f8ef565cf9e534d57d09fe706"
- integrity sha512-xs5dPOrGPCzuRXNi8F6rwhawWvQQkeli5Ro48PRuQh8pYPCPmNnltP9itiUPT4xI8oW+y0m59lyyeQk54s5VgA==
+webpack-hot-middleware@2.25.1:
+ version "2.25.1"
+ resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.25.1.tgz#581f59edf0781743f4ca4c200fd32c9266c6cf7c"
+ integrity sha512-Koh0KyU/RPYwel/khxbsDz9ibDivmUbrRuKSSQvW42KSDdO4w23WI3SkHpSUKHE76LrFnnM/L7JCrpBwu8AXYw==
dependencies:
- ansi-html "0.0.7"
- html-entities "^1.2.0"
+ ansi-html-community "0.0.8"
+ html-entities "^2.1.0"
querystring "^0.2.0"
- strip-ansi "^3.0.0"
+ strip-ansi "^6.0.0"
webpack-merge@^5.7.3:
version "5.8.0"