diff --git a/client/src/config/globals.js b/client/src/config/globals.js index fba64bc..ebca36d 100644 --- a/client/src/config/globals.js +++ b/client/src/config/globals.js @@ -31,17 +31,6 @@ export const globals = { MESSAGES: { ENTER_NAME: 'Client must enter name.' }, - EVENTS: { - PLAYER_JOINED: 'playerJoined', - SYNC_GAME_STATE: 'syncGameState', - START_TIMER: 'startTimer', - KILL_PLAYER: 'killPlayer', - REVEAL_PLAYER: 'revealPlayer', - CHANGE_NAME: 'changeName', - START_GAME: 'startGame', - PLAYER_LEFT: 'playerLeft', - NEW_SPECTATOR: 'newSpectator' - }, SOCKET_EVENTS: { IN_GAME_MESSAGE: 'inGameMessage' }, @@ -55,7 +44,12 @@ export const globals = { REVEAL_PLAYER: 'revealPlayer', TRANSFER_MODERATOR: 'transferModerator', CHANGE_NAME: 'changeName', - END_GAME: 'endGame' + END_GAME: 'endGame', + PLAYER_JOINED: 'playerJoined', + SYNC_GAME_STATE: 'syncGameState', + START_TIMER: 'startTimer', + PLAYER_LEFT: 'playerLeft', + NEW_SPECTATOR: 'newSpectator' }, USER_TYPES: { MODERATOR: 'moderator', diff --git a/client/src/modules/HTMLFragments.js b/client/src/modules/front_end_components/HTMLFragments.js similarity index 99% rename from client/src/modules/HTMLFragments.js rename to client/src/modules/front_end_components/HTMLFragments.js index bc105d2..e8bba82 100644 --- a/client/src/modules/HTMLFragments.js +++ b/client/src/modules/front_end_components/HTMLFragments.js @@ -156,7 +156,7 @@ export const HTMLFragments = {
- +
`, GAME_PLAYER: `
diff --git a/client/src/modules/ModalManager.js b/client/src/modules/front_end_components/ModalManager.js similarity index 100% rename from client/src/modules/ModalManager.js rename to client/src/modules/front_end_components/ModalManager.js diff --git a/client/src/modules/Navbar.js b/client/src/modules/front_end_components/Navbar.js similarity index 97% rename from client/src/modules/Navbar.js rename to client/src/modules/front_end_components/Navbar.js index 1cd04f4..731cc18 100644 --- a/client/src/modules/Navbar.js +++ b/client/src/modules/front_end_components/Navbar.js @@ -38,7 +38,7 @@ function flipHamburger () { function getNavbarLinks (page = null, device) { const linkClass = device === 'mobile' ? 'mobile-link' : 'desktop-link'; return '' + 'Home' + 'Create' + diff --git a/client/src/modules/Toast.js b/client/src/modules/front_end_components/Toast.js similarity index 100% rename from client/src/modules/Toast.js rename to client/src/modules/front_end_components/Toast.js diff --git a/client/src/modules/DeckStateManager.js b/client/src/modules/game_creation/DeckStateManager.js similarity index 97% rename from client/src/modules/DeckStateManager.js rename to client/src/modules/game_creation/DeckStateManager.js index 5eed73b..da2a9d9 100644 --- a/client/src/modules/DeckStateManager.js +++ b/client/src/modules/game_creation/DeckStateManager.js @@ -1,7 +1,7 @@ -import { globals } from '../config/globals.js'; -import { HTMLFragments } from './HTMLFragments.js'; -import { toast } from './Toast.js'; -import { ModalManager } from './ModalManager.js'; +import { globals } from '../../config/globals.js'; +import { HTMLFragments } from '../front_end_components/HTMLFragments.js'; +import { toast } from '../front_end_components/Toast.js'; +import { ModalManager } from '../front_end_components/ModalManager.js'; export class DeckStateManager { constructor () { diff --git a/client/src/modules/GameCreationStepManager.js b/client/src/modules/game_creation/GameCreationStepManager.js similarity index 97% rename from client/src/modules/GameCreationStepManager.js rename to client/src/modules/game_creation/GameCreationStepManager.js index f40e39d..8aa88dc 100644 --- a/client/src/modules/GameCreationStepManager.js +++ b/client/src/modules/game_creation/GameCreationStepManager.js @@ -1,10 +1,10 @@ -import { Game } from '../model/Game.js'; -import { cancelCurrentToast, toast } from './Toast.js'; -import { ModalManager } from './ModalManager.js'; -import { XHRUtility } from './XHRUtility.js'; -import { globals } from '../config/globals.js'; -import { HTMLFragments } from './HTMLFragments.js'; -import { UserUtility } from './UserUtility.js'; +import { Game } from '../../model/Game.js'; +import { cancelCurrentToast, toast } from '../front_end_components/Toast.js'; +import { ModalManager } from '../front_end_components/ModalManager.js'; +import { XHRUtility } from '../utility/XHRUtility.js'; +import { globals } from '../../config/globals.js'; +import { HTMLFragments } from '../front_end_components/HTMLFragments.js'; +import { UserUtility } from '../utility/UserUtility.js'; import { RoleBox } from './RoleBox.js'; export class GameCreationStepManager { @@ -457,7 +457,7 @@ function showButtons (back, forward, forwardHandler, backHandler, builtGame = nu document.querySelector('#create-game')?.remove(); if (back) { const backButton = document.createElement('button'); - backButton.innerHTML = 'back'; + backButton.innerHTML = 'back'; backButton.addEventListener('click', backHandler); backButton.setAttribute('id', 'step-back-button'); backButton.classList.add('cancel'); @@ -467,7 +467,7 @@ function showButtons (back, forward, forwardHandler, backHandler, builtGame = nu if (forward && builtGame === null) { const fwdButton = document.createElement('button'); - fwdButton.innerHTML = 'next'; + fwdButton.innerHTML = 'next'; fwdButton.addEventListener('click', forwardHandler); fwdButton.setAttribute('id', 'step-forward-button'); fwdButton.classList.add('app-button'); diff --git a/client/src/modules/RoleBox.js b/client/src/modules/game_creation/RoleBox.js similarity index 97% rename from client/src/modules/RoleBox.js rename to client/src/modules/game_creation/RoleBox.js index d5bbe5a..b88e8af 100644 --- a/client/src/modules/RoleBox.js +++ b/client/src/modules/game_creation/RoleBox.js @@ -1,8 +1,8 @@ -import { HTMLFragments } from './HTMLFragments.js'; -import { globals } from '../config/globals.js'; -import { defaultRoles } from '../config/defaultRoles.js'; -import { toast } from './Toast.js'; -import { ModalManager } from './ModalManager.js'; +import { HTMLFragments } from '../front_end_components/HTMLFragments.js'; +import { globals } from '../../config/globals.js'; +import { defaultRoles } from '../../config/defaultRoles.js'; +import { toast } from '../front_end_components/Toast.js'; +import { ModalManager } from '../front_end_components/ModalManager.js'; export class RoleBox { constructor (container, deckManager) { diff --git a/client/src/modules/GameStateRenderer.js b/client/src/modules/game_state/GameStateRenderer.js similarity index 98% rename from client/src/modules/GameStateRenderer.js rename to client/src/modules/game_state/GameStateRenderer.js index 50e776a..49d28d6 100644 --- a/client/src/modules/GameStateRenderer.js +++ b/client/src/modules/game_state/GameStateRenderer.js @@ -1,11 +1,11 @@ -import { globals } from '../config/globals.js'; -import { toast } from './Toast.js'; -import { HTMLFragments } from './HTMLFragments.js'; -import { ModalManager } from './ModalManager.js'; -import { XHRUtility } from './XHRUtility.js'; -import { UserUtility } from './UserUtility.js'; +import { globals } from '../../config/globals.js'; +import { toast } from '../front_end_components/Toast.js'; +import { HTMLFragments } from '../front_end_components/HTMLFragments.js'; +import { ModalManager } from '../front_end_components/ModalManager.js'; +import { XHRUtility } from '../utility/XHRUtility.js'; +import { UserUtility } from '../utility/UserUtility.js'; // QRCode module via: https://github.com/soldair/node-qrcode -import { QRCode } from './third_party/qrcode.js'; +import { QRCode } from '../third_party/qrcode.js'; export class GameStateRenderer { constructor (stateBucket, socket) { diff --git a/client/src/modules/StateBucket.js b/client/src/modules/game_state/StateBucket.js similarity index 100% rename from client/src/modules/StateBucket.js rename to client/src/modules/game_state/StateBucket.js diff --git a/client/src/modules/page_handlers/createHandler.js b/client/src/modules/page_handlers/createHandler.js new file mode 100644 index 0000000..2447c9e --- /dev/null +++ b/client/src/modules/page_handlers/createHandler.js @@ -0,0 +1,8 @@ +import { injectNavbar } from '../front_end_components/Navbar.js'; +import createTemplate from '../../view_templates/CreateTemplate.js'; + +export const createHandler = (gameCreationStepManager) => { + injectNavbar(); + document.getElementById('game-creation-container').innerHTML = createTemplate; + gameCreationStepManager.renderStep('creation-step-container', 1); +}; diff --git a/client/src/modules/page_handlers/gameHandler.js b/client/src/modules/page_handlers/gameHandler.js new file mode 100644 index 0000000..69c71b9 --- /dev/null +++ b/client/src/modules/page_handlers/gameHandler.js @@ -0,0 +1,440 @@ +import { injectNavbar } from '../front_end_components/Navbar.js'; +import { stateBucket } from '../game_state/StateBucket.js'; +import { GameTimerManager } from '../timer/GameTimerManager.js'; +import { GameStateRenderer } from '../game_state/GameStateRenderer.js'; +import { UserUtility } from '../utility/UserUtility.js'; +import { toast } from '../front_end_components/Toast.js'; +import { globals } from '../../config/globals.js'; +import { HTMLFragments } from '../front_end_components/HTMLFragments.js'; +import { ModalManager } from '../front_end_components/ModalManager.js'; + +export const gameHandler = async (socket, XHRUtility, window, gameDOM) => { + document.body.innerHTML = gameDOM + document.body.innerHTML; + injectNavbar(); + + const response = await XHRUtility.xhr( + '/api/games/environment', + 'GET', + null, + null + ).catch((res) => { + toast(res.content, 'error', true); + }); + + stateBucket.environment = response.content; + const timerWorker = new Worker(new URL('../timer/Timer.js', import.meta.url)); + const gameTimerManager = new GameTimerManager(stateBucket, socket); + const gameStateRenderer = new GameStateRenderer(stateBucket, socket); + + socket.on('connect', function () { + syncWithGame( + stateBucket, + gameTimerManager, + gameStateRenderer, + timerWorker, + socket, + UserUtility.validateAnonUserSignature(response.content), + window + ); + }); + + socket.on('connect_error', (err) => { + toast(err, 'error', true, false); + }); + + socket.on('disconnect', () => { + toast('Disconnected. Attempting reconnect...', 'error', true, false); + }); + + setClientSocketHandlers(stateBucket, gameStateRenderer, socket, timerWorker, gameTimerManager); +}; + +function syncWithGame (stateBucket, gameTimerManager, gameStateRenderer, timerWorker, socket, cookie, window) { + const splitUrl = window.location.href.split('/game/'); + const accessCode = splitUrl[1]; + if (/^[a-zA-Z0-9]+$/.test(accessCode) && accessCode.length === globals.ACCESS_CODE_LENGTH) { + socket.emit(globals.SOCKET_EVENTS.IN_GAME_MESSAGE, globals.EVENT_IDS.FETCH_GAME_STATE, accessCode, { personId: cookie }, function (gameState) { + if (gameState === null) { + window.location = '/not-found?reason=' + encodeURIComponent('game-not-found'); + } else { + stateBucket.currentGameState = gameState; + document.querySelector('.spinner-container')?.remove(); + document.querySelector('.spinner-background')?.remove(); + document.getElementById('game-content').innerHTML = HTMLFragments.INITIAL_GAME_DOM; + toast('You are connected.', 'success', true, true, 'short'); + processGameState(stateBucket.currentGameState, cookie, socket, gameStateRenderer, gameTimerManager, timerWorker, true, true); + } + }); + } else { + window.location = '/not-found?reason=' + encodeURIComponent('invalid-access-code'); + } +} + +function processGameState ( + currentGameState, + userId, + socket, + gameStateRenderer, + gameTimerManager, + timerWorker, + refreshPrompt = true, + animateContainer = false +) { + const containerAnimation = document.getElementById('game-state-container').animate( + [ + { opacity: '0', transform: 'translateY(10px)' }, + { opacity: '1', transform: 'translateY(0px)' } + ], { + duration: 500, + easing: 'ease-in-out', + fill: 'both' + }); + if (animateContainer) { + containerAnimation.play(); + } + displayClientInfo(currentGameState.client.name, currentGameState.client.userType); + if (refreshPrompt) { + removeStartGameFunctionalityIfPresent(gameStateRenderer); + document.querySelector('#end-game-prompt')?.remove(); + } + switch (currentGameState.status) { + case globals.STATUS.LOBBY: + document.getElementById('game-state-container').innerHTML = HTMLFragments.LOBBY; + gameStateRenderer.renderLobbyHeader(); + gameStateRenderer.renderLobbyPlayers(); + if (( + currentGameState.client.userType === globals.USER_TYPES.MODERATOR + || currentGameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR + ) + && refreshPrompt + ) { + displayStartGamePromptForModerators(currentGameState, gameStateRenderer); + } + break; + case globals.STATUS.IN_PROGRESS: + gameStateRenderer.renderGameHeader(); + switch (currentGameState.client.userType) { + case globals.USER_TYPES.PLAYER: + document.getElementById('game-state-container').innerHTML = HTMLFragments.PLAYER_GAME_VIEW; + gameStateRenderer.renderPlayerView(); + break; + case globals.USER_TYPES.KILLED_PLAYER: + + document.getElementById('game-state-container').innerHTML = HTMLFragments.PLAYER_GAME_VIEW; + gameStateRenderer.renderPlayerView(true); + break; + case globals.USER_TYPES.MODERATOR: + document.getElementById('transfer-mod-prompt').innerHTML = HTMLFragments.TRANSFER_MOD_MODAL; + document.getElementById('game-state-container').innerHTML = HTMLFragments.MODERATOR_GAME_VIEW; + gameStateRenderer.renderModeratorView(); + break; + case globals.USER_TYPES.TEMPORARY_MODERATOR: + document.getElementById('transfer-mod-prompt').innerHTML = HTMLFragments.TRANSFER_MOD_MODAL; + document.getElementById('game-state-container').innerHTML = HTMLFragments.TEMP_MOD_GAME_VIEW; + gameStateRenderer.renderTempModView(); + break; + case globals.USER_TYPES.SPECTATOR: + document.getElementById('game-state-container').innerHTML = HTMLFragments.SPECTATOR_GAME_VIEW; + gameStateRenderer.renderSpectatorView(); + break; + default: + break; + } + if (currentGameState.timerParams) { + socket.emit(globals.SOCKET_EVENTS.IN_GAME_MESSAGE, globals.EVENT_IDS.GET_TIME_REMAINING, currentGameState.accessCode); + } else { + document.querySelector('#game-timer')?.remove(); + document.querySelector('#timer-container-moderator')?.remove(); + document.querySelector('label[for="game-timer"]')?.remove(); + } + break; + case globals.STATUS.ENDED: { + const container = document.getElementById('game-state-container'); + container.innerHTML = HTMLFragments.END_OF_GAME_VIEW; + gameStateRenderer.renderEndOfGame(currentGameState); + break; + } + default: + break; + } + + activateRoleInfoButton(stateBucket.currentGameState.deck); +} + +function activateRoleInfoButton (deck) { + deck.sort((a, b) => { + return a.team === globals.ALIGNMENT.GOOD ? -1 : 1; + }); + document.getElementById('role-info-button').addEventListener('click', (e) => { + e.preventDefault(); + document.getElementById('role-info-prompt').innerHTML = HTMLFragments.ROLE_INFO_MODAL; + const modalContent = document.getElementById('game-role-info-container'); + for (const card of deck) { + const roleDiv = document.createElement('div'); + const roleNameDiv = document.createElement('div'); + + roleNameDiv.classList.add('role-info-name'); + + const roleName = document.createElement('h5'); + const roleQuantity = document.createElement('h5'); + const roleDescription = document.createElement('p'); + + roleDescription.innerText = card.description; + roleName.innerText = card.role; + roleQuantity.innerText = card.quantity + 'x'; + + if (card.team === globals.ALIGNMENT.GOOD) { + roleName.classList.add(globals.ALIGNMENT.GOOD); + } else { + roleName.classList.add(globals.ALIGNMENT.EVIL); + } + + roleNameDiv.appendChild(roleQuantity); + roleNameDiv.appendChild(roleName); + + roleDiv.appendChild(roleNameDiv); + roleDiv.appendChild(roleDescription); + + modalContent.appendChild(roleDiv); + } + ModalManager.displayModal('role-info-modal', 'role-info-modal-background', 'close-role-info-modal-button'); + }); +} + +function displayClientInfo (name, userType) { + document.getElementById('client-name').innerText = name; + document.getElementById('client-user-type').innerText = userType; + document.getElementById('client-user-type').innerText += globals.USER_TYPE_ICONS[userType]; +} + +function setClientSocketHandlers (stateBucket, gameStateRenderer, socket, timerWorker, gameTimerManager) { + socket.on(globals.EVENT_IDS.PLAYER_JOINED, (player, gameIsFull) => { + toast(player.name + ' joined!', 'success', false, true, 'short'); + stateBucket.currentGameState.people.push(player); + stateBucket.currentGameState.isFull = gameIsFull; + gameStateRenderer.renderLobbyPlayers(); + if (( + stateBucket.currentGameState.client.userType === globals.USER_TYPES.MODERATOR + || stateBucket.currentGameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR + ) + ) { + displayStartGamePromptForModerators(stateBucket.currentGameState, gameStateRenderer); + } + }); + + socket.on(globals.EVENT_IDS.NEW_SPECTATOR, (spectator) => { + stateBucket.currentGameState.spectators.push(spectator); + }); + + socket.on(globals.EVENT_IDS.PLAYER_LEFT, (player) => { + removeStartGameFunctionalityIfPresent(gameStateRenderer); + toast(player.name + ' has left!', 'error', false, true, 'short'); + const index = stateBucket.currentGameState.people.findIndex(person => person.id === player.id); + if (index >= 0) { + stateBucket.currentGameState.people.splice( + index, + 1 + ); + gameStateRenderer.renderLobbyPlayers(); + } + }); + + socket.on(globals.EVENT_IDS.START_GAME, () => { + socket.emit( + globals.SOCKET_EVENTS.IN_GAME_MESSAGE, + globals.EVENT_IDS.FETCH_GAME_STATE, + stateBucket.currentGameState.accessCode, + { personId: stateBucket.currentGameState.client.cookie }, + function (gameState) { + stateBucket.currentGameState = gameState; + processGameState( + stateBucket.currentGameState, + gameState.client.cookie, + socket, + gameStateRenderer, + gameTimerManager, + timerWorker, + true, + true + ); + } + ); + }); + + socket.on(globals.EVENT_IDS.SYNC_GAME_STATE, () => { + socket.emit( + globals.SOCKET_EVENTS.IN_GAME_MESSAGE, + globals.EVENT_IDS.FETCH_GAME_STATE, + stateBucket.currentGameState.accessCode, + { personId: stateBucket.currentGameState.client.cookie }, + function (gameState) { + stateBucket.currentGameState = gameState; + processGameState( + stateBucket.currentGameState, + gameState.client.cookie, + socket, + gameStateRenderer, + gameTimerManager, + timerWorker, + true, + true + ); + } + ); + }); + + if (timerWorker && gameTimerManager) { + gameTimerManager.attachTimerSocketListeners(socket, timerWorker, gameStateRenderer); + } + + socket.on(globals.EVENT_IDS.KILL_PLAYER, (id) => { + const killedPerson = stateBucket.currentGameState.people.find((person) => person.id === id); + if (killedPerson) { + killedPerson.out = true; + if (stateBucket.currentGameState.client.userType === globals.USER_TYPES.MODERATOR) { + toast(killedPerson.name + ' killed.', 'success', true, true, 'medium'); + gameStateRenderer.renderPlayersWithRoleAndAlignmentInfo(stateBucket.currentGameState.status === globals.STATUS.ENDED); + } else { + if (killedPerson.id === stateBucket.currentGameState.client.id) { + const clientUserType = document.getElementById('client-user-type'); + if (clientUserType) { + clientUserType.innerText = globals.USER_TYPES.KILLED_PLAYER + ' \uD83D\uDC80'; + } + gameStateRenderer.updatePlayerCardToKilledState(); + toast('You have been killed!', 'warning', true, true, 'medium'); + } else { + toast(killedPerson.name + ' was killed!', 'warning', true, true, 'medium'); + } + if (stateBucket.currentGameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) { + gameStateRenderer.removePlayerListEventListeners(false); + } else { + gameStateRenderer.renderPlayersWithNoRoleInformationUnlessRevealed(false); + } + } + } + }); + + socket.on(globals.EVENT_IDS.REVEAL_PLAYER, (revealData) => { + const revealedPerson = stateBucket.currentGameState.people.find((person) => person.id === revealData.id); + if (revealedPerson) { + revealedPerson.revealed = true; + revealedPerson.gameRole = revealData.gameRole; + revealedPerson.alignment = revealData.alignment; + if (stateBucket.currentGameState.client.userType === globals.USER_TYPES.MODERATOR) { + toast(revealedPerson.name + ' revealed.', 'success', true, true, 'medium'); + gameStateRenderer.renderPlayersWithRoleAndAlignmentInfo(stateBucket.currentGameState.status === globals.STATUS.ENDED); + } else { + if (revealedPerson.id === stateBucket.currentGameState.client.id) { + toast('Your role has been revealed!', 'warning', true, true, 'medium'); + } else { + toast(revealedPerson.name + ' was revealed as a ' + revealedPerson.gameRole + '!', 'warning', true, true, 'medium'); + } + if (stateBucket.currentGameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) { + gameStateRenderer.renderPlayersWithNoRoleInformationUnlessRevealed(true); + } else { + gameStateRenderer.renderPlayersWithNoRoleInformationUnlessRevealed(false); + } + } + } + }); + + socket.on(globals.EVENT_IDS.CHANGE_NAME, (personId, name) => { + propagateNameChange(stateBucket.currentGameState, name, personId); + updateDOMWithNameChange(stateBucket.currentGameState, gameStateRenderer); + processGameState( + stateBucket.currentGameState, + stateBucket.currentGameState.client.cookie, + socket, + gameStateRenderer, + gameTimerManager, + timerWorker, + false, + false + ); + }); + + socket.on(globals.COMMANDS.END_GAME, (people) => { + stateBucket.currentGameState.people = people; + stateBucket.currentGameState.status = globals.STATUS.ENDED; + processGameState( + stateBucket.currentGameState, + stateBucket.currentGameState.client.cookie, + socket, + gameStateRenderer, + gameTimerManager, + timerWorker, + true, + true + ); + }); +} + +function displayStartGamePromptForModerators (gameState, gameStateRenderer) { + const existingPrompt = document.getElementById('start-game-prompt'); + if (existingPrompt) { + enableOrDisableStartButton(gameState, existingPrompt, gameStateRenderer.startGameHandler); + } else { + const newPrompt = document.createElement('div'); + newPrompt.setAttribute('id', 'start-game-prompt'); + newPrompt.innerHTML = HTMLFragments.START_GAME_PROMPT; + + document.body.appendChild(newPrompt); + enableOrDisableStartButton(gameState, newPrompt, gameStateRenderer.startGameHandler); + } +} + +function enableOrDisableStartButton (gameState, buttonContainer, handler) { + if (gameState.isFull) { + buttonContainer.querySelector('#start-game-button').addEventListener('click', handler); + buttonContainer.querySelector('#start-game-button').classList.remove('disabled'); + } else { + buttonContainer.querySelector('#start-game-button').removeEventListener('click', handler); + buttonContainer.querySelector('#start-game-button').classList.add('disabled'); + } +} + +function removeStartGameFunctionalityIfPresent (gameStateRenderer) { + document.querySelector('#start-game-prompt')?.removeEventListener('click', gameStateRenderer.startGameHandler); + document.querySelector('#start-game-prompt')?.remove(); +} + +function propagateNameChange (gameState, name, personId) { + if (gameState.client.id === personId) { + gameState.client.name = name; + } + const matchingPerson = gameState.people.find((person) => person.id === personId); + if (matchingPerson) { + matchingPerson.name = name; + } + + if (gameState.moderator.id === personId) { + gameState.moderator.name = name; + } + + const matchingSpectator = gameState.spectators?.find((spectator) => spectator.id === personId); + if (matchingSpectator) { + matchingSpectator.name = name; + } +} + +function updateDOMWithNameChange (gameState, gameStateRenderer) { + if (gameState.status === globals.STATUS.IN_PROGRESS) { + switch (gameState.client.userType) { + case globals.USER_TYPES.PLAYER: + case globals.USER_TYPES.KILLED_PLAYER: + case globals.USER_TYPES.SPECTATOR: + gameStateRenderer.renderPlayersWithNoRoleInformationUnlessRevealed(false); + break; + case globals.USER_TYPES.MODERATOR: + gameStateRenderer.renderPlayersWithRoleAndAlignmentInfo(gameState.status === globals.STATUS.ENDED); + break; + case globals.USER_TYPES.TEMPORARY_MODERATOR: + gameStateRenderer.renderPlayersWithNoRoleInformationUnlessRevealed(true); + break; + default: + break; + } + } else { + gameStateRenderer.renderLobbyPlayers(); + } +} diff --git a/client/src/modules/GameTimerManager.js b/client/src/modules/timer/GameTimerManager.js similarity index 99% rename from client/src/modules/GameTimerManager.js rename to client/src/modules/timer/GameTimerManager.js index 4bb2089..71defae 100644 --- a/client/src/modules/GameTimerManager.js +++ b/client/src/modules/timer/GameTimerManager.js @@ -1,4 +1,4 @@ -import { globals } from '../config/globals.js'; +import { globals } from '../../config/globals.js'; export class GameTimerManager { constructor (stateBucket, socket) { diff --git a/client/src/modules/Timer.js b/client/src/modules/timer/Timer.js similarity index 100% rename from client/src/modules/Timer.js rename to client/src/modules/timer/Timer.js diff --git a/client/src/modules/UserUtility.js b/client/src/modules/utility/UserUtility.js similarity index 95% rename from client/src/modules/UserUtility.js rename to client/src/modules/utility/UserUtility.js index b445cd7..d9ae4b0 100644 --- a/client/src/modules/UserUtility.js +++ b/client/src/modules/utility/UserUtility.js @@ -1,4 +1,4 @@ -import { globals } from '../config/globals.js'; +import { globals } from '../../config/globals.js'; /* we will use sessionStorage during local development to aid in testing, vs. localStorage for production. diff --git a/client/src/modules/XHRUtility.js b/client/src/modules/utility/XHRUtility.js similarity index 100% rename from client/src/modules/XHRUtility.js rename to client/src/modules/utility/XHRUtility.js diff --git a/client/src/scripts/create.js b/client/src/scripts/create.js index c60d852..0fae57e 100644 --- a/client/src/scripts/create.js +++ b/client/src/scripts/create.js @@ -1,18 +1,5 @@ -import { DeckStateManager } from '../modules/DeckStateManager.js'; -import { GameCreationStepManager } from '../modules/GameCreationStepManager.js'; -import { injectNavbar } from '../modules/Navbar.js'; -import createTemplate from '../view_templates/CreateTemplate.js'; +import { createHandler } from '../modules/page_handlers/createHandler.js'; +import { GameCreationStepManager } from '../modules/game_creation/GameCreationStepManager.js'; +import { DeckStateManager } from '../modules/game_creation/DeckStateManager.js'; -const create = () => { - injectNavbar(); - document.getElementById('game-creation-container').innerHTML = createTemplate; - const deckManager = new DeckStateManager(); - const gameCreationStepManager = new GameCreationStepManager(deckManager); - gameCreationStepManager.renderStep('creation-step-container', 1); -}; - -if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { - module.exports = create; -} else { - create(); -} +createHandler(new GameCreationStepManager(new DeckStateManager())); diff --git a/client/src/scripts/game.js b/client/src/scripts/game.js index 024fbc1..09c57df 100644 --- a/client/src/scripts/game.js +++ b/client/src/scripts/game.js @@ -1,443 +1,8 @@ -import { UserUtility } from '../modules/UserUtility.js'; -import { globals } from '../config/globals.js'; -import { HTMLFragments } from '../modules/HTMLFragments.js'; -import { GameStateRenderer } from '../modules/GameStateRenderer.js'; -import { toast } from '../modules/Toast.js'; -import { GameTimerManager } from '../modules/GameTimerManager.js'; -import { ModalManager } from '../modules/ModalManager.js'; -import { stateBucket } from '../modules/StateBucket.js'; +import 'core-js/stable'; +import 'regenerator-runtime/runtime'; +import { gameHandler } from '../modules/page_handlers/gameHandler'; import { io } from 'socket.io-client'; -import { injectNavbar } from '../modules/Navbar.js'; -import { XHRUtility } from '../modules/XHRUtility.js'; +import { XHRUtility } from '../modules/utility/XHRUtility.js'; +import gameTemplate from '../view_templates/GameTemplate.js'; -const game = () => { - injectNavbar(); - XHRUtility.xhr( - '/api/games/environment', - 'GET', - null, - null - ) - .then((res) => { - stateBucket.environment = res.content; - const socket = io('/in-game'); - const timerWorker = new Worker(new URL('../modules/Timer.js', import.meta.url)); - const gameTimerManager = new GameTimerManager(stateBucket, socket); - const gameStateRenderer = new GameStateRenderer(stateBucket, socket); - socket.on('connect', () => { - syncWithGame( - stateBucket, - gameTimerManager, - gameStateRenderer, - timerWorker, - socket, - UserUtility.validateAnonUserSignature(res.content) - ); - }); - socket.on('connect_error', (err) => { - toast(err, 'error', true, false); - }); - socket.on('disconnect', () => { - toast('Disconnected. Attempting reconnect...', 'error', true, false); - }); - setClientSocketHandlers(stateBucket, gameStateRenderer, socket, timerWorker, gameTimerManager); - }).catch((res) => { - toast(res.content, 'error', true); - }); -}; - -function syncWithGame (stateBucket, gameTimerManager, gameStateRenderer, timerWorker, socket, cookie) { - const splitUrl = window.location.href.split('/game/'); - const accessCode = splitUrl[1]; - if (/^[a-zA-Z0-9]+$/.test(accessCode) && accessCode.length === globals.ACCESS_CODE_LENGTH) { - socket.emit(globals.SOCKET_EVENTS.IN_GAME_MESSAGE, globals.EVENT_IDS.FETCH_GAME_STATE, accessCode, { personId: cookie }, function (gameState) { - if (gameState === null) { - window.location = '/not-found?reason=' + encodeURIComponent('game-not-found'); - } else { - stateBucket.currentGameState = gameState; - document.querySelector('.spinner-container')?.remove(); - document.querySelector('.spinner-background')?.remove(); - document.getElementById('game-content').innerHTML = HTMLFragments.INITIAL_GAME_DOM; - toast('You are connected.', 'success', true, true, 'short'); - processGameState(stateBucket.currentGameState, cookie, socket, gameStateRenderer, gameTimerManager, timerWorker, true, true); - } - }); - } else { - window.location = '/not-found?reason=' + encodeURIComponent('invalid-access-code'); - } -} - -function processGameState ( - currentGameState, - userId, - socket, - gameStateRenderer, - gameTimerManager, - timerWorker, - refreshPrompt = true, - animateContainer = false -) { - const containerAnimation = document.getElementById('game-state-container').animate( - [ - { opacity: '0', transform: 'translateY(10px)' }, - { opacity: '1', transform: 'translateY(0px)' } - ], { - duration: 500, - easing: 'ease-in-out', - fill: 'both' - }); - if (animateContainer) { - containerAnimation.play(); - } - displayClientInfo(currentGameState.client.name, currentGameState.client.userType); - if (refreshPrompt) { - removeStartGameFunctionalityIfPresent(gameStateRenderer); - document.querySelector('#end-game-prompt')?.remove(); - } - switch (currentGameState.status) { - case globals.STATUS.LOBBY: - document.getElementById('game-state-container').innerHTML = HTMLFragments.LOBBY; - gameStateRenderer.renderLobbyHeader(); - gameStateRenderer.renderLobbyPlayers(); - if (( - currentGameState.client.userType === globals.USER_TYPES.MODERATOR - || currentGameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR - ) - && refreshPrompt - ) { - displayStartGamePromptForModerators(currentGameState, gameStateRenderer); - } - break; - case globals.STATUS.IN_PROGRESS: - gameStateRenderer.renderGameHeader(); - switch (currentGameState.client.userType) { - case globals.USER_TYPES.PLAYER: - document.getElementById('game-state-container').innerHTML = HTMLFragments.PLAYER_GAME_VIEW; - gameStateRenderer.renderPlayerView(); - break; - case globals.USER_TYPES.KILLED_PLAYER: - - document.getElementById('game-state-container').innerHTML = HTMLFragments.PLAYER_GAME_VIEW; - gameStateRenderer.renderPlayerView(true); - break; - case globals.USER_TYPES.MODERATOR: - document.getElementById('transfer-mod-prompt').innerHTML = HTMLFragments.TRANSFER_MOD_MODAL; - document.getElementById('game-state-container').innerHTML = HTMLFragments.MODERATOR_GAME_VIEW; - gameStateRenderer.renderModeratorView(); - break; - case globals.USER_TYPES.TEMPORARY_MODERATOR: - document.getElementById('transfer-mod-prompt').innerHTML = HTMLFragments.TRANSFER_MOD_MODAL; - document.getElementById('game-state-container').innerHTML = HTMLFragments.TEMP_MOD_GAME_VIEW; - gameStateRenderer.renderTempModView(); - break; - case globals.USER_TYPES.SPECTATOR: - document.getElementById('game-state-container').innerHTML = HTMLFragments.SPECTATOR_GAME_VIEW; - gameStateRenderer.renderSpectatorView(); - break; - default: - break; - } - if (currentGameState.timerParams) { - socket.emit(globals.SOCKET_EVENTS.IN_GAME_MESSAGE, globals.EVENT_IDS.GET_TIME_REMAINING, currentGameState.accessCode); - } else { - document.querySelector('#game-timer')?.remove(); - document.querySelector('#timer-container-moderator')?.remove(); - document.querySelector('label[for="game-timer"]')?.remove(); - } - break; - case globals.STATUS.ENDED: { - const container = document.getElementById('game-state-container'); - container.innerHTML = HTMLFragments.END_OF_GAME_VIEW; - gameStateRenderer.renderEndOfGame(currentGameState); - break; - } - default: - break; - } - - activateRoleInfoButton(stateBucket.currentGameState.deck); -} - -function displayClientInfo (name, userType) { - document.getElementById('client-name').innerText = name; - document.getElementById('client-user-type').innerText = userType; - document.getElementById('client-user-type').innerText += globals.USER_TYPE_ICONS[userType]; -} - -function setClientSocketHandlers (stateBucket, gameStateRenderer, socket, timerWorker, gameTimerManager) { - socket.on(globals.EVENTS.PLAYER_JOINED, (player, gameIsFull) => { - toast(player.name + ' joined!', 'success', false, true, 'short'); - stateBucket.currentGameState.people.push(player); - stateBucket.currentGameState.isFull = gameIsFull; - gameStateRenderer.renderLobbyPlayers(); - if (( - stateBucket.currentGameState.client.userType === globals.USER_TYPES.MODERATOR - || stateBucket.currentGameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR - ) - ) { - displayStartGamePromptForModerators(stateBucket.currentGameState, gameStateRenderer); - } - }); - - socket.on(globals.EVENTS.NEW_SPECTATOR, (spectator) => { - stateBucket.currentGameState.spectators.push(spectator); - }); - - socket.on(globals.EVENTS.PLAYER_LEFT, (player) => { - removeStartGameFunctionalityIfPresent(gameStateRenderer); - toast(player.name + ' has left!', 'error', false, true, 'short'); - const index = stateBucket.currentGameState.people.findIndex(person => person.id === player.id); - if (index >= 0) { - stateBucket.currentGameState.people.splice( - index, - 1 - ); - gameStateRenderer.renderLobbyPlayers(); - } - }); - - socket.on(globals.EVENTS.START_GAME, () => { - socket.emit( - globals.SOCKET_EVENTS.IN_GAME_MESSAGE, - globals.EVENT_IDS.FETCH_GAME_STATE, - stateBucket.currentGameState.accessCode, - { personId: stateBucket.currentGameState.client.cookie }, - function (gameState) { - stateBucket.currentGameState = gameState; - processGameState( - stateBucket.currentGameState, - gameState.client.cookie, - socket, - gameStateRenderer, - gameTimerManager, - timerWorker, - true, - true - ); - } - ); - }); - - socket.on(globals.EVENTS.SYNC_GAME_STATE, () => { - socket.emit( - globals.SOCKET_EVENTS.IN_GAME_MESSAGE, - globals.EVENT_IDS.FETCH_GAME_STATE, - stateBucket.currentGameState.accessCode, - { personId: stateBucket.currentGameState.client.cookie }, - function (gameState) { - stateBucket.currentGameState = gameState; - processGameState( - stateBucket.currentGameState, - gameState.client.cookie, - socket, - gameStateRenderer, - gameTimerManager, - timerWorker, - true, - true - ); - } - ); - }); - - if (timerWorker && gameTimerManager) { - gameTimerManager.attachTimerSocketListeners(socket, timerWorker, gameStateRenderer); - } - - socket.on(globals.EVENTS.KILL_PLAYER, (id) => { - const killedPerson = stateBucket.currentGameState.people.find((person) => person.id === id); - if (killedPerson) { - killedPerson.out = true; - if (stateBucket.currentGameState.client.userType === globals.USER_TYPES.MODERATOR) { - toast(killedPerson.name + ' killed.', 'success', true, true, 'medium'); - gameStateRenderer.renderPlayersWithRoleAndAlignmentInfo(stateBucket.currentGameState.status === globals.STATUS.ENDED); - } else { - if (killedPerson.id === stateBucket.currentGameState.client.id) { - const clientUserType = document.getElementById('client-user-type'); - if (clientUserType) { - clientUserType.innerText = globals.USER_TYPES.KILLED_PLAYER + ' \uD83D\uDC80'; - } - gameStateRenderer.updatePlayerCardToKilledState(); - toast('You have been killed!', 'warning', true, true, 'medium'); - } else { - toast(killedPerson.name + ' was killed!', 'warning', true, true, 'medium'); - } - if (stateBucket.currentGameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) { - gameStateRenderer.removePlayerListEventListeners(false); - } else { - gameStateRenderer.renderPlayersWithNoRoleInformationUnlessRevealed(false); - } - } - } - }); - - socket.on(globals.EVENTS.REVEAL_PLAYER, (revealData) => { - const revealedPerson = stateBucket.currentGameState.people.find((person) => person.id === revealData.id); - if (revealedPerson) { - revealedPerson.revealed = true; - revealedPerson.gameRole = revealData.gameRole; - revealedPerson.alignment = revealData.alignment; - if (stateBucket.currentGameState.client.userType === globals.USER_TYPES.MODERATOR) { - toast(revealedPerson.name + ' revealed.', 'success', true, true, 'medium'); - gameStateRenderer.renderPlayersWithRoleAndAlignmentInfo(stateBucket.currentGameState.status === globals.STATUS.ENDED); - } else { - if (revealedPerson.id === stateBucket.currentGameState.client.id) { - toast('Your role has been revealed!', 'warning', true, true, 'medium'); - } else { - toast(revealedPerson.name + ' was revealed as a ' + revealedPerson.gameRole + '!', 'warning', true, true, 'medium'); - } - if (stateBucket.currentGameState.client.userType === globals.USER_TYPES.TEMPORARY_MODERATOR) { - gameStateRenderer.renderPlayersWithNoRoleInformationUnlessRevealed(true); - } else { - gameStateRenderer.renderPlayersWithNoRoleInformationUnlessRevealed(false); - } - } - } - }); - - socket.on(globals.EVENTS.CHANGE_NAME, (personId, name) => { - propagateNameChange(stateBucket.currentGameState, name, personId); - updateDOMWithNameChange(stateBucket.currentGameState, gameStateRenderer); - processGameState( - stateBucket.currentGameState, - stateBucket.currentGameState.client.cookie, - socket, - gameStateRenderer, - gameTimerManager, - timerWorker, - false, - false - ); - }); - - socket.on(globals.COMMANDS.END_GAME, (people) => { - stateBucket.currentGameState.people = people; - stateBucket.currentGameState.status = globals.STATUS.ENDED; - processGameState( - stateBucket.currentGameState, - stateBucket.currentGameState.client.cookie, - socket, - gameStateRenderer, - gameTimerManager, - timerWorker, - true, - true - ); - }); -} - -function displayStartGamePromptForModerators (gameState, gameStateRenderer) { - const existingPrompt = document.getElementById('start-game-prompt'); - if (existingPrompt) { - enableOrDisableStartButton(gameState, existingPrompt, gameStateRenderer.startGameHandler); - } else { - const newPrompt = document.createElement('div'); - newPrompt.setAttribute('id', 'start-game-prompt'); - newPrompt.innerHTML = HTMLFragments.START_GAME_PROMPT; - - document.body.appendChild(newPrompt); - enableOrDisableStartButton(gameState, newPrompt, gameStateRenderer.startGameHandler); - } -} - -function enableOrDisableStartButton (gameState, buttonContainer, handler) { - if (gameState.isFull) { - buttonContainer.querySelector('#start-game-button').addEventListener('click', handler); - buttonContainer.querySelector('#start-game-button').classList.remove('disabled'); - } else { - buttonContainer.querySelector('#start-game-button').removeEventListener('click', handler); - buttonContainer.querySelector('#start-game-button').classList.add('disabled'); - } -} - -function removeStartGameFunctionalityIfPresent (gameStateRenderer) { - document.querySelector('#start-game-prompt')?.removeEventListener('click', gameStateRenderer.startGameHandler); - document.querySelector('#start-game-prompt')?.remove(); -} - -function propagateNameChange (gameState, name, personId) { - if (gameState.client.id === personId) { - gameState.client.name = name; - } - const matchingPerson = gameState.people.find((person) => person.id === personId); - if (matchingPerson) { - matchingPerson.name = name; - } - - if (gameState.moderator.id === personId) { - gameState.moderator.name = name; - } - - const matchingSpectator = gameState.spectators?.find((spectator) => spectator.id === personId); - if (matchingSpectator) { - matchingSpectator.name = name; - } -} - -function updateDOMWithNameChange (gameState, gameStateRenderer) { - if (gameState.status === globals.STATUS.IN_PROGRESS) { - switch (gameState.client.userType) { - case globals.USER_TYPES.PLAYER: - case globals.USER_TYPES.KILLED_PLAYER: - case globals.USER_TYPES.SPECTATOR: - gameStateRenderer.renderPlayersWithNoRoleInformationUnlessRevealed(false); - break; - case globals.USER_TYPES.MODERATOR: - gameStateRenderer.renderPlayersWithRoleAndAlignmentInfo(gameState.status === globals.STATUS.ENDED); - break; - case globals.USER_TYPES.TEMPORARY_MODERATOR: - gameStateRenderer.renderPlayersWithNoRoleInformationUnlessRevealed(true); - break; - default: - break; - } - } else { - gameStateRenderer.renderLobbyPlayers(); - } -} - -function activateRoleInfoButton (deck) { - deck.sort((a, b) => { - return a.team === globals.ALIGNMENT.GOOD ? -1 : 1; - }); - document.getElementById('role-info-button').addEventListener('click', (e) => { - e.preventDefault(); - document.getElementById('role-info-prompt').innerHTML = HTMLFragments.ROLE_INFO_MODAL; - const modalContent = document.getElementById('game-role-info-container'); - for (const card of deck) { - const roleDiv = document.createElement('div'); - const roleNameDiv = document.createElement('div'); - - roleNameDiv.classList.add('role-info-name'); - - const roleName = document.createElement('h5'); - const roleQuantity = document.createElement('h5'); - const roleDescription = document.createElement('p'); - - roleDescription.innerText = card.description; - roleName.innerText = card.role; - roleQuantity.innerText = card.quantity + 'x'; - - if (card.team === globals.ALIGNMENT.GOOD) { - roleName.classList.add(globals.ALIGNMENT.GOOD); - } else { - roleName.classList.add(globals.ALIGNMENT.EVIL); - } - - roleNameDiv.appendChild(roleQuantity); - roleNameDiv.appendChild(roleName); - - roleDiv.appendChild(roleNameDiv); - roleDiv.appendChild(roleDescription); - - modalContent.appendChild(roleDiv); - } - ModalManager.displayModal('role-info-modal', 'role-info-modal-background', 'close-role-info-modal-button'); - }); -} - -if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') { - module.exports = game; -} else { - game(); -} +await gameHandler(io('/in-game'), XHRUtility, window, gameTemplate); diff --git a/client/src/scripts/home.js b/client/src/scripts/home.js index 17a9a94..f6f85d0 100644 --- a/client/src/scripts/home.js +++ b/client/src/scripts/home.js @@ -1,6 +1,6 @@ -import { XHRUtility } from '../modules/XHRUtility.js'; -import { toast } from '../modules/Toast.js'; -import { injectNavbar } from '../modules/Navbar.js'; +import { XHRUtility } from '../modules/utility/XHRUtility.js'; +import { toast } from '../modules/front_end_components/Toast.js'; +import { injectNavbar } from '../modules/front_end_components/Navbar.js'; const home = () => { injectNavbar(); diff --git a/client/src/scripts/howToUse.js b/client/src/scripts/howToUse.js index 6cf8d9d..59b5f46 100644 --- a/client/src/scripts/howToUse.js +++ b/client/src/scripts/howToUse.js @@ -1,4 +1,4 @@ -import { injectNavbar } from '../modules/Navbar.js'; +import { injectNavbar } from '../modules/front_end_components/Navbar.js'; const howToUse = () => { injectNavbar(); diff --git a/client/src/scripts/join.js b/client/src/scripts/join.js index cd8a3c0..72e72f8 100644 --- a/client/src/scripts/join.js +++ b/client/src/scripts/join.js @@ -1,7 +1,7 @@ -import { injectNavbar } from '../modules/Navbar.js'; -import { toast } from '../modules/Toast.js'; -import { XHRUtility } from '../modules/XHRUtility.js'; -import { UserUtility } from '../modules/UserUtility.js'; +import { injectNavbar } from '../modules/front_end_components/Navbar.js'; +import { toast } from '../modules/front_end_components/Toast.js'; +import { XHRUtility } from '../modules/utility/XHRUtility.js'; +import { UserUtility } from '../modules/utility/UserUtility.js'; import { globals } from '../config/globals.js'; const join = () => { diff --git a/client/src/scripts/notFound.js b/client/src/scripts/notFound.js index e83aec9..58e2f21 100644 --- a/client/src/scripts/notFound.js +++ b/client/src/scripts/notFound.js @@ -1,4 +1,4 @@ -import { injectNavbar } from '../modules/Navbar.js'; +import { injectNavbar } from '../modules/front_end_components/Navbar.js'; const notFound = () => { injectNavbar(); diff --git a/client/src/view_templates/GameTemplate.js b/client/src/view_templates/GameTemplate.js new file mode 100644 index 0000000..9c16664 --- /dev/null +++ b/client/src/view_templates/GameTemplate.js @@ -0,0 +1,42 @@ +const template = + `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

Connecting to game...

+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
`; + +export default template; diff --git a/client/src/views/game.html b/client/src/views/game.html index ca4c905..935d264 100644 --- a/client/src/views/game.html +++ b/client/src/views/game.html @@ -19,46 +19,8 @@ -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-

Connecting to game...

-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- + + diff --git a/client/webpack/webpack-dev.config.js b/client/webpack/webpack-dev.config.js index ab0d73a..975d9a3 100644 --- a/client/webpack/webpack-dev.config.js +++ b/client/webpack/webpack-dev.config.js @@ -33,5 +33,8 @@ module.exports = { loader: "webpack-remove-debug", // remove "debug" package } ], + }, + experiments: { + topLevelAwait: true } } diff --git a/client/webpack/webpack-prod.config.js b/client/webpack/webpack-prod.config.js index e0455b2..d264f98 100644 --- a/client/webpack/webpack-prod.config.js +++ b/client/webpack/webpack-prod.config.js @@ -33,5 +33,8 @@ module.exports = { loader: "webpack-remove-debug", // remove "debug" package } ], + }, + experiments: { + topLevelAwait: true } } diff --git a/karma.conf.js b/karma.conf.js index ecc80dd..5c29d9e 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -4,8 +4,8 @@ module.exports = function(config) { frameworks: ['jasmine'], files: [ { pattern: 'spec/e2e/*.js', type: 'module' }, - { pattern: 'client/src/modules/*.js', type: 'module', included: true, served: true }, - { pattern: 'client/src/modules/third_party/*.js', type: 'module', included: true, served: true }, + { pattern: 'spec/support/*.js', type: 'module' }, + { pattern: 'client/src/modules/*/*.js', type: 'module', included: true, served: true }, { pattern: 'client/src/config/*.js', type: 'module', included: true, served: true }, { pattern: 'client/src/model/*.js', type: 'module', included: true, served: true }, { pattern: 'client/src/view_templates/*.js', type: 'module', included: true, served: true } diff --git a/package-lock.json b/package-lock.json index c2650c8..cc14dc8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@babel/core": "^7.16.7", + "@babel/core": "^7.18.13", "@babel/eslint-parser": "^7.16.5", "@babel/plugin-transform-object-assign": "^7.16.5", "@babel/preset-env": "^7.16.5", @@ -17,6 +17,7 @@ "babel-eslint": "^10.1.0", "babel-loader": "^8.2.3", "body-parser": "^1.19.1", + "core-js": "^3.25.0", "cors": "^2.8.5", "express": "^4.17.1", "express-force-https": "^1.0.0", @@ -25,6 +26,7 @@ "karma-jasmine": "^4.0.1", "open": "^7.0.3", "rate-limiter-flexible": "^2.3.6", + "regenerator-runtime": "^0.13.9", "socket.io": "^4.4.0", "socket.io-client": "^4.4.0", "webpack": "^5.65.0", @@ -46,45 +48,69 @@ "node": ">= 14.0.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "dependencies": { - "@babel/highlight": "^7.16.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@ampproject/remapping/node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dependencies": { + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", + "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", - "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", + "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7", + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.13", + "@babel/types": "^7.18.13", "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" + "json5": "^2.2.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -94,233 +120,10 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", - "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dependencies": { - "@babel/types": "^7.16.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "dependencies": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", - "@babel/types": "^7.16.8", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core/node_modules/@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/core/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -339,9 +142,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/eslint-parser": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz", - "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz", + "integrity": "sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==", "dependencies": { "eslint-scope": "^5.1.1", "eslint-visitor-keys": "^2.1.0", @@ -356,13 +159,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", - "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", + "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", "dependencies": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.13", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" @@ -392,13 +195,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "dependencies": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", "semver": "^6.3.0" }, "engines": { @@ -483,12 +286,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", - "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", - "dependencies": { - "@babel/types": "^7.16.0" - }, + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "engines": { "node": ">=6.9.0" } @@ -505,35 +305,23 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "dependencies": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", - "dependencies": { - "@babel/types": "^7.16.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -551,29 +339,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "dependencies": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" @@ -627,11 +415,11 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -649,28 +437,36 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", "engines": { "node": ">=6.9.0" } @@ -690,203 +486,24 @@ } }, "node_modules/@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "dependencies": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers/node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", - "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dependencies": { - "@babel/types": "^7.16.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "dependencies": { - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", - "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", - "@babel/types": "^7.16.8", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@babel/helpers/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -895,9 +512,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", - "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", + "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1932,31 +1549,31 @@ } }, "node_modules/@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", - "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", + "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.5", - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.5", - "@babel/types": "^7.16.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.13", + "@babel/types": "^7.18.13", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1986,11 +1603,12 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", + "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2709,25 +2327,30 @@ } }, "node_modules/browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/buffer-from": { @@ -2764,9 +2387,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001352", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", - "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==", + "version": "1.0.30001388", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001388.tgz", + "integrity": "sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==", "funding": [ { "type": "opencollective", @@ -2870,7 +2493,7 @@ "node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colorette": { "version": "2.0.16", @@ -2978,6 +2601,16 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "node_modules/core-js": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz", + "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-js-compat": { "version": "3.20.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.0.tgz", @@ -3128,9 +2761,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.27", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.27.tgz", - "integrity": "sha512-uZ95szi3zUbzRDx1zx/xnsCG+2xgZyy57pDOeaeO4r8zx5Dqe8Jv1ti8cunvBwJHVI5LzPuw8umKwZb3WKYxSQ==" + "version": "1.4.240", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.240.tgz", + "integrity": "sha512-r20dUOtZ4vUPTqAajDGonIM1uas5tf85Up+wPdtNBNvBSqGCfkpvMVvQ1T8YJzPV9/Y9g3FbUDcXb94Rafycow==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -3353,7 +2986,7 @@ "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } @@ -4445,7 +4078,7 @@ "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } @@ -5117,12 +4750,9 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dependencies": { - "minimist": "^1.2.5" - }, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "bin": { "json5": "lib/cli.js" }, @@ -5512,9 +5142,9 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -6350,14 +5980,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -6784,6 +6406,31 @@ "node": ">= 0.8" } }, + "node_modules/update-browserslist-db": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -7144,208 +6791,65 @@ } }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", "requires": { - "@babel/highlight": "^7.16.0" + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + } + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.16.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz", - "integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==" + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.13.tgz", + "integrity": "sha512-5yUzC5LqyTFp2HLmDoxGQelcdYgSpP9xsnMWBphAscOdFrHSAVbLNzWiy32sVNDqJRDiJK6klfDnAgu6PAGSHw==" }, "@babel/core": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.7.tgz", - "integrity": "sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.13.tgz", + "integrity": "sha512-ZisbOvRRusFktksHSG6pjj1CSvkPkcZq/KHD45LAkVP/oiHJkNBZWfpvlLmX8OtHDG8IuzsFlVRWo08w7Qxn0A==", "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.7", - "@babel/helper-compilation-targets": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", - "@babel/helpers": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7", + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-compilation-targets": "^7.18.9", + "@babel/helper-module-transforms": "^7.18.9", + "@babel/helpers": "^7.18.9", + "@babel/parser": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.18.13", + "@babel/types": "^7.18.13", "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" + "json5": "^2.2.1", + "semver": "^6.3.0" }, "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", - "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "requires": { - "@babel/types": "^7.16.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", - "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", - "requires": { - "@babel/compat-data": "^7.16.4", - "@babel/helper-validator-option": "^7.16.7", - "browserslist": "^4.17.5", - "semver": "^6.3.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-imports": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", - "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-module-transforms": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", - "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", - "requires": { - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-module-imports": "^7.16.7", - "@babel/helper-simple-access": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/helper-validator-identifier": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", - "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/helper-validator-option": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", - "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" - }, - "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==" - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", - "@babel/types": "^7.16.8", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -7358,9 +6862,9 @@ } }, "@babel/eslint-parser": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz", - "integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.9.tgz", + "integrity": "sha512-KzSGpMBggz4fKbRbWLNyPVTuQr6cmCcBhOyXTw/fieOVaw5oYAwcAj4a7UKcDYCPxQq+CG1NCDZH9e2JTXquiQ==", "requires": { "eslint-scope": "^5.1.1", "eslint-visitor-keys": "^2.1.0", @@ -7368,13 +6872,13 @@ } }, "@babel/generator": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz", - "integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.13.tgz", + "integrity": "sha512-CkPg8ySSPuHTYPJYo7IRALdqyjM9HCbt/3uOBEFbzyGVP6Mn8bwFPB0jX6982JVNBlYzM1nnPkfjuXSOPtQeEQ==", "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.18.13", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" } }, "@babel/helper-annotate-as-pure": { @@ -7395,13 +6899,13 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.16.3", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", - "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz", + "integrity": "sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==", "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.17.5", + "@babel/compat-data": "^7.18.8", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.20.2", "semver": "^6.3.0" } }, @@ -7459,12 +6963,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz", - "integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==", - "requires": { - "@babel/types": "^7.16.0" - } + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, "@babel/helper-explode-assignable-expression": { "version": "7.16.0", @@ -7475,29 +6976,20 @@ } }, "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz", + "integrity": "sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==", "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", - "requires": { - "@babel/types": "^7.16.0" + "@babel/template": "^7.18.6", + "@babel/types": "^7.18.9" } }, "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { @@ -7509,26 +7001,26 @@ } }, "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-transforms": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz", - "integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz", + "integrity": "sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==", "requires": { - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.18.6", + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/helper-optimise-call-expression": { @@ -7567,11 +7059,11 @@ } }, "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", + "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -7583,22 +7075,27 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", + "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==" + }, "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz", + "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==" }, "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" }, "@babel/helper-wrap-function": { "version": "7.16.5", @@ -7612,160 +7109,29 @@ } }, "@babel/helpers": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", - "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.9.tgz", + "integrity": "sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==", "requires": { - "@babel/template": "^7.16.7", - "@babel/traverse": "^7.16.7", - "@babel/types": "^7.16.7" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "requires": { - "@babel/highlight": "^7.16.7" - } - }, - "@babel/generator": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", - "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "requires": { - "@babel/types": "^7.16.8", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", - "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-function-name": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", - "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", - "requires": { - "@babel/helper-get-function-arity": "^7.16.7", - "@babel/template": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", - "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", - "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", - "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", - "requires": { - "@babel/types": "^7.16.7" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" - }, - "@babel/highlight": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", - "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==" - }, - "@babel/template": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", - "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/parser": "^7.16.7", - "@babel/types": "^7.16.7" - } - }, - "@babel/traverse": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", - "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", - "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/generator": "^7.16.8", - "@babel/helper-environment-visitor": "^7.16.7", - "@babel/helper-function-name": "^7.16.7", - "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-split-export-declaration": "^7.16.7", - "@babel/parser": "^7.16.8", - "@babel/types": "^7.16.8", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "requires": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } + "@babel/template": "^7.18.6", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9" } }, "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.16.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz", - "integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==" + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.13.tgz", + "integrity": "sha512-dgXcIfMuQ0kgzLB2b9tRZs7TTFFaGM2AbtA4fJgUUYukzGH4jwsS7hzQHEGs67jdehpm22vkgKwvbU+aEflgwg==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.16.2", @@ -8431,28 +7797,28 @@ } }, "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" } }, "@babel/traverse": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz", - "integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.13.tgz", + "integrity": "sha512-N6kt9X1jRMLPxxxPYWi7tgvJRH/rtoU+dbKAPDM44RFHiMH8igdsaSBgFeskhSl/kLWLDUvIh1RXCrTmg0/zvA==", "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.5", - "@babel/helper-environment-visitor": "^7.16.5", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.5", - "@babel/types": "^7.16.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.18.13", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.18.9", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.18.13", + "@babel/types": "^7.18.13", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -8473,11 +7839,12 @@ } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.18.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.13.tgz", + "integrity": "sha512-ePqfTihzW0W6XAU+aMw2ykilisStJfDnsejDCXRchCcMJ4O0+8DhPXf2YUbZ6wjBlsEmZwLK/sPweWtu8hcJYQ==", "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-validator-identifier": "^7.18.6", "to-fast-properties": "^2.0.0" } }, @@ -9059,15 +8426,14 @@ } }, "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" } }, "buffer-from": { @@ -9095,9 +8461,9 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "caniuse-lite": { - "version": "1.0.30001352", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz", - "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==" + "version": "1.0.30001388", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001388.tgz", + "integrity": "sha512-znVbq4OUjqgLxMxoNX2ZeeLR0d7lcDiE5uJ4eUiWdml1J1EkxbnQq6opT9jb9SMfJxB0XA16/ziHwni4u1I3GQ==" }, "chalk": { "version": "2.4.2", @@ -9170,7 +8536,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "colorette": { "version": "2.0.16", @@ -9251,6 +8617,11 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, + "core-js": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.25.0.tgz", + "integrity": "sha512-CVU1xvJEfJGhyCpBrzzzU1kjCfgsGUxhEvwUV2e/cOedYWHdmluamx+knDnmhqALddMG16fZvIqvs9aijsHHaA==" + }, "core-js-compat": { "version": "3.20.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.0.tgz", @@ -9372,9 +8743,9 @@ } }, "electron-to-chromium": { - "version": "1.4.27", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.27.tgz", - "integrity": "sha512-uZ95szi3zUbzRDx1zx/xnsCG+2xgZyy57pDOeaeO4r8zx5Dqe8Jv1ti8cunvBwJHVI5LzPuw8umKwZb3WKYxSQ==" + "version": "1.4.240", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.240.tgz", + "integrity": "sha512-r20dUOtZ4vUPTqAajDGonIM1uas5tf85Up+wPdtNBNvBSqGCfkpvMVvQ1T8YJzPV9/Y9g3FbUDcXb94Rafycow==" }, "emoji-regex": { "version": "8.0.0", @@ -9546,7 +8917,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "eslint": { "version": "8.6.0", @@ -10330,7 +9701,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "has-symbols": { "version": "1.0.2", @@ -10791,12 +10162,9 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonfile": { "version": "6.1.0", @@ -11096,9 +10464,9 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==" }, "normalize-path": { "version": "3.0.0", @@ -11724,11 +11092,6 @@ } } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -12018,6 +11381,15 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "update-browserslist-db": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", diff --git a/package.json b/package.json index 027a4a6..ce9cd00 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "author": "", "license": "ISC", "dependencies": { - "@babel/core": "^7.16.7", + "@babel/core": "^7.18.13", "@babel/eslint-parser": "^7.16.5", "@babel/plugin-transform-object-assign": "^7.16.5", "@babel/preset-env": "^7.16.5", @@ -33,6 +33,7 @@ "babel-eslint": "^10.1.0", "babel-loader": "^8.2.3", "body-parser": "^1.19.1", + "core-js": "^3.25.0", "cors": "^2.8.5", "express": "^4.17.1", "express-force-https": "^1.0.0", @@ -41,6 +42,7 @@ "karma-jasmine": "^4.0.1", "open": "^7.0.3", "rate-limiter-flexible": "^2.3.6", + "regenerator-runtime": "^0.13.9", "socket.io": "^4.4.0", "socket.io-client": "^4.4.0", "webpack": "^5.65.0", diff --git a/spec/e2e/create_spec.js b/spec/e2e/create_spec.js index 0c04938..68cd6ff 100644 --- a/spec/e2e/create_spec.js +++ b/spec/e2e/create_spec.js @@ -1,21 +1,17 @@ // TODO: clean up these deep relative paths? jsconfig.json is not working... - -import { GameCreationStepManager } from '../../client/src/modules/GameCreationStepManager.js'; -import { DeckStateManager } from '../../client/src/modules/DeckStateManager.js'; -import createTemplate from '../../client/src/view_templates/CreateTemplate.js'; +import { createHandler } from '../../client/src/modules/page_handlers/createHandler.js'; +import { GameCreationStepManager } from '../../client/src/modules/game_creation/GameCreationStepManager.js'; +import { DeckStateManager } from '../../client/src/modules/game_creation/DeckStateManager.js'; describe('Create page', function () { - let gameCreationStepManager; + const gameCreationStepManager = new GameCreationStepManager(new DeckStateManager()); beforeAll(function () { spyOn(window, 'confirm').and.returnValue(true); const container = document.createElement('div'); container.setAttribute('id', 'game-creation-container'); document.body.appendChild(container); - document.getElementById('game-creation-container').innerHTML = createTemplate; - const deckManager = new DeckStateManager(); - gameCreationStepManager = new GameCreationStepManager(deckManager); - gameCreationStepManager.renderStep('creation-step-container', 1); + createHandler(gameCreationStepManager); }); describe('deck builder page', function () { @@ -119,5 +115,9 @@ describe('Create page', function () { expect(gameCreationStepManager.deckManager.deck.length).toEqual(5); expect(document.querySelectorAll('.added-role').length).toEqual(5); }); + + afterAll(() => { + document.body.innerHTML = ''; + }); }); }); diff --git a/spec/e2e/game_spec.js b/spec/e2e/game_spec.js new file mode 100644 index 0000000..ab5edfa --- /dev/null +++ b/spec/e2e/game_spec.js @@ -0,0 +1,145 @@ +import { gameHandler } from '../../client/src/modules/page_handlers/gameHandler.js'; +import { mockGames } from '../support/MockGames.js'; +import gameTemplate from '../../client/src/view_templates/GameTemplate.js'; +import { globals } from '../../client/src/config/globals.js'; + +describe('game page', () => { + const XHRUtility = { + xhr (url, method = 'GET', headers, body = null) { + switch (url) { + case '/api/games/environment': + return new Promise((resolve, reject) => { + resolve({ content: 'production' }); + }); + } + } + }; + + describe('lobby game', () => { + const mockSocket = { + eventHandlers: {}, + on: function (message, handler) { + console.log('REGISTERED MOCK SOCKET HANDLER: ' + message); + this.eventHandlers[message] = handler; + }, + emit: function (eventName, ...args) { + switch (args[0]) { // eventName is currently always "inGameMessage" - the first arg after that is the specific message type + case globals.EVENT_IDS.FETCH_GAME_STATE: + args[args.length - 1](mockGames.gameInLobby); + } + }, + hasListeners: function (listener) { + return false; + } + }; + + beforeAll(async () => { + await gameHandler(mockSocket, XHRUtility, { location: { href: 'host/game/ABCD' } }, gameTemplate); + mockSocket.eventHandlers.connect(); + }); + + it('should display the connected client', () => { + expect(document.getElementById('client-name').innerText).toEqual('Alec'); + expect(document.getElementById('client-user-type').innerText).toEqual('moderator \uD83D\uDC51'); + }); + + it('should display the QR Code', () => { + expect(document.getElementById('canvas').innerText).not.toBeNull(); + }); + + it('should display a new player when they join', () => { + mockSocket.eventHandlers[globals.EVENT_IDS.PLAYER_JOINED]({ + name: 'Jane', + id: '123', + userType: globals.USER_TYPES.PLAYER, + out: false, + revealed: false + }, false); + expect(document.querySelectorAll('.lobby-player').length).toEqual(2); + expect(document.getElementById('current-info-message').innerText).toEqual('Jane joined!'); + }); + + it('should activate the start button for the moderator when the game is full', () => { + expect(document.getElementById('start-game-button').classList.contains('disabled')).toBeTrue(); + mockSocket.eventHandlers[globals.EVENT_IDS.PLAYER_JOINED]({ + name: 'Jack', + id: '456', + userType: globals.USER_TYPES.PLAYER, + out: false, + revealed: false + }, true); + expect(document.getElementById('start-game-button').classList.contains('disabled')).toBeFalse(); + }); + + afterAll(() => { + document.body.innerHTML = ''; + }); + }); + + describe('in-progress game', () => { + const mockSocket = { + eventHandlers: {}, + on: function (message, handler) { + console.log('REGISTERED MOCK SOCKET HANDLER: ' + message); + this.eventHandlers[message] = handler; + }, + emit: function (eventName, ...args) { + switch (args[0]) { // eventName is currently always "inGameMessage" - the first arg after that is the specific message type + case globals.EVENT_IDS.FETCH_GAME_STATE: + args[args.length - 1](mockGames.inProgressGame); + break; + default: + break; + } + }, + hasListeners: function (listener) { + return false; + } + }; + + beforeAll(async () => { + await gameHandler(mockSocket, XHRUtility, { location: { href: 'host/game/ABCD' } }, gameTemplate); + mockSocket.eventHandlers.connect(); + mockSocket.eventHandlers.getTimeRemaining(120000, true); + }); + + it('should display the game role of the client', () => { + expect(document.getElementById('role-name').innerText).toEqual('Parity Hunter'); + expect(document.getElementById('role-image').getAttribute('src')).toEqual('../images/roles/ParityHunter.png'); + expect(document.getElementById('game-timer').innerText).toEqual('00:02:00'); + expect(document.getElementById('game-timer').classList.contains('paused')).toEqual(true); + expect(document.getElementById('players-alive-label').innerText).toEqual('Players: 4 / 5 Alive'); + }); + + it('should flip the role card of the client', () => { + const clickEvent = document.createEvent('MouseEvents'); + clickEvent.initEvent('dblclick', true, true); + document.getElementById('game-role-back').dispatchEvent(clickEvent); + + expect(document.getElementById('game-role').style.display).toEqual('flex'); + expect(document.getElementById('game-role-back').style.display).toEqual('none'); + }); + + it('should display the timer', () => { + expect(document.getElementById('game-timer').innerText).toEqual('00:02:00'); + expect(document.getElementById('game-timer').classList.contains('paused')).toEqual(true); + }); + + it('should display the number of alive players', () => { + expect(document.getElementById('players-alive-label').innerText).toEqual('Players: 4 / 5 Alive'); + }); + + it('should display the role info modal when the button is clicked', () => { + document.getElementById('role-info-button').click(); + expect(document.getElementById('role-info-modal').style.display).toEqual('flex'); + }); + + it('should NOT display the ability to play/pause the timer when the client is NOT a moderator', () => { + expect(document.getElementById('play-pause')).toBeNull(); + }); + + afterAll(() => { + document.body.innerHTML = ''; + }); + }); +}); diff --git a/spec/support/MockGames.js b/spec/support/MockGames.js new file mode 100644 index 0000000..c254796 --- /dev/null +++ b/spec/support/MockGames.js @@ -0,0 +1,168 @@ +export const mockGames = { + gameInLobby: { + accessCode: 'ZS6M', + status: 'lobby', + moderator: { + name: 'Alec', + id: 'HZM64BVGXCSXS9L5YMGK2WTTQ', + userType: 'moderator', + out: false, + revealed: false + }, + client: { + name: 'Alec', + hasEnteredName: false, + id: 'HZM64BVGXCSXS9L5YMGK2WTTQ', + cookie: 'Q68BYSMM7DB5CH338TNPMF9CK', + userType: 'moderator' + }, + deck: [ + { + role: 'Parity Hunter', + team: 'good', + description: 'You beat a werewolf in a 1v1 situation, winning the game for the village.', + id: 'wli3r2i9zxxmnns5euvtc01v0', + quantity: 1 + }, + { + role: 'Seer', + team: 'good', + description: 'Each night, learn if a chosen person is a Werewolf.', + id: '7q0xxfuflsjetzit1elu5rd2k', + quantity: 1 + }, + { + role: 'Villager', + team: 'good', + description: 'During the day, find the wolves and kill them.', + id: '33pw77odkdt3042yumxtxbrda', + quantity: 1 + }, + { + role: 'Sorceress', + team: 'evil', + description: 'Each night, learn if a chosen person is the Seer.', + id: '6fboglgqwua8n0twgh2f4a0xh', + quantity: 1 + }, + { + role: 'Werewolf', + team: 'evil', + description: "During the night, choose a villager to kill. Don't get killed.", + id: 'ixpmpaouc3oj1llkm6gttxbor', + quantity: 1 + } + ], + people: [], + timerParams: { + hours: null, + minutes: 15, + paused: false + }, + isFull: false, + spectators: [] + }, + inProgressGame: { + accessCode: 'VVVG', + status: 'in progress', + moderator: { + name: 'Alec', + id: 'H24358C4GQ238LFK66RYMST9P', + userType: 'moderator', + out: false, + revealed: false + }, + client: { + name: 'Andrea', + hasEnteredName: false, + id: 'THCX9K6MCKZXBXYH95FPLP68Y', + cookie: 'ZLPHS946H33W7LVJ28M8XCRVZ', + userType: 'player', + gameRole: 'Parity Hunter', + gameRoleDescription: 'You beat a werewolf in a 1v1 situation, winning the game for the village.', + alignment: 'good', + out: false + }, + deck: [ + { + role: 'Parity Hunter', + team: 'good', + description: 'You beat a werewolf in a 1v1 situation, winning the game for the village.', + id: 'gw82x923gde5pcf3ru8y0w6mr', + quantity: 1 + }, + { + role: 'Seer', + team: 'good', + description: 'Each night, learn if a chosen person is a Werewolf.', + id: '0it2wybz7mdoatqs60b847x5v', + quantity: 1 + }, + { + role: 'Villager', + team: 'good', + description: 'During the day, find the wolves and kill them.', + id: 'v8oeyscxu53bg0a29uxsh4mzc', + quantity: 1 + }, + { + role: 'Sorceress', + team: 'evil', + description: 'Each night, learn if a chosen person is the Seer.', + id: '52ooljj12xpah0dgirxay2lma', + quantity: 1 + }, + { + role: 'Werewolf', + team: 'evil', + description: "During the night, choose a villager to kill. Don't get killed.", + id: '1oomauy0wc9pn5q55d2f4zq64', + quantity: 1 + } + ], + people: [ + { + name: 'Andrea', + id: 'THCX9K6MCKZXBXYH95FPLP68Y', + userType: 'player', + out: false, + revealed: false + }, + { + name: 'Greg', + id: 'SFVBXJZNF3G3QDML63X34KG5X', + userType: 'player', + out: false, + revealed: false + }, + { + name: 'Lys', + id: 'S2496LVXL9CFP5B493XX6XMYL', + userType: 'player', + out: false, + revealed: false + }, + { + name: 'Hannah', + id: 'Y7P2LGDZL6NV283525PL5GZTB', + userType: 'player', + out: true, + revealed: true + }, + { + name: 'Matthew', + id: 'Z9YZ2JBM2GPRXFJB9J6ZFNSP9', + userType: 'player', + out: false, + revealed: false + } + ], + timerParams: { + hours: null, + minutes: 2, + paused: true, + timeRemaining: 120000 + }, + isFull: true + } +};