diff --git a/backend/raspberry.js b/backend/raspberry.js index 7c079bb..65f3173 100644 --- a/backend/raspberry.js +++ b/backend/raspberry.js @@ -1,16 +1,32 @@ +const gpio = require('onoff').Gpio; + +//index +1 stands for pumpid +const relays = [ + new gpio(11, 'out'), + new gpio(13, 'out'), + new gpio(19 , 'out'), + new gpio(17, 'out'), + new gpio(27, 'out'), + new gpio(22, 'out'), + new gpio(10, 'out'), + new gpio(9, 'out'), +] + function showOnDisplay(text, removeAfter = null) { } async function activatePump(pumpID, activateFor) { - console.log(`Activating pump ${pumpID} for ${activateFor} ms`); + const pumpArrayIndex = pumpID - 1; + const relay = relays[pumpArrayIndex]; + relay.writeSync(1); await new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, Math.floor(activateFor)); }); - console.log(`Pump ${pumpID} disabled after ${activateFor} ms`); - + relay.writeSync(0); + relay.unexport(); return true; } diff --git a/buildBackend/.env b/buildBackend/.env new file mode 100644 index 0000000..e453aba --- /dev/null +++ b/buildBackend/.env @@ -0,0 +1,14 @@ +NODE_ENV = 'development' +BACKEND_PORT = 4000 +# frontend port must also be changed in frontend/src/requests.js +FRONTEND_PORT = 3000 +SETTINGS_PASSWORD = 'cocktail' +# pump rates in ml per 1s +RATE_PUMP_1 = 100; +RATE_PUMP_2 = 100; +RATE_PUMP_3 = 100; +RATE_PUMP_4 = 100; +RATE_PUMP_5 = 100; +RATE_PUMP_6 = 100; +RATE_PUMP_7 = 100; +RATE_PUMP_8 = 100; \ No newline at end of file diff --git a/buildBackend/backend/backend/app.js b/buildBackend/backend/backend/app.js new file mode 100644 index 0000000..b3adb6c --- /dev/null +++ b/buildBackend/backend/backend/app.js @@ -0,0 +1,129 @@ +const cors = require('cors'); +const dotenv = require('dotenv'); +const fs = require('fs'); +const showOnDisplay = require('./raspberry').showOnDisplay; +const activatePump = require('./raspberry').activatePump; +const checkPassword = require('./misc').checkPassword; +const getTask = require('./currentTask').getTask; +const pumpsJSONPATH = './data/pumps.json'; + +const result = dotenv.config({ + path: './.env' +}); +if (result.error) { + throw result.error; +} +console.log(result.parsed); + +const http = require('http'); +const express = require('express'); +const ip = require("ip"); +const app = express(); +app.use(express.json()); +app.use(cors()); + +//import routes +const drinkRoute = require('./routes/drinks'); +app.use('/drink', drinkRoute); +app.use(cors({origin: '*'})); + +app.get('/status', (req, res) => { + const status = getTask(); + res.status(200); + res.send({ + task: status + }); +}); + +app.get('/pumps', (req, res) => { + fs.readFile(pumpsJSONPATH, "utf8", (error, jsonString) => { + if (error) { + res.status(500); + res.send({ error: error.message }); + return; + } + res.status(200); + res.send(jsonString); + }); +}); + +app.patch('/setPump', (req, res) => { + const response = { + success: false, + } + + const password = req.body.password; + const selectedPumpID = req.body.pump; + const newSelection = req.body.newSelection; + + if (!(password || selectedPumpID || newSelection)) { + res.status(500); + const passedParameters = JSON.stringify({password, pump: selectedPumpID, newSelection}); + res.send({ error: `Wrong parameters ${passedParameters}` }); + return; + }; + + if(checkPassword(password).correct) { + const currentPumpStatus = JSON.parse(fs.readFileSync(pumpsJSONPATH, 'utf8')); + const newPumpsArray = currentPumpStatus.pumps.map(pump => { + if(pump.id === selectedPumpID) { + pump.select = newSelection; + } + return pump; + }); + + fs.writeFile(pumpsJSONPATH, JSON.stringify({pumps: newPumpsArray}), (error) => { + if (error) { + res.status(500); + res.send({ error: error.message }); + return; + } + res.status(200); + response.success = true; + res.send(response); + }); + } else { + res.status(401); + res.send(response); + } +}); + +app.post('/password', async (req, res) => { + const response = checkPassword(req.body.password); + res.status(200); + res.send(response); +}); + + +let lastRequests = [ + Promise.resolve(), + Promise.resolve(), + Promise.resolve(), + Promise.resolve(), + Promise.resolve(), + Promise.resolve(), + Promise.resolve(), + Promise.resolve(), +]; + +app.post('/startPump', async (req, res) => { + res.status(200); + res.send({success: true}); + const pumpID = req.body.id; + const timeInMs = req.body.time; + + const response = await Promise.race([lastRequests[pumpID - 1], 'loading']); + if (response === 'loading') return; + + const promise = activatePump(pumpID, timeInMs); + lastRequests[pumpID - 1] = promise; +}); + +// get ip with -hostname I +// https://pimylifeup.com/raspberry-pi-static-ip-address/ +const hostname = ip.address(); +const port = process.env.BACKEND_PORT || 3000; + +const server = app.listen(port, () => { + console.log('Server running at '+hostname+':'+port) +}); \ No newline at end of file diff --git a/buildBackend/backend/backend/currentTask.js b/buildBackend/backend/backend/currentTask.js new file mode 100644 index 0000000..ab28480 --- /dev/null +++ b/buildBackend/backend/backend/currentTask.js @@ -0,0 +1,14 @@ +const task = { + task: 'Idle' +} + +function setTask(newTask) { + task.task = newTask; +} + +function getTask() { + return task.task; +} + +module.exports.getTask = getTask; +module.exports.setTask = setTask; \ No newline at end of file diff --git a/buildBackend/backend/backend/databaseHandler.js b/buildBackend/backend/backend/databaseHandler.js new file mode 100644 index 0000000..d456971 --- /dev/null +++ b/buildBackend/backend/backend/databaseHandler.js @@ -0,0 +1,129 @@ +const sqlite3 = require('sqlite3').verbose(); +const drinksDatabase = new sqlite3.Database('./data/database.db', (err) => { + if (err) { + console.error(err.message); + } else { + console.log('Connected to the drinks database.'); + } +}); + +class DrinksDatabase { + static async createTables() { + + const createDrinks = new Promise((resolve, reject) => { + drinksDatabase.run('CREATE TABLE IF NOT EXISTS drinks (id INTEGER PRIMARY KEY, name TEXT, hasAlcohol BOOLEAN)', (err) => { + if (err) { + reject(err); + } + resolve(); + }); + }); + const createIngredients = new Promise((resolve, reject) => { + drinksDatabase.run('CREATE TABLE IF NOT EXISTS ingredients (id INTEGER, ingredient TEXT, categoryOfIngredient TEXT, amountOfIngredient REAL, unitOfMeasurement TEXT)', (err) => { + if (err) { + reject(err); + } + resolve(); + }); + }); + + return Promise.all([createDrinks, createIngredients]); + } + + static getID() { + return Math.floor(+Date.now() + Math.random()); + } + + static async createDrink(name, hasAlcohol) { + const newID = this.getID(); + return new Promise((resolve, reject) => { + drinksDatabase.run('INSERT INTO drinks (id, name, hasAlcohol) VALUES (?, ?, ?)', [newID, name, hasAlcohol], (err) => { + if (err) { + reject(err); + } + resolve(newID); + }); + }); + } + + static async removeDrink(id) { + const deleteIngredients = new Promise((resolve, reject) => { + drinksDatabase.run('DELETE FROM ingredients WHERE id = ?', [id], (err) => { + if (err) { + reject(err); + } + resolve(); + }); + }); + + const deleteDrink = new Promise((resolve, reject) => { + drinksDatabase.run('DELETE FROM drinks WHERE id = ?', [id], (err) => { + if (err) { + reject(err); + } + resolve(); + }); + }); + + await Promise.all([deleteIngredients, deleteDrink]); + } + + static async addIngredient(drinkID, ingredient, category, amount, unit) { + return new Promise((resolve, reject) => { + drinksDatabase.run('INSERT INTO ingredients (id, ingredient, categoryOfIngredient, amountOfIngredient, unitOfMeasurement) VALUES (?, ?, ?, ?, ?)', [drinkID, ingredient, category, amount, unit], (err) => { + if (err) { + reject(err); + } + resolve(); + }) + }); + } + + static async getIngredients(drinkID) { + return new Promise((resolve, reject) => { + drinksDatabase.all('SELECT * FROM ingredients WHERE id = ?', [drinkID], (err, rows) => { + if (err) { + reject(err); + } + resolve(rows); + }); + }); + } + + static async getAllIngredientsCategories() { + return new Promise((resolve, reject) => { + drinksDatabase.all('SELECT DISTINCT categoryOfIngredient FROM ingredients', (err, rows) => { + if (err) { + reject(err); + } + resolve(rows); + }); + }); + } + + static async getAllDrinks() { + return new Promise((resolve, reject) => { + drinksDatabase.all('SELECT * FROM DRINKS', (err, rows) => { + if (err) { + reject(err); + } + resolve(rows); + }); + }); + } + + static async endConnection() { + return new Promise((resolve, reject) => { + drinksDatabase.close((err) => { + if (err) { + reject(err); + } + resolve(); + }) + }); + } +} + +DrinksDatabase.createTables(); + +module.exports = DrinksDatabase; diff --git a/buildBackend/backend/backend/getCocktails.js b/buildBackend/backend/backend/getCocktails.js new file mode 100644 index 0000000..e69de29 diff --git a/buildBackend/backend/backend/misc.js b/buildBackend/backend/backend/misc.js new file mode 100644 index 0000000..7628eca --- /dev/null +++ b/buildBackend/backend/backend/misc.js @@ -0,0 +1,37 @@ +const ingredientsJSONPATH = './data/ingredients.json'; +const fs = require('fs'); + +function checkPassword(password) { + const response = { + correct: false + } + + const validPassword = process.env.SETTINGS_PASSWORD; + + if (validPassword === password) { + response.correct = true; + } + + return response; +} +module.exports.checkPassword = checkPassword; + +async function getCategoryOfIngredient(ingredient) { + const currentIngredients = await fs.promises.readFile(ingredientsJSONPATH, "utf8"). catch((error) => { + res.status(500); + res.send({ error: error.message }); + return; + }); + + let foundCategory = null; + Object.entries(JSON.parse(currentIngredients)).forEach(([category, ingredients]) => { + ingredients.forEach((ingredientInCategory) => { + if (ingredientInCategory === ingredient) { + foundCategory = category; + } + }); + }); + + return foundCategory; +} +module.exports.getCategoryOfIngredient = getCategoryOfIngredient; \ No newline at end of file diff --git a/buildBackend/backend/backend/output.js b/buildBackend/backend/backend/output.js new file mode 100644 index 0000000..e69de29 diff --git a/buildBackend/backend/backend/raspberry.js b/buildBackend/backend/backend/raspberry.js new file mode 100644 index 0000000..65f3173 --- /dev/null +++ b/buildBackend/backend/backend/raspberry.js @@ -0,0 +1,34 @@ +const gpio = require('onoff').Gpio; + +//index +1 stands for pumpid +const relays = [ + new gpio(11, 'out'), + new gpio(13, 'out'), + new gpio(19 , 'out'), + new gpio(17, 'out'), + new gpio(27, 'out'), + new gpio(22, 'out'), + new gpio(10, 'out'), + new gpio(9, 'out'), +] + +function showOnDisplay(text, removeAfter = null) { + +} + +async function activatePump(pumpID, activateFor) { + const pumpArrayIndex = pumpID - 1; + const relay = relays[pumpArrayIndex]; + relay.writeSync(1); + await new Promise((resolve, reject) => { + setTimeout(() => { + resolve(); + }, Math.floor(activateFor)); + }); + relay.writeSync(0); + relay.unexport(); + return true; +} + +module.exports.showOnDisplay = showOnDisplay; +module.exports.activatePump = activatePump; \ No newline at end of file diff --git a/buildBackend/backend/backend/routes/drinks.js b/buildBackend/backend/backend/routes/drinks.js new file mode 100644 index 0000000..8590718 --- /dev/null +++ b/buildBackend/backend/backend/routes/drinks.js @@ -0,0 +1,271 @@ +const DrinksDatabase = require('../databaseHandler'); +const checkPassword = require('../misc').checkPassword; +const getCategoryOfIngredient = require('../misc').getCategoryOfIngredient; +const activatePump = require('../raspberry').activatePump; +const setTask = require('../currentTask').setTask; +const getTask = require('../currentTask').getTask; +const ingredientsJSONPATH = './data/ingredients.json'; +const pumpsJSONPATH = './data/pumps.json'; + +const express = require('express'); +const fs = require('fs'); + +const router = express.Router(); + +router.get('/make', (req, res) => { + res.send('Already making a drink.'); +}); + +router.get('/ingredients', (req, res) => { + fs.readFile(ingredientsJSONPATH, "utf8", (error, jsonString) => { + if (error) { + res.status(500); + res.send({ error: error.message }); + return; + } + res.status(200); + res.send(jsonString); + }); +}); + +router.patch('/addIngredient', async (req, res) => { + const response = { + success: false, + } + + const password = req.body.password; + const passwordValid = checkPassword(password).correct; + if (!passwordValid) { + res.status(401); + res.send(response); + return; + } + + const category = req.body.category; + const newIngredient = req.body.ingredient; + + const currentIngredients = await fs.promises.readFile(ingredientsJSONPATH, "utf8").catch(error => { + res.status(500); + res.send({ error: error.message }); + return; + }); + + if (!currentIngredients) { + res.status(500); + res.send({response, ...{ error: 'Could not read ingredients file.'}}); + return; + } + + const newObject = {...JSON.parse(currentIngredients)}; + newObject[category].push(newIngredient); + + await fs.promises.writeFile(ingredientsJSONPATH, JSON.stringify(newObject)).catch(error => { + res.status(500); + res.send({ error: error.message }); + return; + }); + + res.status(200); + response.success = true; + res.send(response); +}); + +router.patch('/removeIngredient', async (req, res) => { + const response = { + success: false, + } + + const password = req.body.password; + const passwordValid = checkPassword(password).correct; + if (!passwordValid) { + res.status(401); + res.send(response); + return; + } + + const category = req.body.category; + const deleteIngredient = req.body.ingredient; + + const currentIngredients = await fs.promises.readFile(ingredientsJSONPATH, "utf8").catch(error => { + res.status(500); + res.send({ error: error.message }); + return; + }); + + if (!currentIngredients) { + res.status(500); + res.send({response, ...{ error: 'Could not read ingredients file.'}}); + return; + } + + const newObject = {...JSON.parse(currentIngredients)}; + const newArray = newObject[category].filter(ingredient => ingredient !== deleteIngredient); + newObject[category] = newArray; + + await fs.promises.writeFile(ingredientsJSONPATH, JSON.stringify(newObject)).catch(error => { + res.status(500); + res.send({ error: error.message }); + return; + }); + + res.status(200); + response.success = true; + res.send(response); +}); + +// DrinksDatabase +router.patch('/add', async (req, res) => { + const name = req.body.name; + const ingredients = req.body.ingredients; + + // get all categories and check if it contains alcohol + let hasAlcohol = false; + const ingredientsWithCategory = await Promise.all(ingredients.map(async (ingredient) => { + const nameOfIngredient = ingredient.ingredient; + const category = await getCategoryOfIngredient(nameOfIngredient); + + if (category === 'alcohol') { + hasAlcohol = true; + } + + return { + ...ingredient, + ...{category} + } + })); + + const idOfDrink = await DrinksDatabase.createDrink(name, hasAlcohol); + await Promise.all(ingredientsWithCategory.map(async (ingredient) => { + await DrinksDatabase.addIngredient(idOfDrink, ingredient.ingredient, ingredient.category, ingredient.amount, ingredient.unit); + })).catch((error) => { + res.status(500); + res.send({ error: error.message }); + return; + }); + + res.status(200); + res.send({ + success: true, + id: idOfDrink + }); +}); + + +router.get('/all', async (req, res) => { + const allDrinks = await DrinksDatabase.getAllDrinks(); + res.status(200); + res.send(allDrinks); +}); + +function getUnitInMl(unit) { + switch (unit) { + case 'ml': + return 1; + case 'cl': + return 10; + case 'tsp': + return 5; + case 'tbsp': + return 15; + default: + return 1; + } +} + +async function getPumpWithIngredient(ingredient) { + const response = await fs.promises.readFile(pumpsJSONPATH, 'utf8').catch((error) => console.error(error)); + const pumpSettingsArray = JSON.parse(response).pumps; + + const ingredientIndex = pumpSettingsArray.findIndex((object) => object.select === ingredient); + if (ingredientIndex === -1) { + console.error(`Ingredient ${ingredient} not avaible.`); + return -1; + } + + return pumpSettingsArray[ingredientIndex].id; +} + +function getPumpRate(pumpID) { + // ml per second + pumpID = parseInt(pumpID); + + switch (pumpID) { + case 1: + return process.env.RATE_PUMP_1; + case 2: + return process.env.RATE_PUMP_2; + case 3: + return process.env.RATE_PUMP_3; + case 4: + return process.env.RATE_PUMP_4; + case 5: + return process.env.RATE_PUMP_5; + case 6: + return process.env.RATE_PUMP_6; + case 7: + return process.env.RATE_PUMP_7; + case 8: + return process.env.RATE_PUMP_8; + } +} + +router.post('/make', async (req, res) => { + const currentTask = getTask(); + if (currentTask !== 'Idle') { + res.status() + }; + setTask('Mixing'); + + const idOfDrink = req.body.id; + const ingredients = await DrinksDatabase.getIngredients(idOfDrink); + const notAdded = []; + await Promise.all(ingredients.map(async (ingredient) => { + + const pumpID = await getPumpWithIngredient(ingredient.ingredient); + if (pumpID === -1) { + notAdded.push(ingredient); + return; + } + + console.log(ingredient); + const unit = ingredient.unitOfMeasurement; + const amount = ingredient.amountOfIngredient; + + const convertRate = getUnitInMl(unit); + const mlToDispense = amount * convertRate; + const pumpRateMlPerSecond = parseInt(getPumpRate(pumpID)); + + const activationTimeInSeconds = mlToDispense / pumpRateMlPerSecond; + const activationTime = activationTimeInSeconds * 1000; + await activatePump(pumpID, activationTime); + })); + res.status(200); + res.send({notAdded}); + setTask('Idle'); +}); + +router.delete('/remove', async (req, res) => { + const password = req.body.password; + const drinkID = req.body.id; + + if (!(checkPassword(password).correct)) { + res.status(401); + } + + try { + await DrinksDatabase.removeDrink(drinkID); + res.status(200); + res.send({success: true}) + } catch(error) { + res.status(500); + res.send({error: error.message}) + } +}); + +router.post('/ingredients', async (req, res) => { + const id = req.body.id; + const ingredients = await DrinksDatabase.getIngredients(id); + res.status(200); + res.send({ingredients}); +}); +module.exports = router; \ No newline at end of file diff --git a/buildBackend/package-lock.json b/buildBackend/package-lock.json new file mode 100644 index 0000000..72ecf4d --- /dev/null +++ b/buildBackend/package-lock.json @@ -0,0 +1,3061 @@ +{ + "name": "cocktail-mixer", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "cocktail-mixer", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "body-parser": "^1.19.0", + "cors": "^2.8.5", + "dotenv": "^10.0.0", + "ip": "^1.1.5", + "onoff": "^6.0.3", + "sqlite3": "^5.0.2" + }, + "devDependencies": { + "express": "^4.17.1" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "optional": 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-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "optional": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "optional": true + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "optional": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "optional": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "optional": true, + "dependencies": { + "inherits": "~2.0.0" + }, + "engines": { + "node": "0.4 || >=0.5.8" + } + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "optional": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "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=" + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "optional": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/epoll": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/epoll/-/epoll-4.0.1.tgz", + "integrity": "sha512-BgCq0nEsk+XI7y9qjrRtt9uXsyFEdvevvq42xl6t/hKZjxLSDZreD9rTZ0pU40V//c3Zzk2PZGuIsn8YJHSJ4g==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.14.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "optional": true + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "engines": [ + "node >=0.6.0" + ], + "optional": true + }, + "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==", + "optional": 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==", + "optional": true + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dependencies": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "optional": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "optional": true, + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "optional": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "optional": true + }, + "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==", + "optional": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "optional": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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==" + }, + "node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/needle/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "node_modules/node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "optional": true, + "dependencies": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "deprecated": "Please upgrade to @mapbox/node-pre-gyp: the non-scoped node-pre-gyp package is deprecated and only the @mapbox scoped package will recieve updates in the future", + "dependencies": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" + } + }, + "node_modules/node-pre-gyp/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/node-pre-gyp/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/node-pre-gyp/node_modules/tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "optional": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "node_modules/npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dependencies": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dependencies": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onoff": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/onoff/-/onoff-6.0.3.tgz", + "integrity": "sha512-xtVlwRDzswYM69bzzIui/qzu7QHsFnjsQiCV1iYVA/HXt5xdc9utc97SYAlXzK8wAhIN7+H7MaVqh2vpfdKk9A==", + "dependencies": { + "epoll": "^4.0.1", + "lodash.debounce": "^4.0.8" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "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=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "optional": true + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "optional": true + }, + "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==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "optional": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "optional": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + }, + "node_modules/sqlite3": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.2.tgz", + "integrity": "sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.0.0", + "node-pre-gyp": "^0.11.0" + }, + "optionalDependencies": { + "node-gyp": "3.x" + }, + "peerDependencies": { + "node-gyp": "3.x" + }, + "peerDependenciesMeta": { + "node-gyp": { + "optional": true + } + } + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "optional": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "deprecated": "This version of tar is no longer supported, and will not receive security updates. Please upgrade asap.", + "optional": true, + "dependencies": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "optional": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "optional": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "optional": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "engines": [ + "node >=0.6.0" + ], + "optional": true, + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "optional": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "optional": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "optional": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "optional": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "optional": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "epoll": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/epoll/-/epoll-4.0.1.tgz", + "integrity": "sha512-BgCq0nEsk+XI7y9qjrRtt9uXsyFEdvevvq42xl6t/hKZjxLSDZreD9rTZ0pU40V//c3Zzk2PZGuIsn8YJHSJ4g==", + "requires": { + "bindings": "^1.5.0", + "nan": "^2.14.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "optional": true + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "optional": true + }, + "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==", + "optional": true + }, + "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==", + "optional": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "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" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "optional": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "optional": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "optional": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "optional": true + }, + "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==", + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "requires": { + "mime-db": "1.51.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + } + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + } + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "optional": true, + "requires": { + "abbrev": "1" + } + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onoff": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/onoff/-/onoff-6.0.3.tgz", + "integrity": "sha512-xtVlwRDzswYM69bzzIui/qzu7QHsFnjsQiCV1iYVA/HXt5xdc9utc97SYAlXzK8wAhIN7+H7MaVqh2vpfdKk9A==", + "requires": { + "epoll": "^4.0.1", + "lodash.debounce": "^4.0.8" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "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=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "optional": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "optional": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "optional": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "optional": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "optional": true + } + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + }, + "sqlite3": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.2.tgz", + "integrity": "sha512-1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA==", + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp": "3.x", + "node-pre-gyp": "^0.11.0" + } + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "optional": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "optional": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "optional": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "optional": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } +} diff --git a/buildBackend/package.json b/buildBackend/package.json new file mode 100644 index 0000000..1c2ea0d --- /dev/null +++ b/buildBackend/package.json @@ -0,0 +1,26 @@ +{ + "name": "cocktail-mixer", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "startFrontend": "cd ./frontend && npm run start", + "startBackend": "node ./backend/app", + "start": "npm run startFrontend & npm run startBackend", + "build": "rm -f -r ./buildBackend && mkdir -p ./buildBackend/backend && cp -r ./backend ./buildBackend/backend && cp -t ./buildBackend .env package.json package-lock.json" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "express": "^4.17.1" + }, + "dependencies": { + "body-parser": "^1.19.0", + "cors": "^2.8.5", + "dotenv": "^10.0.0", + "ip": "^1.1.5", + "onoff": "^6.0.3", + "sqlite3": "^5.0.2" + } +} diff --git a/frontend/build/asset-manifest.json b/frontend/build/asset-manifest.json index 63df01e..d20f1dd 100644 --- a/frontend/build/asset-manifest.json +++ b/frontend/build/asset-manifest.json @@ -1,21 +1,21 @@ { "files": { - "main.css": "/static/css/main.e4b6d27c.chunk.css", - "main.js": "/static/js/main.61cc9d63.chunk.js", - "main.js.map": "/static/js/main.61cc9d63.chunk.js.map", + "main.css": "/static/css/main.9c984979.chunk.css", + "main.js": "/static/js/main.723c0bfd.chunk.js", + "main.js.map": "/static/js/main.723c0bfd.chunk.js.map", "runtime-main.js": "/static/js/runtime-main.ff5b8ea4.js", "runtime-main.js.map": "/static/js/runtime-main.ff5b8ea4.js.map", "static/js/2.9df7d897.chunk.js": "/static/js/2.9df7d897.chunk.js", "static/js/2.9df7d897.chunk.js.map": "/static/js/2.9df7d897.chunk.js.map", "index.html": "/index.html", - "static/css/main.e4b6d27c.chunk.css.map": "/static/css/main.e4b6d27c.chunk.css.map", + "static/css/main.9c984979.chunk.css.map": "/static/css/main.9c984979.chunk.css.map", "static/js/2.9df7d897.chunk.js.LICENSE.txt": "/static/js/2.9df7d897.chunk.js.LICENSE.txt", "static/media/settings.8588567d.svg": "/static/media/settings.8588567d.svg" }, "entrypoints": [ "static/js/runtime-main.ff5b8ea4.js", "static/js/2.9df7d897.chunk.js", - "static/css/main.e4b6d27c.chunk.css", - "static/js/main.61cc9d63.chunk.js" + "static/css/main.9c984979.chunk.css", + "static/js/main.723c0bfd.chunk.js" ] } \ No newline at end of file diff --git a/frontend/build/index.html b/frontend/build/index.html index 330f304..13a05c9 100644 --- a/frontend/build/index.html +++ b/frontend/build/index.html @@ -1 +1 @@ -Cocktail Mixer
\ No newline at end of file +Cocktail Mixer
\ No newline at end of file diff --git a/frontend/build/static/css/main.e4b6d27c.chunk.css b/frontend/build/static/css/main.9c984979.chunk.css similarity index 63% rename from frontend/build/static/css/main.e4b6d27c.chunk.css rename to frontend/build/static/css/main.9c984979.chunk.css index f21b2aa..f063e67 100644 --- a/frontend/build/static/css/main.e4b6d27c.chunk.css +++ b/frontend/build/static/css/main.9c984979.chunk.css @@ -1,2 +1,2 @@ -body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,"Courier New",monospace}#root,.App,body,html{height:100%}.App{text-align:center;display:flow-root}.App-logo{height:40vmin;pointer-events:none}@media (prefers-reduced-motion:no-preference){.App-logo{animation:App-logo-spin 20s linear infinite}}.App-header{background-color:#282c34;min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:calc(10px + 2vmin);color:#fff}.App-link{color:#61dafb}@keyframes App-logo-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.button{margin:1em;min-width:5rem;height:1.5rem;border-radius:.25rem;cursor:pointer;display:flex;justify-content:center;align-items:center}.button.red{background:#e84855}.button.green{background:#4caf50}.attention{align-items:center;-webkit-appearance:none;appearance:none;background-color:#fcfcfd;border-radius:4px;border-width:0;box-shadow:0 2px 4px rgba(45,35,66,.4),0 7px 13px -3px rgba(45,35,66,.3),inset 0 -3px 0 #d6d6e7;box-sizing:border-box;color:#36395a;cursor:pointer;display:flex;font-family:"JetBrains Mono",monospace;height:48px;justify-content:center;line-height:1;list-style:none;overflow:hidden;padding-left:16px;padding-right:16px;position:relative;text-align:left;text-decoration:none;transition:box-shadow .15s,transform .15s;-ms-user-select:none;user-select:none;-webkit-user-select:none;touch-action:manipulation;white-space:nowrap;will-change:box-shadow,transform;font-size:18px;z-index:1}.button.attention:focus{box-shadow:inset 0 0 0 1.5px #d6d6e7,0 2px 4px rgba(45,35,66,.4),0 7px 13px -3px rgba(45,35,66,.3),inset 0 -3px 0 #d6d6e7}.button.attention:hover{box-shadow:0 4px 8px rgba(45,35,66,.4),0 7px 13px -3px rgba(45,35,66,.3),inset 0 -3px 0 #d6d6e7;transform:translateY(-2px)}.button.attention:active{box-shadow:inset 0 3px 7px #d6d6e7;transform:translateY(2px)}.remove{border-radius:50%;padding:.5em;width:30px;height:30px;border:2px solid #00f;color:#00f;position:relative}.remove:hover{border:2px solid #00f;background-color:rgba(255,0,0,.7);color:#fff}.remove:before{width:2px;left:12px;top:5px;bottom:5px}.remove:after,.remove:before{content:" ";position:absolute;display:block;background-color:#00f;transform:rotate(45deg)}.remove:after{height:2px;top:12px;left:5px;right:5px}.white-content-overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:2;transition:opacity .2s ease}.white-content-overlay .settings-container{display:flex;flex-direction:column;justify-content:center;align-items:center;width:90%;max-width:30rem;height:90%;border-radius:1rem;background:#fff}.blur-background{position:absolute;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:-1}@keyframes shake{0%{transform:translate(1px,1px) rotate(0deg)}10%{transform:translate(-1px,-2px) rotate(-1deg)}20%{transform:translate(-3px) rotate(1deg)}30%{transform:translate(3px,2px) rotate(0deg)}40%{transform:translate(1px,-1px) rotate(1deg)}50%{transform:translate(-1px,2px) rotate(-1deg)}60%{transform:translate(-3px,1px) rotate(0deg)}70%{transform:translate(3px,1px) rotate(-1deg)}80%{transform:translate(-1px,-1px) rotate(1deg)}90%{transform:translate(1px,2px) rotate(0deg)}to{transform:translate(1px,-2px) rotate(-1deg)}}.settings-menu .settings-container{display:flex;flex-direction:column;justify-content:center;align-items:center;width:90%;max-width:30rem;height:90%;border-radius:1rem;background:#fff}.settings-menu .settings-hidden{overflow:auto}.settings-container>*{margin:1em}.password-input{display:flex;align-items:center;margin-top:auto;border:1px solid #7d7d7d;border-radius:.25rem;min-width:3rem}.password-input input{border:none;outline:none}.password-input button{background:none;padding:.25em;color:#4e4e4e;background-color:hsla(0,0%,49%,.24705882352941178);border:none;border-left:1px solid hsla(0,0%,49%,.24705882352941178);cursor:pointer}.invalid{animation:shake .5s;border-color:red}.settings-container .close-button{margin-top:auto;padding:0;cursor:pointer;border:none;border-radius:5rem;background:rgba(221,31,31,.733);width:3rem;height:3rem}.pump-settings{display:flex;flex-direction:column;align-items:center}.pump-settings .pumps{display:flex;justify-content:center;margin:0 auto;width:100%;flex-wrap:wrap}.ingredient.delete{display:flex;flex-direction:row;justify-content:center;align-items:center}.debug-values{overflow:auto;height:30rem;border:1px solid #000}.debug-value{overflow:scroll;border:1px solid #000}.top-header{display:flex;justify-content:space-around;align-items:center;border:1px solid #000;border-radius:.5rem;margin:1rem;padding:.5rem;box-shadow:0 0 1rem #888}.settings{cursor:pointer;padding:1rem;margin:-1rem}.status{display:flex;justify-content:center;align-items:center;grid-column-gap:.5em;column-gap:.5em}.circle{border-radius:50%;width:.5em;height:.5em}.circle.green{background:#378805}.circle.red{background:#e3242b}.main{border:1px solid #000;border-radius:.5rem;box-shadow:0 0 1rem #888;display:flex}.drink-categories,.main{width:80%;margin:0 auto}.drink-category{border:1px solid #000;margin:1rem 0;width:100%}.drink-category .drinks{display:flex;flex-wrap:wrap;justify-content:center}.drink-category .name{background:#fff;width:50%;padding:0 1em;margin:-.5rem auto 0}.footer{border:1px solid #000;border-radius:.5rem;box-shadow:0 0 1rem #888;margin:1rem;display:flex;align-items:center}.footer .button.attention{flex:1 1}.add-drink-component{display:flex;flex-direction:column;align-items:center;overflow-x:hidden;overflow-y:auto;width:100%;max-height:80%}.submit-container .button{margin:0;background:rgba(123,247,123,.63)}.add-drink-component .name{margin-bottom:1em}.add-drink-component .button{min-height:2.5rem}.ingredient-section{display:flex;flex-direction:row;width:-webkit-min-content;width:min-content}.ingredient-section select{min-width:6rem;width:20%}.ingredient-section input{min-width:3rem;width:10%} -/*# sourceMappingURL=main.e4b6d27c.chunk.css.map */ \ No newline at end of file +body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code{font-family:source-code-pro,Menlo,Monaco,Consolas,"Courier New",monospace}#root,.App,body,html{height:100%}.App{text-align:center;display:flow-root}.App-logo{height:40vmin;pointer-events:none}@media (prefers-reduced-motion:no-preference){.App-logo{animation:App-logo-spin 20s linear infinite}}.App-header{background-color:#282c34;min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:calc(10px + 2vmin);color:#fff}.App-link{color:#61dafb}@keyframes App-logo-spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.button{margin:1em;min-width:5rem;height:1.5rem;border-radius:.25rem;cursor:pointer;display:flex;justify-content:center;align-items:center}.button.red{background:#e84855}.button.green{background:#4caf50}.attention{align-items:center;-webkit-appearance:none;appearance:none;background-color:#fcfcfd;border-radius:4px;border-width:0;box-shadow:0 2px 4px rgba(45,35,66,.4),0 7px 13px -3px rgba(45,35,66,.3),inset 0 -3px 0 #d6d6e7;box-sizing:border-box;color:#36395a;cursor:pointer;display:flex;font-family:"JetBrains Mono",monospace;height:48px;justify-content:center;line-height:1;list-style:none;overflow:hidden;padding-left:16px;padding-right:16px;position:relative;text-align:left;text-decoration:none;transition:box-shadow .15s,transform .15s;-ms-user-select:none;user-select:none;-webkit-user-select:none;touch-action:manipulation;white-space:nowrap;will-change:box-shadow,transform;font-size:18px;z-index:1}.button.attention:focus{box-shadow:inset 0 0 0 1.5px #d6d6e7,0 2px 4px rgba(45,35,66,.4),0 7px 13px -3px rgba(45,35,66,.3),inset 0 -3px 0 #d6d6e7}.button.attention:hover{box-shadow:0 4px 8px rgba(45,35,66,.4),0 7px 13px -3px rgba(45,35,66,.3),inset 0 -3px 0 #d6d6e7;transform:translateY(-2px)}.button.attention:active{box-shadow:inset 0 3px 7px #d6d6e7;transform:translateY(2px)}.remove{border-radius:50%;padding:.5em;width:30px;height:30px;border:2px solid #00f;color:#00f;position:relative}.remove:hover{border:2px solid #00f;background-color:rgba(255,0,0,.7);color:#fff}.remove:before{width:2px;left:12px;top:5px;bottom:5px}.remove:after,.remove:before{content:" ";position:absolute;display:block;background-color:#00f;transform:rotate(45deg)}.remove:after{height:2px;top:12px;left:5px;right:5px}.white-content-overlay{position:absolute;top:0;left:0;width:100%;height:100%;display:flex;justify-content:center;align-items:center;z-index:2;transition:opacity .2s ease}.white-content-overlay .settings-container{display:flex;flex-direction:column;justify-content:center;align-items:center;width:90%;max-width:30rem;height:90%;border-radius:1rem;background:#fff}.blur-background{position:absolute;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:-1}@keyframes shake{0%{transform:translate(1px,1px) rotate(0deg)}10%{transform:translate(-1px,-2px) rotate(-1deg)}20%{transform:translate(-3px) rotate(1deg)}30%{transform:translate(3px,2px) rotate(0deg)}40%{transform:translate(1px,-1px) rotate(1deg)}50%{transform:translate(-1px,2px) rotate(-1deg)}60%{transform:translate(-3px,1px) rotate(0deg)}70%{transform:translate(3px,1px) rotate(-1deg)}80%{transform:translate(-1px,-1px) rotate(1deg)}90%{transform:translate(1px,2px) rotate(0deg)}to{transform:translate(1px,-2px) rotate(-1deg)}}.settings-menu .settings-container{display:flex;flex-direction:column;justify-content:center;align-items:center;width:90%;max-width:30rem;height:90%;border-radius:1rem;background:#fff}.settings-menu .settings-hidden{overflow:auto}.settings-container>*{margin:1em}.password-input{display:flex;align-items:center;margin-top:auto;border:1px solid #7d7d7d;border-radius:.25rem;min-width:3rem}.password-input input{border:none;outline:none}.password-input button{background:none;padding:.25em;color:#4e4e4e;background-color:hsla(0,0%,49%,.24705882352941178);border:none;border-left:1px solid hsla(0,0%,49%,.24705882352941178);cursor:pointer}.invalid{animation:shake .5s;border-color:red}.settings-container .close-button{margin-top:auto;padding:0;cursor:pointer;border:none;border-radius:5rem;background:rgba(221,31,31,.733);width:3rem;height:3rem}.pump-settings{display:flex;flex-direction:column;align-items:center}.pump-settings .pumps{display:flex;justify-content:center;margin:0 auto;width:100%;flex-wrap:wrap}.ingredient.delete{display:flex;flex-direction:row;justify-content:center;align-items:center}.debug-values{overflow:auto;height:20vh;border:1px solid #000}.debug-value{overflow:scroll;border:1px solid #000}.remove-drink-section{display:flex;justify-content:center;align-items:center;flex-direction:row}.top-header{display:flex;justify-content:space-around;align-items:center;border:1px solid #000;border-radius:.5rem;margin:1rem;padding:.5rem;box-shadow:0 0 1rem #888}.settings{cursor:pointer;padding:1rem;margin:-1rem}.status{display:flex;justify-content:center;align-items:center;grid-column-gap:.5em;column-gap:.5em}@keyframes greenPulsate{0%{box-shadow:0 0 0 0 rgba(55,136,5,.4392156862745098),0 0 0 0 rgba(55,136,5,.4392156862745098),0 0 0 0 rgba(55,136,5,.3137254901960784)}50%{box-shadow:0 0 .5px .2px rgba(55,136,5,.4392156862745098),0 0 2.5px 1px rgba(55,136,5,.4392156862745098),0 0 3px 2px rgba(55,136,5,.3137254901960784)}to{box-shadow:0 0 0 0 rgba(55,136,5,.4392156862745098),0 0 0 0 rgba(55,136,5,.4392156862745098),0 0 0 0 rgba(55,136,5,.3137254901960784)}}@keyframes redPulsate{0%{box-shadow:0 0 0 0 #e3242b,0 0 0 0 #e3242b,0 0 0 0 #e3242b}50%{box-shadow:0 0 .5px .2px rgba(227,36,43,.4392156862745098),0 0 2.5px 1px rgba(227,36,43,.4392156862745098),0 0 3px 2px rgba(227,36,43,.3137254901960784)}to{box-shadow:0 0 0 0 #e3242b,0 0 0 0 #e3242b,0 0 0 0 #e3242b}}.circle{border-radius:50%;width:.5em;height:.5em}.circle.green{background:#378805;animation:greenPulsate 1s linear infinite}.circle.red{background:#e3242b;animation:redPulsate 1s linear infinite}.main{border:1px solid #000;border-radius:.5rem;box-shadow:0 0 1rem #888;display:flex;width:80%;height:70vh;margin:0 auto;overflow-y:auto}.main .loading{margin:1em auto}.drink-categories{margin:0 auto;width:80%}.drink-category{border:1px solid #000;margin:1rem 0;width:100%}.drink-category .drinks{display:flex;flex-wrap:wrap;justify-content:center}.drink-category .name{background:#fff;width:50%;padding:0 1em;margin:-.5rem auto 0}.footer{border:1px solid #000;border-radius:.5rem;box-shadow:0 0 1rem #888;margin:1rem;display:flex;align-items:center}.footer .button.attention{flex:1 1}.add-drink-component{display:flex;flex-direction:column;align-items:center;overflow-x:hidden;overflow-y:auto;width:100%;max-height:80%}.submit-container .button{margin:0;background:rgba(123,247,123,.63)}.add-drink-component .name{margin-bottom:1em}.add-drink-component .button{min-height:2.5rem}.ingredient-section{display:flex;flex-direction:row;width:-webkit-min-content;width:min-content}.ingredient-section select{min-width:6rem;width:20%}.ingredient-section input{min-width:3rem;width:10%} +/*# sourceMappingURL=main.9c984979.chunk.css.map */ \ No newline at end of file diff --git a/frontend/build/static/css/main.9c984979.chunk.css.map b/frontend/build/static/css/main.9c984979.chunk.css.map new file mode 100644 index 0000000..d1e9d1d --- /dev/null +++ b/frontend/build/static/css/main.9c984979.chunk.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack://src/index.css","webpack://src/App.css","webpack://src/components/styles/buttons.css","webpack://src/components/styles/overlays.css","webpack://src/components/styles/settings.css","webpack://src/components/styles/topHeader.css","webpack://src/components/styles/middleMain.css","webpack://src/components/styles/bottomFooter.css"],"names":[],"mappings":"AAAA,KACE,QAAS,CACT,mJAEY,CACZ,kCAAmC,CACnC,iCACF,CAEA,KACE,yEAEF,CCZA,qBACE,WACF,CAEA,KACE,iBAAkB,CAGlB,iBACF,CAEA,UACE,aAAc,CACd,mBACF,CAEA,8CACE,UACE,2CACF,CACF,CAEA,YACE,wBAAyB,CACzB,gBAAiB,CACjB,YAAa,CACb,qBAAsB,CACtB,kBAAmB,CACnB,sBAAuB,CACvB,4BAA6B,CAC7B,UACF,CAEA,UACE,aACF,CAEA,yBACE,GACE,sBACF,CACA,GACE,uBACF,CACF,CC5CA,QACI,UAAW,CAEX,cAAe,CACf,aAAc,CACd,oBAAsB,CAEtB,cAAe,CACf,YAAa,CACb,sBAAuB,CACvB,kBACJ,CAEA,YACI,kBACJ,CAEA,cACI,kBACJ,CAGA,WACE,kBAAmB,CACnB,uBAAgB,CAAhB,eAAgB,CAChB,wBAAyB,CACzB,iBAAkB,CAClB,cAAe,CACf,+FAAwG,CACxG,qBAAsB,CACtB,aAAc,CACd,cAAe,CACf,YAAa,CACb,sCAAuC,CACvC,WAAY,CACZ,sBAAuB,CACvB,aAAc,CACd,eAAgB,CAChB,eAAgB,CAChB,iBAAkB,CAClB,kBAAmB,CACrB,iBAAkB,CAChB,eAAgB,CAChB,oBAAqB,CACrB,yCAA0C,CAC1C,oBAAiB,CAAjB,gBAAiB,CACjB,wBAAyB,CACzB,yBAA0B,CAC1B,kBAAmB,CACnB,gCAAiC,CACjC,cAAe,CACf,SACF,CAEA,wBACE,yHACF,CAEA,wBACE,+FAA0G,CAC1G,0BACF,CAEA,yBACE,kCAAmC,CACnC,yBACF,CAEA,QACE,iBAAkB,CAClB,YAAc,CACd,UAAW,CACX,WAAY,CACZ,qBAAsB,CACtB,UAAW,CACX,iBACF,CACA,cACE,qBAAsB,CACtB,iCAAsC,CACtC,UACF,CAEA,eAKE,SAAU,CACV,SAAU,CACV,OAAQ,CACR,UAEF,CACA,6BAVE,WAAY,CACZ,iBAAkB,CAClB,aAAc,CACd,qBAAsB,CAKtB,uBAYF,CAVA,cAKE,UAAW,CACX,QAAQ,CACR,QAAS,CACT,SAEF,CCxGA,uBACI,iBAAkB,CAClB,KAAM,CACN,MAAO,CACP,UAAW,CACX,WAAY,CAEZ,YAAa,CACb,sBAAuB,CACvB,kBAAmB,CACnB,SAAU,CAEV,2BACJ,CAEA,2CACI,YAAa,CACb,qBAAsB,CACtB,sBAAuB,CACvB,kBAAmB,CAEnB,SAAU,CACV,eAAgB,CAChB,UAAW,CACX,kBAAmB,CAEnB,eACJ,CAEA,iBACI,iBAAkB,CAClB,UAAW,CACX,WAAY,CACZ,yBAA8B,CAE9B,UACJ,CCpCA,iBACI,GAAK,yCAA6C,CAClD,IAAM,4CAAgD,CACtD,IAAM,sCAA8C,CACpD,IAAM,yCAA6C,CACnD,IAAM,0CAA8C,CACpD,IAAM,2CAA+C,CACrD,IAAM,0CAA8C,CACpD,IAAM,0CAA8C,CACpD,IAAM,2CAA+C,CACrD,IAAM,yCAA6C,CACnD,GAAO,2CAA+C,CAC1D,CAEA,mCACI,YAAa,CACb,qBAAsB,CACtB,sBAAuB,CACvB,kBAAmB,CAEnB,SAAU,CACV,eAAgB,CAChB,UAAW,CACX,kBAAmB,CAEnB,eACJ,CAEA,gCACI,aACJ,CAEA,sBACI,UACJ,CAEA,gBACI,YAAa,CACb,kBAAmB,CACnB,eAAgB,CAEhB,wBAAyB,CACzB,oBAAsB,CACtB,cACJ,CAEA,sBACI,WAAY,CACZ,YACJ,CAEA,uBAEI,eAAgB,CAEhB,aAAe,CACf,aAAc,CACd,kDAA2B,CAE3B,WAAgC,CAAhC,uDAAgC,CAChC,cACJ,CAEA,SACI,mBAAqB,CACrB,gBACJ,CAEA,kCACI,eAAgB,CAChB,SAAU,CAEV,cAAe,CACf,WAAY,CAEZ,kBAAmB,CAEnB,+BAAoC,CACpC,UAAW,CACX,WACJ,CAEA,eACI,YAAa,CACb,qBAAsB,CACtB,kBACJ,CAEA,sBACI,YAAa,CACb,sBAAuB,CACvB,aAAc,CACd,UAAW,CACX,cACJ,CAEA,mBACI,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,kBACJ,CAEA,cACI,aAAc,CACd,WAAY,CACZ,qBACJ,CAEA,aACI,eAAgB,CAChB,qBACJ,CAEA,sBACI,YAAa,CACb,sBAAuB,CACvB,kBAAmB,CACnB,kBACJ,CCtHA,YACI,YAAa,CACb,4BAA6B,CAC7B,kBAAmB,CAEnB,qBAAuB,CACvB,mBAAqB,CACrB,WAAY,CAEZ,aAAe,CACf,wBACJ,CAGA,UACI,cAAe,CACf,YAAa,CACb,YACJ,CAGA,QACI,YAAa,CACb,sBAAuB,CACvB,kBAAmB,CACnB,oBAAiB,CAAjB,eACJ,CAEA,wBACI,GAAU,qIAG0C,CACpD,IAAW,qJAGyC,CACpD,GAAW,qIAGyC,CACxD,CAEA,sBACI,GAAU,0DAGwC,CAClD,IAAW,wJAGyC,CACpD,GAAW,0DAGuC,CACtD,CAEA,QACI,iBAAkB,CAClB,UAAY,CACZ,WACJ,CAEA,cACI,kBAAmB,CACnB,yCACJ,CAEA,YACI,kBAAmB,CACnB,uCACJ,CCzEA,MACI,qBAAuB,CACvB,mBAAqB,CACrB,wBAA4B,CAE5B,YAAa,CACb,SAAU,CACV,WAAY,CAEZ,aAAc,CACd,eACJ,CAEA,eACI,eACJ,CAEA,kBACI,aAAc,CACd,SACJ,CAEA,gBACI,qBAAuB,CACvB,aAAc,CACd,UACJ,CAEA,wBACI,YAAa,CACb,cAAe,CAEf,sBACJ,CAEA,sBACI,eAAiB,CACjB,SAAU,CACV,aAAc,CACd,oBACJ,CCxCA,QACI,qBAAuB,CACvB,mBAAqB,CACrB,wBAA4B,CAC5B,WAAY,CACZ,YAAa,CACb,kBACJ,CAEA,0BACI,QACJ,CAEA,qBACI,YAAa,CACb,qBAAsB,CACtB,kBAAmB,CACnB,iBAAkB,CAClB,eAAgB,CAChB,UAAW,CACX,cACJ,CAEA,0BACI,QAAS,CACT,gCACJ,CAEA,2BACI,iBACJ,CAEA,6BACI,iBACJ,CAEA,oBACI,YAAa,CACb,kBAAmB,CACnB,yBAAkB,CAAlB,iBACJ,CAEA,2BACI,cAAe,CACf,SACJ,CAEA,0BACI,cAAe,CACf,SACJ","file":"main.9c984979.chunk.css","sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n","html, body, #root, .App {\n height: 100%;\n}\n\n.App {\n text-align: center;\n\n /*prevent margin collapse*/\n display: flow-root;\n}\n\n.App-logo {\n height: 40vmin;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .App-logo {\n animation: App-logo-spin infinite 20s linear;\n }\n}\n\n.App-header {\n background-color: #282c34;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: calc(10px + 2vmin);\n color: white;\n}\n\n.App-link {\n color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n",".button {\n margin: 1em;\n\n min-width: 5rem;\n height: 1.5rem;\n border-radius: 0.25rem;\n\n cursor: pointer;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.button.red {\n background: #E84855;\n}\n\n.button.green {\n background: #4CAF50;\n}\n\n/* CSS */\n.attention {\n align-items: center;\n appearance: none;\n background-color: #FCFCFD;\n border-radius: 4px;\n border-width: 0;\n box-shadow: rgba(45, 35, 66, 0.4) 0 2px 4px,rgba(45, 35, 66, 0.3) 0 7px 13px -3px,#D6D6E7 0 -3px 0 inset;\n box-sizing: border-box;\n color: #36395A;\n cursor: pointer;\n display: flex;\n font-family: \"JetBrains Mono\",monospace;\n height: 48px;\n justify-content: center;\n line-height: 1;\n list-style: none;\n overflow: hidden;\n padding-left: 16px;\n padding-right: 16px;\nposition: relative; \n text-align: left;\n text-decoration: none;\n transition: box-shadow .15s,transform .15s;\n user-select: none;\n -webkit-user-select: none;\n touch-action: manipulation;\n white-space: nowrap;\n will-change: box-shadow,transform;\n font-size: 18px;\n z-index: 1;\n}\n\n.button.attention:focus {\n box-shadow: #D6D6E7 0 0 0 1.5px inset, rgba(45, 35, 66, 0.4) 0 2px 4px, rgba(45, 35, 66, 0.3) 0 7px 13px -3px, #D6D6E7 0 -3px 0 inset;\n}\n\n.button.attention:hover {\n box-shadow: rgba(45, 35, 66, 0.4) 0 4px 8px, rgba(45, 35, 66, 0.3) 0 7px 13px -3px, #D6D6E7 0 -3px 0 inset;\n transform: translateY(-2px);\n}\n\n.button.attention:active {\n box-shadow: #D6D6E7 0 3px 7px inset;\n transform: translateY(2px);\n}\n\n.remove {\n border-radius: 50%;\n padding: 0.5em;\n width: 30px;\n height: 30px;\n border: 2px solid blue;\n color: blue;\n position: relative;\n}\n.remove:hover {\n border: 2px solid blue;\n background-color: rgba(255, 0, 0, 0.7);\n color: #ffffff;\n}\n\n.remove::before {\n content: \" \";\n position: absolute;\n display: block;\n background-color: blue;\n width: 2px;\n left: 12px;\n top: 5px;\n bottom: 5px;\n transform: rotate(45deg);\n}\n.remove::after {\n content: \" \";\n position: absolute;\n display: block;\n background-color: blue;\n height: 2px;\n top:12px;\n left: 5px;\n right: 5px;\n transform: rotate(45deg);\n}",".white-content-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 2;\n\n transition: opacity 200ms ease;\n}\n\n.white-content-overlay .settings-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n width: 90%;\n max-width: 30rem;\n height: 90%;\n border-radius: 1rem;\n\n background: white;\n}\n\n.blur-background {\n position: absolute;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n\n z-index: -1;\n}","@keyframes shake {\n 0% { transform: translate(1px, 1px) rotate(0deg); }\n 10% { transform: translate(-1px, -2px) rotate(-1deg); }\n 20% { transform: translate(-3px, 0px) rotate(1deg); }\n 30% { transform: translate(3px, 2px) rotate(0deg); }\n 40% { transform: translate(1px, -1px) rotate(1deg); }\n 50% { transform: translate(-1px, 2px) rotate(-1deg); }\n 60% { transform: translate(-3px, 1px) rotate(0deg); }\n 70% { transform: translate(3px, 1px) rotate(-1deg); }\n 80% { transform: translate(-1px, -1px) rotate(1deg); }\n 90% { transform: translate(1px, 2px) rotate(0deg); }\n 100% { transform: translate(1px, -2px) rotate(-1deg); }\n}\n\n.settings-menu .settings-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n width: 90%;\n max-width: 30rem;\n height: 90%;\n border-radius: 1rem;\n\n background: white;\n}\n\n.settings-menu .settings-hidden {\n overflow: auto;\n}\n\n.settings-container > * {\n margin: 1em;\n}\n\n.password-input {\n display: flex;\n align-items: center;\n margin-top: auto;\n\n border: #7D7D7D solid 1px;\n border-radius: 0.25rem;\n min-width: 3rem;\n}\n\n.password-input input {\n border: none;\n outline: none;\n}\n\n.password-input button {\n border: none;\n background: none;\n\n padding: 0.25em;\n color: #4e4e4e;\n background-color: #7d7d7d3f;\n\n border-left: #7d7d7d3f solid 1px;\n cursor: pointer;\n}\n\n.invalid {\n animation: shake 0.5s;\n border-color: red;\n}\n\n.settings-container .close-button {\n margin-top: auto;\n padding: 0;\n\n cursor: pointer;\n border: none;\n\n border-radius: 5rem;\n\n background: rgba(221, 31, 31, 0.733);\n width: 3rem;\n height: 3rem;\n}\n\n.pump-settings {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.pump-settings .pumps {\n display: flex;\n justify-content: center;\n margin: 0 auto;\n width: 100%;\n flex-wrap: wrap;\n}\n\n.ingredient.delete {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n.debug-values {\n overflow: auto;\n height: 20vh;\n border: 1px solid black;\n}\n\n.debug-value {\n overflow: scroll;\n border: 1px solid black;\n}\n\n.remove-drink-section {\n display: flex;\n justify-content: center;\n align-items: center;\n flex-direction: row;\n}","/*HEADER DIV*/\n.top-header {\n display: flex;\n justify-content: space-around;\n align-items: center;\n\n border: black solid 1px;\n border-radius: 0.5rem;\n margin: 1rem;\n \n padding: 0.5rem;\n box-shadow: 0 0 1rem #888888;\n}\n\n/*SETTINGS ICON DIV*/\n.settings {\n cursor: pointer;\n padding: 1rem;\n margin: -1rem;\n}\n\n/*STATUS DIV*/\n.status {\n display: flex;\n justify-content: center;\n align-items: center;\n column-gap: 0.5em;\n}\n\n@keyframes greenPulsate {\n 0% { box-shadow:\n 0 0 0px 0px #37880570, /* inner white */\n 0 0 0px 0px #37880570, /* middle magenta */\n 0 0 0px 0px #37880550; /* outer cyan */ }\n 50% { box-shadow:\n 0 0 0.5px 0.2px #37880570, /* inner white */\n 0 0 2.5px 1px #37880570, /* middle magenta */\n 0 0 3px 2px #37880550; /* outer cyan */ }\n 100% { box-shadow:\n 0 0 0px 0px #37880570, /* inner white */\n 0 0 0px 0px #37880570, /* middle magenta */\n 0 0 0px 0px #37880550; /* outer cyan */ }\n}\n\n@keyframes redPulsate {\n 0% { box-shadow:\n 0 0 0px 0px #E3242B, /* inner white */\n 0 0 0px 0px #E3242B, /* middle magenta */\n 0 0 0px 0px #E3242B; /* outer cyan */ }\n 50% { box-shadow:\n 0 0 0.5px 0.2px #E3242B70, /* inner white */\n 0 0 2.5px 1px #E3242B70, /* middle magenta */\n 0 0 3px 2px #E3242B50; /* outer cyan */ }\n 100% { box-shadow:\n 0 0 0px 0px #E3242B, /* inner white */\n 0 0 0px 0px #E3242B, /* middle magenta */\n 0 0 0px 0px #E3242B; /* outer cyan */ }\n}\n\n.circle {\n border-radius: 50%;\n width: 0.5em;\n height: 0.5em;\n}\n\n.circle.green {\n background: #378805;\n animation: greenPulsate 1s linear infinite;\n}\n\n.circle.red {\n background: #E3242B;\n animation: redPulsate 1s linear infinite;\n}",".main {\n border: 1px solid black;\n border-radius: 0.5rem;\n box-shadow: 0 0 1rem #888888;\n margin: 1rem;\n display: flex;\n width: 80%;\n height: 70vh;\n\n margin: 0 auto;\n overflow-y: auto;\n}\n\n.main .loading {\n margin: 1em auto;\n}\n\n.drink-categories {\n margin: 0 auto;\n width: 80%;\n}\n\n.drink-category {\n border: solid 1px black;\n margin: 1rem 0;\n width: 100%;\n}\n\n.drink-category .drinks {\n display: flex;\n flex-wrap: wrap;\n\n justify-content: center;\n}\n\n.drink-category .name {\n background: white;\n width: 50%;\n padding: 0 1em;\n margin: -0.5rem auto 0 auto;\n}\n\n",".footer {\n border: 1px solid black;\n border-radius: 0.5rem;\n box-shadow: 0 0 1rem #888888;\n margin: 1rem;\n display: flex;\n align-items: center;\n}\n\n.footer .button.attention {\n flex: 1;\n}\n\n.add-drink-component {\n display: flex;\n flex-direction: column;\n align-items: center;\n overflow-x: hidden;\n overflow-y: auto;\n width: 100%;\n max-height: 80%;\n}\n\n.submit-container .button {\n margin: 0;\n background: rgba(123, 247, 123, 0.63);\n}\n\n.add-drink-component .name {\n margin-bottom: 1em;\n}\n\n.add-drink-component .button {\n min-height: 2.5rem;\n}\n\n.ingredient-section {\n display: flex;\n flex-direction: row;\n width: min-content;\n}\n\n.ingredient-section select {\n min-width: 6rem;\n width: 20%;\n}\n\n.ingredient-section input {\n min-width: 3rem;\n width: 10%;\n}"]} \ No newline at end of file diff --git a/frontend/build/static/css/main.e4b6d27c.chunk.css.map b/frontend/build/static/css/main.e4b6d27c.chunk.css.map deleted file mode 100644 index a411497..0000000 --- a/frontend/build/static/css/main.e4b6d27c.chunk.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack://src/index.css","webpack://src/App.css","webpack://src/components/styles/buttons.css","webpack://src/components/styles/overlays.css","webpack://src/components/styles/settings.css","webpack://src/components/styles/topHeader.css","webpack://src/components/styles/middleMain.css","webpack://src/components/styles/bottomFooter.css"],"names":[],"mappings":"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","file":"main.e4b6d27c.chunk.css","sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n","html, body, #root, .App {\n height: 100%;\n}\n\n.App {\n text-align: center;\n\n /*prevent margin collapse*/\n display: flow-root;\n}\n\n.App-logo {\n height: 40vmin;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .App-logo {\n animation: App-logo-spin infinite 20s linear;\n }\n}\n\n.App-header {\n background-color: #282c34;\n min-height: 100vh;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n font-size: calc(10px + 2vmin);\n color: white;\n}\n\n.App-link {\n color: #61dafb;\n}\n\n@keyframes App-logo-spin {\n from {\n transform: rotate(0deg);\n }\n to {\n transform: rotate(360deg);\n }\n}\n",".button {\n margin: 1em;\n\n min-width: 5rem;\n height: 1.5rem;\n border-radius: 0.25rem;\n\n cursor: pointer;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n\n.button.red {\n background: #E84855;\n}\n\n.button.green {\n background: #4CAF50;\n}\n\n/* CSS */\n.attention {\n align-items: center;\n appearance: none;\n background-color: #FCFCFD;\n border-radius: 4px;\n border-width: 0;\n box-shadow: rgba(45, 35, 66, 0.4) 0 2px 4px,rgba(45, 35, 66, 0.3) 0 7px 13px -3px,#D6D6E7 0 -3px 0 inset;\n box-sizing: border-box;\n color: #36395A;\n cursor: pointer;\n display: flex;\n font-family: \"JetBrains Mono\",monospace;\n height: 48px;\n justify-content: center;\n line-height: 1;\n list-style: none;\n overflow: hidden;\n padding-left: 16px;\n padding-right: 16px;\nposition: relative; \n text-align: left;\n text-decoration: none;\n transition: box-shadow .15s,transform .15s;\n user-select: none;\n -webkit-user-select: none;\n touch-action: manipulation;\n white-space: nowrap;\n will-change: box-shadow,transform;\n font-size: 18px;\n z-index: 1;\n}\n\n.button.attention:focus {\n box-shadow: #D6D6E7 0 0 0 1.5px inset, rgba(45, 35, 66, 0.4) 0 2px 4px, rgba(45, 35, 66, 0.3) 0 7px 13px -3px, #D6D6E7 0 -3px 0 inset;\n}\n\n.button.attention:hover {\n box-shadow: rgba(45, 35, 66, 0.4) 0 4px 8px, rgba(45, 35, 66, 0.3) 0 7px 13px -3px, #D6D6E7 0 -3px 0 inset;\n transform: translateY(-2px);\n}\n\n.button.attention:active {\n box-shadow: #D6D6E7 0 3px 7px inset;\n transform: translateY(2px);\n}\n\n.remove {\n border-radius: 50%;\n padding: 0.5em;\n width: 30px;\n height: 30px;\n border: 2px solid blue;\n color: blue;\n position: relative;\n}\n.remove:hover {\n border: 2px solid blue;\n background-color: rgba(255, 0, 0, 0.7);\n color: #ffffff;\n}\n\n.remove::before {\n content: \" \";\n position: absolute;\n display: block;\n background-color: blue;\n width: 2px;\n left: 12px;\n top: 5px;\n bottom: 5px;\n transform: rotate(45deg);\n}\n.remove::after {\n content: \" \";\n position: absolute;\n display: block;\n background-color: blue;\n height: 2px;\n top:12px;\n left: 5px;\n right: 5px;\n transform: rotate(45deg);\n}",".white-content-overlay {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 2;\n\n transition: opacity 200ms ease;\n}\n\n.white-content-overlay .settings-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n width: 90%;\n max-width: 30rem;\n height: 90%;\n border-radius: 1rem;\n\n background: white;\n}\n\n.blur-background {\n position: absolute;\n width: 100%;\n height: 100%;\n background: rgba(0, 0, 0, 0.5);\n\n z-index: -1;\n}","@keyframes shake {\n 0% { transform: translate(1px, 1px) rotate(0deg); }\n 10% { transform: translate(-1px, -2px) rotate(-1deg); }\n 20% { transform: translate(-3px, 0px) rotate(1deg); }\n 30% { transform: translate(3px, 2px) rotate(0deg); }\n 40% { transform: translate(1px, -1px) rotate(1deg); }\n 50% { transform: translate(-1px, 2px) rotate(-1deg); }\n 60% { transform: translate(-3px, 1px) rotate(0deg); }\n 70% { transform: translate(3px, 1px) rotate(-1deg); }\n 80% { transform: translate(-1px, -1px) rotate(1deg); }\n 90% { transform: translate(1px, 2px) rotate(0deg); }\n 100% { transform: translate(1px, -2px) rotate(-1deg); }\n}\n\n.settings-menu .settings-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n\n width: 90%;\n max-width: 30rem;\n height: 90%;\n border-radius: 1rem;\n\n background: white;\n}\n\n.settings-menu .settings-hidden {\n overflow: auto;\n}\n\n.settings-container > * {\n margin: 1em;\n}\n\n.password-input {\n display: flex;\n align-items: center;\n margin-top: auto;\n\n border: #7D7D7D solid 1px;\n border-radius: 0.25rem;\n min-width: 3rem;\n}\n\n.password-input input {\n border: none;\n outline: none;\n}\n\n.password-input button {\n border: none;\n background: none;\n\n padding: 0.25em;\n color: #4e4e4e;\n background-color: #7d7d7d3f;\n\n border-left: #7d7d7d3f solid 1px;\n cursor: pointer;\n}\n\n.invalid {\n animation: shake 0.5s;\n border-color: red;\n}\n\n.settings-container .close-button {\n margin-top: auto;\n padding: 0;\n\n cursor: pointer;\n border: none;\n\n border-radius: 5rem;\n\n background: rgba(221, 31, 31, 0.733);\n width: 3rem;\n height: 3rem;\n}\n\n.pump-settings {\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n.pump-settings .pumps {\n display: flex;\n justify-content: center;\n margin: 0 auto;\n width: 100%;\n flex-wrap: wrap;\n}\n\n.ingredient.delete {\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n}\n\n.debug-values {\n overflow: auto;\n height: 30rem;\n border: 1px solid black;\n}\n\n.debug-value {\n overflow: scroll;\n border: 1px solid black;\n}","/*HEADER DIV*/\n.top-header {\n display: flex;\n justify-content: space-around;\n align-items: center;\n\n border: black solid 1px;\n border-radius: 0.5rem;\n margin: 1rem;\n \n padding: 0.5rem;\n box-shadow: 0 0 1rem #888888;\n}\n\n/*SETTINGS ICON DIV*/\n.settings {\n cursor: pointer;\n padding: 1rem;\n margin: -1rem;\n}\n\n/*STATUS DIV*/\n.status {\n display: flex;\n justify-content: center;\n align-items: center;\n column-gap: 0.5em;\n}\n\n.circle {\n border-radius: 50%;\n width: 0.5em;\n height: 0.5em;\n}\n\n.circle.green {\n background: #378805\n}\n\n.circle.red {\n background: #E3242B\n}",".main {\n border: 1px solid black;\n border-radius: 0.5rem;\n box-shadow: 0 0 1rem #888888;\n margin: 1rem;\n display: flex;\n width: 80%;\n margin: 0 auto;\n}\n\n\n.drink-categories {\n margin: 0 auto;\n width: 80%;\n}\n\n.drink-category {\n border: solid 1px black;\n margin: 1rem 0;\n width: 100%;\n}\n\n.drink-category .drinks {\n display: flex;\n flex-wrap: wrap;\n\n justify-content: center;\n}\n\n.drink-category .name {\n background: white;\n width: 50%;\n padding: 0 1em;\n margin: -0.5rem auto 0 auto;\n}\n\n",".footer {\n border: 1px solid black;\n border-radius: 0.5rem;\n box-shadow: 0 0 1rem #888888;\n margin: 1rem;\n display: flex;\n align-items: center;\n}\n\n.footer .button.attention {\n flex: 1;\n}\n\n.add-drink-component {\n display: flex;\n flex-direction: column;\n align-items: center;\n overflow-x: hidden;\n overflow-y: auto;\n width: 100%;\n max-height: 80%;\n}\n\n.submit-container .button {\n margin: 0;\n background: rgba(123, 247, 123, 0.63);\n}\n\n.add-drink-component .name {\n margin-bottom: 1em;\n}\n\n.add-drink-component .button {\n min-height: 2.5rem;\n}\n\n.ingredient-section {\n display: flex;\n flex-direction: row;\n width: min-content;\n}\n\n.ingredient-section select {\n min-width: 6rem;\n width: 20%;\n}\n\n.ingredient-section input {\n min-width: 3rem;\n width: 10%;\n}"]} \ No newline at end of file diff --git a/frontend/build/static/js/main.61cc9d63.chunk.js b/frontend/build/static/js/main.61cc9d63.chunk.js deleted file mode 100644 index 6143f49..0000000 --- a/frontend/build/static/js/main.61cc9d63.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonpfrontend=this.webpackJsonpfrontend||[]).push([[0],[,,,,,,,,,,,,,,,function(e,t,n){},function(e,t,n){},,function(e,t,n){},,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t);var r=n(1),c=n.n(r),a=n(10),s=n.n(a),u=(n(15),n(3)),i=(n(16),n(2)),o=n.n(i),l=n(4),j=n(5),d=window.location.href.slice(0,-6),b="".concat(d,":").concat(4e3,"/");function p(){return f.apply(this,arguments)}function f(){return(f=Object(l.a)(o.a.mark((function e(){var t,n,r;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(b+"status");case 3:return t=e.sent,e.next=6,t.json();case 6:return n=e.sent,r=Object(j.a)({online:!0},n),e.abrupt("return",r);case 11:return e.prev=11,e.t0=e.catch(0),e.abrupt("return",{online:!1});case 14:case"end":return e.stop()}}),e,null,[[0,11]])})))).apply(this,arguments)}function O(){return(O=Object(l.a)(o.a.mark((function e(t){var n,r;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(b+"password",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:t})});case 3:return n=e.sent,e.next=6,n.json();case 6:return r=e.sent,e.abrupt("return",r);case 10:return e.prev=10,e.t0=e.catch(0),e.abrupt("return",{success:!1});case 13:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}function h(){return v.apply(this,arguments)}function v(){return(v=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(b+"pumps");case 3:return t=e.sent,e.next=6,t.json();case 6:if(n=e.sent,200===t.status){e.next=9;break}throw new Error(n.error);case 9:return e.abrupt("return",{json:n,success:!0});case 12:return e.prev=12,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",{error:e.t0,success:!1});case 16:case"end":return e.stop()}}),e,null,[[0,12]])})))).apply(this,arguments)}function x(){return m.apply(this,arguments)}function m(){return(m=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(b+"drink/ingredients");case 3:return t=e.sent,e.next=6,t.json();case 6:if(n=e.sent,200===t.status){e.next=9;break}throw new Error(n.error);case 9:return e.abrupt("return",{drinks:n,success:!0});case 12:return e.prev=12,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",{error:e.t0,success:!1});case 16:case"end":return e.stop()}}),e,null,[[0,12]])})))).apply(this,arguments)}function g(){return(g=Object(l.a)(o.a.mark((function e(t,n,r){var c,a;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(b+"setPump",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:t,pump:n,newSelection:r})});case 3:return c=e.sent,e.next=6,c.json();case 6:if(a=e.sent,200===c.status){e.next=9;break}throw new Error(a.error);case 9:return e.abrupt("return",{success:!0});case 12:return e.prev=12,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",{error:e.t0,success:!1});case 16:case"end":return e.stop()}}),e,null,[[0,12]])})))).apply(this,arguments)}function y(e,t,n){return k.apply(this,arguments)}function k(){return(k=Object(l.a)(o.a.mark((function e(t,n,r){var c,a;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(b+"drink/addIngredient",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:t,ingredient:n,category:r})});case 3:return c=e.sent,e.next=6,c.json();case 6:return a=e.sent,e.abrupt("return",a);case 10:return e.prev=10,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",{error:e.t0,success:!1});case 14:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}function w(e,t,n){return C.apply(this,arguments)}function C(){return(C=Object(l.a)(o.a.mark((function e(t,n,r){var c,a;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(b+"drink/removeIngredient",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:t,ingredient:n,category:r})});case 3:return c=e.sent,e.next=6,c.json();case 6:return a=e.sent,e.abrupt("return",a);case 10:return e.prev=10,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",{error:e.t0,success:!1});case 14:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}function S(e){return N.apply(this,arguments)}function N(){return(N=Object(l.a)(o.a.mark((function e(t){var n,r,c;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=JSON.stringify(t),e.prev=1,e.next=4,fetch(b+"drink/add",{method:"PATCH",headers:{"Content-Type":"application/json"},body:n});case 4:return r=e.sent,e.next=7,r.json();case 7:return c=e.sent,e.abrupt("return",c);case 11:return e.prev=11,e.t0=e.catch(1),e.abrupt("return",{error:e.t0,success:!1});case 14:case"end":return e.stop()}}),e,null,[[1,11]])})))).apply(this,arguments)}function T(){return E.apply(this,arguments)}function E(){return(E=Object(l.a)(o.a.mark((function e(){return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",["ml","cl","tsp","tbsp"]);case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function D(){return(D=Object(l.a)(o.a.mark((function e(t,n){return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:fetch(b+"startPump",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:t,time:n})});case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function I(){return A.apply(this,arguments)}function A(){return(A=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(b+"drink/all",{method:"GET",headers:{"Content-Type":"application/json"}});case 3:return t=e.sent,e.next=6,t.json();case 6:return n=e.sent,e.abrupt("return",{success:!0,response:n});case 10:return e.prev=10,e.t0=e.catch(0),e.abrupt("return",{success:!1});case 13:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}function M(e){return P.apply(this,arguments)}function P(){return(P=Object(l.a)(o.a.mark((function e(t){return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return fetch(b+"drink/make",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:t})}),e.abrupt("return",!0);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}n(18);var L=n(0);function J(e){var t=e.children,n=e.onClick;return Object(L.jsx)("div",{className:"button red",onClick:n,children:t})}function U(e){var t=e.children,n=e.onClick;return Object(L.jsx)("div",{className:"button green",onClick:n,children:t})}function W(e){var t=e.children,n=e.onClick,r=e.onMouseDown,c=e.onMouseUp,a=e.onMouseLeave;return Object(L.jsx)("div",{className:"button attention",onClick:n,onMouseDown:r,onMouseUp:c,onMouseLeave:a,children:t})}function R(e){var t=e.children,n=e.onClick;return Object(L.jsx)("button",{onClick:n,className:"remove",children:t})}n(20);function H(e){var t=e.cbWhenPressed;return Object(L.jsx)("button",{className:"close-button",onClick:t})}function q(){return Object(L.jsx)("div",{className:"blur-background"})}function B(e){var t=e.children,n=e.cbToClose,c=Object(r.useState)(0),a=Object(u.a)(c,2),s=a[0],i=a[1];function o(){i(0),setTimeout(n,200)}return Object(r.useEffect)((function(){setTimeout((function(){i(1)}),50)}),[]),Object(r.useEffect)((function(){return document.addEventListener("keydown",(function(e){"Escape"===e.code&&o()})),function(){document.removeEventListener("keydown",(function(e){"Escape"===e.code&&o()}))}}),[]),Object(L.jsxs)("div",{className:"white-content-overlay",style:{opacity:s},children:[Object(L.jsx)(q,{}),Object(L.jsxs)("div",{className:"settings-container",children:[t,Object(L.jsx)(H,{cbWhenPressed:o})]})]})}n(21);function F(){return localStorage.getItem("password")}function G(e){var t=Object(r.useState)(""),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(!1),i=Object(u.a)(s,2),o=i[0],l=i[1],j=e.cbWhenCorrect;function d(){""===c&&l(!0),function(e){return O.apply(this,arguments)}(c).then((function(e){e.correct?(j(),function(e){localStorage.setItem("password",e)}(c)):l(!0)}))}return Object(r.useEffect)((function(){var e=setTimeout((function(){return l(!1)}),500);return function(){return clearTimeout(e)}}),[o]),Object(r.useEffect)((function(){var e=function(e){"Enter"===e.code&&d()};return document.addEventListener("keydown",e),function(){return document.removeEventListener("keydown",e)}})),Object(L.jsxs)("div",{className:"password-input ".concat(o?"invalid":""),children:[Object(L.jsx)("input",{value:c,onChange:function(e){var t=e.currentTarget.value;a(t)},type:"password"}),Object(L.jsx)("button",{className:"submit",onClick:d,children:"Submit"})]})}function z(e){var t=e.onChange,n=e.selectedDrink,c=Object(r.useState)(),a=Object(u.a)(c,2),s=a[0],i=a[1],j=function(){var e=Object(r.useState)(),t=Object(u.a)(e,2),n=t[0],c=t[1];return Object(r.useEffect)((function(){function e(){return(e=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x();case 2:t=e.sent,c(t.drinks);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),n}();return Object(r.useEffect)((function(){i(n||"empty")}),[n]),j&&s?Object(L.jsxs)("select",{value:s,onChange:function(e){var n=e.target.value;i(n);try{t(e)}catch(r){console.log("Did you define an onChange prop? "+r)}},children:[Object(L.jsx)("option",{value:"empty",children:"Empty"},"empty"),Object.entries(j).map((function(e){var t,n=Object(u.a)(e,2),r=n[0],c=n[1];return Object(L.jsx)("optgroup",{label:r,children:(t=c,t.map((function(e,t){return Object(L.jsx)("option",{value:e,children:e},t)})))},r)}))]}):Object(L.jsx)("select",{disabled:!0,children:Object(L.jsx)("option",{value:"loading",children:"Loading..."})})}function K(e){var t=e.onChange,n=e.selectedCategory,c=Object(r.useState)(),a=Object(u.a)(c,2),s=a[0],i=a[1],j=Object(r.useState)(),d=Object(u.a)(j,2),b=d[0],p=d[1];function f(){return f=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x();case 2:t=e.sent,n=Object.entries(t.drinks).map((function(e){var t=Object(u.a)(e,2),n=t[0];t[1];return n})),p(n);case 5:case"end":return e.stop()}}),e)}))),f.apply(this,arguments)}return Object(r.useEffect)((function(){!function(){f.apply(this,arguments)}(),n&&i(n)}),[n]),Object(L.jsxs)("select",{className:"ingredients-category-selector",value:s,onChange:function(e){var n=e.target.value;i(n);try{t(n)}catch(r){console.log("Did you define an onChange prop? "+r)}},children:[Object(L.jsx)("option",{value:"",children:"Select category"}),b?b.map((function(e){return Object(L.jsx)("option",{value:e,children:e},e)})):Object(L.jsx)("option",{children:"Loading..."})]})}function Q(e){var t=e.pumpNumber,n="pump"+t;return Object(L.jsxs)("div",{className:"pump-setting",children:[Object(L.jsx)("div",{children:n}),Object(L.jsx)(z,{onChange:function(e){var n=e.target.value;!function(e,t,n){g.apply(this,arguments)}(F(),t,n)},selectedDrink:e.selectedDrink})]})}function V(){var e=Object(r.useState)(),t=Object(u.a)(e,2),n=t[0],c=t[1];function a(){return s.apply(this,arguments)}function s(){return(s=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,h();case 2:t=e.sent,n=t.json.pumps,c(n);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(r.useEffect)((function(){a()}),[]),Object(L.jsxs)("div",{className:"pump-settings",children:[Object(L.jsx)("div",{className:"pumps",children:n?n.map((function(e,t){return Object(L.jsx)(Q,{pumpNumber:e.id,selectedDrink:e.select},t)})):Object(L.jsx)("div",{children:"Loading..."})}),Object(L.jsx)(U,{onClick:function(){c(void 0),a()},children:"Refresh"})]})}function X(e){var t=Object(r.useState)(),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(),i=Object(u.a)(s,2),j=i[0],d=i[1],b=Object(r.useState)(!1),p=Object(u.a)(b,2),f=p[0],O=p[1],h=e.closecb;function v(){return(v=Object(l.a)(o.a.mark((function e(t){var n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t.preventDefault(),j&&c){e.next=3;break}return e.abrupt("return");case 3:return O(!0),n=F(),e.next=7,y(n,j,c);case 7:e.sent&&d(),O(!1),h();case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return f?Object(L.jsx)("div",{children:"Adding..."}):Object(L.jsxs)("div",{className:"add-ingredient",children:[Object(L.jsx)("div",{className:"add-ingredient-title",children:"Add Ingredient"}),Object(L.jsxs)("form",{className:"add-ingredient-input",onSubmit:function(e){return v.apply(this,arguments)},children:[Object(L.jsx)("input",{type:"text",onChange:function(e){var t=e.currentTarget.value;d(t)},required:!0}),Object(L.jsx)(K,{onChange:a,selectedCategory:c}),Object(L.jsx)("input",{type:"submit",value:"Add",required:!0})]}),Object(L.jsx)(J,{onClick:h,children:"Cancel"})]})}function Y(){return Object(L.jsx)(J,{children:"Remove Drink"})}function Z(e){var t=Object(r.useState)(!1),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(),i=Object(u.a)(s,2),j=i[0],d=i[1],b=Object(r.useState)(),p=Object(u.a)(b,2),f=p[0],O=p[1],h=e.closecb;function v(){return(v=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(f&&"empty"!==f){e.next=2;break}return e.abrupt("return");case 2:return a(!0),t=F(),e.next=6,w(t,f,j);case 6:h(),a(!1);case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return c?Object(L.jsx)("div",{children:"Deleting..."}):Object(L.jsxs)("div",{className:"ingredient delete",children:[Object(L.jsx)(z,{onChange:function(e){var t=e.target.value;O(t);var n=e.currentTarget.selectedIndex,r=e.currentTarget[n].parentElement.label;d(r)}}),Object(L.jsx)(J,{onClick:function(){return v.apply(this,arguments)},children:"Remove Ingredient"}),Object(L.jsx)(J,{onClick:h,children:"Cancel"})]})}function $(){var e=Object(r.useState)(),t=Object(u.a)(e,2),n=t[0],c=t[1],a=Object(r.useState)(),s=Object(u.a)(a,2),i=s[0],j=s[1],d=Object(r.useState)(),b=Object(u.a)(d,2),f=b[0],O=b[1];function v(e){return JSON.stringify(e,null,2)}function m(){return g.apply(this,arguments)}function g(){return g=Object(l.a)(o.a.mark((function e(){var t,n,r;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p();case 2:return t=e.sent,c(v(t)),e.next=6,h();case 6:return n=e.sent,j(v(n)),e.next=10,x();case 10:r=e.sent,O(v(r));case 12:case"end":return e.stop()}}),e)}))),g.apply(this,arguments)}return Object(r.useState)((function(){m();var e=setInterval(m,1e3);return function(){return clearInterval(e)}})),Object(L.jsxs)("div",{className:"debug-values",children:[Object(L.jsxs)("div",{className:"debug-container",children:[Object(L.jsx)("div",{className:"debug-title",children:"Status"}),Object(L.jsx)("pre",{className:"debug-value",children:n})]}),Object(L.jsxs)("div",{className:"debug-container",children:[Object(L.jsx)("div",{className:"debug-title",children:"Pumps"}),Object(L.jsx)("pre",{className:"debug-value",children:i})]}),Object(L.jsxs)("div",{className:"debug-container",children:[Object(L.jsx)("div",{className:"debug-title",children:"Drinks"}),Object(L.jsx)("pre",{className:"debug-value",children:f})]})]})}function _(){var e=Object(r.useState)(!1),t=Object(u.a)(e,2),n=t[0],c=t[1],a=Object(r.useState)(!1),s=Object(u.a)(a,2),i=s[0],o=s[1],l=Object(r.useState)(!1),j=Object(u.a)(l,2),d=j[0],b=j[1],p=Object(r.useState)(!1),f=Object(u.a)(p,2),O=f[0],h=f[1];return Object(L.jsxs)("div",{className:"settings-hidden",children:[Object(L.jsx)(V,{}),n?Object(L.jsx)(Y,{}):Object(L.jsx)(J,{onClick:function(){return c(!0)},children:"Remove Drink"}),i?Object(L.jsx)(Z,{closecb:function(){return o(!1)}}):Object(L.jsx)(J,{onClick:function(){return o(!0)},children:"Remove Ingredient"}),d?Object(L.jsx)(X,{closecb:function(){return b(!1)}}):Object(L.jsx)(U,{onClick:function(){return b(!0)},children:"Add Ingredient"}),O?Object(L.jsx)($,{}):Object(L.jsx)(U,{onClick:function(){return h(!0)},children:"Debug"})]})}var ee=function(e){var t=Object(r.useState)(!1),n=Object(u.a)(t,2),c=n[0],a=n[1],s=e.cbToClose;return Object(L.jsx)(B,{cbToClose:s,children:c?Object(L.jsx)(_,{}):Object(L.jsx)(G,{cbWhenCorrect:function(){a(!0)}})})},te=n.p+"static/media/settings.8588567d.svg";n(22);function ne(e){var t=e.connected;return Object(L.jsxs)("div",{className:"status",children:[Object(L.jsx)("div",{className:"circle ".concat(t?"green":"red")}),Object(L.jsx)("div",{className:"text",children:t?"Connected":"Disconnected"})]})}function re(e){var t=e.currentTask;return Object(L.jsxs)("div",{className:"task",children:[Object(L.jsx)("div",{className:"current",children:"Current Status:"}),Object(L.jsx)("div",{className:"task",children:t})]})}function ce(e){var t=e.cbWhenPressed;return Object(L.jsx)("div",{onClick:t,className:"settings",children:Object(L.jsx)("img",{src:te,alt:"Settings"})})}var ae=function(e){var t=function(){var e=Object(r.useState)({online:!1,task:"Idle"}),t=Object(u.a)(e,2),n=t[0],c=t[1];function a(){return s.apply(this,arguments)}function s(){return(s=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,p();case 2:t=e.sent,c(t);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(r.useEffect)((function(){a();var e=setInterval(a,2e3);return function(){return clearInterval(e)}}),[]),n}(),n=t.online,c=t.task,a=e.cbShowSettings;return Object(L.jsxs)("div",{className:"top-header",children:[Object(L.jsx)(ne,{connected:n}),Object(L.jsx)(re,{currentTask:c}),Object(L.jsx)(ce,{cbWhenPressed:a})]})};n(23);function se(e){var t=e.closecb,n=e.drink;function r(){return(r=Object(l.a)(o.a.mark((function e(){return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,M(n.id);case 2:t();case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(L.jsxs)(B,{cbToClose:t,children:[Object(L.jsx)("h2",{className:"title",children:n.name}),Object(L.jsx)(W,{onClick:function(){return r.apply(this,arguments)},children:"Make Drink"})]})}function ue(e){var t=e.category,n=e.drinks,c=Object(r.useState)(!1),a=Object(u.a)(c,2),s=a[0],i=a[1],j=Object(r.useState)(),d=Object(u.a)(j,2),b=d[0],p=d[1];function f(){return(f=Object(l.a)(o.a.mark((function e(t){return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i(!0),p(t);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(L.jsxs)("div",{className:"drink-category",children:[s?Object(L.jsx)(se,{closecb:function(){return i(!1)},drink:b}):null,Object(L.jsx)("div",{className:"name",children:t}),Object(L.jsx)("div",{className:"drinks",children:n.map((function(e,t){return Object(L.jsx)(W,{onClick:function(){return function(e){return f.apply(this,arguments)}(e)},children:e.name},t)}))})]})}function ie(e){var t=Object(r.useState)(),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(),i=Object(u.a)(s,2),j=i[0],d=i[1];return Object(r.useEffect)((function(){function e(){return(e=Object(l.a)(o.a.mark((function e(){var t,n,r,c;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,I();case 2:t=e.sent,n=t.response,r=[],c=[],n.forEach((function(e){1===e.hasAlcohol?r.push(e):c.push(e)})),d(r),a(c);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),j&&c?Object(L.jsxs)("div",{className:"drink-categories",children:[Object(L.jsx)(ue,{category:"Alcoholic",drinks:j}),Object(L.jsx)(ue,{category:"Non-alcoholic",drinks:c})]}):Object(L.jsx)("div",{children:"Loading..."})}var oe=function(){return Object(L.jsx)("div",{className:"main",children:Object(L.jsx)(ie,{})})},le=n(9);n(24);function je(e){var t=e.onChange,n=Object(r.useState)(),c=Object(u.a)(n,2),a=c[0],s=c[1],i=Object(r.useState)(),j=Object(u.a)(i,2),d=j[0],b=j[1];return Object(r.useEffect)((function(){function e(){return e=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T();case 2:t=e.sent,s(t);case 4:case"end":return e.stop()}}),e)}))),e.apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),Object(L.jsxs)("select",{className:"unit-selector",onChange:function(e){b(e.target.value),t(e)},value:d,children:[d?null:Object(L.jsx)("option",{value:"",children:"Select Unit"}),a?a.map((function(e){return Object(L.jsx)("option",{value:e,children:e},e)})):null]})}function de(e){var t=e.onChange,n=Object(r.useState)(""),c=Object(u.a)(n,2),a=c[0],s=c[1];return Object(L.jsx)("input",{className:"amount-input",type:"number",onChange:function(e){var n=e.target.value;n>1e3||n<0||(s(n),t(e))},max:"1000",min:"1",value:a})}function be(e){var t=e.onDelete,n=e.onIngredientChange,r=e.onAmountChange,c=e.onUnitOfMeasurementChange;return Object(L.jsxs)("div",{className:"ingredient-section",children:[Object(L.jsx)(z,{onChange:function(e){var t=e.target.value;n(t)}}),Object(L.jsx)(de,{onChange:function(e){var t=e.target.value;r(t)}}),Object(L.jsx)(je,{onChange:function(e){var t=e.target.value;c(t)}}),Object(L.jsx)(R,{onClick:t})]})}function pe(e){var t=Object(r.useState)(),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)([]),i=Object(u.a)(s,2),d=i[0],b=i[1],p=Object(r.useState)(!1),f=Object(u.a)(p,2),O=f[0],h=f[1];function v(){return 0!==d.length&&(d.every((function(e){return 0!=(e.id&&e.ingredient&&e.amount&&e.unit)}))&&0!=c)}function x(){return(x=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!v()){e.next=11;break}return h(!0),t={name:c,ingredients:d},e.next=6,S(t);case 6:!0===e.sent.success&&(a(""),b([])),h(!1),e.next=12;break;case 11:alert("Please fill out all fields");case 12:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return O?Object(L.jsx)("div",{className:"add-drink-component",children:"Adding..."}):Object(L.jsxs)(L.Fragment,{children:[Object(L.jsxs)("div",{className:"add-drink-component",children:[Object(L.jsx)("input",{className:"name",type:"text",value:c,onChange:function(e){var t=e.target.value;a(t)}}),d.length?d.map((function(e){return Object(L.jsx)(be,{onDelete:function(){!function(e){b(d.filter((function(t){return t.id!==e})))}(e.id)},onIngredientChange:function(t){return function(e,t){b(d.map((function(n){return n.id===e?Object(j.a)(Object(j.a)({},n),{},{ingredient:t}):n})))}(e.id,t)},onAmountChange:function(t){return function(e,t){b(d.map((function(n){return n.id===e?Object(j.a)(Object(j.a)({},n),{},{amount:t}):n})))}(e.id,t)},onUnitOfMeasurementChange:function(t){return function(e,t){b(d.map((function(n){return n.id===e?Object(j.a)(Object(j.a)({},n),{},{unit:t}):n})))}(e.id,t)}},e.id)})):null,Object(L.jsx)(W,{onClick:function(){b([].concat(Object(le.a)(d),[{id:Math.floor(+Date.now()+Math.random()),ingredient:"",amount:"",unit:""}]))},children:"Add Ingredient"})]}),Object(L.jsx)("div",{className:"submit-container",children:Object(L.jsx)(W,{onClick:function(){return x.apply(this,arguments)},children:"Submit"})})]})}function fe(e){var t=Object(r.useState)([null,null,null,null,null,null,null,null]),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(),i=Object(u.a)(s,2),j=i[0],d=i[1];function b(e){var t=setInterval((function(){!function(e,t){D.apply(this,arguments)}(e,500)}),500);a((function(n){var r=Object(le.a)(n);return r[e-1]=t,r}))}function p(e){clearInterval(c[e-1])}return Object(r.useEffect)((function(){function e(){return(e=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,h();case 2:t=e.sent,d(t.json.pumps);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),Object(L.jsx)("div",{className:"custom-buttons",children:j?j.map((function(e){var t=e.id,n=e.select;return Object(L.jsx)(W,{onMouseDown:function(){b(t)},onMouseUp:function(){p(t)},onMouseLeave:function(){p(t)},children:n},t)})):Object(L.jsx)("div",{children:"Loading..."})})}var Oe=function(){var e=Object(r.useState)(!1),t=Object(u.a)(e,2),n=t[0],c=t[1],a=Object(r.useState)(!1),s=Object(u.a)(a,2),i=s[0],o=s[1];return Object(L.jsxs)("div",{className:"footer",children:[n?Object(L.jsx)(B,{cbToClose:function(){return c(!1)},children:Object(L.jsx)(pe,{})}):null,i?Object(L.jsx)(B,{cbToClose:function(){return o(!1)},children:Object(L.jsx)(fe,{})}):null,Object(L.jsx)(W,{onClick:function(){return c(!0)},children:"Add Drink"}),Object(L.jsx)(W,{onClick:function(){return o(!0)},children:"Custom"})]})};var he=function(){var e=Object(r.useState)(!1),t=Object(u.a)(e,2),n=t[0],c=t[1];return Object(L.jsxs)("div",{className:"App",children:[n?Object(L.jsx)(ee,{cbToClose:function(){return c(!1)}}):null,Object(L.jsx)(ae,{cbShowSettings:function(){return c(!0)}}),Object(L.jsx)(oe,{}),Object(L.jsx)(Oe,{})]})};s.a.render(Object(L.jsx)(c.a.StrictMode,{children:Object(L.jsx)(he,{})}),document.getElementById("root"))}],[[25,1,2]]]); -//# sourceMappingURL=main.61cc9d63.chunk.js.map \ No newline at end of file diff --git a/frontend/build/static/js/main.61cc9d63.chunk.js.map b/frontend/build/static/js/main.61cc9d63.chunk.js.map deleted file mode 100644 index 909b00a..0000000 --- a/frontend/build/static/js/main.61cc9d63.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["requests.js","components/overlays/buttons.js","components/overlays/overlays.js","components/overlays/settings.js","components/assets/settings.svg","components/defaults/topHeader.js","components/defaults/middleMain.js","components/defaults/bottomFooter.js","App.js","index.js"],"names":["HOSTNAME_WITHOUT_PORT","window","location","href","slice","BACKEND_LINK","getStatus","a","fetch","response","json","responseObject","online","password","method","headers","body","JSON","stringify","success","getPumpsAndStatus","status","Error","error","console","getPossibleDrinks","drinks","pumpNumber","newSelection","pump","addIngredient","ingredient","category","removeIngredient","createDrink","drinkObject","drinkJSON","responseJSON","getPossibleUnits","forInMs","id","time","getAllDrinks","allDrinks","allDrinksJSON","makeDrink","DangerButton","props","text","children","cb","onClick","className","NormalButton","AttentionButton","onMouseDown","onMouseUp","onMouseLeave","RemoveButton","CloseButton","cbWhenPressed","BlurBackground","WhiteContentOverlay","content","closecb","cbToClose","useState","opacity","setOpacity","handleClose","setTimeout","useEffect","document","addEventListener","e","code","removeEventListener","style","getPasswordCookie","localStorage","getItem","Password","setPassword","redBorder","setRedBorder","cbWhenPasswordCorrect","cbWhenCorrect","checkInput","checkPassword","then","res","correct","setItem","setPasswordCookie","timeoutID","clearTimeout","eventHandler","value","onChange","event","newInput","currentTarget","type","IngredientsSelector","startDrink","selectedDrink","setSelectedDrink","ingredients","setIngredients","getIngredients","useAvaibleIngredients","target","log","Object","entries","map","options","key","label","option","index","disabled","IngredientsCategorySelector","selectedCategory","currentCategory","setCurrentCategory","categories","setCategories","getCategories","PumpSetting","formattedName","setPumpSelectionStatus","PumpSettings","pumps","setPumps","getPumps","allPumps","pumpObj","select","undefined","AddIngredient","setSelectedCategory","ingredientsName","setIngredientsName","locked","setLocked","preventDefault","onSubmit","required","RemoveDrink","RemoveIngredient","selectedIngredient","setSelectedIngredient","selectedIndex","parentElement","Debug","setStatus","setDrinks","getString","object","refresh","intervalID","setInterval","clearInterval","SettingsHidden","showRemoveDrink","setShowRemoveDrink","showRemoveIngredient","setShowRemoveIngredient","showAddIngredient","setShowAddIngredient","showDebug","setShowDebug","SettingsMenu","accessGranted","setAccessGranted","ConnectionStatus","isConnected","connected","TaskStatus","task","currentTask","SettingsIcon","src","settingsIcon","alt","Header","connectionStatus","onlineStatus","setOnlineStatus","checkStatus","newStatus","useOnlineStatus","isOnline","currentlyDoing","cbShowSettings","FinalDrinkOverview","drink","name","DrinkCategory","showDrinkOverview","setShowDrinkOverview","showDrinkOverviewFor","AllDrinkCategories","nonAlcoholicDrinks","setNonAlcoholicDrinks","alcoholicDrinks","setAlcoholicDrinks","alcohol","noAlcohol","forEach","hasAlcohol","push","Main","UnitSelector","units","setUnits","selectedUnit","setSelectedUnit","getUnits","unit","AmountInput","setValue","newValue","max","min","IngredientSection","onDelete","onIngredientChange","onAmountChange","onUnitOfMeasurementChange","newIngredient","newAmount","newUnit","AddDrinkComponent","setName","blockInput","setBlockInput","validateInput","length","every","amount","newDrink","alert","newName","filter","setIngredient","setAmount","setUnit","Math","floor","Date","now","random","CustomComponent","pumpInterval","setPumpInterval","pumpState","setPumpState","startInterval","idOfPump","startPump","prevState","newState","cancelTimeout","getPumpState","Footer","showAddDrink","setShowAddDrink","showCustom","setShowCustom","App","showSettings","setShowSettings","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.61cc9d63.chunk.js","sourcesContent":["const HOSTNAME = window.location.href;\nconst HOSTNAME_WITHOUT_PORT = HOSTNAME.slice(0, -6);\nconst BACKEND_PORT = 4000;\nconst BACKEND_LINK = `${HOSTNAME_WITHOUT_PORT}:${BACKEND_PORT}/`;\n\nasync function getStatus() {\n try {\n const response = await fetch(BACKEND_LINK + 'status');\n const json = await response.json();\n const responseObject = {\n online: true,\n ...json\n }\n return responseObject;\n } catch (e) {\n return { online: false };\n }\n}\n\nasync function checkPassword(password) {\n try {\n const response = await fetch(BACKEND_LINK + 'password', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ password }),\n });\n const json = await response.json();\n\n return json;\n } catch (e) {\n return { success: false };\n }\n}\n\nasync function getPumpsAndStatus() {\n try {\n const response = await fetch(BACKEND_LINK + 'pumps');\n const json = await response.json();\n\n if (response.status !== 200) {\n throw new Error(json.error);\n }\n return {\n json,\n success: true\n }\n } catch (e) {\n console.error(e);\n return { \n error: e,\n success: false \n };\n }\n}\n\nasync function getPossibleDrinks() {\n try {\n const response = await fetch(BACKEND_LINK + 'drink/ingredients');\n const json = await response.json();\n\n if (response.status !== 200) {\n throw new Error(json.error);\n }\n return {\n drinks: json,\n success: true\n }\n } catch (e) {\n console.error(e);\n return { \n error: e,\n success: false \n };\n }\n}\n\nasync function setPumpSelectionStatus(password, pumpNumber, newSelection) {\n try {\n const response = await fetch(BACKEND_LINK + 'setPump', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ password, pump: pumpNumber, newSelection }),\n });\n const json = await response.json();\n\n if (response.status !== 200) {\n throw new Error(json.error);\n }\n return {\n success: true\n }\n } catch (e) {\n console.error(e);\n return { \n error: e,\n success: false \n };\n }\n}\n\nasync function addIngredient(password, ingredient, category) {\n try {\n const response = await fetch(BACKEND_LINK + 'drink/addIngredient', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json' \n },\n body: JSON.stringify({ password, ingredient, category }),\n });\n const json = await response.json();\n return json;\n } catch (e) {\n console.error(e);\n return { \n error: e,\n success: false \n };\n }\n}\n\nasync function removeIngredient(password, ingredient, category) {\n try {\n const response = await fetch(BACKEND_LINK + 'drink/removeIngredient', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ password, ingredient, category }),\n });\n const json = await response.json();\n return json;\n } catch (e) {\n console.error(e);\n return {\n error: e,\n success: false\n }\n }\n}\n\nasync function createDrink(drinkObject) {\n const drinkJSON = JSON.stringify(drinkObject);\n\n try {\n const response = await fetch(BACKEND_LINK + 'drink/add', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: drinkJSON,\n });\n \n const responseJSON = await response.json();\n return responseJSON;\n } catch(e) {\n return {\n error: e,\n success: false\n }\n }\n\n\n}\n\nasync function getPossibleUnits() {\n return [\n 'ml',\n 'cl',\n 'tsp',\n 'tbsp',\n ]\n}\n\nasync function getUnitInMl(unit) {\n switch (unit) {\n case 'ml':\n return 1;\n case 'cl':\n return 10;\n case 'tsp':\n return 5;\n case 'tbsp':\n return 15;\n default:\n return 1;\n }\n}\n\nasync function startPump(pumpNumber, forInMs) {\n fetch(BACKEND_LINK + 'startPump', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ id: pumpNumber, time: forInMs }),\n });\n}\n\nasync function getAllDrinks() {\n try {\n const allDrinks = await fetch(BACKEND_LINK + 'drink/all', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n },\n });\n const allDrinksJSON = await allDrinks.json();\n return {\n success: true,\n response: allDrinksJSON\n }\n } catch(e) {\n return {\n success: false,\n }\n }\n}\n\nasync function makeDrink(id) {\n fetch(BACKEND_LINK + 'drink/make', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({id}),\n });\n\n return true;\n}\n\nexport { getStatus, checkPassword, getPumpsAndStatus, getPossibleDrinks, setPumpSelectionStatus, addIngredient, removeIngredient,\n getAllDrinks, getPossibleUnits, createDrink, startPump, makeDrink }; ","import '../styles/buttons.css';\n\nfunction DangerButton(props) {\n const text = props.children;\n const cb = props.onClick;\n\n return (\n
\n {text}\n
\n )\n}\n\nfunction NormalButton(props) {\n const text = props.children;\n const cb = props.onClick;\n\n return (\n
\n {text}\n
\n )\n}\n\nfunction AttentionButton(props) {\n const text = props.children;\n const cb = props.onClick;\n const onMouseDown = props.onMouseDown;\n const onMouseUp = props.onMouseUp;\n const onMouseLeave = props.onMouseLeave;\n\n return (\n
\n {text}\n
\n )\n}\n\nfunction RemoveButton(props) {\n const text = props.children;\n const cb = props.onClick;\n\n return (\n \n )\n}\n\nfunction AddButton(props) {\n return (\n \n )\n}\nexport { DangerButton, NormalButton, AttentionButton, RemoveButton, AddButton };","import { useState, useEffect } from 'react';\nimport './../styles/overlays.css';\n\nfunction CloseButton(props) {\n const cbWhenPressed = props.cbWhenPressed;\n\n return (\n \n )\n}\n\nfunction BlurBackground() {\n // add pointer events on mount and unmount?\n\n return (\n
\n
\n )\n}\n\nfunction WhiteContentOverlay(props) {\n const content = props.children;\n const closecb = props.cbToClose;\n const [opacity, setOpacity] = useState(0);\n\n useEffect(() => {\n setTimeout(\n () => {\n setOpacity(1);\n }, 50\n )\n }, [])\n\n useEffect(() => {\n document.addEventListener('keydown', (e) => {\n if (e.code === 'Escape') handleClose();\n });\n \n return () => {\n document.removeEventListener('keydown', (e) => {\n if (e.code === 'Escape') handleClose();\n });\n }\n }, [])\n\n function handleClose() {\n setOpacity(0);\n setTimeout(closecb, 200);\n }\n\n return (\n
\n \n
\n {content}\n \n
\n
\n );\n}\n\nexport { WhiteContentOverlay };","import React, { useState, useEffect } from \"react\";\nimport { getStatus, checkPassword, getPumpsAndStatus, getPossibleDrinks, setPumpSelectionStatus, addIngredient, removeIngredient } from \"../../requests\";\nimport { NormalButton, DangerButton } from \"./buttons\";\nimport { WhiteContentOverlay } from \"./overlays\";\nimport './../styles/settings.css';\n\nfunction setPasswordCookie(password) {\n localStorage.setItem('password', password);\n}\n\nfunction getPasswordCookie() {\n return localStorage.getItem('password');\n}\n\nfunction Password(props) {\n const [password, setPassword] = useState('');\n const [redBorder, setRedBorder] = useState(false);\n const cbWhenPasswordCorrect = props.cbWhenCorrect;\n\n function checkInput() {\n /* all on the requests on the shown site after correct password\n must be sent with the correct password */\n if (password === '') setRedBorder(true);\n checkPassword(password).then(res => {\n if (res.correct) {\n cbWhenPasswordCorrect();\n setPasswordCookie(password);\n } else {\n setRedBorder(true);\n }\n });\n }\n\n useEffect(() => {\n const timeoutID = setTimeout(() => setRedBorder(false), 500);\n return () => clearTimeout(timeoutID);\n }, [redBorder]);\n\n useEffect(() => {\n const eventHandler = (e) => {\n if (e.code === 'Enter') {\n checkInput();\n }\n }\n\n document.addEventListener('keydown', eventHandler);\n return () => document.removeEventListener('keydown', eventHandler);\n });\n\n function handleChange(event) {\n const newInput = event.currentTarget.value;\n setPassword(newInput);\n }\n\n return (\n
\n \n \n
\n )\n\n}\n\nfunction useAvaibleIngredients() {\n const [ingredients, setIngredients] = useState();\n\n useEffect(() => {\n async function getIngredients() {\n const response = await getPossibleDrinks();\n setIngredients(response.drinks);\n }\n\n getIngredients();\n }, []);\n\n return ingredients;\n}\n\nfunction IngredientsSelector(props) {\n const onChange = props.onChange;\n const startDrink = props.selectedDrink;\n const [selectedDrink, setSelectedDrink] = useState();\n\n const ingredients = useAvaibleIngredients();\n\n useEffect(() => {\n if (!startDrink)\n setSelectedDrink('empty')\n else\n setSelectedDrink(startDrink);\n }, [startDrink]);\n\n function handleChange(event) {\n const newInput = event.target.value;\n setSelectedDrink(newInput);\n try {\n onChange(event);\n } catch (e) {\n console.log('Did you define an onChange prop? ' + e);\n }\n }\n\n function renderOptions(options) {\n return options.map((option, index) => );\n }\n\n if (ingredients && selectedDrink)\n return (\n \n )\n else\n return (\n \n )\n}\n\nfunction IngredientsCategorySelector(props) {\n const onChange = props.onChange;\n const selectedCategory = props.selectedCategory;\n\n const [currentCategory, setCurrentCategory] = useState();\n const [categories, setCategories] = useState();\n\n async function getCategories() {\n const response = await getPossibleDrinks();\n\n const categories = Object.entries(response.drinks).map(([key, value]) => {\n return key;\n });\n\n setCategories(categories);\n }\n\n useEffect(() => {\n getCategories();\n\n if (selectedCategory) setCurrentCategory(selectedCategory);\n }, [selectedCategory]);\n\n function handleChange(event) {\n const newInput = event.target.value;\n setCurrentCategory(newInput);\n try {\n onChange(newInput);\n } catch (e) {\n console.log('Did you define an onChange prop? ' + e);\n }\n }\n\n return (\n \n )\n}\n\nfunction PumpSetting(props) {\n const pumpNumber = props.pumpNumber;\n const formattedName = 'pump' + pumpNumber;\n\n function setSelection(event) {\n const newInput = event.target.value;\n const currentPassword = getPasswordCookie();\n setPumpSelectionStatus(currentPassword, pumpNumber, newInput);\n }\n\n return (\n
\n
{formattedName}
\n \n
\n );\n}\n\nfunction PumpSettings() {\n const [pumps, setPumps] = useState();\n\n async function getPumps() {\n const response = await getPumpsAndStatus();\n const allPumps = response.json.pumps;\n setPumps(allPumps);\n }\n\n function refresh() {\n setPumps(undefined);\n getPumps();\n }\n\n useEffect(() => {\n getPumps();\n }, []);\n\n return (\n
\n
\n {pumps ? (\n pumps.map((pumpObj, index) => {\n return (\n \n )\n })\n ) :
Loading...
}\n
\n Refresh\n
\n )\n}\n\nfunction AddIngredient(props) {\n const [selectedCategory, setSelectedCategory] = useState();\n const [ingredientsName, setIngredientsName] = useState();\n const [locked, setLocked] = useState(false);\n\n const closecb = props.closecb;\n\n async function onSubmit(event) {\n event.preventDefault();\n if (!(ingredientsName && selectedCategory)) return;\n setLocked(true);\n const password = getPasswordCookie();\n const addedIngredient = await addIngredient(password, ingredientsName, selectedCategory);\n if (addedIngredient) setIngredientsName();\n setLocked(false);\n closecb();\n }\n\n function handleChange(event) {\n const newInput = event.currentTarget.value;\n setIngredientsName(newInput);\n }\n\n if (locked) {\n return
Adding...
\n } else {\n return (\n
\n
Add Ingredient
\n
\n \n \n \n \n Cancel\n
\n )\n }\n}\n\nfunction RemoveDrink() {\n return Remove Drink;\n}\n\nfunction RemoveIngredient(props) {\n const [locked, setLocked] = useState(false);\n const [selectedCategory, setSelectedCategory] = useState();\n const [selectedIngredient, setSelectedIngredient] = useState();\n const closecb = props.closecb;\n\n async function onSubmit() {\n if (!selectedIngredient || (selectedIngredient === 'empty')) return;\n setLocked(true);\n const password = getPasswordCookie();\n await removeIngredient(password, selectedIngredient, selectedCategory);\n closecb();\n setLocked(false);\n }\n\n function handleChange(event) {\n const newInput = event.target.value;\n setSelectedIngredient(newInput);\n const selectedIndex = event.currentTarget.selectedIndex;\n const selectedOptionElement = event.currentTarget[selectedIndex];\n const selectedOptgroup = selectedOptionElement.parentElement;\n const category = selectedOptgroup.label;\n setSelectedCategory(category);\n }\n \n return locked ?
Deleting...
: \n
\n \n Remove Ingredient\n Cancel\n
;\n}\n\nfunction Debug() {\n const [status, setStatus] = useState();\n const [pumps, setPumps] = useState();\n const [drinks, setDrinks] = useState();\n\n function getString(object) {\n return JSON.stringify(object, null, 2);\n }\n\n async function refresh() {\n const status = await getStatus();\n setStatus(getString(status));\n const pumps = await getPumpsAndStatus();\n setPumps(getString(pumps));\n const drinks = await getPossibleDrinks();\n setDrinks(getString(drinks));\n }\n\n useState(() => {\n refresh();\n const intervalID = setInterval(refresh, 1000);\n\n return () => clearInterval(intervalID);\n })\n\n return (\n
\n
\n
Status
\n
{status}
\n
\n
\n
Pumps
\n
{pumps}
\n
\n
\n
Drinks
\n
{drinks}
\n
\n
\n );\n}\n\nfunction SettingsHidden() {\n const [showRemoveDrink, setShowRemoveDrink] = useState(false);\n const [showRemoveIngredient, setShowRemoveIngredient] = useState(false);\n const [showAddIngredient, setShowAddIngredient] = useState(false);\n const [showDebug, setShowDebug] = useState(false);\n\n return (\n
\n \n {showRemoveDrink ? : setShowRemoveDrink(true)}>Remove Drink}\n {showRemoveIngredient ? setShowRemoveIngredient(false)}/> : setShowRemoveIngredient(true)}>Remove Ingredient}\n {showAddIngredient ? setShowAddIngredient(false)}/> : setShowAddIngredient(true)}>Add Ingredient}\n {showDebug ? : setShowDebug(true)}>Debug}\n
\n );\n}\n\nfunction SettingsMenu(props) {\n const [accessGranted, setAccessGranted] = useState(false);\n const cbToClose = props.cbToClose;\n\n function grantAccess() {\n setAccessGranted(true);\n }\n\n return (\n \n {accessGranted ? : }\n \n );\n}\n\nexport default SettingsMenu;\nexport { IngredientsSelector, IngredientsCategorySelector };","export default __webpack_public_path__ + \"static/media/settings.8588567d.svg\";","import React, { useState, useEffect } from 'react';\nimport settingsIcon from './../assets/settings.svg';\nimport '../styles/topHeader.css';\n\nimport { getStatus } from './../../requests';\n\nfunction useOnlineStatus() {\n const [onlineStatus, setOnlineStatus] = useState({\n online: false,\n task: 'Idle'\n });\n\n async function checkStatus() {\n const newStatus = await getStatus();\n setOnlineStatus(newStatus);\n }\n\n useEffect(() => {\n checkStatus();\n const intervalID = setInterval(checkStatus, 2000);\n return () => clearInterval(intervalID);\n }, []);\n\n return onlineStatus;\n}\n\nfunction ConnectionStatus(props) {\n const isConnected = props.connected;\n\n return (\n
\n
\n
\n\n
\n {isConnected ? 'Connected' : 'Disconnected'}\n
\n
\n )\n}\n\nfunction TaskStatus(props) {\n const task = props.currentTask;\n\n return (\n
\n
Current Status:
\n
{task}
\n
\n )\n}\n\nfunction SettingsIcon(props) {\n const cbWhenPressed = props.cbWhenPressed;\n\n return (\n
\n \"Settings\"\n
\n )\n}\n\nfunction Header(props) {\n const connectionStatus = useOnlineStatus();\n const isOnline = connectionStatus.online;\n const currentlyDoing = connectionStatus.task;\n\n const cbShowSettings = props.cbShowSettings;\n return (\n
\n \n \n \n
\n )\n}\n\nexport default Header;","import '../styles/middleMain.css';\nimport { AttentionButton } from './../../components/overlays/buttons';\nimport { getAllDrinks, makeDrink } from './../../requests';\nimport { useState, useEffect } from 'react'; \nimport { WhiteContentOverlay } from '../../components/overlays/overlays';\n\nfunction FinalDrinkOverview(props) {\n const closecb = props.closecb;\n const drink = props.drink;\n\n async function pumpDrink() {\n await makeDrink(drink.id);\n closecb();\n }\n\n return (\n \n

{drink.name}

\n Make Drink\n
\n )\n}\n\nfunction DrinkCategory(props) {\n const category = props.category;\n const drinks = props.drinks;\n\n const [showDrinkOverview, setShowDrinkOverview] = useState(false);\n const [selectedDrink, setSelectedDrink] = useState();\n\n async function showDrinkOverviewFor(drink) {\n setShowDrinkOverview(true);\n setSelectedDrink(drink);\n }\n\n return (\n
\n {showDrinkOverview ? \n setShowDrinkOverview(false)} drink={selectedDrink}>\n \n : null}\n
{category}
\n
\n {drinks.map((drink, index) => {\n return showDrinkOverviewFor(drink)\n }\n >{drink.name}\n })\n }\n
\n
\n )\n}\n\nfunction AllDrinkCategories(props) {\n const [nonAlcoholicDrinks, setNonAlcoholicDrinks] = useState();\n const [alcoholicDrinks, setAlcoholicDrinks] = useState();\n\n useEffect(() => {\n async function getCategories() {\n const response = await getAllDrinks();\n const allDrinks = response.response;\n\n const alcohol = [];\n const noAlcohol = [];\n\n allDrinks.forEach((drink) => {\n if (drink.hasAlcohol === 1) {\n alcohol.push(drink);\n } else {\n noAlcohol.push(drink);\n }\n });\n\n setAlcoholicDrinks(alcohol);\n setNonAlcoholicDrinks(noAlcohol);\n }\n\n getCategories();\n }, [])\n\n if (alcoholicDrinks && nonAlcoholicDrinks) {\n return (\n
\n \n \n
\n );\n }\n \n return
Loading...
\n}\n\nfunction Main() {\n return (\n
\n \n
\n )\n}\n\nexport default Main;","import '../styles/bottomFooter.css';\nimport { useState, useEffect } from 'react';\nimport { AttentionButton, RemoveButton } from '../../components/overlays/buttons';\nimport { WhiteContentOverlay } from '../../components/overlays/overlays';\nimport { getPumpsAndStatus, getPossibleUnits, createDrink, startPump } from '../../requests';\nimport { IngredientsSelector } from './../../components/overlays/settings';\n\nfunction UnitSelector(props) {\n const onChange = props.onChange;\n const [units, setUnits] = useState();\n const [selectedUnit, setSelectedUnit] = useState();\n\n useEffect(() => {\n async function getUnits() {\n const units = await getPossibleUnits();\n setUnits(units);\n }\n\n getUnits();\n }, []);\n\n function handleChange(e) {\n setSelectedUnit(e.target.value);\n onChange(e);\n }\n\n return (\n \n )\n}\n\nfunction AmountInput(props) {\n const onChange = props.onChange;\n const [value, setValue] = useState('');\n\n function handleChange(e) {\n const newValue = e.target.value;\n if (newValue > 1000) return;\n if (newValue < 0) return;\n setValue(newValue);\n onChange(e);\n }\n\n return (\n \n )\n}\n\nfunction IngredientSection(props) {\n const onDelete = props.onDelete;\n const onIngredientChange = props.onIngredientChange;\n const onAmountChange = props.onAmountChange;\n const onUnitOfMeasurementChange = props.onUnitOfMeasurementChange;\n\n function handleChangeIngredient(e) {\n const newIngredient = e.target.value;\n onIngredientChange(newIngredient);\n }\n\n function handleChangeAmount(e) {\n const newAmount = e.target.value;\n onAmountChange(newAmount);\n }\n\n function handleChangeUnit(e) {\n const newUnit = e.target.value;\n onUnitOfMeasurementChange(newUnit);\n }\n\n return (\n
\n \n \n \n \n
\n )\n}\n\nfunction AddDrinkComponent(props) {\n const [name, setName] = useState();\n const [ingredients, setIngredients] = useState([]);\n const [blockInput, setBlockInput] = useState(false);\n\n function getID() {\n return Math.floor(+Date.now() + Math.random());\n }\n\n function addIngredient() {\n setIngredients([...ingredients, {\n id: getID(),\n ingredient: '',\n amount: '',\n unit: ''\n }]);\n }\n\n function removeIngredient(id) {\n setIngredients(ingredients.filter((ingredient) => ingredient.id !== id));\n }\n\n function setIngredient(id, newIngredient) {\n setIngredients(ingredients.map((ingredient) => {\n if (ingredient.id === id) {\n return {\n ...ingredient,\n ingredient: newIngredient\n }\n }\n\n return ingredient;\n }));\n }\n\n function setAmount(id, newAmount) {\n setIngredients(ingredients.map((ingredient) => {\n if (ingredient.id === id) {\n return {\n ...ingredient,\n amount: newAmount\n }\n }\n\n return ingredient;\n }));\n }\n\n function setUnit(id, newUnit) {\n setIngredients(ingredients.map((ingredient) => {\n if (ingredient.id === id) {\n return {\n ...ingredient,\n unit: newUnit\n }\n }\n\n return ingredient;\n }));\n }\n\n function handleNameChange(e) {\n const newName = e.target.value;\n setName(newName);\n }\n\n function validateInput() {\n if (ingredients.length === 0) return false;\n\n const everythingHasValues = ingredients.every((ingredient) => {\n return (ingredient.id && ingredient.ingredient && ingredient.amount && ingredient.unit) != false;\n });\n const hasName = (name != false);\n\n return everythingHasValues && hasName;\n }\n\n async function submit() {\n const correctFormatting = validateInput();\n if (correctFormatting) {\n setBlockInput(true);\n const newDrink = {\n name,\n ingredients\n }\n\n const response = await createDrink(newDrink);\n\n if (response.success === true) {\n setName('');\n setIngredients([]);\n }\n setBlockInput(false);\n } else {\n alert('Please fill out all fields');\n }\n }\n\n if (blockInput) return (\n
\n Adding...\n
\n )\n\n return (\n <>\n
\n \n\n {ingredients.length ? ingredients.map((ingredient) => {\n return (\n {\n const id = ingredient.id;\n removeIngredient(id); \n }\n }\n onIngredientChange={\n (newIngredient) => setIngredient(ingredient.id, newIngredient)\n }\n onAmountChange={\n (newAmount) => setAmount(ingredient.id, newAmount)\n }\n onUnitOfMeasurementChange={\n (newUnit) => setUnit(ingredient.id, newUnit)\n }\n />\n )\n }) : null}\n Add Ingredient\n
\n
\n Submit\n
\n \n )\n}\n\nfunction CustomComponent(props) {\n const [pumpInterval, setPumpInterval] = useState([\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n ]);\n const [pumpState, setPumpState] = useState();\n\n useEffect(() => {\n async function getPumpState() {\n const response = await getPumpsAndStatus();\n setPumpState(response.json.pumps);\n }\n getPumpState();\n }, []);\n\n function startInterval(idOfPump) {\n const intervalID = setInterval(() => {\n startPump(idOfPump, 500);\n }, 500);\n\n setPumpInterval((prevState) => {\n const newState = [...prevState];\n newState[idOfPump - 1] = intervalID;\n return newState;\n });\n }\n\n function cancelTimeout(idOfPump) {\n clearInterval(pumpInterval[idOfPump - 1]);\n }\n\n return (\n
\n {pumpState ?\n pumpState.map((pump) => {\n const idOfPump = pump.id;\n const selectedIngredient = pump.select;\n\n return {\n startInterval(idOfPump);\n }\n }\n\n onMouseUp={\n () => {\n cancelTimeout(idOfPump);\n }\n }\n\n onMouseLeave={\n () => {\n cancelTimeout(idOfPump);\n }\n }\n >{selectedIngredient}\n })\n :\n
Loading...
\n }\n
\n )\n}\n\nfunction Footer() {\n const [showAddDrink, setShowAddDrink] = useState(false);\n const [showCustom, setShowCustom] = useState(false);\n\n return (\n
\n {showAddDrink ? setShowAddDrink(false)}> \n \n : null}\n\n {showCustom ? setShowCustom(false)}>\n \n : null}\n\n setShowAddDrink(true)}>Add Drink\n setShowCustom(true)}>Custom\n
\n )\n}\n\nexport default Footer;","import './App.css';\nimport SettingsMenu from './components/overlays/settings';\nimport Header from './components/defaults/topHeader';\nimport Main from './components/defaults/middleMain';\nimport Footer from './components/defaults/bottomFooter';\n\nimport React, {useState} from 'react';\n\nfunction App() {\n const [showSettings, setShowSettings] = useState(false);\n\n return (\n
\n {showSettings ? setShowSettings(false)}/> : null}\n
setShowSettings(true)}/>\n
\n
\n );\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/build/static/js/main.723c0bfd.chunk.js b/frontend/build/static/js/main.723c0bfd.chunk.js new file mode 100644 index 0000000..d01f98f --- /dev/null +++ b/frontend/build/static/js/main.723c0bfd.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonpfrontend=this.webpackJsonpfrontend||[]).push([[0],[,,,,,,,,,,,,,,,function(e,t,n){},function(e,t,n){},,function(e,t,n){},,function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){},function(e,t,n){"use strict";n.r(t);var r=n(1),c=n.n(r),a=n(10),s=n.n(a),u=(n(15),n(3)),i=(n(16),n(2)),o=n.n(i),l=n(4),j=n(5),p=window.location.href.slice(0,-6),d="".concat(p,":").concat(4e3,"/");function b(){return f.apply(this,arguments)}function f(){return(f=Object(l.a)(o.a.mark((function e(){var t,n,r;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(d+"status");case 3:return t=e.sent,e.next=6,t.json();case 6:return n=e.sent,r=Object(j.a)({online:!0},n),e.abrupt("return",r);case 11:return e.prev=11,e.t0=e.catch(0),e.abrupt("return",{online:!1});case 14:case"end":return e.stop()}}),e,null,[[0,11]])})))).apply(this,arguments)}function O(){return(O=Object(l.a)(o.a.mark((function e(t){var n,r;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(d+"password",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:t})});case 3:return n=e.sent,e.next=6,n.json();case 6:return r=e.sent,e.abrupt("return",r);case 10:return e.prev=10,e.t0=e.catch(0),e.abrupt("return",{success:!1});case 13:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}function h(){return v.apply(this,arguments)}function v(){return(v=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(d+"pumps");case 3:return t=e.sent,e.next=6,t.json();case 6:if(n=e.sent,200===t.status){e.next=9;break}throw new Error(n.error);case 9:return e.abrupt("return",{json:n,success:!0});case 12:return e.prev=12,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",{error:e.t0,success:!1});case 16:case"end":return e.stop()}}),e,null,[[0,12]])})))).apply(this,arguments)}function x(){return m.apply(this,arguments)}function m(){return(m=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(d+"drink/ingredients");case 3:return t=e.sent,e.next=6,t.json();case 6:if(n=e.sent,200===t.status){e.next=9;break}throw new Error(n.error);case 9:return e.abrupt("return",{drinks:n,success:!0});case 12:return e.prev=12,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",{error:e.t0,success:!1});case 16:case"end":return e.stop()}}),e,null,[[0,12]])})))).apply(this,arguments)}function g(){return(g=Object(l.a)(o.a.mark((function e(t,n,r){var c,a;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(d+"setPump",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:t,pump:n,newSelection:r})});case 3:return c=e.sent,e.next=6,c.json();case 6:if(a=e.sent,200===c.status){e.next=9;break}throw new Error(a.error);case 9:return e.abrupt("return",{success:!0});case 12:return e.prev=12,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",{error:e.t0,success:!1});case 16:case"end":return e.stop()}}),e,null,[[0,12]])})))).apply(this,arguments)}function y(e,t,n){return k.apply(this,arguments)}function k(){return(k=Object(l.a)(o.a.mark((function e(t,n,r){var c,a;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(d+"drink/addIngredient",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:t,ingredient:n,category:r})});case 3:return c=e.sent,e.next=6,c.json();case 6:return a=e.sent,e.abrupt("return",a);case 10:return e.prev=10,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",{error:e.t0,success:!1});case 14:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}function w(e,t,n){return C.apply(this,arguments)}function C(){return(C=Object(l.a)(o.a.mark((function e(t,n,r){var c,a;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(d+"drink/removeIngredient",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:t,ingredient:n,category:r})});case 3:return c=e.sent,e.next=6,c.json();case 6:return a=e.sent,e.abrupt("return",a);case 10:return e.prev=10,e.t0=e.catch(0),console.error(e.t0),e.abrupt("return",{error:e.t0,success:!1});case 14:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}function S(e){return N.apply(this,arguments)}function N(){return(N=Object(l.a)(o.a.mark((function e(t){var n,r,c;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=JSON.stringify(t),e.prev=1,e.next=4,fetch(d+"drink/add",{method:"PATCH",headers:{"Content-Type":"application/json"},body:n});case 4:return r=e.sent,e.next=7,r.json();case 7:return c=e.sent,e.abrupt("return",c);case 11:return e.prev=11,e.t0=e.catch(1),e.abrupt("return",{error:e.t0,success:!1});case 14:case"end":return e.stop()}}),e,null,[[1,11]])})))).apply(this,arguments)}function T(){return E.apply(this,arguments)}function E(){return(E=Object(l.a)(o.a.mark((function e(){return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",["ml","cl","tsp","tbsp"]);case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function D(){return(D=Object(l.a)(o.a.mark((function e(t,n){return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:fetch(d+"startPump",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:t,time:n})});case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function I(){return A.apply(this,arguments)}function A(){return(A=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(d+"drink/all",{method:"GET",headers:{"Content-Type":"application/json"}});case 3:return t=e.sent,e.next=6,t.json();case 6:return n=e.sent,e.abrupt("return",{success:!0,response:n});case 10:return e.prev=10,e.t0=e.catch(0),e.abrupt("return",{success:!1});case 13:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}function M(e){return P.apply(this,arguments)}function P(){return(P=Object(l.a)(o.a.mark((function e(t){return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return fetch(d+"drink/make",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:t})}),e.abrupt("return",!0);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function L(e,t){return J.apply(this,arguments)}function J(){return(J=Object(l.a)(o.a.mark((function e(t,n){var r;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(d+"drink/remove",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({password:t,id:n})});case 3:return r=e.sent,e.abrupt("return",{success:!0,response:r});case 7:return e.prev=7,e.t0=e.catch(0),e.abrupt("return",{success:!1,error:e.t0});case 10:case"end":return e.stop()}}),e,null,[[0,7]])})))).apply(this,arguments)}function U(e){return W.apply(this,arguments)}function W(){return(W=Object(l.a)(o.a.mark((function e(t){var n,r;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,fetch(d+"drink/ingredients",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:t})});case 3:return n=e.sent,e.next=6,n.json();case 6:return r=e.sent,e.abrupt("return",{success:!0,response:r});case 10:return e.prev=10,e.t0=e.catch(0),e.abrupt("return",{success:!1,error:e.t0});case 13:case"end":return e.stop()}}),e,null,[[0,10]])})))).apply(this,arguments)}n(18);var H=n(0);function R(e){var t=e.children,n=e.onClick;return Object(H.jsx)("div",{className:"button red",onClick:n,children:t})}function q(e){var t=e.children,n=e.onClick;return Object(H.jsx)("div",{className:"button green",onClick:n,children:t})}function B(e){var t=e.children,n=e.onClick,r=e.onMouseDown,c=e.onMouseUp,a=e.onMouseLeave;return Object(H.jsx)("div",{className:"button attention",onClick:n,onMouseDown:r,onMouseUp:c,onMouseLeave:a,children:t})}function F(e){var t=e.children,n=e.onClick;return Object(H.jsx)("button",{onClick:n,className:"remove",children:t})}n(20);function G(e){var t=e.cbWhenPressed;return Object(H.jsx)("button",{className:"close-button",onClick:t})}function z(){return Object(H.jsx)("div",{className:"blur-background"})}function K(e){var t=e.children,n=e.cbToClose,c=Object(r.useState)(0),a=Object(u.a)(c,2),s=a[0],i=a[1];function o(){i(0),setTimeout(n,200)}return Object(r.useEffect)((function(){setTimeout((function(){i(1)}),50)}),[]),Object(r.useEffect)((function(){return document.addEventListener("keydown",(function(e){"Escape"===e.code&&o()})),function(){document.removeEventListener("keydown",(function(e){"Escape"===e.code&&o()}))}}),[]),Object(H.jsxs)("div",{className:"white-content-overlay",style:{opacity:s},children:[Object(H.jsx)(z,{}),Object(H.jsxs)("div",{className:"settings-container",children:[t,Object(H.jsx)(G,{cbWhenPressed:o})]})]})}n(21);function Q(){return localStorage.getItem("password")}function V(e){var t=Object(r.useState)(""),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(!1),i=Object(u.a)(s,2),o=i[0],l=i[1],j=e.cbWhenCorrect;function p(){""===c&&l(!0),function(e){return O.apply(this,arguments)}(c).then((function(e){e.correct?(j(),function(e){localStorage.setItem("password",e)}(c)):l(!0)}))}return Object(r.useEffect)((function(){var e=setTimeout((function(){return l(!1)}),500);return function(){return clearTimeout(e)}}),[o]),Object(r.useEffect)((function(){var e=function(e){"Enter"===e.code&&p()};return document.addEventListener("keydown",e),function(){return document.removeEventListener("keydown",e)}})),Object(H.jsxs)("div",{className:"password-input ".concat(o?"invalid":""),children:[Object(H.jsx)("input",{value:c,onChange:function(e){var t=e.currentTarget.value;a(t)},type:"password"}),Object(H.jsx)("button",{className:"submit",onClick:p,children:"Submit"})]})}function X(e){var t=e.onChange,n=e.selectedDrink,c=Object(r.useState)(),a=Object(u.a)(c,2),s=a[0],i=a[1],j=function(){var e=Object(r.useState)(),t=Object(u.a)(e,2),n=t[0],c=t[1];return Object(r.useEffect)((function(){function e(){return(e=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x();case 2:t=e.sent,c(t.drinks);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),n}();return Object(r.useEffect)((function(){i(n||"empty")}),[n]),j&&s?Object(H.jsxs)("select",{value:s,onChange:function(e){var n=e.target.value;i(n);try{t(e)}catch(r){console.log("Did you define an onChange prop? "+r)}},children:[Object(H.jsx)("option",{value:"empty",children:"Empty"},"empty"),Object.entries(j).map((function(e){var t,n=Object(u.a)(e,2),r=n[0],c=n[1];return Object(H.jsx)("optgroup",{label:r,children:(t=c,t.map((function(e,t){return Object(H.jsx)("option",{value:e,children:e},t)})))},r)}))]}):Object(H.jsx)("select",{disabled:!0,children:Object(H.jsx)("option",{value:"loading",children:"Loading..."})})}function Y(e){var t=e.onChange,n=e.selectedCategory,c=Object(r.useState)(),a=Object(u.a)(c,2),s=a[0],i=a[1],j=Object(r.useState)(),p=Object(u.a)(j,2),d=p[0],b=p[1];function f(){return f=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,x();case 2:t=e.sent,n=Object.entries(t.drinks).map((function(e){var t=Object(u.a)(e,2),n=t[0];t[1];return n})),b(n);case 5:case"end":return e.stop()}}),e)}))),f.apply(this,arguments)}return Object(r.useEffect)((function(){!function(){f.apply(this,arguments)}(),n&&i(n)}),[n]),Object(H.jsxs)("select",{className:"ingredients-category-selector",value:s,onChange:function(e){var n=e.target.value;i(n);try{t(n)}catch(r){console.log("Did you define an onChange prop? "+r)}},children:[Object(H.jsx)("option",{value:"",children:"Select category"}),d?d.map((function(e){return Object(H.jsx)("option",{value:e,children:e},e)})):Object(H.jsx)("option",{children:"Loading..."})]})}function Z(e){var t=e.pumpNumber,n="pump"+t;return Object(H.jsxs)("div",{className:"pump-setting",children:[Object(H.jsx)("div",{children:n}),Object(H.jsx)(X,{onChange:function(e){var n=e.target.value;!function(e,t,n){g.apply(this,arguments)}(Q(),t,n)},selectedDrink:e.selectedDrink})]})}function $(){var e=Object(r.useState)(),t=Object(u.a)(e,2),n=t[0],c=t[1];function a(){return s.apply(this,arguments)}function s(){return(s=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,h();case 2:t=e.sent,n=t.json.pumps,c(n);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(r.useEffect)((function(){a()}),[]),Object(H.jsxs)("div",{className:"pump-settings",children:[Object(H.jsx)("div",{className:"pumps",children:n?n.map((function(e,t){return Object(H.jsx)(Z,{pumpNumber:e.id,selectedDrink:e.select},t)})):Object(H.jsx)("div",{children:"Loading..."})}),Object(H.jsx)(q,{onClick:function(){c(void 0),a()},children:"Refresh"})]})}function _(e){var t=Object(r.useState)(),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(),i=Object(u.a)(s,2),j=i[0],p=i[1],d=Object(r.useState)(!1),b=Object(u.a)(d,2),f=b[0],O=b[1],h=e.closecb;function v(){return(v=Object(l.a)(o.a.mark((function e(t){var n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t.preventDefault(),j&&c){e.next=3;break}return e.abrupt("return");case 3:return O(!0),n=Q(),e.next=7,y(n,j,c);case 7:e.sent&&p(),O(!1),h();case 11:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return f?Object(H.jsx)("div",{children:"Adding..."}):Object(H.jsxs)("div",{className:"add-ingredient",children:[Object(H.jsx)("div",{className:"add-ingredient-title",children:"Add Ingredient"}),Object(H.jsxs)("form",{className:"add-ingredient-input",onSubmit:function(e){return v.apply(this,arguments)},children:[Object(H.jsx)("input",{type:"text",onChange:function(e){var t=e.currentTarget.value;p(t)},required:!0}),Object(H.jsx)(Y,{onChange:a,selectedCategory:c}),Object(H.jsx)("input",{type:"submit",value:"Add",required:!0})]}),Object(H.jsx)(R,{onClick:h,children:"Cancel"})]})}function ee(e){var t=Object(r.useState)(""),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(!1),i=Object(u.a)(s,2),j=i[0],p=i[1],d=Object(r.useState)(),b=Object(u.a)(d,2),f=b[0],O=b[1],h=e.closecb;function v(){return(v=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(f){e.next=2;break}return e.abrupt("return");case 2:return p(!0),t=Q(),e.next=6,L(t,f);case 6:n=e.sent,O(),p(!1),n.success&&h();case 10:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(r.useEffect)((function(){function e(){return(e=Object(l.a)(o.a.mark((function e(){var t,n;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,I();case 2:t=e.sent,n=t.response,a(n);case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),!c||j?Object(H.jsx)("div",{children:"Loading..."}):Object(H.jsxs)("div",{className:"remove-drink-section",children:[Object(H.jsxs)("select",{value:f,onChange:function(e){var t=e.target.value;t&&O(t)},children:[Object(H.jsx)("option",{value:"",children:"Select Drink"}),c.map((function(e,t){return Object(H.jsx)("option",{value:e.id,children:e.name},t)}))]}),Object(H.jsx)(R,{onClick:function(){return v.apply(this,arguments)},children:"Delete"}),Object(H.jsx)(R,{children:"Close"})]})}function te(e){var t=Object(r.useState)(!1),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(),i=Object(u.a)(s,2),j=i[0],p=i[1],d=Object(r.useState)(),b=Object(u.a)(d,2),f=b[0],O=b[1],h=e.closecb;function v(){return(v=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(f&&"empty"!==f){e.next=2;break}return e.abrupt("return");case 2:return a(!0),t=Q(),e.next=6,w(t,f,j);case 6:h(),a(!1);case 8:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return c?Object(H.jsx)("div",{children:"Deleting..."}):Object(H.jsxs)("div",{className:"ingredient delete",children:[Object(H.jsx)(X,{onChange:function(e){var t=e.target.value;O(t);var n=e.currentTarget.selectedIndex,r=e.currentTarget[n].parentElement.label;p(r)}}),Object(H.jsx)(R,{onClick:function(){return v.apply(this,arguments)},children:"Remove Ingredient"}),Object(H.jsx)(R,{onClick:h,children:"Cancel"})]})}function ne(){var e=Object(r.useState)(),t=Object(u.a)(e,2),n=t[0],c=t[1],a=Object(r.useState)(),s=Object(u.a)(a,2),i=s[0],j=s[1],p=Object(r.useState)(),d=Object(u.a)(p,2),f=d[0],O=d[1];function v(e){return JSON.stringify(e,null,2)}function m(){return g.apply(this,arguments)}function g(){return g=Object(l.a)(o.a.mark((function e(){var t,n,r;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,b();case 2:return t=e.sent,c(v(t)),e.next=6,h();case 6:return n=e.sent,j(v(n)),e.next=10,x();case 10:r=e.sent,O(v(r));case 12:case"end":return e.stop()}}),e)}))),g.apply(this,arguments)}return Object(r.useEffect)((function(){m();var e=setInterval(m,1e3);return function(){return clearInterval(e)}})),Object(H.jsxs)("div",{className:"debug-values",children:[Object(H.jsxs)("div",{className:"debug-container",children:[Object(H.jsx)("div",{className:"debug-title",children:"Status"}),Object(H.jsx)("pre",{className:"debug-value",children:n})]}),Object(H.jsxs)("div",{className:"debug-container",children:[Object(H.jsx)("div",{className:"debug-title",children:"Pumps"}),Object(H.jsx)("pre",{className:"debug-value",children:i})]}),Object(H.jsxs)("div",{className:"debug-container",children:[Object(H.jsx)("div",{className:"debug-title",children:"Drinks"}),Object(H.jsx)("pre",{className:"debug-value",children:f})]})]})}function re(){var e=Object(r.useState)(!1),t=Object(u.a)(e,2),n=t[0],c=t[1],a=Object(r.useState)(!1),s=Object(u.a)(a,2),i=s[0],o=s[1],l=Object(r.useState)(!1),j=Object(u.a)(l,2),p=j[0],d=j[1],b=Object(r.useState)(!1),f=Object(u.a)(b,2),O=f[0],h=f[1];return Object(H.jsxs)("div",{className:"settings-hidden",children:[Object(H.jsx)($,{}),n?Object(H.jsx)(ee,{closecb:function(){return c(!1)}}):Object(H.jsx)(R,{onClick:function(){return c(!0)},children:"Remove Drink"}),i?Object(H.jsx)(te,{closecb:function(){return o(!1)}}):Object(H.jsx)(R,{onClick:function(){return o(!0)},children:"Remove Ingredient"}),p?Object(H.jsx)(_,{closecb:function(){return d(!1)}}):Object(H.jsx)(q,{onClick:function(){return d(!0)},children:"Add Ingredient"}),O?Object(H.jsx)(ne,{}):Object(H.jsx)(q,{onClick:function(){return h(!0)},children:"Debug"})]})}var ce=function(e){var t=Object(r.useState)(!1),n=Object(u.a)(t,2),c=n[0],a=n[1],s=e.cbToClose;return Object(H.jsx)(K,{cbToClose:s,children:c?Object(H.jsx)(re,{}):Object(H.jsx)(V,{cbWhenCorrect:function(){a(!0)}})})},ae=n.p+"static/media/settings.8588567d.svg";n(22);function se(e){var t=e.connected;return Object(H.jsxs)("div",{className:"status",children:[Object(H.jsx)("div",{className:"circle ".concat(t?"green":"red")}),Object(H.jsx)("div",{className:"text",children:t?"Connected":"Disconnected"})]})}function ue(e){var t=e.currentTask;return Object(H.jsxs)("div",{className:"task",children:[Object(H.jsx)("div",{className:"current",children:"Current Status:"}),Object(H.jsx)("div",{className:"task",children:t})]})}function ie(e){var t=e.cbWhenPressed;return Object(H.jsx)("div",{onClick:t,className:"settings",children:Object(H.jsx)("img",{src:ae,alt:"Settings"})})}var oe=function(e){var t=function(){var e=Object(r.useState)({online:!1,task:"Idle"}),t=Object(u.a)(e,2),n=t[0],c=t[1];function a(){return s.apply(this,arguments)}function s(){return(s=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,b();case 2:t=e.sent,c(t);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(r.useEffect)((function(){a();var e=setInterval(a,2e3);return function(){return clearInterval(e)}}),[]),n}(),n=t.online,c=t.task,a=e.cbShowSettings;return Object(H.jsxs)("div",{className:"top-header",children:[Object(H.jsx)(se,{connected:n}),Object(H.jsx)(ue,{currentTask:c}),Object(H.jsx)(ie,{cbWhenPressed:a})]})};n(23);function le(e){var t=e.closecb,n=e.drink,c=Object(r.useState)(),a=Object(u.a)(c,2),s=a[0],i=a[1];function j(){return(j=Object(l.a)(o.a.mark((function e(){return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,M(n.id);case 2:t();case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(r.useEffect)((function(){function e(){return e=Object(l.a)(o.a.mark((function e(){var t,r;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,U(n.id);case 2:t=e.sent,r=t.response.ingredients,i(r);case 5:case"end":return e.stop()}}),e)}))),e.apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[n]),Object(H.jsxs)(K,{cbToClose:t,children:[Object(H.jsx)("h2",{className:"title",children:n.name}),Object(H.jsx)("div",{className:"ingredients",children:Object(H.jsx)("ul",{children:s?s.map((function(e,t){return Object(H.jsx)("li",{children:"".concat(e.amountOfIngredient," ").concat(e.unitOfMeasurement," ").concat(e.ingredient)},t)})):null})}),Object(H.jsx)(B,{onClick:function(){return j.apply(this,arguments)},children:"Make Drink"})]})}function je(e){var t=e.category,n=e.drinks,c=Object(r.useState)(!1),a=Object(u.a)(c,2),s=a[0],i=a[1],j=Object(r.useState)(),p=Object(u.a)(j,2),d=p[0],b=p[1];function f(){return(f=Object(l.a)(o.a.mark((function e(t){return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:i(!0),b(t);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return Object(H.jsxs)("div",{className:"drink-category",children:[s?Object(H.jsx)(le,{closecb:function(){return i(!1)},drink:d}):null,Object(H.jsx)("div",{className:"name",children:t}),Object(H.jsx)("div",{className:"drinks",children:n.map((function(e,t){return Object(H.jsx)(B,{onClick:function(){return function(e){return f.apply(this,arguments)}(e)},children:e.name},t)}))})]})}function pe(e){var t=Object(r.useState)(),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(),i=Object(u.a)(s,2),j=i[0],p=i[1];return Object(r.useEffect)((function(){function e(){return(e=Object(l.a)(o.a.mark((function e(){var t,n,r,c;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,I();case 2:t=e.sent,n=t.response,r=[],c=[],n.forEach((function(e){1===e.hasAlcohol?r.push(e):c.push(e)})),p(r),a(c);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),j&&c?Object(H.jsxs)("div",{className:"drink-categories",children:[Object(H.jsx)(je,{category:"Alcoholic",drinks:j}),Object(H.jsx)(je,{category:"Non-alcoholic",drinks:c})]}):Object(H.jsx)("div",{className:"loading",children:"Loading..."})}var de=function(){return Object(H.jsx)("div",{className:"main",children:Object(H.jsx)(pe,{})})},be=n(9);n(24);function fe(e){var t=e.onChange,n=Object(r.useState)(),c=Object(u.a)(n,2),a=c[0],s=c[1],i=Object(r.useState)(),j=Object(u.a)(i,2),p=j[0],d=j[1];return Object(r.useEffect)((function(){function e(){return e=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,T();case 2:t=e.sent,s(t);case 4:case"end":return e.stop()}}),e)}))),e.apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),Object(H.jsxs)("select",{className:"unit-selector",onChange:function(e){d(e.target.value),t(e)},value:p,children:[p?null:Object(H.jsx)("option",{value:"",children:"Select Unit"}),a?a.map((function(e){return Object(H.jsx)("option",{value:e,children:e},e)})):null]})}function Oe(e){var t=e.onChange,n=Object(r.useState)(""),c=Object(u.a)(n,2),a=c[0],s=c[1];return Object(H.jsx)("input",{className:"amount-input",type:"number",onChange:function(e){var n=e.target.value;n>1e3||n<0||(s(n),t(e))},max:"1000",min:"1",value:a})}function he(e){var t=e.onDelete,n=e.onIngredientChange,r=e.onAmountChange,c=e.onUnitOfMeasurementChange;return Object(H.jsxs)("div",{className:"ingredient-section",children:[Object(H.jsx)(X,{onChange:function(e){var t=e.target.value;n(t)}}),Object(H.jsx)(Oe,{onChange:function(e){var t=e.target.value;r(t)}}),Object(H.jsx)(fe,{onChange:function(e){var t=e.target.value;c(t)}}),Object(H.jsx)(F,{onClick:t})]})}function ve(e){var t=Object(r.useState)(),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)([]),i=Object(u.a)(s,2),p=i[0],d=i[1],b=Object(r.useState)(!1),f=Object(u.a)(b,2),O=f[0],h=f[1];function v(){return 0!==p.length&&(p.every((function(e){return 0!=(e.id&&e.ingredient&&e.amount&&e.unit)}))&&0!=c)}function x(){return(x=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(!v()){e.next=11;break}return h(!0),t={name:c,ingredients:p},e.next=6,S(t);case 6:!0===e.sent.success&&(a(""),d([])),h(!1),e.next=12;break;case 11:alert("Please fill out all fields");case 12:case"end":return e.stop()}}),e)})))).apply(this,arguments)}return O?Object(H.jsx)("div",{className:"add-drink-component",children:"Adding..."}):Object(H.jsxs)(H.Fragment,{children:[Object(H.jsxs)("div",{className:"add-drink-component",children:[Object(H.jsx)("input",{className:"name",type:"text",value:c,onChange:function(e){var t=e.target.value;a(t)}}),p.length?p.map((function(e){return Object(H.jsx)(he,{onDelete:function(){!function(e){d(p.filter((function(t){return t.id!==e})))}(e.id)},onIngredientChange:function(t){return function(e,t){d(p.map((function(n){return n.id===e?Object(j.a)(Object(j.a)({},n),{},{ingredient:t}):n})))}(e.id,t)},onAmountChange:function(t){return function(e,t){d(p.map((function(n){return n.id===e?Object(j.a)(Object(j.a)({},n),{},{amount:t}):n})))}(e.id,t)},onUnitOfMeasurementChange:function(t){return function(e,t){d(p.map((function(n){return n.id===e?Object(j.a)(Object(j.a)({},n),{},{unit:t}):n})))}(e.id,t)}},e.id)})):null,Object(H.jsx)(B,{onClick:function(){d([].concat(Object(be.a)(p),[{id:Math.floor(+Date.now()+Math.random()),ingredient:"",amount:"",unit:""}]))},children:"Add Ingredient"})]}),Object(H.jsx)("div",{className:"submit-container",children:Object(H.jsx)(B,{onClick:function(){return x.apply(this,arguments)},children:"Submit"})})]})}function xe(e){var t=Object(r.useState)([null,null,null,null,null,null,null,null]),n=Object(u.a)(t,2),c=n[0],a=n[1],s=Object(r.useState)(),i=Object(u.a)(s,2),j=i[0],p=i[1];function d(e){var t=setInterval((function(){!function(e,t){D.apply(this,arguments)}(e,500)}),500);a((function(n){var r=Object(be.a)(n);return r[e-1]=t,r}))}function b(e){clearInterval(c[e-1])}return Object(r.useEffect)((function(){function e(){return(e=Object(l.a)(o.a.mark((function e(){var t;return o.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,h();case 2:t=e.sent,p(t.json.pumps);case 4:case"end":return e.stop()}}),e)})))).apply(this,arguments)}!function(){e.apply(this,arguments)}()}),[]),Object(H.jsx)("div",{className:"custom-buttons",children:j?j.map((function(e){var t=e.id,n=e.select;return Object(H.jsx)(B,{onMouseDown:function(){d(t)},onMouseUp:function(){b(t)},onMouseLeave:function(){b(t)},children:n},t)})):Object(H.jsx)("div",{children:"Loading..."})})}var me=function(){var e=Object(r.useState)(!1),t=Object(u.a)(e,2),n=t[0],c=t[1],a=Object(r.useState)(!1),s=Object(u.a)(a,2),i=s[0],o=s[1];return Object(H.jsxs)("div",{className:"footer",children:[n?Object(H.jsx)(K,{cbToClose:function(){return c(!1)},children:Object(H.jsx)(ve,{})}):null,i?Object(H.jsx)(K,{cbToClose:function(){return o(!1)},children:Object(H.jsx)(xe,{})}):null,Object(H.jsx)(B,{onClick:function(){return c(!0)},children:"Add Drink"}),Object(H.jsx)(B,{onClick:function(){return o(!0)},children:"Custom"})]})};var ge=function(){var e=Object(r.useState)(!1),t=Object(u.a)(e,2),n=t[0],c=t[1];return Object(H.jsxs)("div",{className:"App",children:[n?Object(H.jsx)(ce,{cbToClose:function(){return c(!1)}}):null,Object(H.jsx)(oe,{cbShowSettings:function(){return c(!0)}}),Object(H.jsx)(de,{}),Object(H.jsx)(me,{})]})};s.a.render(Object(H.jsx)(c.a.StrictMode,{children:Object(H.jsx)(ge,{})}),document.getElementById("root"))}],[[25,1,2]]]); +//# sourceMappingURL=main.723c0bfd.chunk.js.map \ No newline at end of file diff --git a/frontend/build/static/js/main.723c0bfd.chunk.js.map b/frontend/build/static/js/main.723c0bfd.chunk.js.map new file mode 100644 index 0000000..d43c7aa --- /dev/null +++ b/frontend/build/static/js/main.723c0bfd.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["requests.js","components/overlays/buttons.js","components/overlays/overlays.js","components/overlays/settings.js","components/assets/settings.svg","components/defaults/topHeader.js","components/defaults/middleMain.js","components/defaults/bottomFooter.js","App.js","index.js"],"names":["HOSTNAME_WITHOUT_PORT","window","location","href","slice","BACKEND_LINK","getStatus","a","fetch","response","json","responseObject","online","password","method","headers","body","JSON","stringify","success","getPumpsAndStatus","status","Error","error","console","getPossibleDrinks","drinks","pumpNumber","newSelection","pump","addIngredient","ingredient","category","removeIngredient","createDrink","drinkObject","drinkJSON","responseJSON","getPossibleUnits","forInMs","id","time","getAllDrinks","allDrinks","allDrinksJSON","makeDrink","deleteDrink","getIngredients","ingredients","ingredientsJSON","DangerButton","props","text","children","cb","onClick","className","NormalButton","AttentionButton","onMouseDown","onMouseUp","onMouseLeave","RemoveButton","CloseButton","cbWhenPressed","BlurBackground","WhiteContentOverlay","content","closecb","cbToClose","useState","opacity","setOpacity","handleClose","setTimeout","useEffect","document","addEventListener","e","code","removeEventListener","style","getPasswordCookie","localStorage","getItem","Password","setPassword","redBorder","setRedBorder","cbWhenPasswordCorrect","cbWhenCorrect","checkInput","checkPassword","then","res","correct","setItem","setPasswordCookie","timeoutID","clearTimeout","eventHandler","value","onChange","event","newInput","currentTarget","type","IngredientsSelector","startDrink","selectedDrink","setSelectedDrink","setIngredients","useAvaibleIngredients","target","log","Object","entries","map","options","key","label","option","index","disabled","IngredientsCategorySelector","selectedCategory","currentCategory","setCurrentCategory","categories","setCategories","getCategories","PumpSetting","formattedName","setPumpSelectionStatus","PumpSettings","pumps","setPumps","getPumps","allPumps","pumpObj","select","undefined","AddIngredient","setSelectedCategory","ingredientsName","setIngredientsName","locked","setLocked","preventDefault","onSubmit","required","RemoveDrink","setDrinks","loading","setLoading","getDrinks","newDrinkID","drink","name","RemoveIngredient","selectedIngredient","setSelectedIngredient","selectedIndex","parentElement","Debug","setStatus","getString","object","refresh","intervalID","setInterval","clearInterval","SettingsHidden","showRemoveDrink","setShowRemoveDrink","showRemoveIngredient","setShowRemoveIngredient","showAddIngredient","setShowAddIngredient","showDebug","setShowDebug","SettingsMenu","accessGranted","setAccessGranted","ConnectionStatus","isConnected","connected","TaskStatus","task","currentTask","SettingsIcon","src","settingsIcon","alt","Header","connectionStatus","onlineStatus","setOnlineStatus","checkStatus","newStatus","useOnlineStatus","isOnline","currentlyDoing","cbShowSettings","FinalDrinkOverview","ingredientsArray","downloadIngredients","amountOfIngredient","unitOfMeasurement","DrinkCategory","showDrinkOverview","setShowDrinkOverview","showDrinkOverviewFor","AllDrinkCategories","nonAlcoholicDrinks","setNonAlcoholicDrinks","alcoholicDrinks","setAlcoholicDrinks","alcohol","noAlcohol","forEach","hasAlcohol","push","Main","UnitSelector","units","setUnits","selectedUnit","setSelectedUnit","getUnits","unit","AmountInput","setValue","newValue","max","min","IngredientSection","onDelete","onIngredientChange","onAmountChange","onUnitOfMeasurementChange","newIngredient","newAmount","newUnit","AddDrinkComponent","setName","blockInput","setBlockInput","validateInput","length","every","amount","newDrink","alert","newName","filter","setIngredient","setAmount","setUnit","Math","floor","Date","now","random","CustomComponent","pumpInterval","setPumpInterval","pumpState","setPumpState","startInterval","idOfPump","startPump","prevState","newState","cancelTimeout","getPumpState","Footer","showAddDrink","setShowAddDrink","showCustom","setShowCustom","App","showSettings","setShowSettings","ReactDOM","render","StrictMode","getElementById"],"mappings":"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","file":"static/js/main.723c0bfd.chunk.js","sourcesContent":["const HOSTNAME = window.location.href;\nconst HOSTNAME_WITHOUT_PORT = HOSTNAME.slice(0, -6);\nconst BACKEND_PORT = 4000;\nconst BACKEND_LINK = `${HOSTNAME_WITHOUT_PORT}:${BACKEND_PORT}/`;\n\nasync function getStatus() {\n try {\n const response = await fetch(BACKEND_LINK + 'status');\n const json = await response.json();\n const responseObject = {\n online: true,\n ...json\n }\n return responseObject;\n } catch (e) {\n return { online: false };\n }\n}\n\nasync function checkPassword(password) {\n try {\n const response = await fetch(BACKEND_LINK + 'password', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ password }),\n });\n const json = await response.json();\n\n return json;\n } catch (e) {\n return { success: false };\n }\n}\n\nasync function getPumpsAndStatus() {\n try {\n const response = await fetch(BACKEND_LINK + 'pumps');\n const json = await response.json();\n\n if (response.status !== 200) {\n throw new Error(json.error);\n }\n return {\n json,\n success: true\n }\n } catch (e) {\n console.error(e);\n return { \n error: e,\n success: false \n };\n }\n}\n\nasync function getPossibleDrinks() {\n try {\n const response = await fetch(BACKEND_LINK + 'drink/ingredients');\n const json = await response.json();\n\n if (response.status !== 200) {\n throw new Error(json.error);\n }\n return {\n drinks: json,\n success: true\n }\n } catch (e) {\n console.error(e);\n return { \n error: e,\n success: false \n };\n }\n}\n\nasync function setPumpSelectionStatus(password, pumpNumber, newSelection) {\n try {\n const response = await fetch(BACKEND_LINK + 'setPump', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ password, pump: pumpNumber, newSelection }),\n });\n const json = await response.json();\n\n if (response.status !== 200) {\n throw new Error(json.error);\n }\n return {\n success: true\n }\n } catch (e) {\n console.error(e);\n return { \n error: e,\n success: false \n };\n }\n}\n\nasync function addIngredient(password, ingredient, category) {\n try {\n const response = await fetch(BACKEND_LINK + 'drink/addIngredient', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json' \n },\n body: JSON.stringify({ password, ingredient, category }),\n });\n const json = await response.json();\n return json;\n } catch (e) {\n console.error(e);\n return { \n error: e,\n success: false \n };\n }\n}\n\nasync function removeIngredient(password, ingredient, category) {\n try {\n const response = await fetch(BACKEND_LINK + 'drink/removeIngredient', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ password, ingredient, category }),\n });\n const json = await response.json();\n return json;\n } catch (e) {\n console.error(e);\n return {\n error: e,\n success: false\n }\n }\n}\n\nasync function createDrink(drinkObject) {\n const drinkJSON = JSON.stringify(drinkObject);\n\n try {\n const response = await fetch(BACKEND_LINK + 'drink/add', {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: drinkJSON,\n });\n \n const responseJSON = await response.json();\n return responseJSON;\n } catch(e) {\n return {\n error: e,\n success: false\n }\n }\n\n\n}\n\nasync function getPossibleUnits() {\n return [\n 'ml',\n 'cl',\n 'tsp',\n 'tbsp',\n ]\n}\n\nasync function getUnitInMl(unit) {\n switch (unit) {\n case 'ml':\n return 1;\n case 'cl':\n return 10;\n case 'tsp':\n return 5;\n case 'tbsp':\n return 15;\n default:\n return 1;\n }\n}\n\nasync function startPump(pumpNumber, forInMs) {\n fetch(BACKEND_LINK + 'startPump', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({ id: pumpNumber, time: forInMs }),\n });\n}\n\nasync function getAllDrinks() {\n try {\n const allDrinks = await fetch(BACKEND_LINK + 'drink/all', {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json'\n },\n });\n const allDrinksJSON = await allDrinks.json();\n return {\n success: true,\n response: allDrinksJSON\n }\n } catch(e) {\n return {\n success: false,\n }\n }\n}\n\nasync function makeDrink(id) {\n fetch(BACKEND_LINK + 'drink/make', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({id}),\n });\n\n return true;\n}\n\nasync function deleteDrink(password, id) {\n try {\n const response = await fetch(BACKEND_LINK + 'drink/remove', {\n method: 'DELETE',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n password,\n id\n }),\n });\n\n return {\n success: true,\n response\n }\n } catch(e) {\n return {\n success: false,\n error: e\n }\n }\n}\n\nasync function getIngredients(id) {\n try {\n const ingredients = await fetch(BACKEND_LINK + 'drink/ingredients', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({id}),\n });\n const ingredientsJSON = await ingredients.json();\n return {\n success: true,\n response: ingredientsJSON\n }\n } catch(e) {\n return {\n success: false,\n error: e\n }\n }\n}\n\nexport { getStatus, checkPassword, getPumpsAndStatus, getPossibleDrinks, setPumpSelectionStatus, addIngredient, removeIngredient,\n getAllDrinks, getPossibleUnits, createDrink, startPump, makeDrink, deleteDrink, getIngredients }; ","import '../styles/buttons.css';\n\nfunction DangerButton(props) {\n const text = props.children;\n const cb = props.onClick;\n\n return (\n
\n {text}\n
\n )\n}\n\nfunction NormalButton(props) {\n const text = props.children;\n const cb = props.onClick;\n\n return (\n
\n {text}\n
\n )\n}\n\nfunction AttentionButton(props) {\n const text = props.children;\n const cb = props.onClick;\n const onMouseDown = props.onMouseDown;\n const onMouseUp = props.onMouseUp;\n const onMouseLeave = props.onMouseLeave;\n\n return (\n
\n {text}\n
\n )\n}\n\nfunction RemoveButton(props) {\n const text = props.children;\n const cb = props.onClick;\n\n return (\n \n )\n}\n\nfunction AddButton(props) {\n return (\n \n )\n}\nexport { DangerButton, NormalButton, AttentionButton, RemoveButton, AddButton };","import { useState, useEffect } from 'react';\nimport './../styles/overlays.css';\n\nfunction CloseButton(props) {\n const cbWhenPressed = props.cbWhenPressed;\n\n return (\n \n )\n}\n\nfunction BlurBackground() {\n // add pointer events on mount and unmount?\n\n return (\n
\n
\n )\n}\n\nfunction WhiteContentOverlay(props) {\n const content = props.children;\n const closecb = props.cbToClose;\n const [opacity, setOpacity] = useState(0);\n\n useEffect(() => {\n setTimeout(\n () => {\n setOpacity(1);\n }, 50\n )\n }, [])\n\n useEffect(() => {\n document.addEventListener('keydown', (e) => {\n if (e.code === 'Escape') handleClose();\n });\n \n return () => {\n document.removeEventListener('keydown', (e) => {\n if (e.code === 'Escape') handleClose();\n });\n }\n }, [])\n\n function handleClose() {\n setOpacity(0);\n setTimeout(closecb, 200);\n }\n\n return (\n
\n \n
\n {content}\n \n
\n
\n );\n}\n\nexport { WhiteContentOverlay };","import React, { useState, useEffect } from \"react\";\nimport { getStatus, checkPassword, getPumpsAndStatus, getPossibleDrinks, setPumpSelectionStatus, addIngredient, removeIngredient, getAllDrinks, deleteDrink } from \"../../requests\";\nimport { NormalButton, DangerButton } from \"./buttons\";\nimport { WhiteContentOverlay } from \"./overlays\";\nimport './../styles/settings.css';\n\nfunction setPasswordCookie(password) {\n localStorage.setItem('password', password);\n}\n\nfunction getPasswordCookie() {\n return localStorage.getItem('password');\n}\n\nfunction Password(props) {\n const [password, setPassword] = useState('');\n const [redBorder, setRedBorder] = useState(false);\n const cbWhenPasswordCorrect = props.cbWhenCorrect;\n\n function checkInput() {\n /* all on the requests on the shown site after correct password\n must be sent with the correct password */\n if (password === '') setRedBorder(true);\n checkPassword(password).then(res => {\n if (res.correct) {\n cbWhenPasswordCorrect();\n setPasswordCookie(password);\n } else {\n setRedBorder(true);\n }\n });\n }\n\n useEffect(() => {\n const timeoutID = setTimeout(() => setRedBorder(false), 500);\n return () => clearTimeout(timeoutID);\n }, [redBorder]);\n\n useEffect(() => {\n const eventHandler = (e) => {\n if (e.code === 'Enter') {\n checkInput();\n }\n }\n\n document.addEventListener('keydown', eventHandler);\n return () => document.removeEventListener('keydown', eventHandler);\n });\n\n function handleChange(event) {\n const newInput = event.currentTarget.value;\n setPassword(newInput);\n }\n\n return (\n
\n \n \n
\n )\n\n}\n\nfunction useAvaibleIngredients() {\n const [ingredients, setIngredients] = useState();\n\n useEffect(() => {\n async function getIngredients() {\n const response = await getPossibleDrinks();\n setIngredients(response.drinks);\n }\n\n getIngredients();\n }, []);\n\n return ingredients;\n}\n\nfunction IngredientsSelector(props) {\n const onChange = props.onChange;\n const startDrink = props.selectedDrink;\n const [selectedDrink, setSelectedDrink] = useState();\n\n const ingredients = useAvaibleIngredients();\n\n useEffect(() => {\n if (!startDrink)\n setSelectedDrink('empty')\n else\n setSelectedDrink(startDrink);\n }, [startDrink]);\n\n function handleChange(event) {\n const newInput = event.target.value;\n setSelectedDrink(newInput);\n try {\n onChange(event);\n } catch (e) {\n console.log('Did you define an onChange prop? ' + e);\n }\n }\n\n function renderOptions(options) {\n return options.map((option, index) => );\n }\n\n if (ingredients && selectedDrink)\n return (\n \n )\n else\n return (\n \n )\n}\n\nfunction IngredientsCategorySelector(props) {\n const onChange = props.onChange;\n const selectedCategory = props.selectedCategory;\n\n const [currentCategory, setCurrentCategory] = useState();\n const [categories, setCategories] = useState();\n\n async function getCategories() {\n const response = await getPossibleDrinks();\n\n const categories = Object.entries(response.drinks).map(([key, value]) => {\n return key;\n });\n\n setCategories(categories);\n }\n\n useEffect(() => {\n getCategories();\n\n if (selectedCategory) setCurrentCategory(selectedCategory);\n }, [selectedCategory]);\n\n function handleChange(event) {\n const newInput = event.target.value;\n setCurrentCategory(newInput);\n try {\n onChange(newInput);\n } catch (e) {\n console.log('Did you define an onChange prop? ' + e);\n }\n }\n\n return (\n \n )\n}\n\nfunction PumpSetting(props) {\n const pumpNumber = props.pumpNumber;\n const formattedName = 'pump' + pumpNumber;\n\n function setSelection(event) {\n const newInput = event.target.value;\n const currentPassword = getPasswordCookie();\n setPumpSelectionStatus(currentPassword, pumpNumber, newInput);\n }\n\n return (\n
\n
{formattedName}
\n \n
\n );\n}\n\nfunction PumpSettings() {\n const [pumps, setPumps] = useState();\n\n async function getPumps() {\n const response = await getPumpsAndStatus();\n const allPumps = response.json.pumps;\n setPumps(allPumps);\n }\n\n function refresh() {\n setPumps(undefined);\n getPumps();\n }\n\n useEffect(() => {\n getPumps();\n }, []);\n\n return (\n
\n
\n {pumps ? (\n pumps.map((pumpObj, index) => {\n return (\n \n )\n })\n ) :
Loading...
}\n
\n Refresh\n
\n )\n}\n\nfunction AddIngredient(props) {\n const [selectedCategory, setSelectedCategory] = useState();\n const [ingredientsName, setIngredientsName] = useState();\n const [locked, setLocked] = useState(false);\n\n const closecb = props.closecb;\n\n async function onSubmit(event) {\n event.preventDefault();\n if (!(ingredientsName && selectedCategory)) return;\n setLocked(true);\n const password = getPasswordCookie();\n const addedIngredient = await addIngredient(password, ingredientsName, selectedCategory);\n if (addedIngredient) setIngredientsName();\n setLocked(false);\n closecb();\n }\n\n function handleChange(event) {\n const newInput = event.currentTarget.value;\n setIngredientsName(newInput);\n }\n\n if (locked) {\n return
Adding...
\n } else {\n return (\n
\n
Add Ingredient
\n
\n \n \n \n \n Cancel\n
\n )\n }\n}\n\nfunction RemoveDrink(props) {\n const [drinks, setDrinks] = useState(\"\");\n const [loading, setLoading] = useState(false);\n const [selectedDrink, setSelectedDrink] = useState();\n const closecb = props.closecb;\n\n useEffect(()=> {\n async function getDrinks() {\n const response = await getAllDrinks();\n const allDrinks = response.response;\n setDrinks(allDrinks);\n }\n\n getDrinks();\n }, []);\n\n function handleChange(e) {\n const newDrinkID = e.target.value;\n if (!newDrinkID) return;\n setSelectedDrink(newDrinkID);\n }\n\n async function deleteSelected() {\n if (!selectedDrink) return;\n\n setLoading(true);\n const password = getPasswordCookie();\n const response = await deleteDrink(password, selectedDrink);\n setSelectedDrink()\n setLoading(false);\n if (response.success) closecb();\n }\n\n if (!drinks || loading) {\n return
Loading...
\n }\n\n return (\n
\n \n Delete\n Close\n
\n );\n}\n\nfunction RemoveIngredient(props) {\n const [locked, setLocked] = useState(false);\n const [selectedCategory, setSelectedCategory] = useState();\n const [selectedIngredient, setSelectedIngredient] = useState();\n const closecb = props.closecb;\n\n async function onSubmit() {\n if (!selectedIngredient || (selectedIngredient === 'empty')) return;\n setLocked(true);\n const password = getPasswordCookie();\n await removeIngredient(password, selectedIngredient, selectedCategory);\n closecb();\n setLocked(false);\n }\n\n function handleChange(event) {\n const newInput = event.target.value;\n setSelectedIngredient(newInput);\n const selectedIndex = event.currentTarget.selectedIndex;\n const selectedOptionElement = event.currentTarget[selectedIndex];\n const selectedOptgroup = selectedOptionElement.parentElement;\n const category = selectedOptgroup.label;\n setSelectedCategory(category);\n }\n \n return locked ?
Deleting...
: \n
\n \n Remove Ingredient\n Cancel\n
;\n}\n\nfunction Debug() {\n const [status, setStatus] = useState();\n const [pumps, setPumps] = useState();\n const [drinks, setDrinks] = useState();\n\n function getString(object) {\n return JSON.stringify(object, null, 2);\n }\n\n async function refresh() {\n const status = await getStatus();\n setStatus(getString(status));\n const pumps = await getPumpsAndStatus();\n setPumps(getString(pumps));\n const drinks = await getPossibleDrinks();\n setDrinks(getString(drinks));\n }\n\n useEffect(() => {\n refresh();\n const intervalID = setInterval(refresh, 1000);\n\n return () => clearInterval(intervalID);\n });\n\n return (\n
\n
\n
Status
\n
{status}
\n
\n
\n
Pumps
\n
{pumps}
\n
\n
\n
Drinks
\n
{drinks}
\n
\n
\n );\n}\n\nfunction SettingsHidden() {\n const [showRemoveDrink, setShowRemoveDrink] = useState(false);\n const [showRemoveIngredient, setShowRemoveIngredient] = useState(false);\n const [showAddIngredient, setShowAddIngredient] = useState(false);\n const [showDebug, setShowDebug] = useState(false);\n\n return (\n
\n \n {showRemoveDrink ? setShowRemoveDrink(false)}/> : setShowRemoveDrink(true)}>Remove Drink}\n {showRemoveIngredient ? setShowRemoveIngredient(false)}/> : setShowRemoveIngredient(true)}>Remove Ingredient}\n {showAddIngredient ? setShowAddIngredient(false)}/> : setShowAddIngredient(true)}>Add Ingredient}\n {showDebug ? : setShowDebug(true)}>Debug}\n
\n );\n}\n\nfunction SettingsMenu(props) {\n const [accessGranted, setAccessGranted] = useState(false);\n const cbToClose = props.cbToClose;\n\n function grantAccess() {\n setAccessGranted(true);\n }\n\n return (\n \n {accessGranted ? : }\n \n );\n}\n\nexport default SettingsMenu;\nexport { IngredientsSelector, IngredientsCategorySelector };","export default __webpack_public_path__ + \"static/media/settings.8588567d.svg\";","import React, { useState, useEffect } from 'react';\nimport settingsIcon from './../assets/settings.svg';\nimport '../styles/topHeader.css';\n\nimport { getStatus } from './../../requests';\n\nfunction useOnlineStatus() {\n const [onlineStatus, setOnlineStatus] = useState({\n online: false,\n task: 'Idle'\n });\n\n async function checkStatus() {\n const newStatus = await getStatus();\n setOnlineStatus(newStatus);\n }\n\n useEffect(() => {\n checkStatus();\n const intervalID = setInterval(checkStatus, 2000);\n return () => clearInterval(intervalID);\n }, []);\n\n return onlineStatus;\n}\n\nfunction ConnectionStatus(props) {\n const isConnected = props.connected;\n\n return (\n
\n
\n
\n\n
\n {isConnected ? 'Connected' : 'Disconnected'}\n
\n
\n )\n}\n\nfunction TaskStatus(props) {\n const task = props.currentTask;\n\n return (\n
\n
Current Status:
\n
{task}
\n
\n )\n}\n\nfunction SettingsIcon(props) {\n const cbWhenPressed = props.cbWhenPressed;\n\n return (\n
\n \"Settings\"\n
\n )\n}\n\nfunction Header(props) {\n const connectionStatus = useOnlineStatus();\n const isOnline = connectionStatus.online;\n const currentlyDoing = connectionStatus.task;\n\n const cbShowSettings = props.cbShowSettings;\n return (\n
\n \n \n \n
\n )\n}\n\nexport default Header;","import '../styles/middleMain.css';\nimport { AttentionButton } from './../../components/overlays/buttons';\nimport { getAllDrinks, makeDrink, getIngredients } from './../../requests';\nimport { useState, useEffect } from 'react'; \nimport { WhiteContentOverlay } from '../../components/overlays/overlays';\n\nfunction FinalDrinkOverview(props) {\n const closecb = props.closecb;\n const drink = props.drink;\n const [ingredients, setIngredients] = useState();\n\n useEffect(() => {\n async function downloadIngredients() {\n const ingredients = await getIngredients(drink.id);\n const ingredientsArray = ingredients.response.ingredients;\n setIngredients(ingredientsArray);\n }\n\n downloadIngredients();\n }, [drink]);\n\n async function pumpDrink() {\n await makeDrink(drink.id);\n closecb();\n }\n\n return (\n \n

{drink.name}

\n
\n \n
\n Make Drink\n
\n )\n}\n\nfunction DrinkCategory(props) {\n const category = props.category;\n const drinks = props.drinks;\n\n const [showDrinkOverview, setShowDrinkOverview] = useState(false);\n const [selectedDrink, setSelectedDrink] = useState();\n\n async function showDrinkOverviewFor(drink) {\n setShowDrinkOverview(true);\n setSelectedDrink(drink);\n }\n\n return (\n
\n {showDrinkOverview ? \n setShowDrinkOverview(false)} drink={selectedDrink}>\n \n : null}\n
{category}
\n
\n {drinks.map((drink, index) => {\n return showDrinkOverviewFor(drink)\n }\n >{drink.name}\n })\n }\n
\n
\n )\n}\n\nfunction AllDrinkCategories(props) {\n const [nonAlcoholicDrinks, setNonAlcoholicDrinks] = useState();\n const [alcoholicDrinks, setAlcoholicDrinks] = useState();\n\n useEffect(() => {\n async function getCategories() {\n const response = await getAllDrinks();\n const allDrinks = response.response;\n\n const alcohol = [];\n const noAlcohol = [];\n\n allDrinks.forEach((drink) => {\n if (drink.hasAlcohol === 1) {\n alcohol.push(drink);\n } else {\n noAlcohol.push(drink);\n }\n });\n\n setAlcoholicDrinks(alcohol);\n setNonAlcoholicDrinks(noAlcohol);\n }\n\n getCategories();\n }, [])\n\n if (alcoholicDrinks && nonAlcoholicDrinks) {\n return (\n
\n \n \n
\n );\n }\n \n return
Loading...
\n}\n\nfunction Main() {\n return (\n
\n \n
\n )\n}\n\nexport default Main;","import '../styles/bottomFooter.css';\nimport { useState, useEffect } from 'react';\nimport { AttentionButton, RemoveButton } from '../../components/overlays/buttons';\nimport { WhiteContentOverlay } from '../../components/overlays/overlays';\nimport { getPumpsAndStatus, getPossibleUnits, createDrink, startPump } from '../../requests';\nimport { IngredientsSelector } from './../../components/overlays/settings';\n\nfunction UnitSelector(props) {\n const onChange = props.onChange;\n const [units, setUnits] = useState();\n const [selectedUnit, setSelectedUnit] = useState();\n\n useEffect(() => {\n async function getUnits() {\n const units = await getPossibleUnits();\n setUnits(units);\n }\n\n getUnits();\n }, []);\n\n function handleChange(e) {\n setSelectedUnit(e.target.value);\n onChange(e);\n }\n\n return (\n \n )\n}\n\nfunction AmountInput(props) {\n const onChange = props.onChange;\n const [value, setValue] = useState('');\n\n function handleChange(e) {\n const newValue = e.target.value;\n if (newValue > 1000) return;\n if (newValue < 0) return;\n setValue(newValue);\n onChange(e);\n }\n\n return (\n \n )\n}\n\nfunction IngredientSection(props) {\n const onDelete = props.onDelete;\n const onIngredientChange = props.onIngredientChange;\n const onAmountChange = props.onAmountChange;\n const onUnitOfMeasurementChange = props.onUnitOfMeasurementChange;\n\n function handleChangeIngredient(e) {\n const newIngredient = e.target.value;\n onIngredientChange(newIngredient);\n }\n\n function handleChangeAmount(e) {\n const newAmount = e.target.value;\n onAmountChange(newAmount);\n }\n\n function handleChangeUnit(e) {\n const newUnit = e.target.value;\n onUnitOfMeasurementChange(newUnit);\n }\n\n return (\n
\n \n \n \n \n
\n )\n}\n\nfunction AddDrinkComponent(props) {\n const [name, setName] = useState();\n const [ingredients, setIngredients] = useState([]);\n const [blockInput, setBlockInput] = useState(false);\n\n function getID() {\n return Math.floor(+Date.now() + Math.random());\n }\n\n function addIngredient() {\n setIngredients([...ingredients, {\n id: getID(),\n ingredient: '',\n amount: '',\n unit: ''\n }]);\n }\n\n function removeIngredient(id) {\n setIngredients(ingredients.filter((ingredient) => ingredient.id !== id));\n }\n\n function setIngredient(id, newIngredient) {\n setIngredients(ingredients.map((ingredient) => {\n if (ingredient.id === id) {\n return {\n ...ingredient,\n ingredient: newIngredient\n }\n }\n\n return ingredient;\n }));\n }\n\n function setAmount(id, newAmount) {\n setIngredients(ingredients.map((ingredient) => {\n if (ingredient.id === id) {\n return {\n ...ingredient,\n amount: newAmount\n }\n }\n\n return ingredient;\n }));\n }\n\n function setUnit(id, newUnit) {\n setIngredients(ingredients.map((ingredient) => {\n if (ingredient.id === id) {\n return {\n ...ingredient,\n unit: newUnit\n }\n }\n\n return ingredient;\n }));\n }\n\n function handleNameChange(e) {\n const newName = e.target.value;\n setName(newName);\n }\n\n function validateInput() {\n if (ingredients.length === 0) return false;\n\n const everythingHasValues = ingredients.every((ingredient) => {\n return (ingredient.id && ingredient.ingredient && ingredient.amount && ingredient.unit) != false;\n });\n const hasName = (name != false);\n\n return everythingHasValues && hasName;\n }\n\n async function submit() {\n const correctFormatting = validateInput();\n if (correctFormatting) {\n setBlockInput(true);\n const newDrink = {\n name,\n ingredients\n }\n\n const response = await createDrink(newDrink);\n\n if (response.success === true) {\n setName('');\n setIngredients([]);\n }\n setBlockInput(false);\n } else {\n alert('Please fill out all fields');\n }\n }\n\n if (blockInput) return (\n
\n Adding...\n
\n )\n\n return (\n <>\n
\n \n\n {ingredients.length ? ingredients.map((ingredient) => {\n return (\n {\n const id = ingredient.id;\n removeIngredient(id); \n }\n }\n onIngredientChange={\n (newIngredient) => setIngredient(ingredient.id, newIngredient)\n }\n onAmountChange={\n (newAmount) => setAmount(ingredient.id, newAmount)\n }\n onUnitOfMeasurementChange={\n (newUnit) => setUnit(ingredient.id, newUnit)\n }\n />\n )\n }) : null}\n Add Ingredient\n
\n
\n Submit\n
\n \n )\n}\n\nfunction CustomComponent(props) {\n const [pumpInterval, setPumpInterval] = useState([\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n null,\n ]);\n const [pumpState, setPumpState] = useState();\n\n useEffect(() => {\n async function getPumpState() {\n const response = await getPumpsAndStatus();\n setPumpState(response.json.pumps);\n }\n getPumpState();\n }, []);\n\n function startInterval(idOfPump) {\n const intervalID = setInterval(() => {\n startPump(idOfPump, 500);\n }, 500);\n\n setPumpInterval((prevState) => {\n const newState = [...prevState];\n newState[idOfPump - 1] = intervalID;\n return newState;\n });\n }\n\n function cancelTimeout(idOfPump) {\n clearInterval(pumpInterval[idOfPump - 1]);\n }\n\n return (\n
\n {pumpState ?\n pumpState.map((pump) => {\n const idOfPump = pump.id;\n const selectedIngredient = pump.select;\n\n return {\n startInterval(idOfPump);\n }\n }\n\n onMouseUp={\n () => {\n cancelTimeout(idOfPump);\n }\n }\n\n onMouseLeave={\n () => {\n cancelTimeout(idOfPump);\n }\n }\n >{selectedIngredient}\n })\n :\n
Loading...
\n }\n
\n )\n}\n\nfunction Footer() {\n const [showAddDrink, setShowAddDrink] = useState(false);\n const [showCustom, setShowCustom] = useState(false);\n\n return (\n
\n {showAddDrink ? setShowAddDrink(false)}> \n \n : null}\n\n {showCustom ? setShowCustom(false)}>\n \n : null}\n\n setShowAddDrink(true)}>Add Drink\n setShowCustom(true)}>Custom\n
\n )\n}\n\nexport default Footer;","import './App.css';\nimport SettingsMenu from './components/overlays/settings';\nimport Header from './components/defaults/topHeader';\nimport Main from './components/defaults/middleMain';\nimport Footer from './components/defaults/bottomFooter';\n\nimport React, {useState} from 'react';\n\nfunction App() {\n const [showSettings, setShowSettings] = useState(false);\n\n return (\n
\n {showSettings ? setShowSettings(false)}/> : null}\n
setShowSettings(true)}/>\n
\n
\n );\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n"],"sourceRoot":""} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 9f45606..72ecf4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "cors": "^2.8.5", "dotenv": "^10.0.0", "ip": "^1.1.5", + "onoff": "^6.0.3", "sqlite3": "^5.0.2" }, "devDependencies": { @@ -134,6 +135,14 @@ "tweetnacl": "^0.14.3" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -375,6 +384,19 @@ "node": ">= 0.8" } }, + "node_modules/epoll": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/epoll/-/epoll-4.0.1.tgz", + "integrity": "sha512-BgCq0nEsk+XI7y9qjrRtt9uXsyFEdvevvq42xl6t/hKZjxLSDZreD9rTZ0pU40V//c3Zzk2PZGuIsn8YJHSJ4g==", + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.14.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -458,6 +480,11 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "optional": true }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "node_modules/finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -777,6 +804,11 @@ "node": ">=0.6.0" } }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -880,6 +912,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "node_modules/nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + }, "node_modules/needle": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", @@ -1108,6 +1145,18 @@ "wrappy": "1" } }, + "node_modules/onoff": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/onoff/-/onoff-6.0.3.tgz", + "integrity": "sha512-xtVlwRDzswYM69bzzIui/qzu7QHsFnjsQiCV1iYVA/HXt5xdc9utc97SYAlXzK8wAhIN7+H7MaVqh2vpfdKk9A==", + "dependencies": { + "epoll": "^4.0.1", + "lodash.debounce": "^4.0.8" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -1746,6 +1795,14 @@ "tweetnacl": "^0.14.3" } }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -1936,6 +1993,15 @@ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "dev": true }, + "epoll": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/epoll/-/epoll-4.0.1.tgz", + "integrity": "sha512-BgCq0nEsk+XI7y9qjrRtt9uXsyFEdvevvq42xl6t/hKZjxLSDZreD9rTZ0pU40V//c3Zzk2PZGuIsn8YJHSJ4g==", + "requires": { + "bindings": "^1.5.0", + "nan": "^2.14.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2010,6 +2076,11 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "optional": true }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "finalhandler": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", @@ -2279,6 +2350,11 @@ "verror": "1.10.0" } }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -2358,6 +2434,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, + "nan": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + }, "needle": { "version": "2.9.1", "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", @@ -2536,6 +2617,15 @@ "wrappy": "1" } }, + "onoff": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/onoff/-/onoff-6.0.3.tgz", + "integrity": "sha512-xtVlwRDzswYM69bzzIui/qzu7QHsFnjsQiCV1iYVA/HXt5xdc9utc97SYAlXzK8wAhIN7+H7MaVqh2vpfdKk9A==", + "requires": { + "epoll": "^4.0.1", + "lodash.debounce": "^4.0.8" + } + }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", diff --git a/package.json b/package.json index 9385d1d..1c2ea0d 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,9 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "startFrontend": "cd ./frontend && npm run start", - "startBackend" : "node ./backend/app", - "start": "npm run startFrontend & npm run startBackend" + "startBackend": "node ./backend/app", + "start": "npm run startFrontend & npm run startBackend", + "build": "rm -f -r ./buildBackend && mkdir -p ./buildBackend/backend && cp -r ./backend ./buildBackend/backend && cp -t ./buildBackend .env package.json package-lock.json" }, "author": "", "license": "ISC", @@ -19,6 +20,7 @@ "cors": "^2.8.5", "dotenv": "^10.0.0", "ip": "^1.1.5", + "onoff": "^6.0.3", "sqlite3": "^5.0.2" } }