From cbb310e60517ef4ae73df1d276b40b6cb0746978 Mon Sep 17 00:00:00 2001 From: Nkalish Date: Sun, 15 Sep 2019 17:54:01 -0400 Subject: [PATCH 1/5] working website --- .gitignore | 176 +++++++++++++++++++++++++++++++++++ package.json | 27 ++++++ public/css/index.css | 5 + public/html/index.html | 56 +++++++++++ public/html/login.html | 42 +++++++++ server.js | 205 +++++++++++++++++++++++++++++++++++++++++ 6 files changed, 511 insertions(+) create mode 100644 .gitignore create mode 100644 package.json create mode 100644 public/css/index.css create mode 100644 public/html/index.html create mode 100644 public/html/login.html create mode 100644 server.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..211b04ae --- /dev/null +++ b/.gitignore @@ -0,0 +1,176 @@ +# Created by .ignore support plugin (hsz.mobi) +### JEnv template +# JEnv local Java version configuration file +.java-version + +# Used by previous versions of JEnv +.jenv-version + +### Eclipse template +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# CDT- autotools +.autotools + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Annotation Processing +.apt_generated/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet + +### Node template +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +### JDeveloper template +# default application storage directory used by the IDE Performance Cache feature +.data/ + +# used for ADF styles caching +temp/ + +# default output directories +classes/ +deploy/ +javadoc/ + +# lock file, a part of Oracle Credential Store Framework +cwallet.sso.lck +.gitignore +.idea/a3-persistence.iml +.idea/misc.xml +.idea/modules.xml +.idea/vcs.xml +package-lock.json +*my_db/* \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 00000000..d2729257 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "persistance", + "version": "1.0.0", + "description": "Project 3 for webware", + "author": "Noble Kalish", + "scripts": { + "start": "node server.js", + "bundle": "browserify public/js/scripts.js -o public/js/bundle.js", + "build": "npm run bundle; npm start;" + }, + "dependencies": { + "body-parser": "^1.19.0", + "bulma": "^0.7.5", + "connect-flash": "^0.1.1", + "express": "^4.17.1", + "express-session": "^1.16.2", + "mime": "^2.4.4", + "passport": "^0.4.0", + "passport-local": "^1.0.0", + "pouchdb": "^7.1.1", + "pouchdb-upsert": "^2.2.0", + "tailwindcss": "^1.1.2" + }, + "engines": { + "node": "8.x" + } +} diff --git a/public/css/index.css b/public/css/index.css new file mode 100644 index 00000000..b76c090a --- /dev/null +++ b/public/css/index.css @@ -0,0 +1,5 @@ +@tailwind base; + +@tailwind components; + +@tailwind utilities; \ No newline at end of file diff --git a/public/html/index.html b/public/html/index.html new file mode 100644 index 00000000..0e2fd418 --- /dev/null +++ b/public/html/index.html @@ -0,0 +1,56 @@ + + + + + Title + + + +
+ +
+ +
+
+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+
+ + + \ No newline at end of file diff --git a/public/html/login.html b/public/html/login.html new file mode 100644 index 00000000..98a120da --- /dev/null +++ b/public/html/login.html @@ -0,0 +1,42 @@ + + + + + Title + + + +
+
+
+ + +
+
+ + +
+
+ +
+
+
+
+ + +
+
+ + +
+
+ +
+
+
+ + \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 00000000..07a49feb --- /dev/null +++ b/server.js @@ -0,0 +1,205 @@ +const express = require('express'), + pouchdb = require('pouchdb'), + passport = require('passport'), + bodyParser = require('body-parser'), + sessions = require('express-session'), + LocalStrategy = require('passport-local').Strategy, + flash = require('connect-flash'); + +pouchdb.plugin(require('pouchdb-upsert')); + +const db = new pouchdb('my_db'); +const app = express(); +let User = []; + +db.get('users').catch(function (err) { + if (err.name === 'not_found') { + return { + _id: 'users', + users: [] + }; + } else { // hm, some other error + throw err; + } +}).then(function (doc) { + User = doc.users; +}).catch(err => { + console.log(err); +}); + +app.use(express.static('public')); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(sessions({secret: '{secret}', name: 'session_id', saveUninitialized: true, resave: true})); +app.use(passport.initialize()); +app.use(passport.session()); +app.use(flash()); + +app.get('/', function(request, response) { + response.sendFile(__dirname + '/public/html/login.html'); +}); + +app.get('/index', function (request, response) { + response.sendFile(__dirname + '/public/html/index.html'); +}); + +app.post('/palletList', function (req, res) { + req.session.palletList = []; + db.get(req.session.passport.user).catch(err => { + console.log(err); + }).then(doc => { + let palletList; + if (doc.palletList) { + palletList = doc.palletList; + } else { + palletList = []; + } + palletList.forEach(entry => { + req.session.palletList.push(entry.palletName); + }); + res.status(200).send(req.session.palletList); + }).catch(err => { + console.log(err); + }); +}); + +app.post('/submitPallet', function (req, res) { + const body = req.body; + const session = req.session; + let palletList = []; + db.get(session.passport.user).catch(err => { + console.log(err); + }).then(doc => { + palletList = doc.palletList || []; + if (session.palletList) { + const pallet = session.palletList.find(pallet => pallet === body.palletName); + if (!pallet) { + palletList.push(body); + session.palletList.push(body.palletName); + db.upsert(session.passport.user, function(doc) { + doc.counter = doc.counter || 0; + doc.counter++; + doc.palletList = palletList; + return doc; + }).catch(err => { + console.log(err); + }) + } else { + palletList.forEach((entry, index) => { + if (entry.palletName === body.palletName) { + palletList[index] = body; + }}); + db.upsert(session.passport.user, function(doc) { + doc.counter = doc.counter || 0; + doc.counter++; + doc.palletList = palletList; + return doc; + }).catch(err => { + console.log(err); + }) + } + } + res.status(200).send(req.session.palletList); + }).catch(err => { + console.log(err); + }); +}); + +app.post('/createUser', function (req, res) { + let newUser = req.body; + const user1 = User.find(user => user.username === newUser.newUsername); + if (!user1) { + newUser = { + username: newUser.newUsername, + password: newUser.newPassword, + }; + User.push(newUser); + let userDoc = { + _id: 'users', + users: User + }; + db.upsert('users', function (doc) { + doc.counter = doc.counter || 0; + doc.counter++; + doc.users = User; + return doc; + }).catch(err => { + console.log(err); + }); + } + res.sendFile(__dirname + '/public/html/login.html'); +}); + +app.post('/getPallet', function (req, res) { + let data = req.body; + let session = req.session; + db.get(session.passport.user).then(doc => { + let pallet = doc.palletList.find(pallet => pallet.palletName === data.palletName); + if(pallet) { + res.status(200).send(pallet); + } + }).catch(err => { + console.log(err); + }); +}); + +app.post('/deletePallet', function (req, res) { + let session = req.session; + let data = req.body; + + db.get(session.passport.user).then(doc => { + let newList = doc.palletList.filter(function(value, index, arr){ + return value.palletName !== data.palletName; + }); + session.palletList = []; + newList.forEach(entry => { + session.palletList.push(entry.palletName); + }); + db.upsert(session.passport.user, function(doc) { + doc.counter = doc.counter || 0; + doc.counter++; + doc.palletList = newList; + return doc; + }).catch(err => { + console.log(err); + }); + res.status(200).send(session.palletList); + }).catch(err => { + console.log(err); + }) +}); + +app.post('/login', + passport.authenticate('local', { successRedirect: '/index', + failureRedirect: '/', failureFlash: 'Invalid Username of Password' })); + +const listener = app.listen(3000, function() { + console.log('Your app is listening on port ' + 3000); +}); + +passport.use(new LocalStrategy( + function(username, password, done) { + const user1 = User.find(user => user.username === username); + + if (!user1) { + return done(null, false, {message: "Incorrect user"}); + } else if (user1.password === password) { + return done(null, {username, password}); + } else { + return done(null, false, {message: "Incorrect password"}); + } + } +)); + +passport.serializeUser( ( user, done ) => done( null, user.username ) ); + +passport.deserializeUser( ( username, done ) => { + const user = User.find( u => u.username === username ); + console.log( 'deserializing:', username ); + + if( user !== undefined ) { + done( null, user ) + }else{ + done( null, false, { message:'user not found; session not restored' }) + } +}); From 8c9f672f563b93bca73f851ea4622e375948f3d6 Mon Sep 17 00:00:00 2001 From: Nkalish Date: Sun, 15 Sep 2019 17:54:17 -0400 Subject: [PATCH 2/5] js --- public/js/index.js | 177 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 public/js/index.js diff --git a/public/js/index.js b/public/js/index.js new file mode 100644 index 00000000..d3c6793d --- /dev/null +++ b/public/js/index.js @@ -0,0 +1,177 @@ +let palletList; + +submitPallet = function(e){ + e.preventDefault(); + + const palletName = document.getElementById('palletName'); + const designer = document.getElementById('designer'); + const colorNumber = document.getElementById('colorNumber'); + const inUse = document.getElementById('inUse'); + const ownYes = document.getElementById('ownYes'); + const submitBtn = document.getElementById('submit'); + + let palletListSelect = document.querySelector('#palletList'); + + for (let i=1; i { + console.log(err) + }).then(response => { + response.json().catch(err => { + console.log(err); + }).then(data => { + palletList = data; + palletList.forEach(entry => { + palletListSelect.options[palletListSelect.options.length] = new Option(entry, entry); + }); + }) + }); + submitBtn.value = 'Submit'; +}; + +getPallet = function(e){ + let pallet; + e.preventDefault(); + + const palletName = document.getElementById('palletName'); + const designer = document.getElementById('designer'); + const colorNumber = document.getElementById('colorNumber'); + const inUse = document.getElementById('inUse'); + const submitBtn = document.getElementById('submit'); + const palletListSelect = document.querySelector('#palletList'); + const deleteBtn = document.getElementById('delete'); + + if (palletListSelect.value !== 'newPallet') { + submitBtn.value = "Update"; + deleteBtn.disabled = false; + let pallet = { + palletName: palletListSelect.value + }; + let body = JSON.stringify(pallet); + fetch('/getPallet', { + method: 'POST', + body, + headers: {'Content-Type': 'application/json'} + }).then(response => { + response.json().then(data => { + palletName.value = data.palletName; + designer.value = data.designer; + colorNumber.value = data.colorNumber; + inUse.value = data.inUse; + let ele = document.getElementsByName("own"); + if(data.own) { + ele[0].checked = true; + ele[1].checked = false; + } else { + ele[0].checked = false; + ele[1].checked = true; + } + }) + }) + } else { + submitBtn.value = "Submit"; + palletName.value = ""; + deleteBtn.disabled = true; + designer.value = ""; + colorNumber.value = 0; + inUse.checked = false; + let ele = document.getElementsByName("own"); + for(let i=0;i { + response.json().then(palletList => { + console.log(palletList); + console.log(palletListSelect); + for (let i=1; i { + palletListSelect.options[palletListSelect.options.length] = new Option(entry, entry); + }); + console.log(palletListSelect); + }); + }); + submitBtn.value = "Submit"; + palletListSelect.value = "newPallet"; + palletName.value = ""; + deleteBtn.disabled = true; + designer.value = ""; + colorNumber.value = 0; + inUse.checked = false; + let ele = document.getElementsByName("own"); + for(let i=0;i { + console.log(err); + }).then(palletList => { + palletList.forEach(entry => { + palletListSelect.options[palletListSelect.options.length] = new Option(entry, entry); + }); + }); + }); + submitBtn.onclick = submitPallet; + palletListSelect.onchange = getPallet; + deleteBtn.onclick = deletePallet; +}; \ No newline at end of file From 4c12e9563654702a7e5b35507b83a51c8ab2e36a Mon Sep 17 00:00:00 2001 From: "Glitch (noblekalish-a3-persistence)" Date: Sun, 15 Sep 2019 22:28:43 +0000 Subject: [PATCH 3/5] =?UTF-8?q?=F0=9F=8C=97=F0=9F=92=BF=20Updated=20with?= =?UTF-8?q?=20Glitch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 176 ------ public/js/index.js | 356 +++++++------ server.js | 414 ++++++++------- shrinkwrap.yaml | 1270 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 1659 insertions(+), 557 deletions(-) delete mode 100644 .gitignore create mode 100644 shrinkwrap.yaml diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 211b04ae..00000000 --- a/.gitignore +++ /dev/null @@ -1,176 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -### JEnv template -# JEnv local Java version configuration file -.java-version - -# Used by previous versions of JEnv -.jenv-version - -### Eclipse template -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.settings/ -.loadpath -.recommenders - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# PyDev specific (Python IDE for Eclipse) -*.pydevproject - -# CDT-specific (C/C++ Development Tooling) -.cproject - -# CDT- autotools -.autotools - -# Java annotation processor (APT) -.factorypath - -# PDT-specific (PHP Development Tools) -.buildpath - -# sbteclipse plugin -.target - -# Tern plugin -.tern-project - -# TeXlipse plugin -.texlipse - -# STS (Spring Tool Suite) -.springBeans - -# Code Recommenders -.recommenders/ - -# Annotation Processing -.apt_generated/ - -# Scala IDE specific (Scala & Java development for Eclipse) -.cache-main -.scala_dependencies -.worksheet - -### Node template -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) -report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# TypeScript v1 declaration files -typings/ - -# TypeScript cache -*.tsbuildinfo - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# Yarn Integrity file -.yarn-integrity - -# dotenv environment variables file -.env -.env.test - -# parcel-bundler cache (https://parceljs.org/) -.cache - -# next.js build output -.next - -# nuxt.js build output -.nuxt - -# vuepress build output -.vuepress/dist - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -### JDeveloper template -# default application storage directory used by the IDE Performance Cache feature -.data/ - -# used for ADF styles caching -temp/ - -# default output directories -classes/ -deploy/ -javadoc/ - -# lock file, a part of Oracle Credential Store Framework -cwallet.sso.lck -.gitignore -.idea/a3-persistence.iml -.idea/misc.xml -.idea/modules.xml -.idea/vcs.xml -package-lock.json -*my_db/* \ No newline at end of file diff --git a/public/js/index.js b/public/js/index.js index d3c6793d..021b062d 100644 --- a/public/js/index.js +++ b/public/js/index.js @@ -1,177 +1,181 @@ -let palletList; - -submitPallet = function(e){ - e.preventDefault(); - - const palletName = document.getElementById('palletName'); - const designer = document.getElementById('designer'); - const colorNumber = document.getElementById('colorNumber'); - const inUse = document.getElementById('inUse'); - const ownYes = document.getElementById('ownYes'); - const submitBtn = document.getElementById('submit'); - - let palletListSelect = document.querySelector('#palletList'); - - for (let i=1; i { - console.log(err) - }).then(response => { - response.json().catch(err => { - console.log(err); - }).then(data => { - palletList = data; - palletList.forEach(entry => { - palletListSelect.options[palletListSelect.options.length] = new Option(entry, entry); - }); - }) - }); - submitBtn.value = 'Submit'; -}; - -getPallet = function(e){ - let pallet; - e.preventDefault(); - - const palletName = document.getElementById('palletName'); - const designer = document.getElementById('designer'); - const colorNumber = document.getElementById('colorNumber'); - const inUse = document.getElementById('inUse'); - const submitBtn = document.getElementById('submit'); - const palletListSelect = document.querySelector('#palletList'); - const deleteBtn = document.getElementById('delete'); - - if (palletListSelect.value !== 'newPallet') { - submitBtn.value = "Update"; - deleteBtn.disabled = false; - let pallet = { - palletName: palletListSelect.value - }; - let body = JSON.stringify(pallet); - fetch('/getPallet', { - method: 'POST', - body, - headers: {'Content-Type': 'application/json'} - }).then(response => { - response.json().then(data => { - palletName.value = data.palletName; - designer.value = data.designer; - colorNumber.value = data.colorNumber; - inUse.value = data.inUse; - let ele = document.getElementsByName("own"); - if(data.own) { - ele[0].checked = true; - ele[1].checked = false; - } else { - ele[0].checked = false; - ele[1].checked = true; - } - }) - }) - } else { - submitBtn.value = "Submit"; - palletName.value = ""; - deleteBtn.disabled = true; - designer.value = ""; - colorNumber.value = 0; - inUse.checked = false; - let ele = document.getElementsByName("own"); - for(let i=0;i { - response.json().then(palletList => { - console.log(palletList); - console.log(palletListSelect); - for (let i=1; i { - palletListSelect.options[palletListSelect.options.length] = new Option(entry, entry); - }); - console.log(palletListSelect); - }); - }); - submitBtn.value = "Submit"; - palletListSelect.value = "newPallet"; - palletName.value = ""; - deleteBtn.disabled = true; - designer.value = ""; - colorNumber.value = 0; - inUse.checked = false; - let ele = document.getElementsByName("own"); - for(let i=0;i { - console.log(err); - }).then(palletList => { - palletList.forEach(entry => { - palletListSelect.options[palletListSelect.options.length] = new Option(entry, entry); - }); - }); - }); - submitBtn.onclick = submitPallet; - palletListSelect.onchange = getPallet; - deleteBtn.onclick = deletePallet; +let palletList; + +submitPallet = function(e){ + e.preventDefault(); + + const palletName = document.getElementById('palletName'); + const designer = document.getElementById('designer'); + const colorNumber = document.getElementById('colorNumber'); + const inUse = document.getElementById('inUse'); + const ownYes = document.getElementById('ownYes'); + const ownNo = document.getElementById('ownNo'); + const own = document.getElementsByName('own'); + const submitBtn = document.getElementById('submit'); + + let palletListSelect = document.querySelector('#palletList'); + + for (let i=1; i { + console.log(err) + }).then(response => { + response.json().catch(err => { + console.log(err); + }).then(data => { + palletList = data; + palletList.forEach(entry => { + palletListSelect.options[palletListSelect.options.length] = new Option(entry, entry); + }); + }) + }); + submitBtn.value = 'Submit'; +}; + +getPallet = function(e){ + let pallet; + e.preventDefault(); + + const palletName = document.getElementById('palletName'); + const designer = document.getElementById('designer'); + const colorNumber = document.getElementById('colorNumber'); + const inUse = document.getElementById('inUse'); + const submitBtn = document.getElementById('submit'); + const palletListSelect = document.querySelector('#palletList'); + const deleteBtn = document.getElementById('delete'); + + if (palletListSelect.value !== 'newPallet') { + submitBtn.value = "Update"; + deleteBtn.disabled = false; + let pallet = { + palletName: palletListSelect.value + }; + let body = JSON.stringify(pallet); + fetch('/getPallet', { + method: 'POST', + body, + headers: {'Content-Type': 'application/json'} + }).then(response => { + response.json().then(data => { + palletName.value = data.palletName; + designer.value = data.designer; + colorNumber.value = data.colorNumber; + inUse.value = data.inUse; + let ele = document.getElementsByName("own"); + if(data.own) { + ele[0].checked = true; + ele[1].checked = false; + } else { + ele[0].checked = false; + ele[1].checked = true; + } + }) + }) + } else { + submitBtn.value = "Submit"; + palletName.value = ""; + deleteBtn.disabled = true; + designer.value = ""; + colorNumber.value = 0; + inUse.checked = false; + let ele = document.getElementsByName("own"); + for(let i=0;i { + response.json().then(palletList => { + console.log(palletList); + console.log(palletListSelect); + for (let i=1; i { + palletListSelect.options[palletListSelect.options.length] = new Option(entry, entry); + }); + console.log(palletListSelect); + }); + }); + submitBtn.value = "Submit"; + palletListSelect.value = "newPallet"; + palletName.value = ""; + deleteBtn.disabled = true; + designer.value = ""; + colorNumber.value = 0; + inUse.checked = false; + let ele = document.getElementsByName("own"); + for(let i=0;i { + console.log(err); + }).then(palletList => { + palletList.forEach(entry => { + palletListSelect.options[palletListSelect.options.length] = new Option(entry, entry); + }); + }); + }); + submitBtn.onclick = submitPallet; + palletListSelect.onchange = getPallet; + deleteBtn.onclick = deletePallet; }; \ No newline at end of file diff --git a/server.js b/server.js index 07a49feb..0a4292e5 100644 --- a/server.js +++ b/server.js @@ -1,205 +1,209 @@ -const express = require('express'), - pouchdb = require('pouchdb'), - passport = require('passport'), - bodyParser = require('body-parser'), - sessions = require('express-session'), - LocalStrategy = require('passport-local').Strategy, - flash = require('connect-flash'); - -pouchdb.plugin(require('pouchdb-upsert')); - -const db = new pouchdb('my_db'); -const app = express(); -let User = []; - -db.get('users').catch(function (err) { - if (err.name === 'not_found') { - return { - _id: 'users', - users: [] - }; - } else { // hm, some other error - throw err; - } -}).then(function (doc) { - User = doc.users; -}).catch(err => { - console.log(err); -}); - -app.use(express.static('public')); -app.use(bodyParser.json()); -app.use(bodyParser.urlencoded({ extended: false })); -app.use(sessions({secret: '{secret}', name: 'session_id', saveUninitialized: true, resave: true})); -app.use(passport.initialize()); -app.use(passport.session()); -app.use(flash()); - -app.get('/', function(request, response) { - response.sendFile(__dirname + '/public/html/login.html'); -}); - -app.get('/index', function (request, response) { - response.sendFile(__dirname + '/public/html/index.html'); -}); - -app.post('/palletList', function (req, res) { - req.session.palletList = []; - db.get(req.session.passport.user).catch(err => { - console.log(err); - }).then(doc => { - let palletList; - if (doc.palletList) { - palletList = doc.palletList; - } else { - palletList = []; - } - palletList.forEach(entry => { - req.session.palletList.push(entry.palletName); - }); - res.status(200).send(req.session.palletList); - }).catch(err => { - console.log(err); - }); -}); - -app.post('/submitPallet', function (req, res) { - const body = req.body; - const session = req.session; - let palletList = []; - db.get(session.passport.user).catch(err => { - console.log(err); - }).then(doc => { - palletList = doc.palletList || []; - if (session.palletList) { - const pallet = session.palletList.find(pallet => pallet === body.palletName); - if (!pallet) { - palletList.push(body); - session.palletList.push(body.palletName); - db.upsert(session.passport.user, function(doc) { - doc.counter = doc.counter || 0; - doc.counter++; - doc.palletList = palletList; - return doc; - }).catch(err => { - console.log(err); - }) - } else { - palletList.forEach((entry, index) => { - if (entry.palletName === body.palletName) { - palletList[index] = body; - }}); - db.upsert(session.passport.user, function(doc) { - doc.counter = doc.counter || 0; - doc.counter++; - doc.palletList = palletList; - return doc; - }).catch(err => { - console.log(err); - }) - } - } - res.status(200).send(req.session.palletList); - }).catch(err => { - console.log(err); - }); -}); - -app.post('/createUser', function (req, res) { - let newUser = req.body; - const user1 = User.find(user => user.username === newUser.newUsername); - if (!user1) { - newUser = { - username: newUser.newUsername, - password: newUser.newPassword, - }; - User.push(newUser); - let userDoc = { - _id: 'users', - users: User - }; - db.upsert('users', function (doc) { - doc.counter = doc.counter || 0; - doc.counter++; - doc.users = User; - return doc; - }).catch(err => { - console.log(err); - }); - } - res.sendFile(__dirname + '/public/html/login.html'); -}); - -app.post('/getPallet', function (req, res) { - let data = req.body; - let session = req.session; - db.get(session.passport.user).then(doc => { - let pallet = doc.palletList.find(pallet => pallet.palletName === data.palletName); - if(pallet) { - res.status(200).send(pallet); - } - }).catch(err => { - console.log(err); - }); -}); - -app.post('/deletePallet', function (req, res) { - let session = req.session; - let data = req.body; - - db.get(session.passport.user).then(doc => { - let newList = doc.palletList.filter(function(value, index, arr){ - return value.palletName !== data.palletName; - }); - session.palletList = []; - newList.forEach(entry => { - session.palletList.push(entry.palletName); - }); - db.upsert(session.passport.user, function(doc) { - doc.counter = doc.counter || 0; - doc.counter++; - doc.palletList = newList; - return doc; - }).catch(err => { - console.log(err); - }); - res.status(200).send(session.palletList); - }).catch(err => { - console.log(err); - }) -}); - -app.post('/login', - passport.authenticate('local', { successRedirect: '/index', - failureRedirect: '/', failureFlash: 'Invalid Username of Password' })); - -const listener = app.listen(3000, function() { - console.log('Your app is listening on port ' + 3000); -}); - -passport.use(new LocalStrategy( - function(username, password, done) { - const user1 = User.find(user => user.username === username); - - if (!user1) { - return done(null, false, {message: "Incorrect user"}); - } else if (user1.password === password) { - return done(null, {username, password}); - } else { - return done(null, false, {message: "Incorrect password"}); - } - } -)); - -passport.serializeUser( ( user, done ) => done( null, user.username ) ); - -passport.deserializeUser( ( username, done ) => { - const user = User.find( u => u.username === username ); - console.log( 'deserializing:', username ); - - if( user !== undefined ) { - done( null, user ) - }else{ - done( null, false, { message:'user not found; session not restored' }) - } -}); +const express = require('express'), + pouchdb = require('pouchdb'), + passport = require('passport'), + bodyParser = require('body-parser'), + sessions = require('express-session'), + LocalStrategy = require('passport-local').Strategy, + flash = require('connect-flash'); + +pouchdb.plugin(require('pouchdb-upsert')); + +const db = new pouchdb('my_db'); +const app = express(); +let User = []; + +db.get('users').catch(function (err) { + if (err.name === 'not_found') { + return { + _id: 'users', + users: [] + }; + } else { // hm, some other error + throw err; + } +}).then(function (doc) { + User = doc.users; +}).catch(err => { + console.log(err); +}); + +app.use(express.static('public')); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: false })); +app.use(sessions({secret: '{secret}', name: 'session_id', saveUninitialized: true, resave: true})); +app.use(passport.initialize()); +app.use(passport.session()); +app.use(flash()); + +app.get('/', function(request, response) { + response.sendFile(__dirname + '/public/html/login.html'); +}); + +app.get('/index', function (request, response) { + response.sendFile(__dirname + '/public/html/index.html'); +}); + +app.post('/palletList', function (req, res) { + req.session.palletList = []; + db.get(req.session.passport.user).catch(err => { + console.log(err); + }).then(doc => { + let palletList; + if (doc) { + palletList = doc.palletList; + } else { + palletList = []; + } + palletList.forEach(entry => { + req.session.palletList.push(entry.palletName); + }); + res.status(200).send(req.session.palletList); + }).catch(err => { + console.log(err); + }); +}); + +app.post('/submitPallet', function (req, res) { + const body = req.body; + const session = req.session; + let palletList = []; + db.get(session.passport.user).catch(err => { + console.log(err); + }).then(doc => { + if (!doc) { + palletList = []; + } else { + palletList = doc.palletList; + } + if (session.palletList) { + const pallet = session.palletList.find(pallet => pallet === body.palletName); + if (!pallet) { + palletList.push(body); + session.palletList.push(body.palletName); + db.upsert(session.passport.user, function(doc) { + doc.counter = doc.counter || 0; + doc.counter++; + doc.palletList = palletList; + return doc; + }).catch(err => { + console.log(err); + }) + } else { + palletList.forEach((entry, index) => { + if (entry.palletName === body.palletName) { + palletList[index] = body; + }}); + db.upsert(session.passport.user, function(doc) { + doc.counter = doc.counter || 0; + doc.counter++; + doc.palletList = palletList; + return doc; + }).catch(err => { + console.log(err); + }) + } + } + res.status(200).send(req.session.palletList); + }).catch(err => { + console.log(err); + }); +}); + +app.post('/createUser', function (req, res) { + let newUser = req.body; + const user1 = User.find(user => user.username === newUser.newUsername); + if (!user1) { + newUser = { + username: newUser.newUsername, + password: newUser.newPassword, + }; + User.push(newUser); + let userDoc = { + _id: 'users', + users: User + }; + db.upsert('users', function (doc) { + doc.counter = doc.counter || 0; + doc.counter++; + doc.users = User; + return doc; + }).catch(err => { + console.log(err); + }); + } + res.sendFile(__dirname + '/public/html/login.html'); +}); + +app.post('/getPallet', function (req, res) { + let data = req.body; + let session = req.session; + db.get(session.passport.user).then(doc => { + let pallet = doc.palletList.find(pallet => pallet.palletName === data.palletName); + if(pallet) { + res.status(200).send(pallet); + } + }).catch(err => { + console.log(err); + }); +}); + +app.post('/deletePallet', function (req, res) { + let session = req.session; + let data = req.body; + + db.get(session.passport.user).then(doc => { + let newList = doc.palletList.filter(function(value, index, arr){ + return value.palletName !== data.palletName; + }); + session.palletList = []; + newList.forEach(entry => { + session.palletList.push(entry.palletName); + }); + db.upsert(session.passport.user, function(doc) { + doc.counter = doc.counter || 0; + doc.counter++; + doc.palletList = newList; + return doc; + }).catch(err => { + console.log(err); + }); + res.status(200).send(session.palletList); + }).catch(err => { + console.log(err); + }) +}); + +app.post('/login', + passport.authenticate('local', { successRedirect: '/index', + failureRedirect: '/', failureFlash: 'Invalid Username of Password' })); + +const listener = app.listen(3000, function() { + console.log('Your app is listening on port ' + 3000); +}); + +passport.use(new LocalStrategy( + function(username, password, done) { + const user1 = User.find(user => user.username === username); + + if (!user1) { + return done(null, false, {message: "Incorrect user"}); + } else if (user1.password === password) { + return done(null, {username, password}); + } else { + return done(null, false, {message: "Incorrect password"}); + } + } +)); + +passport.serializeUser( ( user, done ) => done( null, user.username ) ); + +passport.deserializeUser( ( username, done ) => { + const user = User.find( u => u.username === username ); + console.log( 'deserializing:', username ); + + if( user !== undefined ) { + done( null, user ) + }else{ + done( null, false, { message:'user not found; session not restored' }) + } +}); diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml new file mode 100644 index 00000000..32531eb3 --- /dev/null +++ b/shrinkwrap.yaml @@ -0,0 +1,1270 @@ +dependencies: + body-parser: 1.19.0 + bulma: 0.7.5 + connect-flash: 0.1.1 + express: 4.17.1 + express-session: 1.16.2 + mime: 2.4.4 + passport: 0.4.0 + passport-local: 1.0.0 + pouchdb: 7.1.1 + pouchdb-upsert: 2.2.0 + tailwindcss: 1.1.2 +packages: + /abstract-leveldown/6.0.3: + dependencies: + level-concat-iterator: 2.0.1 + xtend: 4.0.2 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-jzewKKpZbaYUa6HTThnrl+GrJhzjEAeuc7hTVpZdzg7kupXZFoqQDFwyOwLNbmJKJlmzw8yiipMPkDiuKkT06Q== + /abstract-leveldown/6.1.1: + dependencies: + level-concat-iterator: 2.0.1 + xtend: 4.0.2 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-7fK/KySVqzKIomdhkSWzX4YBQhzkzEMbWSiaB6mSN9e+ZdV3KEeKxia/8xQzCkATA5xnnukdP88cFR0D2FsFXw== + /accepts/1.3.7: + dependencies: + mime-types: 2.1.24 + negotiator: 0.6.2 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== + /ansi-styles/3.2.1: + dependencies: + color-convert: 1.9.3 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + /argsarray/0.0.1: + dev: false + resolution: + integrity: sha1-bnIHtOzbObCviDA/pa4ivajfYcs= + /array-flatten/1.1.1: + dev: false + resolution: + integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + /autoprefixer/9.6.1: + dependencies: + browserslist: 4.7.0 + caniuse-lite: 1.0.30000989 + chalk: 2.4.2 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + postcss: 7.0.18 + postcss-value-parser: 4.0.2 + dev: false + engines: + node: '>=6.0.0' + hasBin: true + resolution: + integrity: sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw== + /balanced-match/1.0.0: + dev: false + resolution: + integrity: sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + /body-parser/1.19.0: + 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.18 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw== + /brace-expansion/1.1.11: + dependencies: + balanced-match: 1.0.0 + concat-map: 0.0.1 + dev: false + resolution: + integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + /browserslist/4.7.0: + dependencies: + caniuse-lite: 1.0.30000989 + electron-to-chromium: 1.3.259 + node-releases: 1.1.30 + dev: false + hasBin: true + resolution: + integrity: sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA== + /buffer-from/1.1.0: + dev: false + resolution: + integrity: sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ== + /bulma/0.7.5: + dev: false + resolution: + integrity: sha512-cX98TIn0I6sKba/DhW0FBjtaDpxTelU166pf7ICXpCCuplHWyu6C9LYZmL5PEsnePIeJaiorsTEzzNk3Tsm1hw== + /bytes/3.1.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + /camelcase-css/2.0.1: + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + /caniuse-lite/1.0.30000989: + dev: false + resolution: + integrity: sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== + /chalk/2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + /clone-buffer/1.0.0: + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha1-4+JbIHrE5wGvch4staFnksrD3Fg= + /color-convert/1.9.3: + dependencies: + color-name: 1.1.3 + dev: false + resolution: + integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + /color-name/1.1.3: + dev: false + resolution: + integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + /concat-map/0.0.1: + dev: false + resolution: + integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + /connect-flash/0.1.1: + dev: false + engines: + node: '>= 0.4.0' + resolution: + integrity: sha1-2GMPJtlaf4UfmVax6MxnMvO2qjA= + /content-disposition/0.5.3: + dependencies: + safe-buffer: 5.1.2 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g== + /content-type/1.0.4: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + /cookie-signature/1.0.6: + dev: false + resolution: + integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + /cookie/0.3.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + /cookie/0.4.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== + /core-util-is/1.0.2: + dev: false + resolution: + integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + /css-unit-converter/1.1.1: + dev: false + resolution: + integrity: sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY= + /cssesc/2.0.0: + dev: false + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg== + /cssesc/3.0.0: + dev: false + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + /debug/2.6.9: + dependencies: + ms: 2.0.0 + dev: false + resolution: + integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + /deferred-leveldown/5.0.1: + dependencies: + abstract-leveldown: 6.0.3 + inherits: 2.0.4 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-BXohsvTedWOLkj2n/TY+yqVlrCWa2Zs8LSxh3uCAgFOru7/pjxKyZAexGa1j83BaKloER4PqUyQ9rGPJLt9bqA== + /deferred-leveldown/5.2.0: + dependencies: + abstract-leveldown: 6.1.1 + inherits: 2.0.4 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-E1s224a+nv7nEZQL/s+q4ARzBhsfo3KiEjK3qdvDAvMfWE68GnGsMRYKanoZgYqq+LNgyRMYPzBgEmAXjM2i5g== + /depd/1.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + /depd/2.0.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + /destroy/1.0.4: + dev: false + resolution: + integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + /double-ended-queue/2.1.0-0: + dev: false + resolution: + integrity: sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw= + /ee-first/1.1.1: + dev: false + resolution: + integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + /electron-to-chromium/1.3.259: + dev: false + resolution: + integrity: sha512-NMHS8iQzAYwiFZ1jL/rNOfrZJhvoowKN5uHrbbHOeNgBT5W762wpe/SRLo9kJoTiJ4d2R8i01/NQHwndo9N5PQ== + /encodeurl/1.0.2: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + /encoding-down/6.2.0: + dependencies: + abstract-leveldown: 6.1.1 + inherits: 2.0.4 + level-codec: 9.0.1 + level-errors: 2.0.1 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-XlIoQMBMbU4aE01uSKpAix0sXBJWK8YPhuOdvKa1CroThZyUpj0zWzt+bbe7g1KWsdhNFFzHkQHSdDymVtpJ1w== + /end-stream/0.1.0: + dependencies: + write-stream: 0.4.3 + dev: false + resolution: + integrity: sha1-MgA/P0OKKwFDFoE3+PpumGbIHtU= + /errno/0.1.7: + dependencies: + prr: 1.0.1 + dev: false + hasBin: true + resolution: + integrity: sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + /es6-denodeify/0.1.5: + dev: false + resolution: + integrity: sha1-MdTV/pxVA+ElRgQ5MQ4WoqPznB8= + /escape-html/1.0.3: + dev: false + resolution: + integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + /escape-string-regexp/1.0.5: + dev: false + engines: + node: '>=0.8.0' + resolution: + integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + /etag/1.8.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + /express-session/1.16.2: + dependencies: + cookie: 0.3.1 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + on-headers: 1.0.2 + parseurl: 1.3.3 + safe-buffer: 5.1.2 + uid-safe: 2.1.5 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-oy0sRsdw6n93E9wpCNWKRnSsxYnSDX9Dnr9mhZgqUEEorzcq5nshGYSZ4ZReHFhKQ80WI5iVUUSPW7u3GaKauw== + /express/4.17.1: + 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 + dev: false + engines: + node: '>= 0.10.0' + resolution: + integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== + /fast-future/1.0.2: + dev: false + resolution: + integrity: sha1-hDWpqqAteSSNF9cE52JZMB2ZKAo= + /fetch-cookie/0.7.0: + dependencies: + es6-denodeify: 0.1.5 + tough-cookie: 2.5.0 + dev: false + resolution: + integrity: sha512-Mm5pGlT3agW6t71xVM7vMZPIvI7T4FaTuFW4jari6dVzYHFDb3WZZsGpN22r/o3XMdkM0E7sPd1EGeyVbH2Tgg== + /finalhandler/1.1.2: + 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 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== + /forwarded/0.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + /fresh/0.5.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + /fs-extra/8.1.0: + dependencies: + graceful-fs: 4.2.2 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + engines: + node: '>=6 <7 || >=8' + resolution: + integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== + /fs.realpath/1.0.0: + dev: false + resolution: + integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + /glob/7.1.4: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.0.4 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + resolution: + integrity: sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + /graceful-fs/4.2.2: + dev: false + resolution: + integrity: sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q== + /has-flag/3.0.0: + dev: false + engines: + node: '>=4' + resolution: + integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + /http-errors/1.7.2: + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg== + /http-errors/1.7.3: + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + /iconv-lite/0.4.24: + dependencies: + safer-buffer: 2.1.2 + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + /immediate/3.0.6: + dev: false + resolution: + integrity: sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + /immediate/3.2.3: + dev: false + resolution: + integrity: sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= + /indexes-of/1.0.1: + dev: false + resolution: + integrity: sha1-8w9xbI4r00bHtn0985FVZqfAVgc= + /inflight/1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + resolution: + integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + /inherits/2.0.3: + dev: false + resolution: + integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + /inherits/2.0.4: + dev: false + resolution: + integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + /ipaddr.js/1.9.0: + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + /is-typedarray/1.0.0: + dev: false + resolution: + integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + /isarray/0.0.1: + dev: false + resolution: + integrity: sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + /jsonfile/4.0.0: + dev: false + optionalDependencies: + graceful-fs: 4.2.2 + resolution: + integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + /level-codec/9.0.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-ajFP0kJ+nyq4i6kptSM+mAvJKLOg1X5FiFPtLG9M5gCEZyBmgDi3FkDrvlMkEzrUn1cWxtvVmrvoS4ASyO/q+Q== + /level-concat-iterator/2.0.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== + /level-errors/2.0.1: + dependencies: + errno: 0.1.7 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== + /level-iterator-stream/4.0.1: + dependencies: + inherits: 2.0.4 + readable-stream: 3.4.0 + xtend: 4.0.2 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-pSZWqXK6/yHQkZKCHrR59nKpU5iqorKM22C/BOHTb/cwNQ2EOZG+bovmFFGcOgaBoF3KxqJEI27YwewhJQTzsw== + /level-js/4.0.1: + dependencies: + abstract-leveldown: 6.0.3 + immediate: 3.2.3 + inherits: 2.0.4 + ltgt: 2.2.1 + typedarray-to-buffer: 3.1.5 + dev: false + resolution: + integrity: sha512-m5JRIyHZn5VnCCFeRegJkn5bQd3MJK5qZX12zg3Oivc8+BUIS2yFS6ANMMeHX2ieGxucNvEn6/ZnyjmZQLLUWw== + /level-packager/5.0.3: + dependencies: + encoding-down: 6.2.0 + levelup: 4.2.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-Ut62o3nvUNCxYldM5+13+0sYow6ifKj2C26/0ToB7zKgdypF5wRKcVkcztQVwsQi+ZnrmDzhimp7FKP5Ynv6Rg== + /level-write-stream/1.0.0: + dependencies: + end-stream: 0.1.0 + dev: false + resolution: + integrity: sha1-P3+7Z5pVE3wP6zA97nZuEu4Twdw= + /level/5.0.1: + dependencies: + level-js: 4.0.1 + level-packager: 5.0.3 + leveldown: 5.2.0 + opencollective-postinstall: 2.0.2 + dev: false + engines: + node: '>=8.6.0' + requiresBuild: true + resolution: + integrity: sha512-wcak5OQeA4rURGacqS62R/xNHjCYnJSQDBOlm4KNUGJVE9bWv2B04TclqReYejN+oD65PzD4FsqeWoI5wNC5Lg== + /leveldown/5.0.2: + dependencies: + abstract-leveldown: 6.0.3 + fast-future: 1.0.2 + napi-macros: 1.8.2 + node-gyp-build: 3.8.0 + dev: false + engines: + node: '>=8.6.0' + requiresBuild: true + resolution: + integrity: sha512-Ib6ygFYBleS8x2gh3C1AkVsdrUShqXpe6jSTnZ6sRycEXKhqVf+xOSkhgSnjidpPzyv0d95LJVFrYQ4NuXAqHA== + /leveldown/5.2.0: + dependencies: + abstract-leveldown: 6.1.1 + napi-macros: 2.0.0 + node-gyp-build: 4.1.1 + dev: false + engines: + node: '>=8.6.0' + requiresBuild: true + resolution: + integrity: sha512-Ml6mWFqhhyUbuJUVaOd6ZVBHA5T0XLOK0cwNRIBEDJCjBiJBM3fpi4gdTIhU5/tWqtxMFMQbmo/U7a9rbA1stg== + /levelup/4.0.2: + dependencies: + deferred-leveldown: 5.0.1 + level-errors: 2.0.1 + level-iterator-stream: 4.0.1 + xtend: 4.0.2 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-cx9PmLENwbGA3svWBEbeO2HazpOSOYSXH4VA+ahVpYyurvD+SDSfURl29VBY2qgyk+Vfy2dJd71SBRckj/EZVA== + /levelup/4.2.0: + dependencies: + deferred-leveldown: 5.2.0 + level-errors: 2.0.1 + level-iterator-stream: 4.0.1 + xtend: 4.0.2 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-TiHUSYrSUQhG7a5MZIKq6ClDcARSvMvSy5GTM8I62tHV5XiWqf+aInF+CAenQKzVRG2s6fufg62Lv8614Extyg== + /lie/3.1.1: + dependencies: + immediate: 3.0.6 + dev: false + resolution: + integrity: sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= + /lodash.toarray/4.4.0: + dev: false + resolution: + integrity: sha1-JMS/zWsvuji/0FlNsRedjptlZWE= + /lodash/4.17.15: + dev: false + resolution: + integrity: sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + /ltgt/2.2.1: + dev: false + resolution: + integrity: sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + /media-typer/0.3.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + /merge-descriptors/1.0.1: + dev: false + resolution: + integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + /methods/1.1.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + /mime-db/1.40.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA== + /mime-types/2.1.24: + dependencies: + mime-db: 1.40.0 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ== + /mime/1.6.0: + dev: false + engines: + node: '>=4' + hasBin: true + resolution: + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + /mime/2.4.4: + dev: false + engines: + node: '>=4.0.0' + hasBin: true + resolution: + integrity: sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + /minimatch/3.0.4: + dependencies: + brace-expansion: 1.1.11 + dev: false + resolution: + integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + /ms/2.0.0: + dev: false + resolution: + integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + /ms/2.1.1: + dev: false + resolution: + integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + /napi-macros/1.8.2: + dev: false + resolution: + integrity: sha512-Tr0DNY4RzTaBG2W2m3l7ZtFuJChTH6VZhXVhkGGjF/4cZTt+i8GcM9ozD+30Lmr4mDoZ5Xx34t2o4GJqYWDGcg== + /napi-macros/2.0.0: + dev: false + resolution: + integrity: sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + /negotiator/0.6.2: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== + /node-emoji/1.10.0: + dependencies: + lodash.toarray: 4.4.0 + dev: false + resolution: + integrity: sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw== + /node-fetch/2.4.1: + dev: false + engines: + node: 4.x || >=6.0.0 + resolution: + integrity: sha512-P9UbpFK87NyqBZzUuDBDz4f6Yiys8xm8j7ACDbi6usvFm6KItklQUKjeoqTrYS/S1k6I8oaOC2YLLDr/gg26Mw== + /node-gyp-build/3.8.0: + dev: false + hasBin: true + resolution: + integrity: sha512-bYbpIHyRqZ7sVWXxGpz8QIRug5JZc/hzZH4GbdT9HTZi6WmKCZ8GLvP8OZ9TTiIBvwPFKgtGrlWQSXDAvYdsPw== + /node-gyp-build/4.1.1: + dev: false + hasBin: true + resolution: + integrity: sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ== + /node-releases/1.1.30: + dependencies: + semver: 5.7.1 + dev: false + resolution: + integrity: sha512-BHcr1g6NeUH12IL+X3Flvs4IOnl1TL0JczUhEZjDE+FXXPQcVCNr8NEPb01zqGxzhTpdyJL5GXemaCW7aw6Khw== + /normalize-range/0.1.2: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= + /normalize.css/8.0.1: + dev: false + resolution: + integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg== + /num2fraction/1.2.2: + dev: false + resolution: + integrity: sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= + /object-assign/4.1.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + /on-finished/2.3.0: + dependencies: + ee-first: 1.1.1 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + /on-headers/1.0.2: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + /once/1.4.0: + dependencies: + wrappy: 1.0.2 + dev: false + resolution: + integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + /opencollective-postinstall/2.0.2: + dev: false + hasBin: true + resolution: + integrity: sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw== + /parseurl/1.3.3: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + /passport-local/1.0.0: + dependencies: + passport-strategy: 1.0.0 + dev: false + engines: + node: '>= 0.4.0' + resolution: + integrity: sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4= + /passport-strategy/1.0.0: + dev: false + engines: + node: '>= 0.4.0' + resolution: + integrity: sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ= + /passport/0.4.0: + dependencies: + passport-strategy: 1.0.0 + pause: 0.0.1 + dev: false + engines: + node: '>= 0.4.0' + resolution: + integrity: sha1-xQlWkTR71a07XhgCOMORTRbwWBE= + /path-is-absolute/1.0.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + /path-to-regexp/0.1.7: + dev: false + resolution: + integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + /pause/0.0.1: + dev: false + resolution: + integrity: sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= + /postcss-functions/3.0.0: + dependencies: + glob: 7.1.4 + object-assign: 4.1.1 + postcss: 6.0.23 + postcss-value-parser: 3.3.1 + dev: false + resolution: + integrity: sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4= + /postcss-js/2.0.3: + dependencies: + camelcase-css: 2.0.1 + postcss: 7.0.18 + dev: false + resolution: + integrity: sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w== + /postcss-nested/4.1.2: + dependencies: + postcss: 7.0.18 + postcss-selector-parser: 5.0.0 + dev: false + resolution: + integrity: sha512-9bQFr2TezohU3KRSu9f6sfecXmf/x6RXDedl8CHF6fyuyVW7UqgNMRdWMHZQWuFY6Xqs2NYk+Fj4Z4vSOf7PQg== + /postcss-selector-parser/5.0.0: + dependencies: + cssesc: 2.0.0 + indexes-of: 1.0.1 + uniq: 1.0.1 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ== + /postcss-selector-parser/6.0.2: + dependencies: + cssesc: 3.0.0 + indexes-of: 1.0.1 + uniq: 1.0.1 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg== + /postcss-value-parser/3.3.1: + dev: false + resolution: + integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + /postcss-value-parser/4.0.2: + dev: false + resolution: + integrity: sha512-LmeoohTpp/K4UiyQCwuGWlONxXamGzCMtFxLq4W1nZVGIQLYvMCJx3yAF9qyyuFpflABI9yVdtJAqbihOsCsJQ== + /postcss/6.0.23: + dependencies: + chalk: 2.4.2 + source-map: 0.6.1 + supports-color: 5.5.0 + dev: false + engines: + node: '>=4.0.0' + resolution: + integrity: sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + /postcss/7.0.18: + dependencies: + chalk: 2.4.2 + source-map: 0.6.1 + supports-color: 6.1.0 + dev: false + engines: + node: '>=6.0.0' + resolution: + integrity: sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g== + /pouchdb-promise/6.4.3: + dependencies: + lie: 3.1.1 + dev: false + resolution: + integrity: sha512-ruJaSFXwzsxRHQfwNHjQfsj58LBOY1RzGzde4PM5CWINZwFjCQAhZwfMrch2o/0oZT6d+Xtt0HTWhq35p3b0qw== + /pouchdb-upsert/2.2.0: + dependencies: + pouchdb-promise: 6.4.3 + dev: false + resolution: + integrity: sha1-QrFeQghI87KUw1BgWJ/bUc9/f18= + /pouchdb/7.1.1: + dependencies: + argsarray: 0.0.1 + buffer-from: 1.1.0 + clone-buffer: 1.0.0 + double-ended-queue: 2.1.0-0 + fetch-cookie: 0.7.0 + immediate: 3.0.6 + inherits: 2.0.3 + level: 5.0.1 + level-codec: 9.0.1 + level-write-stream: 1.0.0 + leveldown: 5.0.2 + levelup: 4.0.2 + ltgt: 2.2.1 + node-fetch: 2.4.1 + readable-stream: 1.0.33 + spark-md5: 3.0.0 + through2: 3.0.1 + uuid: 3.2.1 + vuvuzela: 1.0.3 + dev: false + resolution: + integrity: sha512-8bXWclixNJZqokvxGHRsG19zehSJiaZaz4dVYlhXhhUctz7gMcNTElHjPBzBdZlKKvt9aFDndmXN1VVE53Co8g== + /pretty-hrtime/1.0.3: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE= + /proxy-addr/2.0.5: + dependencies: + forwarded: 0.1.2 + ipaddr.js: 1.9.0 + dev: false + engines: + node: '>= 0.10' + resolution: + integrity: sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ== + /prr/1.0.1: + dev: false + resolution: + integrity: sha1-0/wRS6BplaRexok/SEzrHXj19HY= + /psl/1.4.0: + dev: false + resolution: + integrity: sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw== + /punycode/2.1.1: + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + /qs/6.7.0: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== + /random-bytes/1.0.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= + /range-parser/1.2.1: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + /raw-body/2.4.0: + dependencies: + bytes: 3.1.0 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q== + /readable-stream/0.0.4: + dev: false + resolution: + integrity: sha1-8y124/uGM0SlSNeZIwBxc2ZbO40= + /readable-stream/1.0.33: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + resolution: + integrity: sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw= + /readable-stream/3.4.0: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + engines: + node: '>= 6' + resolution: + integrity: sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ== + /reduce-css-calc/2.1.6: + dependencies: + css-unit-converter: 1.1.1 + postcss-value-parser: 3.3.1 + dev: false + resolution: + integrity: sha512-+l5/qlQmdsbM9h6JerJ/y5vR5Ci0k93aszLNpCmbadC3nBcbRGmIBm0s9Nj59i22LvCjTGftWzdQRwdknayxhw== + /safe-buffer/5.1.2: + dev: false + resolution: + integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + /safe-buffer/5.2.0: + dev: false + resolution: + integrity: sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + /safer-buffer/2.1.2: + dev: false + resolution: + integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + /semver/5.7.1: + dev: false + hasBin: true + resolution: + integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + /send/0.17.1: + 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.3 + mime: 1.6.0 + ms: 2.1.1 + on-finished: 2.3.0 + range-parser: 1.2.1 + statuses: 1.5.0 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg== + /serve-static/1.14.1: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.17.1 + dev: false + engines: + node: '>= 0.8.0' + resolution: + integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg== + /setprototypeof/1.1.1: + dev: false + resolution: + integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + /source-map/0.6.1: + dev: false + engines: + node: '>=0.10.0' + resolution: + integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + /spark-md5/3.0.0: + dev: false + resolution: + integrity: sha1-NyIifFTi+vJLHcbZM8wUTm9xv+8= + /statuses/1.5.0: + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + /string_decoder/0.10.31: + dev: false + resolution: + integrity: sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + /string_decoder/1.3.0: + dependencies: + safe-buffer: 5.2.0 + dev: false + resolution: + integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + /supports-color/5.5.0: + dependencies: + has-flag: 3.0.0 + dev: false + engines: + node: '>=4' + resolution: + integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + /supports-color/6.1.0: + dependencies: + has-flag: 3.0.0 + dev: false + engines: + node: '>=6' + resolution: + integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + /tailwindcss/1.1.2: + dependencies: + autoprefixer: 9.6.1 + bytes: 3.1.0 + chalk: 2.4.2 + fs-extra: 8.1.0 + lodash: 4.17.15 + node-emoji: 1.10.0 + normalize.css: 8.0.1 + postcss: 7.0.18 + postcss-functions: 3.0.0 + postcss-js: 2.0.3 + postcss-nested: 4.1.2 + postcss-selector-parser: 6.0.2 + pretty-hrtime: 1.0.3 + reduce-css-calc: 2.1.6 + dev: false + engines: + node: '>=8.9.0' + hasBin: true + resolution: + integrity: sha512-mcTzZHXMipnQY9haB17baNJmBTkYYcC8ljfMdB9/97FfhKJIzlglJcyGythuQTOu7r/QIbLfZYYWZhAvaGj95A== + /through2/3.0.1: + dependencies: + readable-stream: 3.4.0 + dev: false + resolution: + integrity: sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== + /toidentifier/1.0.0: + dev: false + engines: + node: '>=0.6' + resolution: + integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + /tough-cookie/2.5.0: + dependencies: + psl: 1.4.0 + punycode: 2.1.1 + dev: false + engines: + node: '>=0.8' + resolution: + integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + /type-is/1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.24 + dev: false + engines: + node: '>= 0.6' + resolution: + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + /typedarray-to-buffer/3.1.5: + dependencies: + is-typedarray: 1.0.0 + dev: false + resolution: + integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + /uid-safe/2.1.5: + dependencies: + random-bytes: 1.0.0 + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + /uniq/1.0.1: + dev: false + resolution: + integrity: sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + /universalify/0.1.2: + dev: false + engines: + node: '>= 4.0.0' + resolution: + integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + /unpipe/1.0.0: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + /util-deprecate/1.0.2: + dev: false + resolution: + integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + /utils-merge/1.0.1: + dev: false + engines: + node: '>= 0.4.0' + resolution: + integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + /uuid/3.2.1: + dev: false + hasBin: true + resolution: + integrity: sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA== + /vary/1.1.2: + dev: false + engines: + node: '>= 0.8' + resolution: + integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + /vuvuzela/1.0.3: + dev: false + resolution: + integrity: sha1-O+FF5YJxxzylUnndhR8SpoIRSws= + /wrappy/1.0.2: + dev: false + resolution: + integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + /write-stream/0.4.3: + dependencies: + readable-stream: 0.0.4 + dev: false + resolution: + integrity: sha1-g8yMA0fQr2BXqThitOOuAd5cgcE= + /xtend/4.0.2: + dev: false + engines: + node: '>=0.4' + resolution: + integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +registry: 'https://registry.npmjs.org/' +shrinkwrapMinorVersion: 9 +shrinkwrapVersion: 3 +specifiers: + body-parser: ^1.19.0 + bulma: ^0.7.5 + connect-flash: ^0.1.1 + express: ^4.17.1 + express-session: ^1.16.2 + mime: ^2.4.4 + passport: ^0.4.0 + passport-local: ^1.0.0 + pouchdb: ^7.1.1 + pouchdb-upsert: ^2.2.0 + tailwindcss: ^1.1.2 From 68b7b46b5160458fe1e394715bdd7dc2668bbc2d Mon Sep 17 00:00:00 2001 From: Nkalish Date: Sun, 15 Sep 2019 18:56:32 -0400 Subject: [PATCH 4/5] favicon --- README.md | 67 +++++------------------------------------ package.json | 2 ++ public/favicon.png | Bin 0 -> 4056 bytes public/html/index.html | 1 + public/html/login.html | 1 + server.js | 4 ++- 6 files changed, 15 insertions(+), 60 deletions(-) create mode 100644 public/favicon.png diff --git a/README.md b/README.md index 9b257b1e..0d0e10d2 100755 --- a/README.md +++ b/README.md @@ -1,67 +1,16 @@ -Assignment 3 - Persistence: Two-tier Web Application with Flat File Database, Express server, and CSS template -=== +## Pallet Organizer -Due: September 16th, by 11:59 AM. - -This assignnment continues where we left off, extending it to use the most popular Node.js server framework (express), a flat file database suitable for small applications (lowdb), and a CSS application framework / template of your choice (Boostrap, Material Design, Semantic UI, Pure etc.) - - -Baseline Requirements ---- - -Your application is required to implement the following functionalities: - -- a `Server`, created using Express (no alternatives will be accepted for this assignment) -- a `Results` functionality which shows the entire dataset residing in the server's memory -- a `Form/Entry` functionality which allows users to add, modify, and delete data items (must be all three!) associated with their user name / account. -- Use of at least five [Express middleware packages](https://expressjs.com/en/resources/middleware.html). Explore! -- Basic authentication using the [Passport middleware](http://www.passportjs.org) for Express (this counts as one of your five middleware packages). We encourage using the Local strategy, but OAuth (Open Authentication) can also be used for additional technical achievement. The course staff cannot help you with the various flavors of OAuth strategies. YOU MUST PROVIDE US WITH ACCOUNT CREDENTIALS TO LOGIN TO YOUR APPLICATION IF YOU USE OAUTH. The course staff cannot be expected to have credentials for any particular OAuth service. -- Persistent data storage in between server sessions. [lowdb](https://github.com/typicode/lowdb) is a suitable database package for this assignment and will be discussed in class. -- Use of a [CSS framework or template](https://github.com/troxler/awesome-css-frameworks). This should do the bulk of your styling/CSS for you and be appropriate to your application. For example, don't use [NES.css](https://nostalgic-css.github.io/NES.css/) (which is awesome!) unless you're creating a game or some type of retro 80s site. - -Your application is required to demonstrate the use of the following concepts: - -HTML: -- HTML input tags and form fields of various flavors (`