diff --git a/Match-Table-ID-Hand-wif-tests.xlsx b/Match-Table-ID-Hand-wif-tests.xlsx new file mode 100644 index 00000000..aa3c53e5 Binary files /dev/null and b/Match-Table-ID-Hand-wif-tests.xlsx differ diff --git a/README.md b/README.md index 1d3a8a65..3601a067 100644 --- a/README.md +++ b/README.md @@ -1 +1,22 @@ # Rocket Academy Coding Bootcamp: Video Poker + +Description +- A single player 5-card poker card game, based on 'Chicago' rules using points instead of game money. + +- Designed to be a mobile mini game first in portrait mode. + - layout of visual elements try to follow as much as possible, ergonomic principles when playing this game on mobile phone, and to try to make sure that user doesn't drop phone when playing this game. + - where possible, black is used to conserve OLED and IPS display current consumption. + +- also features rigourous logic to minimise false positive or false negative error results when checking player's hand for winning combinations. + + +To be added/changed: +- card dealing animations; +- card exchanging animations; +- sound effects for button presses; +- additional banner display for certain very hard to get winning card combinations +- background instrumental music; +- 'tutorial' mode - allows player to see through all the possible winning combinations they can strive for; +- computer opponent against P1? +- amend table(green) background to shift theme further away from casino look. + \ No newline at end of file diff --git a/REV-styles.css b/REV-styles.css new file mode 100644 index 00000000..e17f164f --- /dev/null +++ b/REV-styles.css @@ -0,0 +1,190 @@ +body { + background-color: black; +/* background-image: url(./images/hearts-13.png); + background-size:300px 140px; */ +} + +.wrapper{ +display: flex; +align-self: center; +justify-content: center; +flex-direction: column; +width: 100vw; +border:2px solid white; + +} + +.banner{ + height: 5vh; + width: 100vw; + background-color: green; + border: 5px solid orange; + text-align: center; + font-size: 5vh; + color: white; +} + +.table{ + display: flex; + /* z-index: 2; */ + justify-content: center; + align-items: center; + background-color: green; + height: 25vh; + width: 100vw; + margin: 2vh 0vw 0vh 0vw; + padding: 0px; +} + +.msgCenter{ + display: flex; + justify-content: center; + align-content:flex-start; + background-color:yellow; + color:black; + height: 7vh; + text-align: center; + font-size: 3vh; +} + +.btnWrap{ + display: flex; + justify-content:space-between; + align-items:center; + height: 10vh; + margin:3px; + padding:0px; + border: 3px solid grey; +} + +.btnWrap2{ + display: flex; + justify-content:space-between; + align-items:center; + height: 10vh; + margin:0px; + padding:0px; + border: 3px solid yellow; +} + + +.btn{ +/* display: flex; + justify-content: center; */ + height: 4vh; + /* width: 25vw; */ + text-align: center; + padding:0px; + font-size:4vh; + margin: 0px; + padding: 0px; +} + +.bidInput{ +height:3.5vh; +width: 15vw; +font-size:4vh; +text-align: center; +padding-top: 13px; +padding-right:3px; +margin-right:10px; +} + +.bidContainer{ + display:flex; + justify-content: flex-end; + align-items:center; + border: 2px solid orange; +} + + + + +.cardHolder{ + display: flex; + justify-content:center; + align-items: center; + background-color:white; + background-image: url(./images/rbt2.png); + background-repeat: no-repeat; + background-position: center; + background-size:164px 228px; + background-repeat: no-repeat; + background-position: center; + margin: 14px 12px 14px 12px; + padding: 2px; +/* background-color:white; */ + width: 157px; + height: 220px; + text-align: center; + border-radius: 9px; + border: 1px solid black +} + +.cardImg{ + display: flex; + justify-self: center; + align-self: center; + z-index: 2; + border-radius: 9px; + +} + +.none{ + display: none; +} + +.fadeOut{ + opacity: 0.15; +} + +.showBack{ + display: flex; + opacity: 1; + background-color:white; + background-image: url(./images/rbt2.png); + background-repeat: no-repeat; + background-position: center; + background-size:164px 228px; + background-repeat: no-repeat; + background-position: center; + border-radius: 9px; + border: 1px solid black +} + +.holdLabel{ + display: flex; + z-index:5; /* z-index not working */ + opacity: 0.93; + background-color: rgb(223, 28, 28); + background-image: url(./images/z-label.png); + background-size:164px 228px; + background-repeat: no-repeat; + background-position: center; + border-radius: 9px; + border: 1px solid black + +} + +.cardCover{ + display: flex; + z-index:5;/* z-index not working */ + opacity: 1; + background-color: white; + background-image: url(./images/rbt2.png); + background-size:164px 228px; + background-repeat: no-repeat; + background-position: center; + border-radius: 9px; + border: 1px solid black + +} +/* for the user interface buttons use + * position: relative for the parent container + * position: absolute for the child + * these should hold in the fixed position in the container + * regardless of window magnification and scrolling + * source: https://css-tricks.com/absolute-positioning-inside-relative-positioning/* / + + /* reset button- consider using position: fixed + * to keep button stuck in the viewport even if the window scrolls*/ \ No newline at end of file diff --git a/checkHandFns.js b/checkHandFns.js new file mode 100644 index 00000000..a2469750 --- /dev/null +++ b/checkHandFns.js @@ -0,0 +1,366 @@ +/* ===================================== + * ---CHECK WINNING HAND COMBINATIONS--- + * ===================================== */ + +/* FN: ROYAL FLUSH */ +const checkRoyalFlush = (hand) => { + let answer = false; + const handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + if ( checkFlush(handClone) === true + && handClone[0].rank === 13 + && handClone[1].rank === 12 + && handClone[2].rank === 11 + && handClone[3].rank === 10 + && handClone[4].rank === 1) { + answer = true; + } +return answer; +}; + +/* FN: STRAIGHT FLUSH */ +const checkStrFlush = (hand) => { + let answer = false; + const handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + if (checkFlush(handClone) === true + && checkSequential(handClone) === true) { + answer = true; + } + return answer; +}; + +/* FN: 4-OF-A-KIND */ +const checkQuads = (hand) => { + let answer = false; + for (let i = 0; i < hand.length; i += 1) { + console.log('LOOP NUMBER =', i); + let handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + handClone.splice(i, 1); + let handRanks = []; + for (let j = 0; j < handClone.length; j += 1) { + handRanks.push(handClone[j].rank); + console.log('handRanks =', handRanks); + } + const handRankSet = new Set(handRanks); + console.log('handRankSet =', handRankSet); + if (handRankSet.size === 1) { + answer = true; + } + } + return answer; +}; + +/* FN: CHECK FOR FULL HOUSE (1 Triplet + 1 Pair) */ +/* 3-of-a-kind position is grouped to 1 Pair position, use checkTriplet coding to build. */ +/* once confirm triplet is present, subtract and use set to check? */ +const checkFullHouse = (hand) => { + let answer = false; + /* there are 2 tiers to check for full house */ + /* each tier works of a primary check function */ + let tier1Triplets = 0; + let tier1pairs = 0; + let tier1FullHouse= 0; + let tier2Triplets = 0; + let tier2pairs = 0; + let tier2FullHouse = 0; + let handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + /* Tier 1, combi 1, 2, 3, in excel diagram */ + for (let i = 0; i < handClone.length - 2; i += 1) { + let cloneFirst = JSON.parse(JSON.stringify(handClone)); + console.log('tier1 LOOP ', i); + console.log('cloneInner =', cloneFirst); + + if (cloneFirst[i].rank === cloneFirst[i + 1].rank + && cloneFirst[i + 1].rank === cloneFirst[i + 2].rank) { + tier1Triplets += 1; + console.log('triplet count =', tier1Triplets); + /* if 1 triplet is found, proceed to check if remaining 2 cards form a pair */ + /* , is remainder 2 cards = pair, return full house is true */ + cloneFirst.splice(i, 3); + console.log('tier1 remainders = ', cloneFirst); + let remainderT1Ranks = []; + + /* loop for parsing ranks of remainder into an array for ranks */ + for(let j = 0; j < cloneFirst.length; j += 1) { + remainderT1Ranks.push(cloneFirst[j].rank); + } + let remainderT1 = new Set(remainderT1Ranks); + console.log('remainderT1 =', remainderT1); + if (remainderT1.size === 1) { + tier1pairs += 1; + tier1FullHouse += 1; + /* console.log('=> tier1pairs count =', tier1pairs); */ + /* console.log('====> tier1FullHouse count =', tier1FullHouse); */ + } else { + tier1pairs += 0; + tier1FullHouse += 0; + /* console.log('=> tier1pairs count =', tier1pairs); */ + /* console.log('====> tier1FullHouse count =', tier1FullHouse); */ + } + } + } + console.log('=> tier1pairs count =', tier1pairs); + console.log('====> tier1FullHouse count =', tier1FullHouse); + /* Tier 2, combi 4, 5, 6 in excel diagram */ + for (let j = 1; j < handClone.length - 2; j += 1) { + let cloneSecond = JSON.parse(JSON.stringify(handClone)); + if (cloneSecond[0].rank === cloneSecond[j] + && cloneSecond[j] === cloneSecond[4]) { + tier2Triplets += 1; + console.log('tier2 LOOP ', j); + console.log('cloneSecond =', cloneSecond); + console.log('Tier 2 triplet count =', tier2Triplets); + /* if 1 triplet is found, proceed to check if remaining 2 cards form a pair */ + /* , is remainder 2 cards = pair, return full house is true */ + /* loop for parsing ranks of remainder into an array for ranks */ + if (j === 1) { + let tier2Rmdr = []; + tier2Rmdr.push(cloneSecond[2].rank); + tier2Rmdr.push(cloneSecond[3].rank); + console.log('tier2 remainders =', tier2Rmdr); + let remainderT2 = new Set(tier2Rmdr); + if (remainderT2.size === 1) { + tier2pairs += 1; + tier2FullHouse += 1; + } else { + tier2pairs += 0; + tier2FullHouse += 0; + } + } + if (j === 2) { + let tier2Rmdr = []; + tier2Rmdr.push(cloneSecond[1].rank); + tier2Rmdr.push(cloneSecond[3].rank); + console.log('tier2 remainders =', tier2Rmdr); + let remainderT2 = new Set(tier2Rmdr); + if (remainderT2.size === 1) { + tier2pairs += 1; + tier2FullHouse += 1; + } else { + tier2pairs += 0; + tier2FullHouse += 0; + } + } + if (j === 3) { + let tier2Rmdr = []; + tier2Rmdr.push(cloneSecond[1].rank); + tier2Rmdr.push(cloneSecond[2].rank); + console.log('tier2 remainders =', tier2Rmdr); + let remainderT2 = new Set(tier2Rmdr); + if (remainderT2.size === 1) { + tier2pairs += 1; + tier2FullHouse += 1; + } else { + tier2pairs += 0; + tier2FullHouse += 0; + } + } + } + } + console.log('=> tier2pairs count =', tier2pairs); + console.log('====> tier2FullHouse count =', tier2FullHouse); + + if (tier1FullHouse === 0 && tier2FullHouse === 0) { + answer = false; + } else if (tier1FullHouse === 1 && tier2FullHouse === 1) { + answer = false; + } else if (tier1FullHouse === 1 && tier2FullHouse === 0) { + answer = true; + } else if (tier1FullHouse === 0 && tier2FullHouse === 1) { + answer = true; + } + + return answer; +}; + +/* FN: CHECK FLUSH */ +/* sequentials === FALSE && FLUSH ==== TRUE */ +const checkFlush = (hand) => { + let answer = false; + const handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + if (checkSameRank(handClone) === true + && checkSequential(handClone) === false) { + answer = true; + } + return answer; +}; + +/* FN: CHECK STRAIGHT */ +/* sequentials === TRUE && FLUSH ==== FALSE */ +const checkStraight = (hand) => { + let answer = false; + const handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + if (checkSameRank(handClone) === false + && checkSequential(handClone) === true) { + answer = true; + } + return answer; +}; + +/* FN: CHECK 3-of-a-Kind PAIRS */ +/* checkQuads === FALSE and checkTriplets === True */ +const check3OfAKind = (hand) => { + let answer = false; + const handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + if (checkQuads(handClone) === false + && checkTriplets(handClone) === true) { + answer = true; + } + return answer; +}; + +/* FN: CHECK 2 PAIRS */ +/* checkQuads === FALSE and countPairs === 2 */ +const check2Pairs = (hand) => { +let answer = false; +const handClone = JSON.parse(JSON.stringify(hand)); +sortRank(handClone); +if (checkQuads(handClone) === false + && countPairs(handClone) === 2) { + answer = true; +} +return answer; +}; + +/* FN: CHECK 1 PAIR */ +/* checkQuads === FALSE and countPairs === 2 */ +const check1Pair = (hand) => { + let answer = false; + let tier1 = false; + let tier2 = false; + const handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + + /* check no quads and only 1 pair */ + if (checkQuads(handClone) === false + && countPairs(handClone) === 1) { + tier1 = true; + console.log('tier1 = ', tier1); + } else { + tier1 = false; + console.log('tier1 = ', tier1); + } + + /* check no triplets */ + if (checkTriplets(handClone) === false) { + tier2 = true; + console.log('tier2 = ', tier2); + } else { + tier2 = false; + console.log('tier2 = ', tier2); + } + if (tier1 === true && tier2 === true) { + answer = true; + } + return answer; + }; + + +/* FN: CHECK HIGHCARD */ +/* NO REPEATS (PAIR/, 2PAIRS,TRIPLETS, QUADS) */ +/* NO SIMULT REPEATS (FULL HOUSE) */ +/* NO SEQUENTIALS */ +/* NO SAME SUITS */ +const checkHighCard = (hand) => { + let result = ''; + let score = 0; + let answer = false; + + /* tier 0: no same suit + no sequentials*/ + if (checkFlush(hand) === true && checkStraight(hand) === true) { + result = 'STRAIGHT FLUSH = TRUE'; + score += 0; + } else if (checkFlush(hand) === false && checkStraight(hand) === false) { + result = 'STRAIGHT FLUSH = FALSE'; + score += 1; + } + console.log('############## STAGE 0 CHECK ###> : ', result); + console.log('score =', score); + + /* tier 1: no same suit */ + if (checkFlush(hand) === true) { + result = 'FLUSH = TRUE'; + score += 0; + } else if (checkFlush(hand) === false) { + score += 1; + result = 'FLUSH = FALSE'; + } + console.log('############## STAGE 1 CHECK ###> : ', result); + console.log('score =', score); + + /* Tier 2: no sequentials */ + if (checkStraight(hand) === true) { + result = 'STRAIGHT = TRUE'; + score += 0; + } else if (checkStraight(hand) === false) { + result = 'STRAIGHT = FALSE'; + score += 1; + } + console.log('############## STAGE 2 CHECK ###> : ', result); + console.log('score =', score); + + /* Tier 3: no Royalflush */ + if (checkRoyalFlush(hand) === true) { + result = 'ROYAL FLUSH = TRUE'; + score += 0; + } else if (checkRoyalFlush(hand) === false) { + result = 'ROYAL FLUSH = FALSE'; + score += 1; + } + console.log('############## STAGE 3 CHECK ###> : ', result); + console.log('score =', score); + + /* Tier 4: no quads */ + if (checkQuads(hand) === true) { + result = 'QUADS = TRUE'; + score += 0; + } else if (checkQuads(hand) === false) { + result = 'QUADS = FALSE'; + score += 1; + } + console.log('############## STAGE 4 CHECK ###> : ', result); + console.log('score =', score); + + /* Tier 5: no triplets */ + if (checkTriplets(hand) === true) { + result = 'TRIPLETS = TRUE'; + score += 0; + } else if (checkTriplets(hand) === false) { + result = 'TRIPLETS = FALSE'; + score += 1; + } + console.log('############## STAGE 5 CHECK ###> : ', result); + console.log('score =', score); + + /* Tier 6: no doublePairs >>>> BUG PRESENT IN CONSOLE LOG <<<<<<< */ + if (check2pairs(hand) === true) { + result = '2 PAIRS = TRUE'; + score += 0; + } else if (check2pairs(hand) === false) { + result = '2 PAIRS = FALSE'; + score += 1; + } + console.log('############## STAGE 6 CHECK ###> : ', result); + console.log('score =', score); + + /* Tier 7: no single Pairs */ + if (check1Pair(hand) === true ) { + result = '1 PAIR = TRUE'; + score += 0; + } else if (check1Pair(hand) === false) { + result = '1 PAIR = FALSE'; + score += 1; + } + console.log('############## STAGE 7 CHECK ###> : ', result); + console.log('score = ', score); + if (score === 8) { + answer = true; + } + return answer; +}; \ No newline at end of file diff --git a/display2.js b/display2.js new file mode 100644 index 00000000..26db59da --- /dev/null +++ b/display2.js @@ -0,0 +1,156 @@ +/* ====================== */ +/* ---- GAME DISPLAY ---- */ +/* ====================== */ + +const tableEl = document.getElementById('tableEl'); + +const displayScore = document.getElementById('scoreBanner'); +displayScore.innerText = `${plyr1Pts} pts`; + +/* FN: PUT USER CLICKED CARDS ON HOLD */ +const applyHoldLabel = (cardImage) => { + const idOfPic = cardImage.id; + if(idOfPic === 'pic0') { + idOfCardHolder = 0; + } else if (idOfPic === 'pic1') { + idOfCardHolder = 1; + } else if (idOfPic === 'pic2') { + idOfCardHolder = 2; + } else if (idOfPic === 'pic3') { + idOfCardHolder = 3; + } else if (idOfPic === 'pic4') { + idOfCardHolder = 4; + } + + const cardHolderEl = document.getElementById(`${idOfCardHolder}`); + if (plyr1Hand[idOfCardHolder].hold === false) { + cardImage.classList.add('fadeOut'); + cardHolderEl.classList.add('holdLabel'); + plyr1Hand[idOfCardHolder].hold = true; + } +}; + +/* FN: REMOVE HOLD LABEL VIA JS */ +const removeHoldLabel = (hand) => { + for (let i = 0; i < hand.length; i += 1) { + if (plyr1Hand[i].hold === true) { + const cardHolderEl = document.getElementById(`${i}`); + cardHolderEl.classList.remove('holdLabel'); + + const cardImage = document.getElementById(`pic${i}`); + cardImage.classList.remove('fadeOut'); + plyr1Hand[i].hold = false; + } + } + return; +}; + +/* Mini FN: cover up cards that need to be swapped */ +const foldCards = (hand) => { + /* read the hand to get which cards will be discarded */ + for (let i = 0; i < hand.length; i += 1) { + if (hand[i].hold === false) { + discardIndexArr.push(i); + } + } + /* console.log ('Card Indexes to discard = ', discardIndexArr); */ + for (let j = 0; j < discardIndexArr.length; j += 1) { + const discardPicIndex = `pic${discardIndexArr[j]}`; + const discardPic = document.getElementById(discardPicIndex); + + const disContainerIndex = `${discardIndexArr[j]}`; + const disContainer = document.getElementById(disContainerIndex); + + disContainer.classList.add('showBack'); + discardPic.classList.add('none'); + } +}; + +/* Mini- FN: SWAP CARD and turn over the covered card */ +const swapCard = () => { +/* load new cards into discard pile */ + const discardPile = []; + for (let i = 0; i < discardIndexArr.length; i += 1) { + discardPile.push(shuffledDeck.pop()); + } + /* console.log ('discard Pile =', discardPile); */ + /* Below code: get card position indexes that need swapping from */ + /* discardArray and get their elements by id */ + for (let j = 0; j < discardIndexArr.length; j += 1) { + const discardPicIndex = `pic${discardIndexArr[j]}`; + const discardPic = document.getElementById(discardPicIndex); + + const disContainerIndex = `${discardIndexArr[j]}`; + console.log('Loop Number, j = ', j); + console.log('disContainerIndex =', disContainerIndex); + const disContainer = document.getElementById(disContainerIndex); + + /* expunge cardImage element from the selected cardHolder */ + disContainer.removeChild(discardPic); + /* carry out the swap function for the plyr1Hand array */ + /* plyr1Hand[disContainerIndex] = shuffledDeck.pop(); */ + const newCard = discardPile[j]; + const oldCard = plyr1Hand[disContainerIndex]; + plyr1Hand[disContainerIndex] = newCard; + discardPile[j] = oldCard; + console.log('discard Pile =', discardPile); + + /* based on new cardIndo, establish new CardImage in this */ + /* container per j */ + const cardImage = new Image(); /* 157, 220 */ + cardImage.classList.add('cardImg'); + cardImage.setAttribute('id', `pic${disContainerIndex}`); + cardImage.src = './images/' + plyr1Hand[disContainerIndex].suit + '-' + plyr1Hand[disContainerIndex].rank + '.png'; + disContainer.appendChild(cardImage); + } +return; +}; + +/* FN: REMOVE HOLD BANNER AND SHOW HELD CARDS AGAIN */ +/* plyr1Hand index is the same as cardContainerIndex */ +const unHoldCards = (hand) => { + for (let i = 0; i < hand.length; i += 1) { + if(hand[i].hold === true) { + const cardHolder = document.getElementById(`${i}`); + cardHolder.classList.remove('holdLabel'); + const cardImage = document.getElementById(`pic${i}`); + cardImage.classList.remove('fadeOut'); + cardImage.classList.add('cardImg'); + } + } + + /* after swap is completed, reset all cardInfo FOLD states to FALSE */ + for (let j = 0; j < hand.length; j += 1) { + plyr1Hand[j].hold = false; + } +}; +/* USER SHOULD STILL BE ABLE TO UN-HOLD CARDS AFTER HE/SHE HOLDs ON THEM TO MAKE CORRECTIONS */ + +/* FN: DEAL 5 CARDS TO SPECIFIED HAND */ +const deal5Cards = () => { + const prefix = './images/'; + + /* This is for the start of the game */ + /* use game states to lock this part step 1 = 5 cards */ + if (gameState === 0) { + for (let i = 0; i < handSize; i += 1) { + plyr1Hand.push(shuffledDeck.pop()); + cardHolder = document.createElement('div'); + cardHolder.classList.add('cardHolder'); + cardHolder.setAttribute('id', `${i}`); + tableEl.appendChild(cardHolder); + + const cardImage = new Image(157, 220); /* 157, 220 */ + cardImage.classList.add('cardImg'); + cardImage.setAttribute('id', `pic${i}`); + cardImage.src = prefix + plyr1Hand[i].suit + "-" + plyr1Hand[i].rank + ".png"; + cardImage.addEventListener('click', (event) => { + applyHoldLabel(event.currentTarget); + }); + cardHolder.appendChild(cardImage); + } + gameState = 1; + output("1) Click Card: HOLD. 2) Input Bid amount, press 'BID' to submit."); + } + return; +}; diff --git a/helper.js b/helper.js new file mode 100644 index 00000000..4ef5e935 --- /dev/null +++ b/helper.js @@ -0,0 +1,397 @@ +/* eslint-disable no-useless-return */ +/* eslint-disable no-else-return */ +/* ====================== + * ---HELPER FUNCTIONS--- + * ====================== */ + +/* FN: MESSAGE CENTER */ +const output = (message) => { + const msgCenter = document.getElementById('msgCenter'); + msgCenter.innerText = message; +}; + +/* FN: GEN RANDOM NUMBERS FOR ARRAY */ +const getRandomIndex = (size) => Math.floor(Math.random() * size); + +/* FN: FOR SHUFFLING */ +const shuffleCards = (cards) => { + for (let index = 0; index < cards.length; index += 1) { + const randomIndex = getRandomIndex(cards.length); + const currentItem = cards[index]; + const randomItem = cards[randomIndex]; + cards[index] = randomItem; + cards[randomIndex] = currentItem; + } + /* returns deck of shuffled cards */ + return cards; +}; + +/* FN: GENERATING A CARD DECK + * make a new deck by "deck = makeDeck()" */ +const makeDeck = () => { + const boxOf52Cards = []; + + /* make 52 cards + * rank 1-13 (1-10 and jack, queen, king and ace) - innermost loop? + * 1-4 suits hearts diamonds, clubs,spades -outtermost loop? */ + + /* Outermost loop for suits */ + let suitIndex = 0; + const suits = ['hearts', 'diamonds', 'clubs', 'spades']; + const suitsEmoji = ['♥', '♦', '♣', '♠']; + while (suitIndex < suits.length) { + let currentSuit = suits[suitIndex]; + let currentEmoji = suitsEmoji[suitIndex]; + + //innermost loop for rank + let rankCounter = 1; + while (rankCounter <= 13) { + let cardName = rankCounter; + + //rank 1, 11, 12, 13 are not number cards + if (cardName === 1) { + cardName = 'ace'; + } else if (cardName === 11) { + cardName = 'jack'; + } else if (cardName === 12) { + cardName = 'queen'; + } else if (cardName === 13) { + cardName = 'king'; + } + + let card = { + name: cardName.toString(), + suit: currentSuit, + suitEmoji: currentEmoji, + rank: rankCounter, + hold: false, + }; + + boxOf52Cards.push(card); + rankCounter = rankCounter + 1; + } + + suitIndex = suitIndex + 1; + } + + return boxOf52Cards; +}; + +/* MINI- FN: SORT CARDS IN HAND AND REARRANGE THEM */ +const sortRank = (hand) => { /* remb hand is an array */ + /* rearrange them from highest to lowest (b - a) */ + hand.sort((a, b) => parseFloat(b.rank) - parseFloat(a.rank)); + return hand; +}; + +/* FN: COLLATED COUNT OF PLYR1'S HAND */ +const cardTally = (hand) => { +/* run a loop over the hand of cards in question */ + for (let i = 0; i < handSize; i += 1) { + const cardName = hand[i].name; + /* if seen card name before, increment its count */ + if (cardName in cardNameTally) { + cardNameTally[cardName] += 1; + } + /* else, initialise count of this card name to 1 */ + else { + cardNameTally[cardName] = 1; + } + } + /* cardNameTally[cardName] gives the value to the key (cardName) */ + for (cardName in cardNameTally) {console.log(`There are ${cardNameTally[cardName]} ${cardName}s in the hand`); + } +}; + +/* FN: CHECK Same Rank 5 cards SAME SUIT */ +const checkSameRank = (hand) => { /* hand is an array */ + const suitsInHand = []; + for (let i = 0; i < hand.length; i += 1) { + suitsInHand.push(hand[i].suit); + } + /* use set() to check if true, then it's a flush */ + const suitsInHandSet = new Set(suitsInHand); + if (suitsInHandSet.size === 1) { + return true; + } else { + return false; + } +}; + +/* FN: CHECK SEQUENTIAL( all cards are a.p. with d = 1, but different suit ) */ +const checkSequential = (hand) => { + let answer = false; + const handClone = JSON.parse(JSON.stringify(hand)); /* so as not to mutate origin array */ + sortRank(handClone); + const diffTracker = []; + for (let i = 0; i < handClone.length - 1; i += 1) { + let diff = handClone[i].rank - handClone[i + 1].rank; + diffTracker.push(diff); + } + + const diffSet = new Set(diffTracker); + if (diffSet.size === 1) { /* principle based on arithmetic progression d = 1 constant */ + answer = true; + } else if ( + /* A, 10, 9, 8, 7 */ + handClone[0].rank === 10 + && handClone[1].rank === 9 + && handClone[2].rank === 8 + && handClone[3].rank === 7 + && handClone[4].rank === 1 + ) { answer = true; + } else if ( + /* Q, A, 10, 9, 8 */ + handClone[0].rank === 12 + && handClone[1].rank === 10 + && handClone[2].rank === 9 + && handClone[3].rank === 8 + && handClone[4].rank === 1 + ) { answer = true; + } else if ( + /* K, Q, A, 10, 9 */ + handClone[0].rank === 13 + && handClone[1].rank === 12 + && handClone[2].rank === 10 + && handClone[3].rank === 9 + && handClone[4].rank === 1 + ) { answer = true; + } + return answer; +}; + +/* FN: CHECK FOR 3 CARDS OF THE SAME RANK */ +const checkTriplets = (hand) => { + let answer = false; + let numOfTriplets = 0; + let handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + for (let i = 0; i < handClone.length - 2; i += 1) { + if (handClone[i].rank === handClone[i + 1].rank + && handClone[i + 1].rank === handClone[i + 2].rank) { + numOfTriplets += 1; + } + } + for (let j = 1; j < handClone.length - 2; j += 1) { + if (handClone[0].rank === handClone[j] + && handClone[j] === handClone[4]) { + numOfTriplets += 1; + } + } + console.log('Number of Triplets found = ', numOfTriplets); + if (numOfTriplets === 1) { + answer = true; + } + + return answer; +}; + +/* FN: CHECK FOR TWO PAIRS */ +const check2pairs = (hand) => { + let answer = false; + for (let i = 0; i < hand.length; i += 1) { + console.log('LOOP NUMBER, i =', i); + let handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + handClone.splice(i, 1); + console.log('handClone =', handClone); + let handRanks = []; + for (let j = 0; j < handClone.length; j += 1) { + handRanks.push(handClone[j].rank); + console.log('handRanks =', handRanks); + } + const handRankSet = new Set(handRanks); + console.log('handRankSet =', handRankSet); + if (handRankSet.size === 2) { + answer = true; + } + } + return answer; +}; + +/* FN: CHECK FOR A PAIR */ +/* note: this logic cannot be used the same way as other check FNs */ +const countPairs = (hand) => { + let handClone = JSON.parse(JSON.stringify(hand)); + sortRank(handClone); + let nmbrOfPairs = 0; + /* stage 1: 1st 4 combinations */ + for (let i = 0; i < handClone.length - 1; i += 1) { + /* console.log('stage1 Loop, i =', i) */ + if(handClone[i].rank === handClone[i + 1].rank) { + nmbrOfPairs += 1; + } + } + console.log(`${nmbrOfPairs}pairs found after stage 1` ); + + /* stage 2: next 3 combinations */ + for (let j = handClone.length - 1; j > 1; j -= 1) { + if(handClone[0].rank === handClone[j].rank) { + nmbrOfPairs += 1; + } + } + console.log(`${nmbrOfPairs}pairs found after stage 2` ); + + /* stage 3: next 2 combinations */ + for (let k = handClone.length - 1; k > 2; k -= 1) { + if (handClone[1].rank === handClone[k].rank) { nmbrOfPairs += 1; + } + } + console.log(`${nmbrOfPairs}pairs found after stage 3` ); + + /* stage 4: final 1 combination */ + if(handClone[2].rank === handClone[4].rank){ + nmbrOfPairs += 1; + } + console.log(`${nmbrOfPairs}pairs found after stage 4` ); + +/* check the state of the stages */ + + + + + return nmbrOfPairs; +}; + +/* FN: CHECK NO REPEATS */ +const checkNoRepeats = (hand) => { + let answer = false; + const repeatedCards = []; + let repeatedRanks = []; + const handClone = JSON.parse(JSON.stringify(hand)); /* so as not to mutate origin array */ + sortRank(handClone); + console.log(handClone); + let pairCount = 0; + for (let i = 0; i < handClone.length - 1; i += 1) { + if (handClone[i].rank === handClone[i + 1].rank) { + repeatedCards.push(handClone[i]); + repeatedCards.push(handClone[i + 1]); + repeatedRanks.push(handClone[i].rank); + repeatedRanks.push(handClone[i + 1].rank); + pairCount += 1; + const repeatedRanksSet = new Set(repeatedRanks); + } + } + + if (pairCount === 0 && repeatedCards.length === 0) { + answer = true; + } + return answer; +}; + +/* FN: Display the score onto Message centre */ +const refreshScore = () => { + displayScore.innerText = `${plyr1Pts} pts`; + return; +}; + +/* FN: GET BID AMOUNT FROM USER INPUT AND BUTTON CLICK */ +const bidBtn = document.querySelector('#wagerBtn'); +bidBtn.addEventListener('click', () => { + if (gameState === 1) { + const bidInput = document.querySelector('#bidAmt'); /* it always returns a string */ + bidAmount = bidInput.valueAsNumber; + + if (isNaN(bidAmount)) { + bidAmount = 0; + output('Please enter a bid amount, if not your bid is 0 points'); + } + + output(`You bidded ${bidAmount} pts. Score multiplier will be ${bidAmount}.`); + } + console.log('bidAmount =', bidAmount); + + plyr1Pts -= bidAmount; + refreshScore(); + + gameState = 2; + return bidAmount; +}); + +/* FN: CLEAR TABLE */ +const clearTable = (hand) => { + const tableElement = document.getElementById('tableEl'); + for (let i = 0; i < hand.length; i += 1) { + const cardHolder = document.getElementById(`${i}`); + tableElement.removeChild(cardHolder); + } +}; + +/* ===== FN : BUTTON - DEAL CARDS ====================== */ +/* querySelector for DEAL BUTTON */ +const dealButton = document.querySelector('#deal01'); +/* Define what clicking Deal Button does */ +const dealBtnClicked = () => { + deal5Cards(plyr1Hand); +}; +// say which function to call *when* the user clicks the button +dealButton.addEventListener('click', dealBtnClicked); + +/* ===== FN : BUTTON - UNDO ====================== */ +const unHoldButton = document.querySelector('#unHold'); +const undoBtnClicked = () => +{ + removeHoldLabel(plyr1Hand); +}; +unHoldButton.addEventListener('click', undoBtnClicked); + +/* ===== FN : BUTTON - CONFIRM =================== */ +const confirmButton = document.querySelector('#cfmBtn'); +const cfmBtnClicked = () => +{ + if (gameState === 2) { + foldCards(plyr1Hand); + swapCard(); + unHoldCards(plyr1Hand); + calcHandScore(plyr1Hand); + plyr1Pts += wonPts * bidAmount; + refreshScore(); + gameState = 3; + } + /* function to read cards and get score, */ + /* function to do pay outs */ +}; +confirmButton.addEventListener('click', cfmBtnClicked); + +/* ===== FN : BUTTON - RESET =================== */ +const resetButton = document.querySelector('#reset'); +const resetBtnClicked = () => +{ + clearTable(plyr1Hand); + plyr1Hand = []; + document.getElementById('bidAmt').value = ''; + plyr1Pts = 100; + refreshScore(); + gameState = 0; + bidAmount = 0; + +}; +resetButton.addEventListener('click', resetBtnClicked); + +/* ***READING THE CARDS*** + * LOGIC:Search for Winning Types in descending order of points + * Fn :check for same suit (same suit && non-sequential = FLUSH) + * Fn :check for sequentials (only sequentials = STRAIGHT, + * sequentials + same suit = STR. FLUSH) + * Fn :check for royals (13 && 12 & 11 & 10 & 1 + same suit = ROYAL FLUSH) + * Fn :check for quads ( 4-OF-A-KIND) + * Fn :check for triplets (3-OF-A-KIND, + * triplet + pairs = FULL HOUSE) + * Fn :check for pairs ( 1 PAIR, + * 2 PAIRS ) + * Fn :check for kickers( HIGH CARD) + * (regardless of kickers.length) + * (useful only when playing against another playerS) + * QUESTION: + * 1) DO WE CHECK FOR REPEATS OF RANK THEN COUNT THE REPEATS? + * or + * 2) USE OBJ TALLY AND THEN USE IF/ELSE TO MATCH TO HAND COMBI? + * 3) is it possible to make the tally function anonymous + * so that it becomes 1 single root to be used to search + * for the different card names? */ + +/* ***ACTIONS AFTER READING THE CARDS*** + * Fn : Assign score to player according to hand + * Fn : Total score for player according to bets placed + * Fn : + * */ diff --git a/images/clubs-1.png b/images/clubs-1.png new file mode 100644 index 00000000..3e7b9123 Binary files /dev/null and b/images/clubs-1.png differ diff --git a/images/clubs-10.png b/images/clubs-10.png new file mode 100644 index 00000000..ea253527 Binary files /dev/null and b/images/clubs-10.png differ diff --git a/images/clubs-11.png b/images/clubs-11.png new file mode 100644 index 00000000..be14cd7a Binary files /dev/null and b/images/clubs-11.png differ diff --git a/images/clubs-12.png b/images/clubs-12.png new file mode 100644 index 00000000..08d9fe5e Binary files /dev/null and b/images/clubs-12.png differ diff --git a/images/clubs-13.png b/images/clubs-13.png new file mode 100644 index 00000000..915528e1 Binary files /dev/null and b/images/clubs-13.png differ diff --git a/images/clubs-2.png b/images/clubs-2.png new file mode 100644 index 00000000..6af80d74 Binary files /dev/null and b/images/clubs-2.png differ diff --git a/images/clubs-3.png b/images/clubs-3.png new file mode 100644 index 00000000..355e1baf Binary files /dev/null and b/images/clubs-3.png differ diff --git a/images/clubs-4.png b/images/clubs-4.png new file mode 100644 index 00000000..532219a7 Binary files /dev/null and b/images/clubs-4.png differ diff --git a/images/clubs-5.png b/images/clubs-5.png new file mode 100644 index 00000000..1c2ca621 Binary files /dev/null and b/images/clubs-5.png differ diff --git a/images/clubs-6.png b/images/clubs-6.png new file mode 100644 index 00000000..69b0a647 Binary files /dev/null and b/images/clubs-6.png differ diff --git a/images/clubs-7.png b/images/clubs-7.png new file mode 100644 index 00000000..c5131e23 Binary files /dev/null and b/images/clubs-7.png differ diff --git a/images/clubs-8.png b/images/clubs-8.png new file mode 100644 index 00000000..60a80e9d Binary files /dev/null and b/images/clubs-8.png differ diff --git a/images/clubs-9.png b/images/clubs-9.png new file mode 100644 index 00000000..30e6d714 Binary files /dev/null and b/images/clubs-9.png differ diff --git a/images/diamonds-1.png b/images/diamonds-1.png new file mode 100644 index 00000000..0111695f Binary files /dev/null and b/images/diamonds-1.png differ diff --git a/images/diamonds-10.png b/images/diamonds-10.png new file mode 100644 index 00000000..0c0e8265 Binary files /dev/null and b/images/diamonds-10.png differ diff --git a/images/diamonds-11.png b/images/diamonds-11.png new file mode 100644 index 00000000..f072825c Binary files /dev/null and b/images/diamonds-11.png differ diff --git a/images/diamonds-12.png b/images/diamonds-12.png new file mode 100644 index 00000000..aa440c7d Binary files /dev/null and b/images/diamonds-12.png differ diff --git a/images/diamonds-13.png b/images/diamonds-13.png new file mode 100644 index 00000000..da250a4c Binary files /dev/null and b/images/diamonds-13.png differ diff --git a/images/diamonds-2.png b/images/diamonds-2.png new file mode 100644 index 00000000..3493f5e8 Binary files /dev/null and b/images/diamonds-2.png differ diff --git a/images/diamonds-3.png b/images/diamonds-3.png new file mode 100644 index 00000000..437e06e6 Binary files /dev/null and b/images/diamonds-3.png differ diff --git a/images/diamonds-4.png b/images/diamonds-4.png new file mode 100644 index 00000000..39ec869a Binary files /dev/null and b/images/diamonds-4.png differ diff --git a/images/diamonds-5.png b/images/diamonds-5.png new file mode 100644 index 00000000..750d7a20 Binary files /dev/null and b/images/diamonds-5.png differ diff --git a/images/diamonds-6.png b/images/diamonds-6.png new file mode 100644 index 00000000..35cbf0e6 Binary files /dev/null and b/images/diamonds-6.png differ diff --git a/images/diamonds-7.png b/images/diamonds-7.png new file mode 100644 index 00000000..b8153432 Binary files /dev/null and b/images/diamonds-7.png differ diff --git a/images/diamonds-8.png b/images/diamonds-8.png new file mode 100644 index 00000000..063bc774 Binary files /dev/null and b/images/diamonds-8.png differ diff --git a/images/diamonds-9.png b/images/diamonds-9.png new file mode 100644 index 00000000..c52e281d Binary files /dev/null and b/images/diamonds-9.png differ diff --git a/images/hearts-1.png b/images/hearts-1.png new file mode 100644 index 00000000..0a4d96f9 Binary files /dev/null and b/images/hearts-1.png differ diff --git a/images/hearts-10.png b/images/hearts-10.png new file mode 100644 index 00000000..47be115e Binary files /dev/null and b/images/hearts-10.png differ diff --git a/images/hearts-11.png b/images/hearts-11.png new file mode 100644 index 00000000..21943b80 Binary files /dev/null and b/images/hearts-11.png differ diff --git a/images/hearts-12.png b/images/hearts-12.png new file mode 100644 index 00000000..d8b39d7a Binary files /dev/null and b/images/hearts-12.png differ diff --git a/images/hearts-13.png b/images/hearts-13.png new file mode 100644 index 00000000..cf9900c1 Binary files /dev/null and b/images/hearts-13.png differ diff --git a/images/hearts-2.png b/images/hearts-2.png new file mode 100644 index 00000000..ff4680a3 Binary files /dev/null and b/images/hearts-2.png differ diff --git a/images/hearts-3.png b/images/hearts-3.png new file mode 100644 index 00000000..08ff735c Binary files /dev/null and b/images/hearts-3.png differ diff --git a/images/hearts-4.png b/images/hearts-4.png new file mode 100644 index 00000000..4cb2a2a6 Binary files /dev/null and b/images/hearts-4.png differ diff --git a/images/hearts-5.png b/images/hearts-5.png new file mode 100644 index 00000000..2a31d10b Binary files /dev/null and b/images/hearts-5.png differ diff --git a/images/hearts-6.png b/images/hearts-6.png new file mode 100644 index 00000000..516d97de Binary files /dev/null and b/images/hearts-6.png differ diff --git a/images/hearts-7.png b/images/hearts-7.png new file mode 100644 index 00000000..6c4fe01c Binary files /dev/null and b/images/hearts-7.png differ diff --git a/images/hearts-8.png b/images/hearts-8.png new file mode 100644 index 00000000..ae24758d Binary files /dev/null and b/images/hearts-8.png differ diff --git a/images/hearts-9.png b/images/hearts-9.png new file mode 100644 index 00000000..ea14ee59 Binary files /dev/null and b/images/hearts-9.png differ diff --git a/images/kindpng_1537437.png b/images/kindpng_1537437.png new file mode 100644 index 00000000..c825fc1b Binary files /dev/null and b/images/kindpng_1537437.png differ diff --git a/images/rbt.png b/images/rbt.png new file mode 100644 index 00000000..dc3547fd Binary files /dev/null and b/images/rbt.png differ diff --git a/images/rbt2.png b/images/rbt2.png new file mode 100644 index 00000000..c4581232 Binary files /dev/null and b/images/rbt2.png differ diff --git a/images/spades-1.png b/images/spades-1.png new file mode 100644 index 00000000..bbe61ae0 Binary files /dev/null and b/images/spades-1.png differ diff --git a/images/spades-10.png b/images/spades-10.png new file mode 100644 index 00000000..7ed98679 Binary files /dev/null and b/images/spades-10.png differ diff --git a/images/spades-11.png b/images/spades-11.png new file mode 100644 index 00000000..196cf063 Binary files /dev/null and b/images/spades-11.png differ diff --git a/images/spades-12.png b/images/spades-12.png new file mode 100644 index 00000000..345ba3be Binary files /dev/null and b/images/spades-12.png differ diff --git a/images/spades-13.png b/images/spades-13.png new file mode 100644 index 00000000..740f9eae Binary files /dev/null and b/images/spades-13.png differ diff --git a/images/spades-2.png b/images/spades-2.png new file mode 100644 index 00000000..235c7138 Binary files /dev/null and b/images/spades-2.png differ diff --git a/images/spades-3.png b/images/spades-3.png new file mode 100644 index 00000000..53372763 Binary files /dev/null and b/images/spades-3.png differ diff --git a/images/spades-4.png b/images/spades-4.png new file mode 100644 index 00000000..59c005d4 Binary files /dev/null and b/images/spades-4.png differ diff --git a/images/spades-5.png b/images/spades-5.png new file mode 100644 index 00000000..e9782fc8 Binary files /dev/null and b/images/spades-5.png differ diff --git a/images/spades-6.png b/images/spades-6.png new file mode 100644 index 00000000..0dd4c33b Binary files /dev/null and b/images/spades-6.png differ diff --git a/images/spades-7.png b/images/spades-7.png new file mode 100644 index 00000000..b36910f6 Binary files /dev/null and b/images/spades-7.png differ diff --git a/images/spades-8.png b/images/spades-8.png new file mode 100644 index 00000000..da307ba2 Binary files /dev/null and b/images/spades-8.png differ diff --git a/images/spades-9.png b/images/spades-9.png new file mode 100644 index 00000000..4a29d549 Binary files /dev/null and b/images/spades-9.png differ diff --git a/images/z-hold.png b/images/z-hold.png new file mode 100644 index 00000000..355e1baf Binary files /dev/null and b/images/z-hold.png differ diff --git a/images/z-label.png b/images/z-label.png new file mode 100644 index 00000000..7db238c8 Binary files /dev/null and b/images/z-label.png differ diff --git a/index.html b/index.html new file mode 100644 index 00000000..092645f2 --- /dev/null +++ b/index.html @@ -0,0 +1,49 @@ + + + + + Video Poker + + + + + +
+
+ +
+
+ +
+
+ + +
+ + +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + diff --git a/init.js b/init.js new file mode 100644 index 00000000..7aadac48 --- /dev/null +++ b/init.js @@ -0,0 +1,6 @@ +/* ====================== + * ---GAME INITIALISATION--- + * ====================== */ + +deck = makeDeck(); +shuffledDeck = shuffleCards(deck); diff --git a/logic.js b/logic.js new file mode 100644 index 00000000..cac7de84 --- /dev/null +++ b/logic.js @@ -0,0 +1,20 @@ +/* ====================== + * ---GAMEPLAY LOGIC--- + * ====================== */ + +/* 1) On loading, message board displays the basic instructions */ +/* gameState = 0 */ +if (gameState === 0) { +output("Welcome to 5-card Video-Poker. Press 'Deal' to draw."); +}; + +/* 2) Player keys in bid amount, and hits the bid button which updates the points bank */ + +/* 3) Player can click deal button and undo button + - Message output shows that he can hit deal button for the swap + (changes based on game state) */ +/* 4) Player hits CONFIRM button to swap cards */ +/* 5) Computation and Conclusion + * - read plyr1Hand and run calcHandScore + * - print in Message Screen the winning or losing hand + * - update point bank! */ diff --git a/package-lock.json b/package-lock.json index 7c1c09b9..72db45d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,35 +1,2069 @@ { "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.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/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.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "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.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "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.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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.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 + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "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.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "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.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "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.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.16.7", "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 +2074,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.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -74,10 +2145,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 +2170,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 +2257,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 +2294,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 +2312,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 +2356,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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -341,9 +2389,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 +2444,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 +2483,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 +2492,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 +2644,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,18 +2669,18 @@ "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" }, "dependencies": { "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } @@ -682,12 +2733,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 +2751,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.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, "fs.realpath": { @@ -735,9 +2785,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 +2799,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.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", + "integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "graceful-fs": { @@ -794,9 +2844,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 +2856,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 +2912,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 +2975,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 +3037,16 @@ "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.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 +3064,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 +3269,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 +3343,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 +3365,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 +3395,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 +3444,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 +3517,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 +3547,36 @@ } }, "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.8.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", + "integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==", "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.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "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 +3607,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 +3657,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" - } } } } diff --git a/reference.txt b/reference.txt new file mode 100644 index 00000000..f8da58e4 --- /dev/null +++ b/reference.txt @@ -0,0 +1,45 @@ +d + +1) 5-of-a-Kind = 4 same rank + 1 Wild card ( rank of cards matter)?? + +1) Royal-Flush = A, K, Q, J, 10, of the same suit + +2) Straight-Flush = 5 same suit + all in sequential rank + +3) Four of a kind(quads) = 4 same rank + 1 kicker (rank matters) (suit doesn't matter) + +4) Full House = 3 same rank + 2 of another rank (' 1 triplet + 1 pair') + +5) Flush = all cards are in the same suit, + not in sequential rank + +6) Straight = all cards are in sequential rank + not same suit + +7) Three-of-a-Kind = 3 same rank + 2 kickers + +8) Two Pairs = 2 same rank + 1 kicker(rank matters) + +9) 1 Pair = 1 same rank + 3 kickers (rank matters) + +10) High Card = 5 kickers no pair + (suit doesn't matter) + (if p1 = p2 = 5 cards same rank, it's a tie) + + + + (rank.sort.highToLow then> compare highest to highest of other player, + if tie, move to next index) + + +Ace can be 11 or 1. + +[Chicago Rules] +High Card -? +One pair - 1 point. +Two pair - 2 points. +Three of a kind - 3 points. +Straight - 4 points. +Flush - 5 points. +Full house - 6 points. +Four of a kind - 7 points +Straight flush - 8 points +Royal Flush - 20 points \ No newline at end of file diff --git a/scoring.js b/scoring.js new file mode 100644 index 00000000..484ad34c --- /dev/null +++ b/scoring.js @@ -0,0 +1,51 @@ +/* + +1) READ HAND FN +2) if HAND is Royal Flush => return 20pts +3) if Straight flush,=> return 8point.... +4) if .. return .. 7 points.. + +*/ + + +const calcHandScore = (hand) => { + if (checkRoyalFlush(hand) === true ) { + wonPts += 20; + output(" ROYAL FLUSH - SCORE: 20"); + } else if (checkStrFlush(hand) === true ) { + wonPts += 8; + output(" STRAIGHT FLUSH - SCORE: 8"); + } else if (checkQuads(hand) === true) { + wonPts += 7; + output(" 4-OF-A-KIND - SCORE: 7"); + } else if (checkFullHouse(hand) === true) { + wonPts += 6; + output(" FULL-HOUSE - SCORE: 6"); + } else if (checkFlush(hand) === true) { + wonPts += 5; + output(" FLUSH - SCORE: 5"); + } else if (checkStraight(hand) === true) { + wonPts += 4; + output(" STRAIGHT- SCORE: 4"); + } else if (check3OfAKind(hand) === true) { + wonPts += 3; + output(" 3-OF-A-KIND - SCORE: 3"); + } else if (check2Pairs(hand) === true) { + wonPts += 2; + output(" 2 PAIRS - SCORE: 2"); + } else if (check1Pair(hand) === true) { + wonPts += 1; + output(" 1 PAIR - SCORE: 1"); + } else if (checkHighCard(hand) === true) { + wonPts += 0; + output(" HIGH CARD - SCORE: 0. YOU LOSE"); + } else { + wonPts = 'error'; + } + + console.log('wonPts =', wonPts); + + return wonPts; +}; + + diff --git a/script.js b/script.js new file mode 100644 index 00000000..db3c4be0 --- /dev/null +++ b/script.js @@ -0,0 +1,22 @@ +/* ====================== + * ---GLOBAL VARIABLES--- + * ====================== */ + +let deck; +let shuffledDeck; +let plyr1Hand = []; +let compHand = []; +let handSize = 5; +let plyr1Pts = 100; +let gameState = 0; + + +let cardNameTally = {}; /* used in helper FN: cardTally */ + +let bidAmount; + +let wonPts = 0; /* needs command to be reset */ + +const discardIndexArr = []; /* holds the discarded cards of the user */ + + diff --git a/styles.css b/styles.css new file mode 100644 index 00000000..0789fa2c --- /dev/null +++ b/styles.css @@ -0,0 +1,271 @@ +body { + background-color: black; +} + +.gutterTop{ + height: 5vh; + padding: 0px; + margin: 0px; + border: 0px solid black; +} + +.wrapper{ +display: flex; +justify-content: center; +flex-direction: column; +width: 96vw; +border:4px solid #fff2cd; +border-radius: 5vw; +} + + .table{ + display: flex; + justify-content: space-around; + align-items: center; + background-color: green; + height: 25vh; + width: 96vw; + margin: 0vh 0vw 0vh 0vw; + padding: 0px; + border-bottom: 0px solid green; + border-top-left-radius:4.5vw; + border-top-right-radius:4.5vw; +} + +.banner{ + height: 5vh; + width: 96vw; + background-color: green; + color: white; + font-family: cursive; + text-align: center; + font-size: 4vh; + padding-top: 0vh; + padding-bottom: 1.5vh; + border-top: 0px solid green; +} + + + +.msgCtr{ + display: flex; + justify-content: center; + align-content:space-between; + background-color:yellow; + color:black; + width:96vw; + height: 8vh; + text-align: center; + font-family: cursive; + font-weight: bold; + font-size: 2.5vh; + padding-top: 1vh; +} + +.btnWrap{ + display: flex; + justify-content:space-between; + align-items:center; + width: 96vw; + height: 10vh; + margin-top:2px; + padding:0px; + border: 0px solid black; +} + +.btnWrap2{ + display: flex; + justify-content:space-between; + align-items:center; + width: 96vw; + height: 10vh; + margin:0px; + padding:0px; + border: 0px solid black; +} + + +.btn{ + background-color:black; + color: grey; + height: 4vh; + text-align: center; + padding:5vw; + font-size:4vh; + margin: 0px; + padding: 0px; + border: 0px solid black; +} + +.bidInput{ +height:3.5vh; +width: 15vw; +font-size:4vh; +text-align: center; +padding-top: 13px; +padding-right:3px; +margin-right:10px; +} + +.bidContainer{ + display:flex; + justify-content: flex-end; + align-items:center; + border: 0px solid black; +} + +.cardHolder{ + display: flex; + z-index: 1; + justify-content:center; + align-items: center; + background-color:white; + background-image: url(./images/rbt2.png); + background-repeat: no-repeat; + background-position: center; + background-size:14vw auto; + background-repeat: no-repeat; + background-position: center; + margin-top:0vw; + padding: 1vw; + width: 14vw; + height: auto; + text-align: center; + border-radius: 1vw; + border: 1px solid black +} + +.cardImg{ + display: flex; + justify-self: center; + align-self: center; + width: 15vw; + height: auto; + z-index: 2; + border-radius: 1vw; + +} + +.none{ + display: none; +} + +.fadeOut{ /* applied to cardImage */ + opacity: 0.25; + z-index:3; +} + +.showBack{ + display: flex; + opacity: 1; + background-color:white; + background-image: url(./images/rbt2.png); + background-repeat: no-repeat; + background-position: center; + background-size:14vw auto; /* 171px 236px */ + background-repeat: no-repeat; + background-position: center; + border-radius: 1vw; + border: 1px solid black +} + +.holdLabel{ /* applied to cardHolder */ + display: flex; + z-index:100; /* z-index not working */ + opacity: 1; + background-color: rgb(223, 28, 28); + background-image: url(./images/z-label.png); + background-size:33vw auto; + background-repeat: no-repeat; + background-position: center; + border-radius: 9px; + border: 3.5px solid rgb(223, 28, 28); + +} + +.cardCover{ + display: flex; + z-index: 5; /* z-index not working */ + opacity: 1; + background-color: white; + background-image: url(./images/rbt2.png); + background-size:14vw auto; + background-repeat: no-repeat; + background-position: center; + border-radius: 1vw; + border: 1px solid black +} + +@media only screen and (min-width: 768px) { + .wrapper{ + width:98vw; + } + .gutterTop{ + height: 2vh; + } + + .table{ + height:46vh; + width: 98vw; + border-top-left-radius:4.75vw; + border-top-right-radius:4.75vw; + background-color: green; + } + + .banner{ + width:98vw; + } + + .cardHolder{ + margin: 50px 6px 14px 6px; + padding: 0px; + width: 13vw; + height: auto; + border: 0.13vw solid black; + border-radius: 0.7vw; + } + + .cardImg{ + /* opacity:0.3; + zoom:1; */ + width: 13vw; + height: auto; + } + + .showBack{ + width: 13vw; + height: auto; + } + + .cardCover{ + width: 13vw; + height: auto; + } + + .msgCtr{ + width:98vw; + } + + .btnWrap{ + justify-content: space-around; + width: 98vw; + } + + .btnWrap2{ + justify-content: space-around; + width: 98vw; + } + + .bidInput{ + width: 5vw; + } + + + .holdLabel{ + width: 13vw; + height: auto; + border: 0.4vw solid rgb(223, 28, 28); + } + + +} \ No newline at end of file diff --git a/styles2.css b/styles2.css new file mode 100644 index 00000000..e0b1792d --- /dev/null +++ b/styles2.css @@ -0,0 +1,360 @@ +body { + background-color: black; + display: flex; + justify-content:center; +} + +.gutterTop{ + height: 5vh; + padding: 0px; + margin: 0px; + border: 0px solid black; +} + +.wrapper{ +display: flex; +justify-content: center; +flex-direction: column; +width: 96vw; +border:4px solid #fff2cd; +border-radius: 5vw; +} + + .table{ + display: flex; + justify-content: space-around; + align-items: center; + background-color: green; + height: 25vh; + width: 96vw; + margin: 0vh 0vw 0vh 0vw; + padding: 0px; + border-bottom: 0px solid green; + border-top-left-radius:4.5vw; + border-top-right-radius:4.5vw; +} + +.banner{ + height: 5vh; + width: 96vw; + background-color: green; + color: white; + font-family: cursive; + text-align: center; + font-size: 4vh; + padding-top: 0vh; + padding-bottom: 1.5vh; + border-top: 0px solid green; +} + + + +.msgCtr{ + display: flex; + justify-content: center; + align-content:space-between; + background-color:yellow; + color:black; + width:96vw; + height: 8vh; + text-align: center; + font-family: cursive; + font-weight: bold; + font-size: 2.5vh; + padding-top: 1vh; +} + +.btnWrap{ + display: flex; + justify-content:space-between; + align-items:center; + width: 96vw; + height: 10vh; + margin-top:2px; + padding:0px; + border: 0px solid black; +} + +.btnWrap2{ + display: flex; + justify-content:space-between; + align-items:center; + width: 96vw; + height: 10vh; + margin:0px; + padding:0px; + border: 0px solid black; +} + + +.btn{ + background-color:black; + color: grey; + height: 4vh; + text-align: center; + padding:5vw; + font-size:4vh; + margin: 0px; + padding: 0px; + border: 0px solid black; +} + +.bidInput{ +height:3.5vh; +width: 15vw; +font-size:4vh; +text-align: center; +padding-top: 13px; +padding-right:3px; +margin-right:10px; +} + +.bidContainer{ + display:flex; + justify-content: flex-end; + align-items:center; + border: 0px solid black; +} + +.cardHolder{ + position: relative; + z-index: 1; +/* justify-content:center; + align-items: center; */ + background-color:white; + background-image: url(./images/rbt2.png); + background-repeat: no-repeat; + background-position: center; + background-size:15.2vw auto; + background-repeat: no-repeat; + background-position: center; + width: 15.0vw; + height: 9.5vh; + margin-top:0vw; + padding: 0vw; + text-align: center; + border-radius: 1vw; + border: 1px solid black +} + +.cardImg{ + position: relative; + z-index: 2; + width: 15vw; + height: auto; + border-radius: 1vw; + +} + +.none{ + display: none; +} + +.fadeOut{ /* applied to cardImage */ + position: absolute; /* not working once again */ + opacity: 0.15; + z-index:-1000; +} + +/* showBack is likely not be used */ +.showBack{ + display: flex; + opacity: 1; + background-color:white; + background-image: url(./images/rbt2.png); + background-repeat: no-repeat; + background-position: center; + background-size:14vw auto; /* 171px 236px */ + background-repeat: no-repeat; + background-position: center; + border-radius: 1vw; + border: 1px solid black +} + +.holdLabel{ /* applied to cardHolder */ + display: flex; + z-index:100; /* z-index not working */ + opacity: 1; + background-color: rgb(223, 28, 28); + background-image: url(./images/z-label.png); + background-size:33vw auto; + background-repeat: no-repeat; + background-position: center; + border-radius: 9px; + border: 3.5px solid rgb(223, 28, 28); + +} + +.cardCover{ + display: flex; + z-index: 5; /* z-index not working */ + opacity: 1; + background-color: white; + background-image: url(./images/rbt2.png); + background-size:14vw auto; + background-repeat: no-repeat; + background-position: center; + border-radius: 1vw; + border: 1px solid black +} + +@media only screen and (min-width: 768px) { + .wrapper{ + width:98vw; + } + .gutterTop{ + height: 2vh; + } + + .table{ + height:46vh; + width: 98vw; + border-top-left-radius:4.30vw; + border-top-right-radius:4.30vw; + background-color: green; + } + + .banner{ + width:98vw; + } + + .cardHolder{ + background-size:13.2vw auto; + margin: 50px 6px 14px 6px; + padding: 0px; + width: 13.2vw; + height: 21.01vh; + border: 0.13vw solid black; + border-radius: 0.7vw; + } + + .cardImg{ + /* opacity:0.3; */ + /*zoom:1; */ + width: 13vw; + right:0.15vw; + bottom: 0.1vh; + height: auto; + border:2px solid black; + border-radius: 0.75vw; + } + + .showBack{ + width: 13vw; + height: auto; + } + + .cardCover{ + width: 13vw; + height: auto; + } + + .msgCtr{ + width:98vw; + } + + .btnWrap{ + justify-content: space-around; + width: 98vw; + } + + .btnWrap2{ + justify-content: space-around; + width: 98vw; + } + + .bidInput{ + width: 5vw; + } + + + .holdLabel{ + background-size:12.8vw auto; + width: 13vw; + height: 29vh; + border: 0.4vw solid rgb(223, 28, 28); + } + + +} + + +@media only screen and (min-width: 1280px) { + .wrapper{ + width:98vw; + } + .gutterTop{ + height: 2vh; + } + + .table{ + height:46vh; + width: 98vw; + border-top-left-radius:4.30vw; + border-top-right-radius:4.30vw; + background-color: green; + } + + .banner{ + width:98vw; + } + + .cardHolder{ + background-size:13.2vw auto; + margin: 50px 6px 14px 6px; + padding: 0px; + width: 13.0vw; + height: 37.0vh; + border: 0.13vw solid black; + border-radius: 0.7vw; + } + + .cardImg{ + /* opacity:1.0; */ + /*zoom:1; */ + width: 13vw; + right:0.15vw; + bottom: 0.1vh; + height: auto; + border:2px solid black; + border-radius: 0.75vw; + } + + .showBack{ + width: 13vw; + height: auto; + } + + .cardCover{ + width: 13vw; + height: auto; + } + + .msgCtr{ + width:98vw; + } + + .btnWrap{ + justify-content: space-around; + width: 98vw; + } + + .btnWrap2{ + justify-content: space-around; + width: 98vw; + } + + .bidInput{ + width: 5vw; + } + + + .holdLabel{ + background-size:13.0vw 37.2vh; + width: 13.6vw; + height: 37.6vh; + border: 0.4vw solid rgb(223, 28, 28); + } + + +} \ No newline at end of file diff --git a/testNegative.js b/testNegative.js new file mode 100644 index 00000000..e2b4bf13 --- /dev/null +++ b/testNegative.js @@ -0,0 +1,38 @@ +/* use this to test the rest of the score cards */ +let highCardPositive = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: '6', + suit: 'clubs', + suitEmoji: '♣', + rank: 6, + value: 6, + }, + { + name: '5', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 5, + value: 5, + }, + { + name: '7', + suit: 'hearts', + suitEmoji: '♥', + rank: 7, + value: 7, + }, + { + name: '10', + suit: 'diamonds', + suitEmoji: '♦', + rank: 10, + value: 10, + } +]; diff --git a/testPositive.js b/testPositive.js new file mode 100644 index 00000000..cac70360 --- /dev/null +++ b/testPositive.js @@ -0,0 +1,686 @@ +/* ################################ CARD IN HAND TEST BLOC BELOW #################### */ + +let onePairPositive = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: 'king', + suit: 'clubs', + suitEmoji: '♣', + rank: 13, + value: 13, + }, + { + name: '10', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 10, + value: 10, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, + { + name: 'ace', + suit: 'diamonds', + suitEmoji: '♦', + rank: 1, + value: 11, + }, +]; + +let onePairPositive2 = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: '10', + suit: 'clubs', + suitEmoji: '♣', + rank: 10, + value: 10, + }, + { + name: '4', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 4, + value: 4, + }, + { + name: 'ace', + suit: 'diamonds', + suitEmoji: '♦', + rank: 1, + value: 11, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, +]; +let TwoPairPositive1 = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: '10', + suit: 'clubs', + suitEmoji: '♣', + rank: 10, + value: 10, + }, + { + name: '10', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 10, + value: 10, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, + { + name: 'ace', + suit: 'diamonds', + suitEmoji: '♦', + rank: 1, + value: 11, + }, +]; + +let tripletPositive1 = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: 'ace', + suit: 'clubs', + suitEmoji: '♣', + rank: 1, + value:11, + }, + { + name: 'ace', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 1, + value: 11, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, + { + name: '6', + suit: 'diamonds', + suitEmoji: '♦', + rank: 6, + value: 6, + }, +]; + +let tripletPositive2 = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, + { + name: '6', + suit: 'diamonds', + suitEmoji: '♦', + rank: 6, + value: 6, + }, + { + name: 'ace', + suit: 'clubs', + suitEmoji: '♣', + rank: 1, + value:11, + }, + { + name: 'ace', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 1, + value: 11, + }, +]; + +let tripletPair = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: '10', + suit: 'clubs', + suitEmoji: '♣', + rank: 10, + value:10, + }, + { + name: 'ace', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 1, + value: 11, + }, + { + name: '10', + suit: 'hearts', + suitEmoji: '♥', + rank: 10, + value: 10, + }, + { + name: 'ace', + suit: 'diamonds', + suitEmoji: '♦', + rank: 1, + value: 1, + }, +]; + +let quadPositive1 = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: 'ace', + suit: 'clubs', + suitEmoji: '♣', + rank: 1, + value:1, + }, + { + name: 'ace', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 1, + value: 11, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, + { + name: 'ace', + suit: 'diamonds', + suitEmoji: '♦', + rank: 1, + value: 11, + }, +]; + + +let quadPositive2 = [ + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: 'ace', + suit: 'clubs', + suitEmoji: '♣', + rank: 1, + value:1, + }, + { + name: 'ace', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 1, + value: 11, + }, + { + name: 'ace', + suit: 'diamonds', + suitEmoji: '♦', + rank: 1, + value: 11, + }, +]; + +let quadPositive3 = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: 'ace', + suit: 'clubs', + suitEmoji: '♣', + rank: 1, + value:1, + }, + { + name: 'ace', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 1, + value: 11, + }, + { + name: 'ace', + suit: 'diamonds', + suitEmoji: '♦', + rank: 1, + value: 11, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, +]; + +let sameSuitDiffRank = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: '4', + suit: 'hearts', + suitEmoji: '♥', + rank: 4, + value:4, + }, + { + name: '9', + suit: 'hearts', + suitEmoji: '♥', /* '♥', "♦", "♣", "♠" */ + rank: 9, + value: 9, + }, + { + name: 'jack', + suit: 'hearts', + suitEmoji: '♥', + rank: 11, + value: 11, + }, + { + name: 'queen', + suit: 'hearts', + suitEmoji: '♥', + rank: 12, + value: 12, + }, +]; + +let sameSuitConsecRank = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: '2', + suit: 'hearts', + suitEmoji: '♥', + rank: 2, + value:2, + }, + { + name: '3', + suit: 'hearts', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 3, + value: 3, + }, + { + name: '4', + suit: 'hearts', + suitEmoji: '♥', + rank: 4, + value: 4, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, +]; + +let fullHousePositiveT1 = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: 'ace', + suit: 'clubs', + suitEmoji: '♣', + rank: 1, + value: 11, + }, + { + name: 'ace', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 1, + value: 11, + }, + { + name: '5', + suit: 'spades', + suitEmoji: '♠', + rank: 5, + value: 5, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, +]; + +let fullHousePositiveT2 = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: '5', + suit: 'spades', + suitEmoji: '♠', + rank: 5, + value: 5, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, + { + name: 'ace', + suit: 'clubs', + suitEmoji: '♣', + rank: 1, + value: 11, + }, + { + name: 'ace', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 1, + value: 11, + }, +]; + +let straightPositive = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: '2', + suit: 'diamonds', + suitEmoji: '♦', + rank: 2, + value: 2, + }, + { + name: '3', + suit: 'spades', + suitEmoji: '♠', /* '♥', "♦", "♣", "♠" */ + rank: 3, + value: 3, + }, + { + name: '4', + suit: 'clubs', + suitEmoji: '♣', + rank: 4, + value: 4, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, +]; + +let flushPositive = [ + { + name: 'king', + suit: 'hearts', + suitEmoji: '♥', + rank: 13, + value: 13, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, + { + name: '3', + suit: 'hearts', + suitEmoji: '♥', /* '♥', "♦", "♣", "♠" */ + rank: 3, + value: 3, + }, + { + name: '7', + suit: 'hearts', + suitEmoji: '♥', + rank: 7, + value: 7, + }, + { + name: 'queen', + suit: 'hearts', + suitEmoji: '♥', + rank: 12, + value: 12, + }, +]; + + +let strFlushPositive = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: '2', + suit: 'hearts', + suitEmoji: '♥', + rank: 2, + value: 2, + }, + { + name: '3', + suit: 'hearts', + suitEmoji: '♥', /* '♥', "♦", "♣", "♠" */ + rank: 3, + value: 3, + }, + { + name: '4', + suit: 'hearts', + suitEmoji: '♥', + rank: 4, + value: 4, + }, + { + name: '5', + suit: 'hearts', + suitEmoji: '♥', + rank: 5, + value: 5, + }, +]; + +let royalFlushPositive = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: 'king', + suit: 'hearts', + suitEmoji: '♥', + rank: 13, + value:13, + }, + { + name: 'jack', + suit: 'hearts', + suitEmoji: '♥', /* '♥', "♦", "♣", "♠" */ + rank: 11, + value: 11, + }, + { + name: '10', + suit: 'hearts', + suitEmoji: '♥', + rank: 10, + value: 10, + }, + { + name: 'queen', + suit: 'hearts', + suitEmoji: '♥', + rank: 12, + value: 12, + }, +]; + +let highCardPositive2 = [ + { + name: 'ace', + suit: 'hearts', + suitEmoji: '♥', + rank: 1, + value: 11, + }, + { + name: 'king', + suit: 'hearts', + suitEmoji: '♥', + rank: 13, + value:13, + }, + { + name: 'jack', + suit: 'hearts', + suitEmoji: '♥', /* '♥', "♦", "♣", "♠" */ + rank: 11, + value: 11, + }, + { + name: '10', + suit: 'spades', + suitEmoji: '♥', + rank: 10, + value: 10, + }, + { + name: 'queen', + suit: 'hearts', + suitEmoji: '♥', + rank: 12, + value: 12, + }, +];