├── .gitignore ├── Concurrency ├── assignment.txt ├── async.js ├── async133.js ├── asyncOrder.js ├── callback.js ├── callback131.js ├── callback2.js ├── passwordChecker.js ├── promise.js └── promise132.js ├── Functions ├── arrow.js ├── calculator.mjs ├── calculator2.mjs ├── chapterProject.js ├── functions.js ├── recursion66.js └── recursive.js ├── Loops ├── chapterProject.mjs ├── forLoops.js ├── forLoops53.js ├── loopsObjects.js ├── nestedLoops.js ├── package-lock.json ├── package.json └── whileLoop.mjs └── rockPaperScissors ├── index.mjs ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /Concurrency/assignment.txt: -------------------------------------------------------------------------------- 1 | Write code that must achieve the following requirements: 2 | 3 | - First, start making breakfast 4 | - Start making an omelette immediately. This should take 5 seconds. 5 | - Start making a paratha after 2 seconds. It should take 3 seconds to make. 6 | - Start making coffee after 4 seconds. It should be ready in 1 second. 7 | - While you're making breakfast, ask wife or husband what she wants for lunch 8 | - He or she will respond after 10 seconds. 9 | - Then, ask him or her where to go for dinner. 10 | - Response should be received immediately. 11 | 12 | 13 | 1. Create a node js application using callback functions. 14 | 2. Create a node js application using promises. 15 | 3. Create a node js application using async / await. -------------------------------------------------------------------------------- /Concurrency/async.js: -------------------------------------------------------------------------------- 1 | const myPromise = new Promise((resolve, reject) => { 2 | resolve("I am resolved.") 3 | }) 4 | 5 | async function myFunction() { 6 | const resolvedValue = await myPromise; 7 | console.log(resolvedValue); 8 | } 9 | 10 | myFunction(); -------------------------------------------------------------------------------- /Concurrency/async133.js: -------------------------------------------------------------------------------- 1 | let counter = 0; 2 | 3 | function incrementCounter(value) { 4 | return new Promise( resolve => { 5 | setTimeout(() => { 6 | counter++ 7 | resolve(`x value ${value} counter: ${counter}`) 8 | }, 1000) 9 | }) 10 | } 11 | 12 | async function asyncFunction(value) { 13 | console.log(`ready ${value} counter: ${counter}`); 14 | const resolvedValue = await incrementCounter(value); 15 | console.log(resolvedValue); 16 | } 17 | 18 | for (let i = 1; i < 4; i++) { 19 | asyncFunction(i) 20 | } -------------------------------------------------------------------------------- /Concurrency/asyncOrder.js: -------------------------------------------------------------------------------- 1 | function breakfastOrder(item) { 2 | return new Promise((resolve) => { 3 | setTimeout(() => { 4 | resolve(`${item} is ready.`); 5 | }, 3000); 6 | }); 7 | } 8 | 9 | async function Order(item) { 10 | const order = await breakfastOrder(item); 11 | console.log(order); 12 | } 13 | 14 | Order("Omelette"); 15 | Order("Paratha"); 16 | Order("Coffee"); 17 | -------------------------------------------------------------------------------- /Concurrency/callback.js: -------------------------------------------------------------------------------- 1 | function doFlexibleStuff(callback) { 2 | callback(); 3 | } 4 | 5 | const function1 = () => console.log("Hello from Function 1") 6 | const function2 = () => console.log("Hello from Function 2") 7 | 8 | doFlexibleStuff(function1) 9 | doFlexibleStuff(function2) -------------------------------------------------------------------------------- /Concurrency/callback131.js: -------------------------------------------------------------------------------- 1 | function greet(fullName) { 2 | console.log(`Hello ${fullName[0] + ' ' + fullName[1]}`); 3 | } 4 | 5 | function mainFunction(userName,callback) { 6 | const name = userName.split(" ") 7 | callback(name); 8 | } 9 | 10 | mainFunction("Adil Altaf",greet) -------------------------------------------------------------------------------- /Concurrency/callback2.js: -------------------------------------------------------------------------------- 1 | // Student in Pakistan, gets 95%. Comment should be "You got an ", grade, ": Zabardast!" 2 | // Student in US, gets 95%. Comment should be "You got an ", grade, ": Perfect!" 3 | 4 | function unitedstates(grade) { 5 | switch (true) { 6 | case grade === "A+": 7 | console.log("You got an ", grade, ": Perfect!"); 8 | break; 9 | case grade === "A": 10 | console.log("You got an ", grade, ": Excellent!"); 11 | break; 12 | case grade === "B": 13 | console.log("You got a ", grade, ": Good Job!"); 14 | break; 15 | case grade === "C": 16 | console.log("You got a ", grade, ": Ok!"); 17 | break; 18 | case grade === "D": 19 | console.log("You got a ", grade, ": Need to improve!"); 20 | break; 21 | default: 22 | console.log("An", grade, ": Oops. Try again!"); 23 | } 24 | } 25 | 26 | function pakistan(grade) { 27 | switch (true) { 28 | case grade === "A+": 29 | console.log("You got an ", grade, ": Zabardast!"); 30 | break; 31 | case grade === "A": 32 | console.log("You got an ", grade, ": عمدہ!"); 33 | break; 34 | case grade === "B": 35 | console.log("You got a ", grade, ": bohot khoob :)"); 36 | break; 37 | case grade === "C": 38 | console.log("You got a ", grade, ": Ok!"); 39 | break; 40 | case grade === "D": 41 | console.log("You got a ", grade, ": Need to improve!"); 42 | break; 43 | default: 44 | console.log("An", grade, ": Oops. Try again!"); 45 | } 46 | } 47 | 48 | function getGrade(percentage, callback) { 49 | let grade; 50 | switch (true) { 51 | case percentage >= 90: 52 | grade = "A+"; 53 | break; 54 | case percentage >= 80: 55 | grade = "A"; 56 | break; 57 | case percentage >= 70: 58 | grade = "B"; 59 | break; 60 | case percentage >= 60: 61 | grade = "C"; 62 | break; 63 | case percentage >= 50: 64 | grade = "D"; 65 | break; 66 | default: 67 | grade = "F"; 68 | } 69 | callback(grade); 70 | } 71 | 72 | getGrade(95,unitedstates) -------------------------------------------------------------------------------- /Concurrency/passwordChecker.js: -------------------------------------------------------------------------------- 1 | const notAllowedPasswords = ["password", "Alexander", "PIAIC"]; 2 | 3 | function checkPassword(password) { 4 | return notAllowedPasswords.includes(password); 5 | } 6 | 7 | function validatePassword(password) { 8 | return new Promise ((resolve, reject) => { 9 | if (checkPassword(password)) { 10 | reject({ 11 | status: false 12 | }) 13 | } else { 14 | resolve({ 15 | status: true 16 | }) 17 | } 18 | }) 19 | } 20 | 21 | function checker(password) { 22 | validatePassword(password) 23 | .then(value => { 24 | console.log("Authorize User"); 25 | console.log(value); 26 | }) 27 | .catch(value => { 28 | console.log("Reject User"); 29 | console.log(value); 30 | }) 31 | } 32 | 33 | checker("password") -------------------------------------------------------------------------------- /Concurrency/promise.js: -------------------------------------------------------------------------------- 1 | const promise = new Promise(function (resolve, reject) { 2 | resolve('JavaScript!') 3 | }); 4 | 5 | promise.then(function (success) { 6 | console.log("success: ", success); 7 | }).catch(function(error){ 8 | console.log("error: ", error); 9 | }) -------------------------------------------------------------------------------- /Concurrency/promise132.js: -------------------------------------------------------------------------------- 1 | const promise = new Promise((resolve, reject) => 2 | reject("Something went wrong") 3 | ); // resolve("Start Counting")); 4 | 5 | const counter = (value) => console.log(value); 6 | 7 | promise 8 | .then((value) => { 9 | counter(value); 10 | return "one"; 11 | }) 12 | .then((value) => { 13 | counter(value); 14 | return "two"; 15 | }) 16 | .then((value) => { 17 | counter(value); 18 | return "three"; 19 | }) 20 | .then((value) => { 21 | counter(value); 22 | }) 23 | .catch((error) => console.error(error)); -------------------------------------------------------------------------------- /Functions/arrow.js: -------------------------------------------------------------------------------- 1 | // function add (x,y) { 2 | // return x+y 3 | // } 4 | // add(1,2) 5 | 6 | // let add2 = (x,y) => x+y 7 | // add2(1,2) 8 | 9 | const student = { 10 | firstName: "Adil", 11 | lastName: "Altaf", 12 | fullName: function () {return this.firstName + ' ' + this.lastName} 13 | } 14 | 15 | console.log(student.fullName()) -------------------------------------------------------------------------------- /Functions/calculator.mjs: -------------------------------------------------------------------------------- 1 | const value1 = 1; 2 | const value2 = 2; 3 | 4 | let operator = "+"; 5 | 6 | function calculator(a, b, c) { 7 | if (c === "-") { 8 | console.log(a - b); 9 | } else { 10 | console.log(a + b); 11 | } 12 | } 13 | 14 | calculator(value1, value2, operator); 15 | -------------------------------------------------------------------------------- /Functions/calculator2.mjs: -------------------------------------------------------------------------------- 1 | const array = []; 2 | 3 | for (let i = 0; i < 10; i++) { 4 | let value1 = i*5; 5 | let value2 = i*i; 6 | let result = calculator(value1, value2, "+") 7 | array.push(result) 8 | } 9 | 10 | console.log(array); 11 | 12 | function calculator(a, b, c) { 13 | if (c === "-") { 14 | return(a - b); 15 | } else { 16 | return(a + b); 17 | } 18 | } -------------------------------------------------------------------------------- /Functions/chapterProject.js: -------------------------------------------------------------------------------- 1 | const one = () => console.log('one'); 2 | const two = () => console.log('two'); 3 | const three = () => { 4 | console.log('three'); 5 | one(); 6 | two(); 7 | }; 8 | const four = () => { 9 | console.log('four'); 10 | setTimeout(one, 0); 11 | three(); 12 | } 13 | 14 | four(); -------------------------------------------------------------------------------- /Functions/functions.js: -------------------------------------------------------------------------------- 1 | function coffeeOrder(drink) { 2 | return `Your ${drink} is on its way!` 3 | } 4 | 5 | const order = coffeeOrder('Espresso') 6 | 7 | console.log(order); -------------------------------------------------------------------------------- /Functions/recursion66.js: -------------------------------------------------------------------------------- 1 | function factorial(nr) { 2 | console.log(nr); 3 | if (nr === 0) { 4 | return 1 5 | } else { 6 | return nr * factorial(--nr) 7 | } 8 | } 9 | 10 | console.log(factorial(2)); -------------------------------------------------------------------------------- /Functions/recursive.js: -------------------------------------------------------------------------------- 1 | function getRecursive(nr) { 2 | console.log("Started function iteration: ", nr); 3 | if (nr > 0) { 4 | getRecursive(--nr); 5 | } else { 6 | console.log("Recursion completed"); 7 | } 8 | console.log("Function ended: ", nr); 9 | } 10 | 11 | getRecursive(5); 12 | -------------------------------------------------------------------------------- /Loops/chapterProject.mjs: -------------------------------------------------------------------------------- 1 | const multiplyTable = []; 2 | const numValues = 11; 3 | for (let i = 0; i < numValues; i++) { 4 | const temporary = []; 5 | for (let j = 0; j < numValues; j++) { 6 | temporary.push(i * j); 7 | } 8 | multiplyTable.push(temporary); 9 | } 10 | 11 | console.table(multiplyTable) -------------------------------------------------------------------------------- /Loops/forLoops.js: -------------------------------------------------------------------------------- 1 | const num = 7; 2 | 3 | for (let i = 1; i < 11; i++) { 4 | console.log(num * i); 5 | } 6 | -------------------------------------------------------------------------------- /Loops/forLoops53.js: -------------------------------------------------------------------------------- 1 | const myWork = []; 2 | 3 | for (let i = 1; i < 11; i++) { 4 | let status = i % 2 ? true : false; 5 | let temporary = { 6 | name: `Lesson ${i}`, 7 | status: status 8 | } 9 | myWork.push(temporary) 10 | } 11 | 12 | console.log(myWork); -------------------------------------------------------------------------------- /Loops/loopsObjects.js: -------------------------------------------------------------------------------- 1 | let car = { 2 | make: "Land Rover", 3 | model: "Defender 110", 4 | year: "2023", 5 | color: "Black" 6 | } 7 | 8 | for (const key in car) { 9 | console.log(car[key]); 10 | } -------------------------------------------------------------------------------- /Loops/nestedLoops.js: -------------------------------------------------------------------------------- 1 | const products = ["Shirt", "Trouser", "Jacket"]; 2 | const gifts = ["Pen", "Keychain", "Tie"]; 3 | 4 | for (let i = 0; i < products.length; i++) { 5 | for (let j = 0; j < gifts.length; j++) { 6 | console.log(products[i] + ' - ' + gifts[j]); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Loops/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "loops", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "loops", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "prompt-sync": "^4.2.0" 13 | } 14 | }, 15 | "node_modules/ansi-regex": { 16 | "version": "4.1.1", 17 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 18 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 19 | "engines": { 20 | "node": ">=6" 21 | } 22 | }, 23 | "node_modules/prompt-sync": { 24 | "version": "4.2.0", 25 | "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", 26 | "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", 27 | "dependencies": { 28 | "strip-ansi": "^5.0.0" 29 | } 30 | }, 31 | "node_modules/strip-ansi": { 32 | "version": "5.2.0", 33 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 34 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 35 | "dependencies": { 36 | "ansi-regex": "^4.1.0" 37 | }, 38 | "engines": { 39 | "node": ">=6" 40 | } 41 | } 42 | }, 43 | "dependencies": { 44 | "ansi-regex": { 45 | "version": "4.1.1", 46 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 47 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" 48 | }, 49 | "prompt-sync": { 50 | "version": "4.2.0", 51 | "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", 52 | "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", 53 | "requires": { 54 | "strip-ansi": "^5.0.0" 55 | } 56 | }, 57 | "strip-ansi": { 58 | "version": "5.2.0", 59 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 60 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 61 | "requires": { 62 | "ansi-regex": "^4.1.0" 63 | } 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Loops/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "loops", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "forLoops.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "prompt-sync": "^4.2.0" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Loops/whileLoop.mjs: -------------------------------------------------------------------------------- 1 | import promptSync from "prompt-sync"; 2 | 3 | const prompt = promptSync(); 4 | 5 | const maxValue = 10; 6 | const randomNumber = Math.floor(Math.random()*maxValue) + 1; 7 | let status = false; 8 | 9 | while(!status) { 10 | let userInput = prompt("Guess a number between 1 and " + maxValue + ' '); 11 | userInput = Number(userInput); 12 | if ( userInput === randomNumber) { 13 | status = true; 14 | console.log("You won! The number was " + randomNumber); 15 | } else if ( userInput > randomNumber ) { 16 | console.log("Sorry, your guess was too high.") 17 | } else { 18 | console.log("Sorry, your guess was too low.") 19 | } 20 | } -------------------------------------------------------------------------------- /rockPaperScissors/index.mjs: -------------------------------------------------------------------------------- 1 | import randomInteger from "random-int"; 2 | import promptSync from "prompt-sync"; 3 | 4 | // The available choices 5 | const choices = ["rock", "paper", "scissors"]; 6 | 7 | const userPrompt = "Please enter 0 for rock, 1 for paper, or 2 scissors. "; 8 | let outcome = "Ready to play."; 9 | 10 | // Computer chooses randomly 11 | const computerChoice = randomInteger(0, 2); 12 | const computerChoiceName = choices[computerChoice]; 13 | 14 | // Prompt the user for an input 15 | const prompt = promptSync(); 16 | const userInput = prompt(userPrompt); 17 | const userChoice = choices[userInput]; 18 | 19 | if (computerChoiceName === userChoice) { 20 | outcome = "Draw"; 21 | } else if (computerChoiceName === "rock" && userChoice === "paper") { 22 | outcome = "Player Wins"; 23 | } else if (computerChoiceName === "rock" && userChoice === "scissors") { 24 | outcome = "Computer Wins"; 25 | } else if (computerChoiceName === "paper" && userChoice === "rock") { 26 | outcome = "Computer Wins"; 27 | } else if (computerChoiceName === "paper" && userChoice === "scissors") { 28 | outcome = "Player Wins"; 29 | } else if (computerChoiceName === "scissors" && userChoice === "rock") { 30 | outcome = "Player Wins"; 31 | } else if (computerChoiceName === "scissors" && userChoice === "paper") { 32 | outcome = "Computer Wins"; 33 | } else { 34 | outcome = "Invalid entry. Please try again."; 35 | } 36 | 37 | console.log("Computer chooses " + computerChoiceName); 38 | console.log("Player chooses " + userChoice); 39 | console.log(outcome); 40 | -------------------------------------------------------------------------------- /rockPaperScissors/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rockpaperscissors", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "rockpaperscissors", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "prompt-sync": "^4.2.0", 13 | "random-int": "^3.0.0" 14 | } 15 | }, 16 | "node_modules/ansi-regex": { 17 | "version": "4.1.1", 18 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 19 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", 20 | "engines": { 21 | "node": ">=6" 22 | } 23 | }, 24 | "node_modules/prompt-sync": { 25 | "version": "4.2.0", 26 | "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", 27 | "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", 28 | "dependencies": { 29 | "strip-ansi": "^5.0.0" 30 | } 31 | }, 32 | "node_modules/random-int": { 33 | "version": "3.0.0", 34 | "resolved": "https://registry.npmjs.org/random-int/-/random-int-3.0.0.tgz", 35 | "integrity": "sha512-QvewnOwigesW2WFyTHiQzR6XUUcSQO/BqmfgRz5N5GpGrKQnTf7ebMz8UtuwaET8IfO1n0wLx8/fHsI8E0Jpow==", 36 | "engines": { 37 | "node": ">=12" 38 | }, 39 | "funding": { 40 | "url": "https://github.com/sponsors/sindresorhus" 41 | } 42 | }, 43 | "node_modules/strip-ansi": { 44 | "version": "5.2.0", 45 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 46 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 47 | "dependencies": { 48 | "ansi-regex": "^4.1.0" 49 | }, 50 | "engines": { 51 | "node": ">=6" 52 | } 53 | } 54 | }, 55 | "dependencies": { 56 | "ansi-regex": { 57 | "version": "4.1.1", 58 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", 59 | "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" 60 | }, 61 | "prompt-sync": { 62 | "version": "4.2.0", 63 | "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", 64 | "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", 65 | "requires": { 66 | "strip-ansi": "^5.0.0" 67 | } 68 | }, 69 | "random-int": { 70 | "version": "3.0.0", 71 | "resolved": "https://registry.npmjs.org/random-int/-/random-int-3.0.0.tgz", 72 | "integrity": "sha512-QvewnOwigesW2WFyTHiQzR6XUUcSQO/BqmfgRz5N5GpGrKQnTf7ebMz8UtuwaET8IfO1n0wLx8/fHsI8E0Jpow==" 73 | }, 74 | "strip-ansi": { 75 | "version": "5.2.0", 76 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 77 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 78 | "requires": { 79 | "ansi-regex": "^4.1.0" 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /rockPaperScissors/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rockpaperscissors", 3 | "version": "1.0.0", 4 | "description": "rock paper scissors game", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "prompt-sync": "^4.2.0", 13 | "random-int": "^3.0.0" 14 | } 15 | } 16 | --------------------------------------------------------------------------------