From 3d35a9e5007f67d8c46f961a2f5cab8ee9c3c58a Mon Sep 17 00:00:00 2001 From: eatplastik <3503345+eatplastik@users.noreply.github.com> Date: Mon, 18 Oct 2021 16:05:03 +0800 Subject: [PATCH 1/4] beta version --- assets/fonts/Comic Sans MS.ttf | Bin 0 -> 135484 bytes global.js | 70 ++++++ helper.js | 438 +++++++++++++++++++++++++++++++++ index.html | 18 ++ script.js | 201 +++++++++++++++ style.css | 193 +++++++++++++++ test.js | 183 ++++++++++++++ 7 files changed, 1103 insertions(+) create mode 100644 assets/fonts/Comic Sans MS.ttf create mode 100644 global.js create mode 100644 helper.js create mode 100644 index.html create mode 100644 script.js create mode 100644 style.css create mode 100644 test.js diff --git a/assets/fonts/Comic Sans MS.ttf b/assets/fonts/Comic Sans MS.ttf new file mode 100644 index 0000000000000000000000000000000000000000..831e3d867aebc4f88d3168b1ac7df2b7ba8a6ee5 GIT binary patch literal 135484 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

7w=iv-nM+zVr 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 z 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" + "1800-6-668-668"; +// document.body.appendChild(cardBack); diff --git a/helper.js b/helper.js new file mode 100644 index 00000000..68b501f9 --- /dev/null +++ b/helper.js @@ -0,0 +1,438 @@ +// --------------------------------------------------------- +// HELPER FUNCTIONS WIN CONDITIONS +// --------------------------------------------------------- + +// 1) ROYAL FLUSH - ACE HIGH STRAIGHT FLUSH -- checked and working +const checkRoyalFlush = (playerHand) => { + // const royalFlush = ['ace', 'king', 'queen', 'jack', '10']; + let cardRanks = []; + + // Check that suits are same across hand + for (let i = 0; i < 5; i++) { + cardRanks.push(playerHand[i].name) + if (playerHand.every((e) => e.suit === testRoyalFlushHand[0].suit)) { + // console.log('same suits') + } + } + if (cardRanks.includes('ace') && cardRanks.includes('king') && cardRanks.includes('queen') && cardRanks.includes('jack') && cardRanks.includes('10')) { + // console.log('royal flush'); + return true; + } else { + // console.log('NO ROYAL FLUSH'); + return false; +} +} + +// 2) STRAIGHT FLUSH (SEQUENTIAL RANK IN SAME SUIT) -- checked and working +const checkStraightFlush = (playerHand) => { + if (checkFlush(playerHand) === true && checkStraight(playerHand) === true) { + // console.log('straight flush'); + return true; + } else { + // console.log('no straight flush'); + return false; + } + +} + +// 3) FOUR OF A KIND (4 CARDS 1 RANK) -- checked and working +const checkFourKind = (playerHand) => { + let cardNameTally = {}; + let cardFourKind = 0; + + for (let i = 0; i < playerHand.length; i++) { + let cardName = playerHand[i].name; + // If we have seen the card name before, increment its count + if (cardName in cardNameTally) { + cardNameTally[cardName] ++; + + // checks 2 of a kind + if (cardNameTally[cardName] === 4) { + console.log("3. four kind"); + cardFourKind++; + // console.log("card name tally: ",cardNameTally) + } + } else { + cardNameTally[cardName] = 1; + }; +}; + + if (cardFourKind === 1) { + // console.log("U HAVE four of kind"); + return true; + } else { + // console.log("U HAVE no four of kind"); + return false; + } + +} + +// 4) FULL HOUSE (3 CARDS 1 RANK + 2 CARDS 1 RANK) --- checked and working +const checkFullHouse = (playerHand) => { + // Extract ranks from player's hand and sort them in ascending order + let sortedRanks = []; + for (let i = 0; i < playerHand.length; i++) { + sortedRanks.push(playerHand[i].rank); + } + + function compareNum(a, b) { + return a - b; + } + sortedRanks.sort(compareNum); + // console.log(sortedRanks); + + // refactor please + if ((sortedRanks[0] === sortedRanks[1] && sortedRanks[1] === sortedRanks[2] && sortedRanks[3] === sortedRanks[4]) || (sortedRanks[4] === sortedRanks[3] && sortedRanks[3] === sortedRanks[2] && sortedRanks[1] === sortedRanks[0])) { + + // console.log('YOU HAVE full house'); + return true; + } else { + // console.log('YOU HAVE NO full house'); + return false; + } +}; + +// 5) FLUSH - 5 CARDS OF THE SAME SUIT -- checked and working +const checkFlush = (playerHand) => { + // for (let i = 0; i < 5; i++) { + if (playerHand.every((e) => e.suit === playerHand[0].suit)) { + // console.log('flush'); + return true; + } else { + // console.log('no flush'); + return false; + } + // }; +}; + + +// 6) STRAIGHT (SQUENTIAL RANK) +// need 1 condition that checks for AKQJ10 +// rest can be determined just through rank +const checkStraight = (playerHand) => { + + // Extract ranks from player's hand and sort them in ascending order + let sortedRanks = []; + for (let i = 0; i < playerHand.length; i++) { + sortedRanks.push(playerHand[i].rank); + } + // Callback function for sort() to order elements as numbers instead of str + function compareNum(a, b) { + return a - b; + } + sortedRanks.sort(compareNum); + // console.log(sortedRanks); + + let sequencedNum = 0; + + for (let j = 0; j < sortedRanks.length - 1; j++) { + if (sortedRanks[j] + 1 !== sortedRanks[j+1]) { + // console.log(sortedRanks[j]); + // console.log('no sequential numbers found'); + } else { + // console.log('sequential numbers found') + sequencedNum++; + } + } + + // const highAcesRanks = [1, 10, 11, 12, 13]; + + if (sortedRanks.includes(1) && sortedRanks.includes(10) && sortedRanks.includes(11) && sortedRanks.includes(12) && sortedRanks.includes(13)) { + // console.log('ace high straight'); + return true; + } else if (sequencedNum === 4) { + // console.log('u r straight'); + return true; + } else { + // console.log("U R NOT STRAIGHT"); + return false; + } +}; + +// 7) THREE OF A KIND -- checked and working +// AAA 222 111 222 333 444 555 666 777 888 999 101010 JJJ QQQ KKK + +const checkThreeKind = (playerHand) => { + + let cardNameTally = {}; + let cardThreeKind = 0; + + for (let i = 0; i < playerHand.length; i++) { + let cardName = playerHand[i].name; + // If we have seen the card name before, increment its count + if (cardName in cardNameTally) { + cardNameTally[cardName] ++; + + // checks 2 of a kind + if (cardNameTally[cardName] === 3) { + console.log("7. three kind"); + cardThreeKind++; + console.log("card name tally: ",cardNameTally) + } + } else { + cardNameTally[cardName] = 1; + }; +}; + + if (cardThreeKind === 1) { + // console.log("U HAVE three of kind"); + return true; + } else { + // console.log("U HAVE no three of kind"); + return false; + } +}; + + +// 8) TWO PAIR -- checked and working +// AA 22 33 44 55 66 77 88 99 1010 JJ QQ KK + +const checkTwoPair = (playerHand) => { + + let cardNameTally = {}; + let cardPairs = 0; + + for (let i = 0; i < playerHand.length; i++) { + let cardName = playerHand[i].name; + // If we have seen the card name before, increment its count + if (cardName in cardNameTally) { + cardNameTally[cardName] ++; + + // checks 2 of a kind + if (cardNameTally[cardName] === 2) { + // console.log("9. one pair "); + cardPairs++; + // console.log("card name tally: ",cardNameTally) + } + } else { + cardNameTally[cardName] = 1; + } +} + + if (cardPairs === 2) { + // console.log("U HAVE two pairs"); + return true; + } else { + // console.log("U HAVE no two pairs"); + return false; + } +} + +// 9) JACKS OR BETTER -- checked and working +// AA, JJ, QQ, KK + +const checkJacksBetter = (playerHand) => { + + let cardNameTally = {}; + let cardJacksBetter = 0; + + for (let i = 0; i < playerHand.length; i++) { + + let cardName = playerHand[i].name; + if (cardName === "ace" || cardName === "king" || cardName === "queen" || cardName === "jack") { + // If we have seen the card name before, increment its count + if (cardName in cardNameTally) { + cardNameTally[cardName] ++; + + // checks 2 of a kind + if (cardNameTally[cardName] === 2) { + // console.log("9. jacks or better "); + cardJacksBetter++; + // console.log("card name tally: ",cardNameTally) + } + } else { + cardNameTally[cardName] = 1; + } + } + } + + if (cardJacksBetter === 1) { + // console.log("U HAVE jacks or better"); + return true; + } else { + // console.log("U HAVE no jacks or better"); + return false; + } +} + +// --------------------------------------------------------- +// HELPER FUNCTIONS FOR CARD FACE GENERATION +// --------------------------------------------------------- + + +const createCard = (cardInfo) => { + const suit = document.createElement('div'); + suit.classList.add('suit', cardInfo.colour); + suit.innerText = cardInfo.suitSymbol; + + const name = document.createElement('div'); + name.classList.add('name', cardInfo.colour); + + if (cardInfo.displayName === "J") { + name.innerText = `"jack"`; + // name.classList.add('court'); + } else if (cardInfo.displayName === "Q") { + name.innerText = `"queen"`; + // name.classList.add('court'); + + } else if (cardInfo.displayName === "K") { + name.innerText = `"king"`; + // name.classList.add('court'); + + } else { + name.innerText = cardInfo.displayName; + // name.innerText = `"QUEEN"`; + } + + + const card = document.createElement('div'); + card.classList.add('card-face-container'); + document.body.appendChild(card); + + const cardTop = document.createElement('div'); + cardTop.classList.add('card-face-top'); + card.appendChild(cardTop); + + const cardTopLeft = document.createElement('div'); + cardTopLeft.classList.add('card-face-top-left'); + card.appendChild(cardTopLeft); + + const cardFaceInfo = document.createElement('div'); + cardFaceInfo.classList.add('card-face-info'); + card.appendChild(cardFaceInfo); + + const cardBtm = document.createElement('div'); + cardBtm.classList.add('card-face-btm'); + card.appendChild(cardBtm); + + const cardBtmRight = document.createElement('div'); + cardBtmRight.classList.add('card-face-btm-right'); + cardBtm.appendChild(cardBtmRight); + + + cardTopLeft.classList.add(cardInfo.colour); + cardTopLeft.innerHTML = cardInfo.displayName + "
" + cardInfo.suitSymbol; + + cardBtmRight.classList.add(cardInfo.colour); + cardBtmRight.innerHTML = cardInfo.displayName + "
" + cardInfo.suitSymbol; + + + card.appendChild(name); + card.appendChild(suit); + + cardFaceInfo.appendChild(name); + cardFaceInfo.appendChild(suit); + + cardContainer.appendChild(card); + + return card; + +}; + + +// --------------------------------------------------------- +// HELPER FUNCTIONS FOR CARD DECK GENERATION +// --------------------------------------------------------- + +// Get a random index ranging from 0 (inclusive) to max (exclusive). +const getRandomIndex = (max) => Math.floor(Math.random() * max); + +// Shuffle an array of cards +const shuffleCards = (cards) => { + // Loop over the card deck array once + for (let currentIndex = 0; currentIndex < cards.length; currentIndex += 1) { + // Select a random index in the deck + const randomIndex = getRandomIndex(cards.length); + // Select the card that corresponds to randomIndex + const randomCard = cards[randomIndex]; + // Select the card that corresponds to currentIndex + const currentCard = cards[currentIndex]; + // Swap positions of randomCard and currentCard in the deck + cards[currentIndex] = randomCard; + cards[randomIndex] = currentCard; + } + // Return the shuffled deck + return cards; +}; + +const makeDeck = () => { + // Initialise an empty deck array + const newDeck = []; + // Initialise an array of the 4 suits in our deck. We will loop over this array. + const suits = ['hearts', 'diamonds', 'clubs', 'spades']; + const suitSymbols = ['♥', '♦', '♣', '♠']; + + // Loop over the suits array + for (let suitIndex = 0; suitIndex < suits.length; suitIndex++) { + // Store the current suit in a variable + const currentSuit = suits[suitIndex]; + const currentSymbol = suitSymbols[suitIndex]; + let suitColour = ''; + + if (currentSuit === 'hearts' || currentSuit === 'diamonds') { + suitColour = 'red'; + } else if (currentSuit === 'clubs' || currentSuit === 'spades') { + suitColour = 'black'; + } + + // Loop from 1 to 13 to create all cards for a given suit + // Notice rankCounter starts at 1 and not 0, and ends at 13 and not 12. + // This is an example of a loop without an array. + for (let rankCounter = 1; rankCounter <= 13; rankCounter++) { + // By default, the card name is the same as rankCounter + let cardName = `${rankCounter}`; + let displayAs = `${rankCounter}`; + + // If rank is 1, 11, 12, or 13, set cardName to the ace or face card's name + if (cardName === '1') { + cardName = 'ace'; + displayAs = 'A'; + } else if (cardName === '11') { + cardName = 'jack'; + displayAs = 'J'; + } else if (cardName === '12') { + cardName = 'queen'; + displayAs = 'Q'; + } else if (cardName === '13') { + cardName = 'king'; + displayAs = 'K'; + } + + // Create a new card with the current name, suit, and rank + const card = { + name: cardName, + suit: currentSuit, + suitSymbol: currentSymbol, + displayName: displayAs, + colour: suitColour, + rank: rankCounter, + }; + + // Add the new card to the deck + newDeck.push(card); + } + } + + // Return the completed card deck + return newDeck; +}; + +// --------------------------------------------------------- +// HELPER FUNCTION FOR GREETING +// --------------------------------------------------------- + +const getGreeting = () => { + let today = new Date(); + let time = today.getHours(); + // console.log(time); + + if (time > 0 && time <= 12) { + return "morning"; + } else if (time > 12 && time <= 18) { + return "afternoon"; + } else if (time > 18) { + return "evening"; + } else { + return "time does not exist"; + } +} diff --git a/index.html b/index.html new file mode 100644 index 00000000..78ed7816 --- /dev/null +++ b/index.html @@ -0,0 +1,18 @@ + + + + + + + Video Poker + + + + ~* WeLcOmE 2 ViDeO pOkEr *~ + + + + + i aM dEpReCaTeD HTML tAg :(" + + diff --git a/script.js b/script.js new file mode 100644 index 00000000..5b168e0b --- /dev/null +++ b/script.js @@ -0,0 +1,201 @@ + +/** + * (╯°□°)╯︵ ┻━┻ + * + */ + + +const dealCards = () => { + if (canDeal === true) { + cardContainer.innerText = ""; + userPoints--; + pointsContainer.innerText = `You have: ${userPoints} points`; + + // deal 5 cards to user and put in array + for (let i = 0; i < 5; i++) { + userHand[i] = cardDeck.pop(); + const cardElement = createCard(userHand[i]); + cardContainer.appendChild(cardElement); + cardElement.addEventListener('click', () => { + userHand.indexOf() + }); + + cardElement.addEventListener('click', () => selectCard(i)); + // console.log(cardClick); + + cardElement.addEventListener('click', () => { + if (cardClick[i] === true) { + cardElement.classList.add('card-placeholder'); + cardClick[i] = false; + } else if (cardClick[i] === false) { + cardElement.classList.remove('card-placeholder'); + cardClick[i] = true; + } + }); + } + + console.log("user's hand", userHand); + canDeal = false; + canSwap = true; + cardsToSwap = []; + cardClick = [true, true, true, true, true]; + gameInfo.innerHTML = 'Click on card(s) you want to discard & click SWAP'; + } +}; + +// User chooses which card(s) they want to discard +const selectCard = (cardIndex) => { + // clear cardsToSwap + + // console.log("you have selected this card") +// check current index of user's hand + // for (let i = 0; i < userHand.length; i++) { + + // making sure this only runs on the card that was clicked + // if (cardIndex === i) { + // if (cardsToSwap.includes(i) === true) { + + if (cardsToSwap.includes(cardIndex) === true) { + + console.log("you deselected this card, it will return to your hand"); + // when user deselects card, match the i in cardstoswap and remove it + // filter() creates a new array that does not include the selected index + // cardsToSwap = cardsToSwap.filter((desel) => desel !== i) + cardsToSwap = cardsToSwap.filter((desel) => desel !== cardIndex) + + + // DOM MAKE THE CARD REAPPEAR + + } else { + console.log("you selected this card to discard, it will leave your hand"); + cardsToSwap.push(cardIndex); + // DOM MAKE THE CARD VANISH + } + + // } + // } + console.log("swap these cards: ", cardsToSwap); + swapButton.addEventListener('click', swapCard); +} + +// use cardsToSwap to remove cards from userHand +const swapCard = () => { + + // cardsToSwap[0, 1, 2] - e.g only 3 cards chosen to discard + // cardsToSwap['3', '1', '0'] -- indexes to be replaced with in userhand + if (canSwap === true) { + // loop through cards to swap index + for (k = 0; k < cardsToSwap.length; k++) { + + // replace with new card + userHand[cardsToSwap[k]] = cardDeck.pop(); + + } + console.log("new user hand: ", userHand) + console.log("new user hand length: ", userHand.length); + // REPOPULATE PLAYERS HAND ON DOM + + cardContainer.innerText = ""; + + for (let i = 0; i < userHand.length; i++) { + const cardElement = createCard(userHand[i]); + cardContainer.appendChild(cardElement); + } + canSwap = false; + calcHandScore(userHand); + gameInfo.innerHTML = `You ${userWin}
Click DEAL to try again` + } +}; + +const calcHandScore = (currentHand) => { + + if (checkRoyalFlush(currentHand) === true) { + userWin = "royal flush"; + if (userBet === 5) { + userPoints += 4000; + // return userWin; + } else { + userPoints += (userBet * 250); + console.log(userWin); + // return userWin; + } +} else if (checkStraightFlush(currentHand) === true) { + userWin = "got straight flush"; + userPoints += (userBet * 50); + console.log(userWin); + // return userWin; +} else if (checkFourKind(currentHand) === true) { + userWin = "got four of a kind"; + userPoints += (userBet * 25); + console.log(userWin); + // return userWin; +} else if (checkFullHouse(currentHand) === true) { + userWin = "got full house"; + userPoints += (userBet * 9); + console.log(userWin); + // return userWin; +} else if (checkFlush(currentHand) === true) { + userWin = "got flush"; + userPoints += (userBet * 6); + console.log(userWin); + // return userWin; +} else if (checkStraight(currentHand) === true) { + userWin = "got straight"; + userPoints += (userBet * 4); + console.log(userWin); + // return userWin; +} else if (checkThreeKind(currentHand) === true) { + userWin = "got three of a kind"; + userPoints += (userBet * 3); + console.log(userWin); + // return userWin; +} else if (checkTwoPair(currentHand) === true) { + userWin = "got two pair"; + userPoints += (userBet * 2); + console.log(userWin); + // return userWin; +} else if (checkJacksBetter(currentHand) === true) { + userWin = "got jacks or better"; + userPoints += (userBet * 1); + console.log(userWin); + // return userWin; +} else { + userWin = "lose (╯°□°)╯︵ ┻━┻"; + console.log(userWin); + // return userWin; +} +canDeal = true; +console.log('user points: ', userPoints); +pointsContainer.innerText = `You have: ${userPoints} points`; +} + +// Create a helper function for output to abstract complexity +// of DOM manipulation away from game logic +const output = (message) => { + gameInfo.innerText = message; +}; + +// ---------------------------------------------------------------- +// GAME INITIALISATION +// ---------------------------------------------------------------- + +const initGame = () => { + gameInfo.innerText = "Good " + getGreeting() + ', click deal to get your first hand'; + console.log('game init'); + + cardDeck = shuffleCards(makeDeck()); + + cardContainer.innerText = ""; + userPoints = 100; + + cardContainer.appendChild(cardBack); + + if (canDeal === true) { + dealButton.addEventListener('click', dealCards); + }; + +}; +initGame(); + +resetButton.addEventListener('click', () => initGame()); + diff --git a/style.css b/style.css new file mode 100644 index 00000000..e9bd1989 --- /dev/null +++ b/style.css @@ -0,0 +1,193 @@ +body { + background-color: blue; + font-family: "Comic Sans MS"; +} + +@font-face { + font-family: "Comic Sans MS"; + src: url("assets/fonts/Comic Sans MS.ttf"); +} + +p { + font-weight: bold; + color: white; +} + +marquee { + color: white; +} + +button { + color: white; + font-family: "Comic Sans MS"; + font-weight: bold; + background-color: transparent; + /* border: 1px solid white; */ + width: 100px; + display: inline-block; + margin: 10px; +} + +.game-container { + display: flex; + flex-direction: column; + flex-wrap: wrap; + margin: auto; + /* border: 1px solid black; */ + padding: 20px; +} + +/* .card { + margin: 10px; + padding: 10px; + background-color: white; + text-align: center; + border-radius: 8px; + border-style: outset; + border-width: 2px; + border-color: whitesmoke; + display: inline-block; +} */ + +/* CARD DISPLAY */ + +.card-face-container { + display: flex; + /* flex-wrap: wrap; */ + flex-direction: column; + justify-content: space-between; + margin: 10px; + padding: 10px; + background-color: white; + border-radius: 8px; + border: 1px outset whitesmoke; + width: 80px; + height: 120px; +} + +.card-face-top { + display: flex; + flex-direction: row; + /* border: 1px solid fuchsia; */ +} + +.card-face-top-left { + flex: 50%; + /* border: 1px solid white; */ + height: 20px; + width: 20px; +} + +.card-face-top-right { + flex: 50%; + text-align: right; + /* border: 1px solid white; */ + height: 20px; + width: 20px; +} + +.card-face-info { + display: flex; + flex-direction: column; + align-items: center; + min-height: 85px; +} + +.card-face-btm { + display: flex; + flex-direction: row; + /* border: 1px solid red; */ +} + +.card-face-btm-left { + flex: 50%; + flex-direction: column; + /* border: 1px solid white; */ + height: 20px; +} + +.card-face-btm-right { + flex: 50%; + text-align: center left; + /* border: 1px solid white; */ + height: 20px; + /* transform: rotate(); */ + transform: rotate(180deg); +} + +.card-back { + display: flex; + /* flex-wrap: wrap; */ + flex-direction: column; + justify-content: space-between; + margin: 10px; + padding: 10px; + background-color: white; + border-radius: 8px; + border: 1px outset whitesmoke; + width: 80px; + height: 120px; + font-family: "Comic Sans MS"; + font-weight: bold; + color: blue; +} + +.card-placeholder { + background-color: blue; + fill: blue; + color: blue; + /* display: inline-block; */ +} + +/* ^^ CARD DISPLAY ^^ */ + +.suit { + margin: 5px; + font-size: 28px; +} + +.name { + margin: 5px; + font-size: 24px; + font-weight: bold; +} + +.court { + font-size: 18px; +} + +.red { + color: red; +} + +.black { + color: black; +} + +.card-container { + display: flex; + max-width: max-content; + /* background-color: white; */ + /* border: 1px solid white; */ + margin: 10px; +} + +.buttons { + display: flex; + flex-direction: row; + /* border: 1px solid yellow; */ + margin: 10px; +} + +.message { + color: white; +} + +.points { + display: flex; + flex: row; + margin: 10px; + /* left: 50px; + top: 50px; */ + color: white; +} diff --git a/test.js b/test.js new file mode 100644 index 00000000..d6c0e3ff --- /dev/null +++ b/test.js @@ -0,0 +1,183 @@ +// const testElement = document.createElement('p'); +// testElement.innerText = 'gRaPhIc DeSiGn iS mY pAsSiOn'; +// document.body.appendChild(testElement); + +/* WEIRD THINGS APPEARING WHENEVER I COPY AND PASTE CODE FROM W3SCHOOLS +const { compare } = require("semver"); + +why the fuck is this here +const { sort } = require("prelude-ls"); +*/ + + +const testCard = { + name: "queen", + suit: "heart", + suitSymbol: "♥️", + displayName: "Q", + colour: "red", + rank: 12, + }; + + +// const fakeCard = document.createElement('div'); +// fakeCard.innerText = "fake card"; +// fakeCard.classList.add('card'); +// document.body.appendChild(fakeCard); + +const spawnCard = (cardInfo) => { + const suit = document.createElement('div'); + suit.classList.add('suit'); + suit.innerText = cardInfo.suitSymbol; + + const name = document.createElement('div'); + name.classList.add('name', cardInfo.colour); + name.innerText = cardInfo.displayName; + + const card = document.createElement('div'); + card.classList.add('card'); + + card.appendChild(name); + card.appendChild(suit); + + document.body.appendChild(card); + + return card; +}; + +// const dummyCard = spawnCard(testCard); +// document.body.appendChild(dummyCard); + +const getCardInfo = () => { + console.log("queen of farts") + // let x = testCard.activeElement.; + // document.getElementById("card").innerHTML = x; + // console.log(x); + +} + +// dummyCard.addEventListener('click', getCardInfo); + + + +// CARD FACE GENERATION + + + +// const cardBtmLeft = document.createElement('div'); +// cardBtmLeft.classList.add('card-face-btm-left'); +// cardBtmLeft.innerText = "A"; +// cardBack.appendChild(cardBtmLeft); + +// const cardTop = document.createElement('div'); +// cardTop.classList.add('card-face-top'); +// fakeCardFace.appendChild(cardTop); + +// const cardTopLeft = document.createElement('div'); +// cardTopLeft.classList.add('card-face-top-left'); +// cardTopLeft.innerText = "A"; +// cardTop.appendChild(cardTopLeft); + +// const cardTopRight = document.createElement('div'); +// cardTopRight.classList.add('card-face-top-right'); +// cardTopRight.innerText = "A"; +// cardTop.appendChild(cardTopRight); + +// const cardFaceInfo = document.createElement('div'); +// cardFaceInfo.classList.add('card-face-info'); +// fakeCardFace.appendChild(cardFaceInfo); + +// const cardBtm = document.createElement('div'); +// cardBtm.classList.add('card-face-btm'); +// fakeCardFace.appendChild(cardBtm); + +// const cardBtmLeft = document.createElement('div'); +// cardBtmLeft.classList.add('card-face-btm-left'); +// cardBtmLeft.innerText = "A"; +// cardBtm.appendChild(cardBtmLeft); + +// const cardBtmRight = document.createElement('div'); +// cardBtmRight.classList.add('card-face-btm-right'); +// cardBtmRight.innerText = "A"; +// cardBtm.appendChild(cardBtmRight); + +const spawnCard2 = (cardInfo) => { + const suit = document.createElement('div'); + suit.classList.add('suit'); + suit.innerText = cardInfo.suitSymbol; + + const name = document.createElement('div'); + name.classList.add('name', cardInfo.colour); + name.innerText = cardInfo.displayName; + // name.innerText = `"QUEEN"`; + + + cardTopLeft.classList.add(cardInfo.colour); + cardTopLeft.innerHTML = cardInfo.displayName + "
" + cardInfo.suitSymbol; + // cardTopRight.classList.add(cardInfo.colour); + // cardTopRight.innerText = cardInfo.displayName; + // cardBtmLeft.classList.add(cardInfo.colour); + // cardBtmLeft.innerText = cardInfo.displayName; + cardBtmRight.classList.add(cardInfo.colour); + cardBtmRight.innerHTML = cardInfo.displayName + "
" + cardInfo.suitSymbol; + + cardFaceInfo.appendChild(name); + cardFaceInfo.appendChild(suit); + + // fakeCardFace.appendChild(card); + + // return card; +}; + +// const difficultLife = spawnCard2(testCard); + +const testCard2 = { + name: "queen", + suit: "hearts", + suitSymbol: "♥️", + displayName: "Q", + colour: "red", + rank: 12, + }; + +const testRoyalFlushHand = [ + {name: "ace", suit: "hearts"}, + {name: "king", suit: "hearts"}, + {name: "queen", suit: "hearts"}, + {name: "jack", suit: "hearts"}, + {name: "10", suit: "hearts"}] + +const testStraightFlushHand = [ + {name: "3", rank: 3, suit: "hearts"}, + {name: "4", rank: 4, suit: "hearts"}, + {name: "6", rank: 6, suit: "hearts"}, + {name: "2", rank: 2, suit: "hearts"}, + {name: "5", rank: 5, suit: "hearts"}] + +const testStraightHand = [ + {name: "ace", rank: 1, suit: "hearts"}, + {name: "king", rank: 13, suit: "clubs"}, + {name: "queen", rank: 12, suit: "spades"}, + {name: "jack", rank: 11, suit: "hearts"}, + {name: "10", rank: 10, suit: "diamonds"}] + +const testFourKindHand = [ + {name: "3", suit: "spades"}, + {name: "4", suit: "heart"}, + {name: "3", suit: "diamonds"}, + {name: "3", suit: "heart"}, + {name: "3", suit: "clubs"}] + +const testJacksBetterHand = [ + {name: "jack", suit: "spades"}, + {name: "4", suit: "heart"}, + {name: "jack", suit: "diamonds"}, + {name: "3", suit: "heart"}, + {name: "3", suit: "clubs"}] + +const testFullHouseHand = [ + {name: "3", rank: 3, suit: "hearts"}, + {name: "3", rank: 3, suit: "spades"}, + {name: "2", rank: 2, suit: "clubs"}, + {name: "3", rank: 3, suit: "clubs"}, + {name: "2", rank: 2, suit: "hearts"}] \ No newline at end of file From c9294bd21a40cc752159e4f81d4edb4fe12e05c1 Mon Sep 17 00:00:00 2001 From: eatplastik <3503345+eatplastik@users.noreply.github.com> Date: Tue, 19 Oct 2021 01:45:45 +0800 Subject: [PATCH 2/4] added BSOD feature --- helper.js | 75 ++++++++++++++++++++++++++++++++++++++++++++++---- index.html | 17 ++++++++++-- script.js | 18 +++++++++--- style.css | 47 +++++++++++++++++++++++++++++-- test.js | 81 ++++++++++++++++++++++++++++++++++++++++++++---------- 5 files changed, 209 insertions(+), 29 deletions(-) diff --git a/helper.js b/helper.js index 68b501f9..b203a9f3 100644 --- a/helper.js +++ b/helper.js @@ -262,8 +262,8 @@ const checkJacksBetter = (playerHand) => { const createCard = (cardInfo) => { const suit = document.createElement('div'); - suit.classList.add('suit', cardInfo.colour); - suit.innerText = cardInfo.suitSymbol; + suit.classList.add('suit-elements', cardInfo.colour); + // suit.innerText = cardInfo.suitSymbol; const name = document.createElement('div'); name.classList.add('name', cardInfo.colour); @@ -280,11 +280,13 @@ const createCard = (cardInfo) => { // name.classList.add('court'); } else { - name.innerText = cardInfo.displayName; - // name.innerText = `"QUEEN"`; + // name.innerText = cardInfo.displayName; + for (let i = 0; i < cardInfo.rank; i++) { + suit.innerText += " " + cardInfo.suitSymbol; } - + } + const card = document.createElement('div'); card.classList.add('card-face-container'); document.body.appendChild(card); @@ -436,3 +438,66 @@ const getGreeting = () => { return "time does not exist"; } } + +// --------------------------------------------------------- +// DECK CHECKER - checks if deck is running out +// --------------------------------------------------------- + +/** + * Checks remaining cards in dealer's deck + * @constructor + */ +const deckChecker = () => { + console.log('current deck length: ' + cardDeck.length); + if (cardDeck.length < 10) { + cardDeck = []; + cardDeck = shuffleCards(makeDeck()); + console.log('new deck length: ' + cardDeck.length); + } +} + +/** + * Blue Screen of Death + * @constructor + * @param {number} currentPoints - User points + */ +const bsod = (currentPoints) => { + + if (currentPoints <= 0) { + gameContainer.innerHTML = ""; + document.getElementById("scroller-top").innerHTML = ""; + document.getElementById("scroller-btm").innerHTML = ""; + + let timeLeft = 9; + const delay = 1000; + const secsLeft = document.createElement('div'); + secsLeft.classList.add("countdown"); + secsLeft.innerText = "10"; + + + const shutDown = setInterval(() => { + secsLeft.innerText = timeLeft; + timeLeft--; + + if (timeLeft === 0) { + clearInterval(shutDown); + } + }, delay); + + const death = document.createElement('div'); + death.classList.add('bsod'); + death.innerHTML = + `A gambling problem has been detected and Video Poker will shut down to prevent damage to the user.
If this is the first time you've seen this stop error screen, restart your computer. if this screen appears again, follow these steps:

+ +Check to make sure any new hardware or software is properly installed. If this is a new installation, ask your hardware or software manufacturer for and Windows updates you might need.

+ +If problems continue, disable or remove any newly installed hardware or software. Disable BIOS memory options such as caching or shadowing. If you need to use Safe Mode to remove or disable components, restart your computer, press F8 to select Advanced Startup Options, and then select Safe Mode.

+ +Technical information: Error Code: YOU_ARE_ADDICTED_TO_VIDEO_POKER *** STOP: 0x000000FE (0x00000008, 0x000000006, 0x00000009, 0x847075cc)` + document.body.appendChild(death); + + document.body.appendChild(secsLeft); + + setTimeout( function() { window.close(); }, 10000); +} +} \ No newline at end of file diff --git a/index.html b/index.html index 78ed7816..b2e8de25 100644 --- a/index.html +++ b/index.html @@ -3,16 +3,27 @@ - + Video Poker - ~* WeLcOmE 2 ViDeO pOkEr *~ +

+ ~* WeLcOmE 2 ViDeO pOkEr *~ +
+ - i aM dEpReCaTeD HTML tAg :(" + +
+ i aM dEpReCaTeD hTmL tAg :( +
diff --git a/script.js b/script.js index 5b168e0b..efcb15d4 100644 --- a/script.js +++ b/script.js @@ -106,7 +106,11 @@ const swapCard = () => { gameInfo.innerHTML = `You ${userWin}
Click DEAL to try again` } }; - +/** + * Calculate hand score + * @constructor + * @param {Array} currentHand - Array of cards + */ const calcHandScore = (currentHand) => { if (checkRoyalFlush(currentHand) === true) { @@ -167,6 +171,9 @@ const calcHandScore = (currentHand) => { canDeal = true; console.log('user points: ', userPoints); pointsContainer.innerText = `You have: ${userPoints} points`; +console.log('current card deck length', cardDeck.length); +deckChecker(); +bsod(userPoints); } // Create a helper function for output to abstract complexity @@ -180,13 +187,16 @@ const output = (message) => { // ---------------------------------------------------------------- const initGame = () => { - gameInfo.innerText = "Good " + getGreeting() + ', click deal to get your first hand'; - console.log('game init'); + gameInfo.innerText = "Good " + getGreeting() + ', click DEAL to get your first hand'; + // console.log('game init'); + + canDeal = true; cardDeck = shuffleCards(makeDeck()); cardContainer.innerText = ""; userPoints = 100; + pointsContainer.innerText = `You have: ${userPoints} points`; cardContainer.appendChild(cardBack); @@ -195,7 +205,7 @@ const initGame = () => { }; }; -initGame(); +initGame(); resetButton.addEventListener('click', () => initGame()); diff --git a/style.css b/style.css index e9bd1989..86cd31d8 100644 --- a/style.css +++ b/style.css @@ -17,6 +17,14 @@ marquee { color: white; } +#scroller-top { + padding: 0px; +} + +#scrooer-btm { + padding: 0px; +} + button { color: white; font-family: "Comic Sans MS"; @@ -33,6 +41,7 @@ button { flex-direction: column; flex-wrap: wrap; margin: auto; + max-width: 100%; /* border: 1px solid black; */ padding: 20px; } @@ -146,10 +155,21 @@ button { font-size: 28px; } +/* Generates number of suit symbols */ +.suit-elements { + display: inline-flexbox; + flex-wrap: wrap; + padding: 0px 12px 0px 12px; + margin: 0px; + font-size: 16px; + text-align: center; +} + .name { margin: 5px; - font-size: 24px; + font-size: 20px; font-weight: bold; + text-justify: distribute; } .court { @@ -166,7 +186,9 @@ button { .card-container { display: flex; - max-width: max-content; + /* flex-direction: column; */ + flex-wrap: wrap; + max-width: 100%; /* background-color: white; */ /* border: 1px solid white; */ margin: 10px; @@ -181,6 +203,7 @@ button { .message { color: white; + padding: 10px; } .points { @@ -191,3 +214,23 @@ button { top: 50px; */ color: white; } + +.bsod { + display: flex; + justify-content: space-evenly; + width: 90%; + height: 100%; + text-align: left; + font-family: "Comic Sans MS"; + font-size: 20px; + color: white; + padding: 50px; +} + +.countdown { + /* display: flex; */ + align-items: center; + font-size: 60px; + color: white; + text-align: center; +} diff --git a/test.js b/test.js index d6c0e3ff..85a7e7c5 100644 --- a/test.js +++ b/test.js @@ -13,12 +13,21 @@ const { sort } = require("prelude-ls"); const testCard = { name: "queen", suit: "heart", - suitSymbol: "♥️", + suitSymbol: "♥", displayName: "Q", colour: "red", rank: 12, }; +const testCard1 = { + name: "10", + suit: "heart", + suitSymbol: "♥", + displayName: "10", + colour: "red", + rank: 10, + }; + // const fakeCard = document.createElement('div'); // fakeCard.innerText = "fake card"; @@ -103,33 +112,75 @@ const getCardInfo = () => { const spawnCard2 = (cardInfo) => { const suit = document.createElement('div'); - suit.classList.add('suit'); - suit.innerText = cardInfo.suitSymbol; + suit.classList.add('suit-elements', cardInfo.colour); - const name = document.createElement('div'); - name.classList.add('name', cardInfo.colour); - name.innerText = cardInfo.displayName; - // name.innerText = `"QUEEN"`; + for (let i = 0; i < cardInfo.rank; i++) { + suit.innerText += " " + cardInfo.suitSymbol; + } + + // const name = document.createElement('div'); + // name.classList.add('name', cardInfo.colour); + + // if (cardInfo.displayName === "J") { + // name.innerText = `"jack"`; + // // name.classList.add('court'); + // } else if (cardInfo.displayName === "Q") { + // name.innerText = `"queen"`; + // // name.classList.add('court'); + + // } else if (cardInfo.displayName === "K") { + // name.innerText = `"king"`; + // // name.classList.add('court'); + + // } else { + // name.innerText = cardInfo.displayName; + // // name.innerText = `"QUEEN"`; + // } + + const card = document.createElement('div'); + card.classList.add('card-face-container'); + document.body.appendChild(card); + + const cardTop = document.createElement('div'); + cardTop.classList.add('card-face-top'); + card.appendChild(cardTop); + + const cardTopLeft = document.createElement('div'); + cardTopLeft.classList.add('card-face-top-left'); + card.appendChild(cardTopLeft); + + const cardFaceInfo = document.createElement('div'); + cardFaceInfo.classList.add('card-face-info'); + card.appendChild(cardFaceInfo); + + const cardBtm = document.createElement('div'); + cardBtm.classList.add('card-face-btm'); + card.appendChild(cardBtm); + + const cardBtmRight = document.createElement('div'); + cardBtmRight.classList.add('card-face-btm-right'); + cardBtm.appendChild(cardBtmRight); cardTopLeft.classList.add(cardInfo.colour); cardTopLeft.innerHTML = cardInfo.displayName + "
" + cardInfo.suitSymbol; - // cardTopRight.classList.add(cardInfo.colour); - // cardTopRight.innerText = cardInfo.displayName; - // cardBtmLeft.classList.add(cardInfo.colour); - // cardBtmLeft.innerText = cardInfo.displayName; + cardBtmRight.classList.add(cardInfo.colour); cardBtmRight.innerHTML = cardInfo.displayName + "
" + cardInfo.suitSymbol; - cardFaceInfo.appendChild(name); + + // card.appendChild(name); + card.appendChild(suit); + + // cardFaceInfo.appendChild(name); cardFaceInfo.appendChild(suit); - // fakeCardFace.appendChild(card); + cardContainer.appendChild(card); - // return card; + return card; }; -// const difficultLife = spawnCard2(testCard); +// const difficultLife = spawnCard2(testCard1); const testCard2 = { name: "queen", From 8a8d2f2b9f8022dbba3bab991dc0ab146dcdeead Mon Sep 17 00:00:00 2001 From: eatplastik <3503345+eatplastik@users.noreply.github.com> Date: Tue, 19 Oct 2021 01:48:12 +0800 Subject: [PATCH 3/4] added eslint, package-lock --- .eslintrc.js | 6 + package-lock.json | 2546 +++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 2351 insertions(+), 201 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 2567d5f9..d554a961 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -21,4 +21,10 @@ module.exports = { // Allow function param reassign for array or object elements or properties 'no-param-reassign': ['error', { props: false }], }, + options: { + 'prefer-const': ['error', { + destructuring: 'any', + ignoreReadBeforeAssign: false, + }], + }, }; diff --git a/package-lock.json b/package-lock.json index 7c1c09b9..d6d09e05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,35 +1,2158 @@ { "name": "video-poker-swe1", "version": "1.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "video-poker-swe1", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "eslint": "^7.6.0", + "eslint-config-airbnb-base": "^14.2.0", + "eslint-plugin-import": "^2.22.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/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=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-includes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", + "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", + "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", + "integrity": "sha512-KbS1Y0jMtyPgIxjO7ZzMAuUpAKMt1SzCL9fsrKsX6b0zJPTaT0SiSPmewwVZg9UAO83HVIlEhZF84LIjZ0lmAw==", + "dev": true + }, + "node_modules/contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.0.tgz", + "integrity": "sha512-Snswd5oC6nJaevs3nZoLSTvGJBvzTfnBqOIArkf3cbyTyq9UD79wOk8s+RiL6bhca0p/eRO6veczhf6A/7Jy8Q==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.9", + "object.assign": "^4.1.0", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", + "eslint-plugin-import": "^2.21.2" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz", + "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "resolve": "^1.13.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-module-utils": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz", + "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-module-utils/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-import": { + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz", + "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.1", + "array.prototype.flat": "^1.2.3", + "contains-path": "^0.1.0", + "debug": "^2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "^0.3.4", + "eslint-module-utils": "^2.6.0", + "has": "^1.0.3", + "minimatch": "^3.0.4", + "object.values": "^1.1.1", + "read-pkg-up": "^2.0.0", + "resolve": "^1.17.0", + "tsconfig-paths": "^3.9.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "dependencies": { + "esutils": "^2.0.2", + "isarray": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz", + "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", + "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/object-inspect": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz", + "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz", + "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.0", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.2.tgz", + "integrity": "sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.entries/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "dependencies": { + "pify": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "dependencies": { + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz", + "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", + "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", + "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart/node_modules/es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "dependencies": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz", + "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz", + "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + }, "dependencies": { "@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { "@babel/highlight": "^7.10.4" } }, "@babel/helper-validator-identifier": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", - "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "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==", "dev": true }, "@babel/highlight": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", - "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -40,27 +2163,64 @@ "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "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=", + "dev": true } } }, "@eslint/eslintrc": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz", - "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.1.1", "espree": "^7.3.0", - "globals": "^12.1.0", + "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", "js-yaml": "^3.13.1", - "lodash": "^4.17.19", "minimatch": "^3.0.4", "strip-json-comments": "^3.1.1" } }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -74,10 +2234,11 @@ "dev": true }, "acorn-jsx": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", - "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", - "dev": true + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} }, "ajv": { "version": "6.12.6", @@ -98,18 +2259,18 @@ "dev": true }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "argparse": { @@ -185,9 +2346,9 @@ } }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "balanced-match": { @@ -222,30 +2383,6 @@ "supports-color": "^7.1.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -264,18 +2401,18 @@ } }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "concat-map": { @@ -308,9 +2445,9 @@ } }, "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { "ms": "2.1.2" @@ -341,9 +2478,9 @@ } }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "enquirer": { @@ -396,35 +2533,38 @@ } }, "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=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "eslint": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz", - "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@eslint/eslintrc": "^0.1.3", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", "eslint-scope": "^5.1.1", "eslint-utils": "^2.1.0", "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.0", - "esquery": "^1.2.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", @@ -432,7 +2572,7 @@ "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", - "lodash": "^4.17.19", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", @@ -441,7 +2581,7 @@ "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", - "table": "^5.2.3", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" } @@ -593,13 +2733,13 @@ "dev": true }, "espree": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz", - "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { "acorn": "^7.4.0", - "acorn-jsx": "^5.2.0", + "acorn-jsx": "^5.3.1", "eslint-visitor-keys": "^1.3.0" }, "dependencies": { @@ -618,9 +2758,9 @@ "dev": true }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -682,12 +2822,12 @@ "dev": true }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "find-up": { @@ -700,20 +2840,19 @@ } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", "dev": true }, "fs.realpath": { @@ -735,9 +2874,9 @@ "dev": true }, "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -749,21 +2888,21 @@ } }, "glob-parent": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", - "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "graceful-fs": { @@ -794,9 +2933,9 @@ "dev": true }, "hosted-git-info": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "ignore": { @@ -806,9 +2945,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -862,15 +3001,15 @@ "dev": true }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -925,9 +3064,9 @@ "dev": true }, "js-yaml": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", - "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -987,10 +3126,22 @@ "path-exists": "^3.0.0" } }, - "lodash": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", - "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, "minimatch": { @@ -1008,15 +3159,6 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1222,9 +3364,9 @@ "dev": true }, "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-type": { @@ -1296,6 +3438,12 @@ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, "resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -1312,9 +3460,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -1342,14 +3490,14 @@ "dev": true }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, "spdx-correct": { @@ -1391,31 +3539,14 @@ "dev": true }, "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, "string.prototype.trimend": { @@ -1481,12 +3612,12 @@ } }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } }, "strip-bom": { @@ -1511,15 +3642,37 @@ } }, "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.2.tgz", + "integrity": "sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g==", "dev": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.6.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.3.tgz", + "integrity": "sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } } }, "text-table": { @@ -1550,15 +3703,15 @@ } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "uri-js": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", - "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -1600,15 +3753,6 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true - }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } } } } From f4c1d10193aefeb0d7f1c3d58415bb7f4f99a769 Mon Sep 17 00:00:00 2001 From: eatplastik <3503345+eatplastik@users.noreply.github.com> Date: Tue, 19 Oct 2021 17:07:55 +0800 Subject: [PATCH 4/4] general tidying, added jsdoc annotation --- global.js | 3 +-- helper.js | 36 ++++++++++++++++++++++++++++-------- script.js | 21 ++------------------- style.css | 34 ---------------------------------- test.js | 8 -------- 5 files changed, 31 insertions(+), 71 deletions(-) diff --git a/global.js b/global.js index 7d297b34..eb0ced4a 100644 --- a/global.js +++ b/global.js @@ -59,7 +59,7 @@ const swapButton = document.createElement('button'); swapButton.innerText = "SWAP"; buttons.appendChild(swapButton); -// New button +// Reset game button const resetButton = document.createElement('button'); resetButton.innerText = "RESET"; buttons.appendChild(resetButton); @@ -67,4 +67,3 @@ buttons.appendChild(resetButton); const cardBack = document.createElement('div'); cardBack.classList.add('card-back'); cardBack.innerHTML = "Be a quitter :" + "
" + "1800-6-668-668"; -// document.body.appendChild(cardBack); diff --git a/helper.js b/helper.js index b203a9f3..e1deaf17 100644 --- a/helper.js +++ b/helper.js @@ -1,5 +1,5 @@ // --------------------------------------------------------- -// HELPER FUNCTIONS WIN CONDITIONS +// HELPER FUNCTIONS FOR WIN CONDITIONS // --------------------------------------------------------- // 1) ROYAL FLUSH - ACE HIGH STRAIGHT FLUSH -- checked and working @@ -107,8 +107,6 @@ const checkFlush = (playerHand) => { // 6) STRAIGHT (SQUENTIAL RANK) -// need 1 condition that checks for AKQJ10 -// rest can be determined just through rank const checkStraight = (playerHand) => { // Extract ranks from player's hand and sort them in ascending order @@ -259,7 +257,11 @@ const checkJacksBetter = (playerHand) => { // HELPER FUNCTIONS FOR CARD FACE GENERATION // --------------------------------------------------------- - +/** + * Generates card face + * @constructor + * @param {object} cardInfo + */ const createCard = (cardInfo) => { const suit = document.createElement('div'); suit.classList.add('suit-elements', cardInfo.colour); @@ -336,10 +338,18 @@ const createCard = (cardInfo) => { // HELPER FUNCTIONS FOR CARD DECK GENERATION // --------------------------------------------------------- -// Get a random index ranging from 0 (inclusive) to max (exclusive). +/** + * Get a random index ranging from 0 (inclusive) to max (exclusive) + * @constructor + * @param {number} max + */ const getRandomIndex = (max) => Math.floor(Math.random() * max); -// Shuffle an array of cards +/** + * Shuffle an array of cards + * @constructor + * @param {Array} cards + */ const shuffleCards = (cards) => { // Loop over the card deck array once for (let currentIndex = 0; currentIndex < cards.length; currentIndex += 1) { @@ -357,6 +367,10 @@ const shuffleCards = (cards) => { return cards; }; +/** + * Generates deck of 52 cards + * @constructor + */ const makeDeck = () => { // Initialise an empty deck array const newDeck = []; @@ -409,12 +423,10 @@ const makeDeck = () => { colour: suitColour, rank: rankCounter, }; - // Add the new card to the deck newDeck.push(card); } } - // Return the completed card deck return newDeck; }; @@ -423,6 +435,10 @@ const makeDeck = () => { // HELPER FUNCTION FOR GREETING // --------------------------------------------------------- +/** + * Gets time of day + * @constructor + */ const getGreeting = () => { let today = new Date(); let time = today.getHours(); @@ -456,6 +472,10 @@ const deckChecker = () => { } } +// --------------------------------------------------------- +// BSOD - totally unnecessary feature +// --------------------------------------------------------- + /** * Blue Screen of Death * @constructor diff --git a/script.js b/script.js index efcb15d4..bb5ca0bc 100644 --- a/script.js +++ b/script.js @@ -4,7 +4,6 @@ * */ - const dealCards = () => { if (canDeal === true) { cardContainer.innerText = ""; @@ -63,13 +62,9 @@ const selectCard = (cardIndex) => { // cardsToSwap = cardsToSwap.filter((desel) => desel !== i) cardsToSwap = cardsToSwap.filter((desel) => desel !== cardIndex) - - // DOM MAKE THE CARD REAPPEAR - } else { console.log("you selected this card to discard, it will leave your hand"); cardsToSwap.push(cardIndex); - // DOM MAKE THE CARD VANISH } // } @@ -93,7 +88,6 @@ const swapCard = () => { } console.log("new user hand: ", userHand) console.log("new user hand length: ", userHand.length); - // REPOPULATE PLAYERS HAND ON DOM cardContainer.innerText = ""; @@ -117,56 +111,45 @@ const calcHandScore = (currentHand) => { userWin = "royal flush"; if (userBet === 5) { userPoints += 4000; - // return userWin; } else { userPoints += (userBet * 250); console.log(userWin); - // return userWin; } } else if (checkStraightFlush(currentHand) === true) { userWin = "got straight flush"; userPoints += (userBet * 50); console.log(userWin); - // return userWin; } else if (checkFourKind(currentHand) === true) { userWin = "got four of a kind"; userPoints += (userBet * 25); console.log(userWin); - // return userWin; } else if (checkFullHouse(currentHand) === true) { userWin = "got full house"; userPoints += (userBet * 9); console.log(userWin); - // return userWin; } else if (checkFlush(currentHand) === true) { userWin = "got flush"; userPoints += (userBet * 6); console.log(userWin); - // return userWin; } else if (checkStraight(currentHand) === true) { userWin = "got straight"; userPoints += (userBet * 4); console.log(userWin); - // return userWin; } else if (checkThreeKind(currentHand) === true) { userWin = "got three of a kind"; userPoints += (userBet * 3); console.log(userWin); - // return userWin; } else if (checkTwoPair(currentHand) === true) { userWin = "got two pair"; userPoints += (userBet * 2); console.log(userWin); - // return userWin; } else if (checkJacksBetter(currentHand) === true) { userWin = "got jacks or better"; userPoints += (userBet * 1); console.log(userWin); - // return userWin; } else { userWin = "lose (╯°□°)╯︵ ┻━┻"; console.log(userWin); - // return userWin; } canDeal = true; console.log('user points: ', userPoints); @@ -182,9 +165,9 @@ const output = (message) => { gameInfo.innerText = message; }; -// ---------------------------------------------------------------- +// ---------------------------------------------------------- // GAME INITIALISATION -// ---------------------------------------------------------------- +// ---------------------------------------------------------- const initGame = () => { gameInfo.innerText = "Good " + getGreeting() + ', click DEAL to get your first hand'; diff --git a/style.css b/style.css index 86cd31d8..f614e780 100644 --- a/style.css +++ b/style.css @@ -30,7 +30,6 @@ button { font-family: "Comic Sans MS"; font-weight: bold; background-color: transparent; - /* border: 1px solid white; */ width: 100px; display: inline-block; margin: 10px; @@ -42,24 +41,9 @@ button { flex-wrap: wrap; margin: auto; max-width: 100%; - /* border: 1px solid black; */ padding: 20px; } -/* .card { - margin: 10px; - padding: 10px; - background-color: white; - text-align: center; - border-radius: 8px; - border-style: outset; - border-width: 2px; - border-color: whitesmoke; - display: inline-block; -} */ - -/* CARD DISPLAY */ - .card-face-container { display: flex; /* flex-wrap: wrap; */ @@ -77,12 +61,10 @@ button { .card-face-top { display: flex; flex-direction: row; - /* border: 1px solid fuchsia; */ } .card-face-top-left { flex: 50%; - /* border: 1px solid white; */ height: 20px; width: 20px; } @@ -90,7 +72,6 @@ button { .card-face-top-right { flex: 50%; text-align: right; - /* border: 1px solid white; */ height: 20px; width: 20px; } @@ -105,28 +86,23 @@ button { .card-face-btm { display: flex; flex-direction: row; - /* border: 1px solid red; */ } .card-face-btm-left { flex: 50%; flex-direction: column; - /* border: 1px solid white; */ height: 20px; } .card-face-btm-right { flex: 50%; text-align: center left; - /* border: 1px solid white; */ height: 20px; - /* transform: rotate(); */ transform: rotate(180deg); } .card-back { display: flex; - /* flex-wrap: wrap; */ flex-direction: column; justify-content: space-between; margin: 10px; @@ -145,11 +121,8 @@ button { background-color: blue; fill: blue; color: blue; - /* display: inline-block; */ } -/* ^^ CARD DISPLAY ^^ */ - .suit { margin: 5px; font-size: 28px; @@ -186,18 +159,14 @@ button { .card-container { display: flex; - /* flex-direction: column; */ flex-wrap: wrap; max-width: 100%; - /* background-color: white; */ - /* border: 1px solid white; */ margin: 10px; } .buttons { display: flex; flex-direction: row; - /* border: 1px solid yellow; */ margin: 10px; } @@ -210,8 +179,6 @@ button { display: flex; flex: row; margin: 10px; - /* left: 50px; - top: 50px; */ color: white; } @@ -228,7 +195,6 @@ button { } .countdown { - /* display: flex; */ align-items: center; font-size: 60px; color: white; diff --git a/test.js b/test.js index 85a7e7c5..6d55820e 100644 --- a/test.js +++ b/test.js @@ -4,12 +4,9 @@ /* WEIRD THINGS APPEARING WHENEVER I COPY AND PASTE CODE FROM W3SCHOOLS const { compare } = require("semver"); - -why the fuck is this here const { sort } = require("prelude-ls"); */ - const testCard = { name: "queen", suit: "heart", @@ -28,7 +25,6 @@ const testCard1 = { rank: 10, }; - // const fakeCard = document.createElement('div'); // fakeCard.innerText = "fake card"; // fakeCard.classList.add('card'); @@ -67,12 +63,8 @@ const getCardInfo = () => { // dummyCard.addEventListener('click', getCardInfo); - - // CARD FACE GENERATION - - // const cardBtmLeft = document.createElement('div'); // cardBtmLeft.classList.add('card-face-btm-left'); // cardBtmLeft.innerText = "A";