diff --git a/assets/chat/css/style.scss b/assets/chat/css/style.scss index f1d218a7..fca431c7 100644 --- a/assets/chat/css/style.scss +++ b/assets/chat/css/style.scss @@ -535,23 +535,11 @@ hr { } } -/* Broadcasts */ -.msg-broadcast { - background-color: $color-chat-emphasize; - color: $color-text-broadcast !important; - font-size: 1.1em; - font-weight: 400; - padding-top: $gutter-md; - padding-bottom: $gutter-md; - time { - margin-right: $gutter-md; - } -} - .msg-donation, .msg-subscription, .msg-giftsub, -.msg-massgift { +.msg-massgift, +.msg-broadcast { text-shadow: 1px 1px 3px rgba(0, 0, 0, 1); font-size: 1.1em; font-weight: 400; @@ -614,6 +602,18 @@ hr { } } +/* Broadcasts */ +.msg-broadcast { + border-color: $color-text-broadcast; + + .broadcast-icon { + background: transparent url('../img/icon-broadcast.png') no-repeat center + center; + background-size: contain; + filter: invert(100%); + } +} + /* Donations */ .msg-donation { .donation-icon { diff --git a/assets/chat/img/icon-broadcast.png b/assets/chat/img/icon-broadcast.png new file mode 100644 index 00000000..1ab16b82 Binary files /dev/null and b/assets/chat/img/icon-broadcast.png differ diff --git a/assets/chat/js/chat.js b/assets/chat/js/chat.js index dc855cdd..c73c1dd1 100644 --- a/assets/chat/js/chat.js +++ b/assets/chat/js/chat.js @@ -740,6 +740,7 @@ class Chat { MessageTypes.GIFTSUB, MessageTypes.MASSGIFT, MessageTypes.DONATION, + MessageTypes.BROADCAST, MessageTypes.DEATH, ].includes(message.type) ) { @@ -748,25 +749,21 @@ class Chat { message.message.substring(0, 4).toLowerCase() === '/me ' || message.type === MessageTypes.DEATH; // check if this is the current users message - message.isown = message.user.username === this.user.username; + message.isown = message.user?.username === this.user.username; // get mentions from message message.mentioned = Chat.extractNicks(message.message).filter((a) => this.users.has(a.toLowerCase()), ); // set tagged state - message.tag = this.taggednicks.get(message.user.username); + message.tag = this.taggednicks.get(message.user?.username); // set tagged note - message.title = this.taggednotes.get(message.user.username) || ''; + message.title = this.taggednotes.get(message.user?.username) || ''; } // Populate highlight for this $message if (message.type === MessageTypes.USER) { // check if the last message was from the same user - message.continued = - win.lastmessage && - !win.lastmessage.target && - win.lastmessage.user && - win.lastmessage.user.username === message.user.username; + message.continued = win.isContinued(message); // set highlighted state message.highlighted = this.shouldHighlightMessage(message); } @@ -1080,30 +1077,32 @@ class Chat { const textonly = Chat.removeSlashCmdFromText(data.data); const usr = this.users.get(data.nick.toLowerCase()); const win = this.mainwindow; - if ( - win.lastmessage !== null && + const isCombo = this.emoteService.canUserUseEmote(usr, textonly) && - Chat.removeSlashCmdFromText(win.lastmessage.message) === textonly - ) { - if (win.lastmessage.type === MessageTypes.EMOTE) { - win.lastmessage.incEmoteCount(); + Chat.removeSlashCmdFromText(win.lastmessage?.message) === textonly; - if (this.user.equalWatching(usr.watching)) { - win.lastmessage.ui.classList.toggle('watching-same', true); - } + if (isCombo && win.lastmessage?.type === MessageTypes.EMOTE) { + win.lastmessage.incEmoteCount(); - this.mainwindow.update(); - } else { - win.removeLastMessage(); - const msg = MessageBuilder.emote(textonly, data.timestamp, 2).into( - this, - ); + if (this.user.equalWatching(usr.watching)) { + win.lastmessage.ui.classList.toggle('watching-same', true); + } - if (this.user.equalWatching(usr.watching)) { - msg.ui.classList.add('watching-same'); - } + this.mainwindow.update(); + return; + } + + if (isCombo && win.lastmessage?.type === MessageTypes.USER) { + win.removeLastMessage(); + const msg = MessageBuilder.emote(textonly, data.timestamp, 2).into(this); + + if (this.user.equalWatching(usr.watching)) { + msg.ui.classList.add('watching-same'); } - } else if (!this.resolveMessage(data.nick, data.data)) { + return; + } + + if (!this.resolveMessage(data.nick, data.data)) { MessageBuilder.message(data.data, usr, data.timestamp).into(this); } } @@ -1263,12 +1262,22 @@ class Chat { if (!this.backlogloading) { const retryMilli = Math.floor(Math.random() * 30000) + 4000; setTimeout(() => window.location.reload(true), retryMilli); + MessageBuilder.broadcast( - `Restart incoming in ${Math.round(retryMilli / 1000)} seconds ...`, + `Restart incoming in ${Math.round(retryMilli / 1000)} seconds...`, + new ChatUser({ + nick: 'System', + id: -1, + }), + data.timestamp, ).into(this); } } else { - MessageBuilder.broadcast(data.data, data.timestamp).into(this); + MessageBuilder.broadcast( + data.data, + new ChatUser(data.user), + data.timestamp, + ).into(this); } } @@ -2360,7 +2369,7 @@ class Chat { } static removeSlashCmdFromText(msg) { - return msg.replace(regexslashcmd, '').trim(); + return msg?.replace(regexslashcmd, '').trim(); } static extractNicks(text) { diff --git a/assets/chat/js/focus.js b/assets/chat/js/focus.js index dd8d4f81..f00997c9 100644 --- a/assets/chat/js/focus.js +++ b/assets/chat/js/focus.js @@ -48,6 +48,7 @@ class ChatUserFocus { } else if (this.chat.settings.get('focusmentioned')) { rule = ` .msg-death[data-username="${value}"], .msg-death[data-mentioned~="${value}"], + .msg-broadcast[data-username="${value}"], .msg-broadcast[data-mentioned~="${value}"], .msg-subscription[data-username="${value}"], .msg-subscription[data-mentioned~="${value}"], .msg-giftsub[data-username="${value}"], .msg-giftsub[data-mentioned~="${value}"], .msg-giftsub[data-giftee="${value}"], .msg-massgift[data-username="${value}"], .msg-massgift[data-mentioned~="${value}"], @@ -60,6 +61,7 @@ class ChatUserFocus { } else { rule = ` .msg-death[data-username="${value}"], + .msg-broadcast[data-username="${value}"], .msg-subscription[data-username="${value}"], .msg-giftsub[data-username="${value}"], .msg-giftsub[data-giftee="${value}"], .msg-massgift[data-username="${value}"], diff --git a/assets/chat/js/formatters/UrlFormatter.js b/assets/chat/js/formatters/UrlFormatter.js index 7b182d44..6a69e8c6 100644 --- a/assets/chat/js/formatters/UrlFormatter.js +++ b/assets/chat/js/formatters/UrlFormatter.js @@ -71,8 +71,7 @@ export default class UrlFormatter { const decodedUrl = self.elem.html(url).text(); const m = decodedUrl.match(self.linkregex); if (m) { - const encodedUrl = self.encodeUrl(m[0]); - const normalizedUrl = this.normalizeUrl(encodedUrl); + const normalizedUrl = self.encodeUrl(this.normalizeUrl(m[0])); let embedHashLink = ''; try { @@ -114,6 +113,14 @@ export default class UrlFormatter { return url.split('?')[0]; } + if (/youtu(?:be\.com|\.be)/i.test(url)) { + // Same as with xeets, remove the nasty share tracking query param + // from YouTube links. + const ytLink = new URL(url); + ytLink.searchParams.delete('si'); + return ytLink.href; + } + return url; } } diff --git a/assets/chat/js/formatters/UrlFormatter.test.js b/assets/chat/js/formatters/UrlFormatter.test.js index 1b9400ae..5dd9253b 100644 --- a/assets/chat/js/formatters/UrlFormatter.test.js +++ b/assets/chat/js/formatters/UrlFormatter.test.js @@ -21,7 +21,37 @@ describe('Normalizing URLs', () => { ); }); - test("Don't modify a URL that isn't Twitter or X", () => { + test('Remove the share tracking query param from a youtube.com link', () => { + expect( + urlFormatter.normalizeUrl( + 'https://www.youtube.com/live/2NjXXQYtUNY?si=5ALpT28ptRec6T7u&t=70', + ), + ).toBe('https://www.youtube.com/live/2NjXXQYtUNY?t=70'); + }); + + test('Remove the share tracking query param from a youtu.be link', () => { + expect( + urlFormatter.normalizeUrl( + 'https://youtu.be/SbPP1i6INPk?si=K0qpdHBGOIJ-gBMK&t=60', + ), + ).toBe('https://youtu.be/SbPP1i6INPk?t=60'); + }); + + test("Don't modify a youtube.com link that doesn't contain the share tracking query param", () => { + expect( + urlFormatter.normalizeUrl( + 'https://www.youtube.com/live/2NjXXQYtUNY?t=70', + ), + ).toBe('https://www.youtube.com/live/2NjXXQYtUNY?t=70'); + }); + + test("Don't modify a youtu.be link that doesn't contain the share tracking query param", () => { + expect(urlFormatter.normalizeUrl('https://youtu.be/SbPP1i6INPk?t=60')).toBe( + 'https://youtu.be/SbPP1i6INPk?t=60', + ); + }); + + test("Don't modify a URL that isn't Twitter, X or YouTube", () => { expect( urlFormatter.normalizeUrl('https://www.twitch.tv/search?term=vtuber'), ).toBe('https://www.twitch.tv/search?term=vtuber'); diff --git a/assets/chat/js/menus/ChatUserInfoMenu.js b/assets/chat/js/menus/ChatUserInfoMenu.js index 39fb8ec0..088f16d1 100644 --- a/assets/chat/js/menus/ChatUserInfoMenu.js +++ b/assets/chat/js/menus/ChatUserInfoMenu.js @@ -13,6 +13,10 @@ export default class ChatUserInfoMenu extends ChatMenuFloating { this.header = this.ui.find('.toolbar span'); + this.watchingSubheader = this.ui.find( + '.user-info h5.watching-subheader', + )[0]; + this.createdDateSubheader = this.ui.find('.user-info h5.date-subheader')[0]; this.tagSubheader = this.ui.find('.user-info h5.tag-subheader')[0]; @@ -237,6 +241,15 @@ export default class ChatUserInfoMenu extends ChatMenuFloating { const tagNote = this.chat.taggednotes.get(this.clickedNick); const usernameFeatures = selectedUser.classList.value; + const watchingEmbed = this.buildWatchingEmbed(this.clickedNick); + if (watchingEmbed !== '') { + this.watchingSubheader.style.display = ''; + this.watchingSubheader.replaceChildren('Watching: ', watchingEmbed); + } else { + this.watchingSubheader.style.display = 'none'; + this.watchingSubheader.replaceChildren(); + } + const formattedDate = this.buildCreatedDate(this.clickedNick); if (formattedDate) { this.createdDateSubheader.style.display = ''; @@ -292,6 +305,14 @@ export default class ChatUserInfoMenu extends ChatMenuFloating { this.redraw(); } + buildWatchingEmbed(nick) { + const user = this.chat.users.get(nick); + if (!user?.watching) { + return ''; + } + return `${user.watching.id} on ${user.watching.platform}`; + } + buildCreatedDate(nick) { const user = this.chat.users.get(nick.toLowerCase()); if (!user?.createdDate) { diff --git a/assets/chat/js/messages/ChatBroadcastMessage.js b/assets/chat/js/messages/ChatBroadcastMessage.js new file mode 100644 index 00000000..18577b57 --- /dev/null +++ b/assets/chat/js/messages/ChatBroadcastMessage.js @@ -0,0 +1,64 @@ +import { usernameColorFlair } from './ChatUserMessage'; +import ChatEventMessage from './ChatEventMessage'; +import MessageTypes from './MessageTypes'; + +export default class ChatBroadcastMessage extends ChatEventMessage { + constructor(message, user, timestamp = null) { + super(message, timestamp); + this.type = MessageTypes.BROADCAST; + this.user = user; + } + + buildUserTemplate(chat = null) { + if (this.user.isSystem()) { + return []; + } + + const colorFlair = usernameColorFlair(chat.flairs, this.user); + + /** @type HTMLAnchorElement */ + const user = document + .querySelector('#user-template') + ?.content.cloneNode(true).firstElementChild; + user.title = this.title; + user.classList.add(colorFlair?.name); + user.innerText = this.user.displayName; + + const ctrl = document.createElement('span'); + ctrl.classList.toggle('ctrl'); + + if (this.slashme) { + return [user, ctrl, ' ']; + } + + ctrl.innerText = ': '; + + return [user, ctrl]; + } + + html(chat = null) { + const eventTemplate = super.html(chat); + + const text = eventTemplate.querySelector('.event-bottom')?.innerHTML; + eventTemplate.querySelector('.event-bottom').remove(); + eventTemplate.querySelector('.event-info').innerHTML = text; + + const user = this.buildUserTemplate(chat); + + eventTemplate.querySelector('.event-icon').classList.add('broadcast-icon'); + eventTemplate.querySelector('.event-info').prepend(...user); + + const classes = Array.from(eventTemplate.classList); + const attributes = eventTemplate + .getAttributeNames() + .reduce((object, attributeName) => { + if (attributeName === 'class') return object; + return { + ...object, + [attributeName]: eventTemplate.getAttribute(attributeName), + }; + }, {}); + + return this.wrap(eventTemplate.innerHTML, classes, attributes); + } +} diff --git a/assets/chat/js/messages/ChatEventMessage.js b/assets/chat/js/messages/ChatEventMessage.js index 9936c719..06834cad 100644 --- a/assets/chat/js/messages/ChatEventMessage.js +++ b/assets/chat/js/messages/ChatEventMessage.js @@ -16,7 +16,7 @@ export default class ChatEventMessage extends ChatMessage { .querySelector('#event-template') ?.content.cloneNode(true).firstElementChild; - if (this.user && this.user.username) + if (this.user && this.user.username && !this.user.isSystem()) eventTemplate.dataset.username = this.user.username; if (this.mentioned && this.mentioned.length > 0) eventTemplate.dataset.mentioned = this.mentioned.join(' ').toLowerCase(); diff --git a/assets/chat/js/messages/ChatMessage.js b/assets/chat/js/messages/ChatMessage.js index e277b6ca..da62f3b0 100644 --- a/assets/chat/js/messages/ChatMessage.js +++ b/assets/chat/js/messages/ChatMessage.js @@ -154,4 +154,15 @@ export default class ChatMessage extends ChatUIMessage { user.equalWatching(this.watching), ); } + + /** + * @param {boolean} isContinued + */ + setContinued(isContinued) { + this.ui.classList.toggle('msg-continue', isContinued); + const ctrl = this.ui.querySelector('.ctrl'); + if (ctrl) ctrl.textContent = isContinued ? '' : ': '; + + this.continued = isContinued; + } } diff --git a/assets/chat/js/messages/MessageBuilder.js b/assets/chat/js/messages/MessageBuilder.js index fe74fe79..53739c20 100644 --- a/assets/chat/js/messages/MessageBuilder.js +++ b/assets/chat/js/messages/MessageBuilder.js @@ -9,6 +9,7 @@ import ChatDonationMessage from './ChatDonationMessage'; import ChatRegularSubscriptionMessage from './subscriptions/ChatRegularSubscriptionMessage'; import ChatGiftedSubscriptionMessage from './subscriptions/ChatGiftedSubscriptionMessage'; import ChatMassSubscriptionMessage from './subscriptions/ChatMassSubscriptionMessage'; +import ChatBroadcastMessage from './ChatBroadcastMessage'; import ChatDeathMessage from './ChatDeathMessage'; export default class MessageBuilder { @@ -28,8 +29,8 @@ export default class MessageBuilder { return new ChatMessage(message, timestamp, MessageTypes.INFO); } - static broadcast(message, timestamp = null) { - return new ChatMessage(message, timestamp, MessageTypes.BROADCAST); + static broadcast(message, user, timestamp = null) { + return new ChatBroadcastMessage(message, user, timestamp); } static command(message, timestamp = null) { diff --git a/assets/chat/js/messages/index.js b/assets/chat/js/messages/index.js index f20c76b8..e6dd08fb 100644 --- a/assets/chat/js/messages/index.js +++ b/assets/chat/js/messages/index.js @@ -12,4 +12,5 @@ export { default as PinnedMessage, checkIfPinWasDismissed, } from './PinnedMessage'; +export { default as ChatBroadcastMessage } from './ChatBroadcastMessage'; export { default as ChatDeathMessage } from './ChatDeathMessage'; diff --git a/assets/chat/js/messages/subscriptions/ChatGiftedSubscriptionMessage.js b/assets/chat/js/messages/subscriptions/ChatGiftedSubscriptionMessage.js index 07be0899..f3d662f5 100644 --- a/assets/chat/js/messages/subscriptions/ChatGiftedSubscriptionMessage.js +++ b/assets/chat/js/messages/subscriptions/ChatGiftedSubscriptionMessage.js @@ -22,7 +22,7 @@ export default class ChatGiftedSubscriptionMessage extends ChatSubscriptionMessa }; }, {}); - attributes['data-giftee'] = this.giftee.username.toLowerCase(); + attributes['data-giftee'] = this.giftee.username; message.querySelector('.subscription-icon').classList.add('gift'); @@ -33,7 +33,7 @@ export default class ChatGiftedSubscriptionMessage extends ChatSubscriptionMessa const gifteeColorFlair = usernameColorFlair(chat.flairs, this.giftee); giftee.classList.add(gifteeColorFlair?.name); - giftee.innerText = this.giftee.username; + giftee.innerText = this.giftee.displayName; const subscriptionInfo = message.querySelector('.event-info'); const user = message.querySelector('.user'); diff --git a/assets/chat/js/user.js b/assets/chat/js/user.js index fe6987b5..35039836 100644 --- a/assets/chat/js/user.js +++ b/assets/chat/js/user.js @@ -125,6 +125,10 @@ class ChatUser { this.watching?.id === embed?.id ); } + + isSystem() { + return this.id === -1; + } } export default ChatUser; diff --git a/assets/chat/js/window.js b/assets/chat/js/window.js index 4b1f7da9..4ce703e8 100644 --- a/assets/chat/js/window.js +++ b/assets/chat/js/window.js @@ -122,18 +122,21 @@ class ChatWindow extends EventEmitter { * this window. */ updateMessages(chat) { - for (const message of this.messages) { + for (const [i, message] of this.messages.entries()) { if (message.type !== MessageTypes.UI) { message.updateTimeFormat(); } - if (message.user) { + if (message.user && !message.user.isSystem()) { const { username } = message.user; message.setOwnMessage(username === chat.user.username); message.ignore(chat.ignored(username, message.message)); message.highlight(chat.shouldHighlightMessage(message)); - message.setTag(chat.taggednicks.get(username)); + if (message.type === MessageTypes.USER) { + message.setContinued(this.isContinued(message, this.messages[i - 1])); + message.setTag(chat.taggednicks.get(username)); + } message.setTagTitle(chat.taggednotes.get(username)); message.setWatching(chat.user); @@ -149,6 +152,21 @@ class ChatWindow extends EventEmitter { this.messages = this.messages.filter((m) => m !== this.lastmessage); } + /** + * @param {ChatMessage} message + * @param {ChatMessage} lastMessage + * @returns {boolean} + */ + isContinued(message, lastMessage = this.lastmessage) { + return ( + lastMessage && + !lastMessage.target && + lastMessage.user && + (!lastMessage.ignored || lastMessage.continued) && // messages should not appear as "continued" if the previous message is ignored and was the start of the thread + lastMessage.user.username === message.user.username + ); + } + cleanupThrottle = throttle(50, this.cleanup); } diff --git a/assets/views/embed.html b/assets/views/embed.html index 20f96e01..9665edd7 100644 --- a/assets/views/embed.html +++ b/assets/views/embed.html @@ -255,6 +255,7 @@
Users
User Info
+
Watching:
Flairs:
diff --git a/package-lock.json b/package-lock.json index 65db9c13..141bbc67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,12 +90,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -112,22 +112,22 @@ } }, "node_modules/@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", - "convert-source-map": "^1.7.0", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", @@ -141,13 +141,19 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -181,14 +187,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -436,9 +442,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -477,26 +483,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -505,9 +511,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1783,20 +1789,20 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -1804,12 +1810,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -4233,9 +4239,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "funding": [ { "type": "opencollective", @@ -4251,9 +4257,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -4341,9 +4347,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", + "version": "1.0.30001568", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", + "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==", "funding": [ { "type": "opencollective", @@ -5456,9 +5462,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.582", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.582.tgz", - "integrity": "sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA==" + "version": "1.4.610", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz", + "integrity": "sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg==" }, "node_modules/emittery": { "version": "0.13.1", @@ -5747,9 +5753,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -9897,9 +9903,9 @@ "dev": true }, "node_modules/jquery": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", - "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==" + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -10946,9 +10952,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -11645,9 +11651,9 @@ } }, "node_modules/prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -13781,9 +13787,9 @@ } }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", @@ -14347,12 +14353,12 @@ } }, "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "requires": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" } }, @@ -14363,35 +14369,43 @@ "dev": true }, "@babel/core": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz", - "integrity": "sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", - "convert-source-map": "^1.7.0", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" + }, + "dependencies": { + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + } } }, "@babel/generator": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", - "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "requires": { - "@babel/types": "^7.22.15", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -14416,14 +14430,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -14607,9 +14621,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true }, "@babel/helper-validator-identifier": { @@ -14636,31 +14650,31 @@ } }, "@babel/helpers": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", - "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", "dev": true, "requires": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" } }, "@babel/highlight": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", - "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz", - "integrity": "sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -15518,30 +15532,30 @@ } }, "@babel/traverse": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz", - "integrity": "sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15", - "debug": "^4.1.0", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.3.tgz", - "integrity": "sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" } @@ -17445,13 +17459,13 @@ } }, "browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "requires": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" } }, @@ -17517,9 +17531,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==" + "version": "1.0.30001568", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001568.tgz", + "integrity": "sha512-vSUkH84HontZJ88MiNrOau1EBrCqEQYgkC5gIySiDlpsm8sGVrhU7Kx4V6h0tnqaHzIHZv08HlJIwPbL4XL9+A==" }, "caseless": { "version": "0.12.0", @@ -18350,9 +18364,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.582", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.582.tgz", - "integrity": "sha512-89o0MGoocwYbzqUUjc+VNpeOFSOK9nIdC5wY4N+PVUarUK0MtjyTjks75AZS2bW4Kl8MdewdFsWaH0jLy+JNoA==" + "version": "1.4.610", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.610.tgz", + "integrity": "sha512-mqi2oL1mfeHYtOdCxbPQYV/PL7YrQlxbvFEZ0Ee8GbDdShimqt2/S6z2RWqysuvlwdOrQdqvE0KZrBTipAeJzg==" }, "emittery": { "version": "0.13.1", @@ -18762,9 +18776,9 @@ } }, "eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, "requires": {} }, @@ -21600,9 +21614,9 @@ "dev": true }, "jquery": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.0.tgz", - "integrity": "sha512-umpJ0/k8X0MvD1ds0P9SfowREz2LenHsQaxSohMZ5OMNEU2r0tf8pdeEFTHMFxWVxKNyU9rTtK3CWzUCTKJUeQ==" + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" }, "js-tokens": { "version": "4.0.0", @@ -22355,9 +22369,9 @@ "dev": true }, "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "normalize-path": { "version": "3.0.0", @@ -22857,9 +22871,9 @@ "dev": true }, "prettier": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.0.tgz", - "integrity": "sha512-TQLvXjq5IAibjh8EpBIkNKxO749UEWABoiIZehEPiY4GNpVdhaFKqSTu+QrlU6D2dPAfubRmtJTi4K4YkQ5eXw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", "dev": true }, "pretty-error": { @@ -24461,9 +24475,9 @@ "dev": true }, "webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0",