diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..9800e93 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +static/libraries +patched-express-response.js \ No newline at end of file diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..5145a0a --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,18 @@ +module.exports = { + env: { + commonjs: true, + es2021: true, + node: true + }, + extends: [ + 'standard' + ], + parserOptions: { + ecmaVersion: 12 + }, + globals: { + _CC: 'readonly' + }, + rules: { + } +} diff --git a/config/index.js b/config/index.js index c78e0a8..aa3ad11 100644 --- a/config/index.js +++ b/config/index.js @@ -1,6 +1,6 @@ -require('dotenv').config(); +require('dotenv').config() -const yesNo = require('yes-no'); +const yesNo = require('yes-no') module.exports = { dbPrefix: process.env.DB_PREFIX || 'dbs/', @@ -16,4 +16,4 @@ module.exports = { wishlist: require('./wishlist'), base: (process.env.ROOT_PATH || '/').endsWith('/') ? (process.env.ROOT_PATH || '/') : `${process.env.ROOT_PATH}/`, trustProxy: process.env.TRUST_PROXY === 'true' ? true : process.env.TRUST_PROXY || 'loopback' -}; +} diff --git a/config/secret/index.js b/config/secret/index.js index 4ed0e2b..320c907 100644 --- a/config/secret/index.js +++ b/config/secret/index.js @@ -1,13 +1,13 @@ const { nanoid } = require('nanoid') -const path = require('path'); -const fs = require('fs'); +const path = require('path') +const fs = require('fs') -const secretFilePath = path.join((process.env.SECRET_DIRNAME ? process.env.SECRET_DIRNAME : __dirname), 'secret.txt'); +const secretFilePath = path.join((process.env.SECRET_DIRNAME ? process.env.SECRET_DIRNAME : __dirname), 'secret.txt') try { - module.exports = fs.readFileSync(secretFilePath).toString(); + module.exports = fs.readFileSync(secretFilePath).toString() } catch (_) { - const secret = nanoid(128); - fs.writeFileSync(secretFilePath, secret); - module.exports = secret; -} \ No newline at end of file + const secret = nanoid(128) + fs.writeFileSync(secretFilePath, secret) + module.exports = secret +} diff --git a/config/wishlist/index.js b/config/wishlist/index.js index b293cba..88cf57a 100644 --- a/config/wishlist/index.js +++ b/config/wishlist/index.js @@ -2,4 +2,4 @@ module.exports = { note: { rows: Number(process.env.WISHLIST_NOTE_ROWS) || 5 } -} \ No newline at end of file +} diff --git a/index.js b/index.js index dd97a83..67d2ef1 100644 --- a/index.js +++ b/index.js @@ -1,14 +1,13 @@ global._CC = { require } -const PouchSession = require('session-pouchdb-store'); -const LocalStrategy = require('passport-local').Strategy; -const session = require('express-session'); -const bcrypt = require('bcrypt-nodejs'); -const flash = require('connect-flash'); -const passport = require('passport'); -const express = require('express'); -const level = require('level'); +const PouchSession = require('session-pouchdb-store') +const LocalStrategy = require('passport-local').Strategy +const session = require('express-session') +const bcrypt = require('bcrypt-nodejs') +const flash = require('connect-flash') +const passport = require('passport') +const express = require('express') -const config = require('./config'); +const config = require('./config') _CC.config = config if (!config.dbPrefix.startsWith('http')) { @@ -16,44 +15,43 @@ if (!config.dbPrefix.startsWith('http')) { mkdirp(config.dbPrefix) } -const PouchDB = require('pouchdb').defaults({ prefix: config.dbPrefix }); +const PouchDB = require('pouchdb').defaults({ prefix: config.dbPrefix }) -const logger = require('./logger'); +const logger = require('./logger') -const app = express(); +const app = express() app.set('base', config.base) app.set('trust proxy', config.trustProxy) -const db = new PouchDB('users'); +const db = new PouchDB('users') passport.use('local', new LocalStrategy( (username, password, done) => { - username = username.trim(); + username = username.trim() db.get(username) .then(doc => { bcrypt.compare(password, doc.password, (err, correct) => { - if (err) return done(err); - if (!correct) return done(null, false, { message: 'Incorrect password' }); - if (correct) return done(null, doc); - }); + if (err) return done(err) + if (!correct) return done(null, false, { message: 'Incorrect password' }) + if (correct) return done(null, doc) + }) }) .catch(err => { - if (err.message === 'missing') return done(null, false, { message: 'Incorrect username.' }); - return done(err); - }); + if (err.message === 'missing') return done(null, false, { message: 'Incorrect username.' }) + return done(err) + }) } -)); +)) -passport.serializeUser((user, callback) => callback(null, user._id)); +passport.serializeUser((user, callback) => callback(null, user._id)) passport.deserializeUser((user, callback) => { db.get(user) .then(dbUser => callback(null, dbUser)) - .catch(() => callback(null, null)); -}); + .catch(() => callback(null, null)) +}) - -app.use(require('body-parser').urlencoded({ extended: true })); +app.use(require('body-parser').urlencoded({ extended: true })) app.use(session({ secret: config.secret, resave: false, @@ -63,26 +61,26 @@ app.use(session({ maxAge: config.sessionMaxAge }, name: 'christmas_community.connect.sid' -})); -app.use(flash()); -app.use(passport.initialize()); -app.use(passport.session()); +})) +app.use(flash()) +app.use(passport.initialize()) +app.use(passport.session()) -app.use(require('./middlewares/locals')); +app.use(require('./middlewares/locals')) app.use((req, res, next) => { - logger.log('express', `${req.ip} - ${req.method} ${req.originalUrl}`); - next(); -}); + logger.log('express', `${req.ip} - ${req.method} ${req.originalUrl}`) + next() +}) -app.set('view engine', 'pug'); -app.use(config.base, require('./routes')({ db, config })); +app.set('view engine', 'pug') +app.use(config.base, require('./routes')({ db, config })) app.listen(config.port, () => logger.success('express', `Express server started on port ${config.port}!`)) ;(() => { if (!config.dbExposePort) return const dbExposeApp = express() - dbExposeApp.use('/', require('express-pouchdb')(PouchDB, { inMemoryConfig: true })); + dbExposeApp.use('/', require('express-pouchdb')(PouchDB, { inMemoryConfig: true })) dbExposeApp.listen(config.dbExposePort, () => logger.success('db expose', `DB has been exposed on port ${config.dbExposePort}`)) })() diff --git a/logger.js b/logger.js index 7076ecd..64b6a59 100644 --- a/logger.js +++ b/logger.js @@ -1,12 +1,9 @@ -const chalk = require('chalk'); -const config = require('./config'); -const colors = {log: 'blue', success: 'green', error: 'red', warn: 'yellow'}; +const chalk = require('chalk') +const colors = { log: 'blue', success: 'green', error: 'red', warn: 'yellow' } -// rewrite to use Object.keys() -for (let property in colors) { - if (colors.hasOwnProperty(property)) { - module.exports[property] = (type, msg) => { - console.log(chalk.keyword(colors[property])(`[ ${type.toUpperCase()} ] ${msg}`)); - }; - } -} +Object.keys(colors).forEach( + method => // eslint-disable-line no-return-assign + module.exports[method] = + (type, msg) => + console.log(chalk.keyword(colors[method])(`[ ${type.toUpperCase()} ] ${msg}`)) +) diff --git a/manager.js b/manager.js index 004c4a4..1fe514f 100644 --- a/manager.js +++ b/manager.js @@ -3,14 +3,14 @@ const { spawn } = require('child_process') const PACKAGENAME = 'get-product-name' -async function isOutdated() { +async function isOutdated () { const command = `npm outdated ${PACKAGENAME} --json` const npm = await exec(command) const data = JSON.parse(npm.stdout) return data[PACKAGENAME]?.current !== data[PACKAGENAME]?.wanted } -async function updateGPD() { +async function updateGPD () { // https://blog.cloud66.com/using-node-with-docker/ const command = `mv ./node_modules ./node_modules.tmp && mv ./node_modules.tmp ./node_modules && npm update ${PACKAGENAME}` await exec(command) @@ -18,15 +18,15 @@ async function updateGPD() { ;(async () => { let cc = null - function spawnCC() { - cc = spawn('node', [ 'index.js' ], { env: process.env }) + function spawnCC () { + cc = spawn('node', ['index.js'], { env: process.env }) cc.on('exit', spawnCC) cc.stdout.pipe(process.stdout) cc.stderr.pipe(process.stderr) } if (process.env.UPDATE_GPD !== 'false') { - async function update() { + async function update () { if (await isOutdated()) { try { await updateGPD() @@ -38,6 +38,6 @@ async function updateGPD() { update() setInterval(update, 1000 * 60 * 60) // 1 hour } - + spawnCC() })() diff --git a/middlewares/locals.js b/middlewares/locals.js index 6abd613..834ed3b 100644 --- a/middlewares/locals.js +++ b/middlewares/locals.js @@ -1,6 +1,6 @@ -const config = require('../config'); +const config = require('../config') module.exports = (req, res, next) => { - res.locals.config = config; - res.locals.req = req; - next(); -}; + res.locals.config = config + res.locals.req = req + next() +} diff --git a/middlewares/verifyAuth.js b/middlewares/verifyAuth.js index 1dab01e..50ab33d 100644 --- a/middlewares/verifyAuth.js +++ b/middlewares/verifyAuth.js @@ -1,7 +1,7 @@ -const config = require('../config'); +const config = require('../config') module.exports = options => { return (req, res, next) => { - options = options ? options : {}; + options = options || {} let authed = false try { authed = req.isAuthenticated() @@ -10,5 +10,5 @@ module.exports = options => { } if (authed) return next() res.redirect(options.failureRedirect || config.defaultFailureRedirect) - }; -} \ No newline at end of file + } +} diff --git a/package.json b/package.json index 90064fd..49c90e4 100644 --- a/package.json +++ b/package.json @@ -36,5 +36,12 @@ "session-pouchdb-store": "^0.4.1", "u64": "^1.0.1", "yes-no": "^0.0.1" + }, + "devDependencies": { + "eslint": "^7.13.0", + "eslint-config-standard": "^16.0.1", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^4.2.1" } } diff --git a/patched-express-response.js b/patched-express-response.js index f30fe0b..d9ea176 100644 --- a/patched-express-response.js +++ b/patched-express-response.js @@ -5,41 +5,41 @@ * MIT Licensed */ -'use strict'; +'use strict' /** * Module dependencies. * @private */ -var Buffer = require('safe-buffer').Buffer -var contentDisposition = require('content-disposition'); -var deprecate = require('depd')('express'); -var encodeUrl = require('encodeurl'); -var escapeHtml = require('escape-html'); -var http = require('http'); -var isAbsolute = require('./utils').isAbsolute; -var onFinished = require('on-finished'); -var path = require('path'); -var statuses = require('statuses') -var merge = require('utils-merge'); -var sign = require('cookie-signature').sign; -var normalizeType = require('./utils').normalizeType; -var normalizeTypes = require('./utils').normalizeTypes; -var setCharset = require('./utils').setCharset; -var cookie = require('cookie'); -var send = require('send'); -var extname = path.extname; -var mime = send.mime; -var resolve = path.resolve; -var vary = require('vary'); +const Buffer = require('safe-buffer').Buffer +const contentDisposition = require('content-disposition') +const deprecate = require('depd')('express') +const encodeUrl = require('encodeurl') +const escapeHtml = require('escape-html') +const http = require('http') +const isAbsolute = require('./utils').isAbsolute +const onFinished = require('on-finished') +const path = require('path') +const statuses = require('statuses') +const merge = require('utils-merge') +const sign = require('cookie-signature').sign +const normalizeType = require('./utils').normalizeType +const normalizeTypes = require('./utils').normalizeTypes +const setCharset = require('./utils').setCharset +const cookie = require('cookie') +const send = require('send') +const extname = path.extname +const mime = send.mime +const resolve = path.resolve +const vary = require('vary') /** * Response prototype. * @public */ -var res = Object.create(http.ServerResponse.prototype) +const res = Object.create(http.ServerResponse.prototype) /** * Module exports. @@ -53,7 +53,7 @@ module.exports = res * @private */ -var charsetRegExp = /;\s*charset\s*=/; +const charsetRegExp = /;\s*charset\s*=/ /** * Set status `code`. @@ -63,10 +63,10 @@ var charsetRegExp = /;\s*charset\s*=/; * @public */ -res.status = function status(code) { - this.statusCode = code; - return this; -}; +res.status = function status (code) { + this.statusCode = code + return this +} /** * Set Link header field with the given `links`. @@ -83,13 +83,13 @@ res.status = function status(code) { * @public */ -res.links = function(links){ - var link = this.get('Link') || ''; - if (link) link += ', '; - return this.set('Link', link + Object.keys(links).map(function(rel){ - return '<' + links[rel] + '>; rel="' + rel + '"'; - }).join(', ')); -}; +res.links = function (links) { + let link = this.get('Link') || '' + if (link) link += ', ' + return this.set('Link', link + Object.keys(links).map(function (rel) { + return '<' + links[rel] + '>; rel="' + rel + '"' + }).join(', ')) +} /** * Send a response. @@ -104,25 +104,25 @@ res.links = function(links){ * @public */ -res.send = function send(body) { - var chunk = body; - var encoding; - var req = this.req; - var type; +res.send = function send (body) { + let chunk = body + let encoding + const req = this.req + let type // settings - var app = this.app; + const app = this.app // allow status / body if (arguments.length === 2) { // res.send(body, status) backwards compat if (typeof arguments[0] !== 'number' && typeof arguments[1] === 'number') { - deprecate('res.send(body, status): Use res.status(status).send(body) instead'); - this.statusCode = arguments[1]; + deprecate('res.send(body, status): Use res.status(status).send(body) instead') + this.statusCode = arguments[1] } else { - deprecate('res.send(status, body): Use res.status(status).send(body) instead'); - this.statusCode = arguments[0]; - chunk = arguments[1]; + deprecate('res.send(status, body): Use res.status(status).send(body) instead') + this.statusCode = arguments[0] + chunk = arguments[1] } } @@ -130,11 +130,11 @@ res.send = function send(body) { if (typeof chunk === 'number' && arguments.length === 1) { // res.send(status) will set status message as text string if (!this.get('Content-Type')) { - this.type('txt'); + this.type('txt') } - deprecate('res.send(status): Use res.sendStatus(status) instead'); - this.statusCode = chunk; + deprecate('res.send(status): Use res.sendStatus(status) instead') + this.statusCode = chunk chunk = statuses[chunk] } @@ -142,41 +142,41 @@ res.send = function send(body) { // string defaulting to html case 'string': if (!this.get('Content-Type')) { - this.type('html'); + this.type('html') } - break; + break case 'boolean': case 'number': case 'object': if (chunk === null) { - chunk = ''; + chunk = '' } else if (Buffer.isBuffer(chunk)) { if (!this.get('Content-Type')) { - this.type('bin'); + this.type('bin') } } else { - return this.json(chunk); + return this.json(chunk) } - break; + break } // write strings in utf-8 if (typeof chunk === 'string') { - encoding = 'utf8'; - type = this.get('Content-Type'); + encoding = 'utf8' + type = this.get('Content-Type') // reflect this in content-type if (typeof type === 'string') { - this.set('Content-Type', setCharset(type, 'utf-8')); + this.set('Content-Type', setCharset(type, 'utf-8')) } } // determine if ETag should be generated - var etagFn = app.get('etag fn') - var generateETag = !this.get('ETag') && typeof etagFn === 'function' + const etagFn = app.get('etag fn') + const generateETag = !this.get('ETag') && typeof etagFn === 'function' // populate Content-Length - var len + let len if (chunk !== undefined) { if (Buffer.isBuffer(chunk)) { // get length of Buffer @@ -187,42 +187,42 @@ res.send = function send(body) { } else { // convert chunk to Buffer and calculate chunk = Buffer.from(chunk, encoding) - encoding = undefined; + encoding = undefined len = chunk.length } - this.set('Content-Length', len); + this.set('Content-Length', len) } // populate ETag - var etag; + let etag if (generateETag && len !== undefined) { if ((etag = etagFn(chunk, encoding))) { - this.set('ETag', etag); + this.set('ETag', etag) } } // freshness - if (req.fresh) this.statusCode = 304; + if (req.fresh) this.statusCode = 304 // strip irrelevant headers - if (204 === this.statusCode || 304 === this.statusCode) { - this.removeHeader('Content-Type'); - this.removeHeader('Content-Length'); - this.removeHeader('Transfer-Encoding'); - chunk = ''; + if (this.statusCode === 204 || this.statusCode === 304) { + this.removeHeader('Content-Type') + this.removeHeader('Content-Length') + this.removeHeader('Transfer-Encoding') + chunk = '' } if (req.method === 'HEAD') { // skip body for HEAD - this.end(); + this.end() } else { // respond - this.end(chunk, encoding); + this.end(chunk, encoding) } - return this; -}; + return this +} /** * Send JSON response. @@ -236,36 +236,36 @@ res.send = function send(body) { * @public */ -res.json = function json(obj) { - var val = obj; +res.json = function json (obj) { + let val = obj // allow status / body if (arguments.length === 2) { // res.json(body, status) backwards compat if (typeof arguments[1] === 'number') { - deprecate('res.json(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; + deprecate('res.json(obj, status): Use res.status(status).json(obj) instead') + this.statusCode = arguments[1] } else { - deprecate('res.json(status, obj): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; + deprecate('res.json(status, obj): Use res.status(status).json(obj) instead') + this.statusCode = arguments[0] + val = arguments[1] } } // settings - var app = this.app; - var escape = app.get('json escape') - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = stringify(val, replacer, spaces, escape) + const app = this.app + const escape = app.get('json escape') + const replacer = app.get('json replacer') + const spaces = app.get('json spaces') + const body = stringify(val, replacer, spaces, escape) // content-type if (!this.get('Content-Type')) { - this.set('Content-Type', 'application/json'); + this.set('Content-Type', 'application/json') } - return this.send(body); -}; + return this.send(body) +} /** * Send JSON response with JSONP callback support. @@ -279,61 +279,61 @@ res.json = function json(obj) { * @public */ -res.jsonp = function jsonp(obj) { - var val = obj; +res.jsonp = function jsonp (obj) { + let val = obj // allow status / body if (arguments.length === 2) { // res.json(body, status) backwards compat if (typeof arguments[1] === 'number') { - deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead'); - this.statusCode = arguments[1]; + deprecate('res.jsonp(obj, status): Use res.status(status).json(obj) instead') + this.statusCode = arguments[1] } else { - deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead'); - this.statusCode = arguments[0]; - val = arguments[1]; + deprecate('res.jsonp(status, obj): Use res.status(status).jsonp(obj) instead') + this.statusCode = arguments[0] + val = arguments[1] } } // settings - var app = this.app; - var escape = app.get('json escape') - var replacer = app.get('json replacer'); - var spaces = app.get('json spaces'); - var body = stringify(val, replacer, spaces, escape) - var callback = this.req.query[app.get('jsonp callback name')]; + const app = this.app + const escape = app.get('json escape') + const replacer = app.get('json replacer') + const spaces = app.get('json spaces') + let body = stringify(val, replacer, spaces, escape) + let callback = this.req.query[app.get('jsonp callback name')] // content-type if (!this.get('Content-Type')) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'application/json'); + this.set('X-Content-Type-Options', 'nosniff') + this.set('Content-Type', 'application/json') } // fixup callback if (Array.isArray(callback)) { - callback = callback[0]; + callback = callback[0] } // jsonp if (typeof callback === 'string' && callback.length !== 0) { - this.set('X-Content-Type-Options', 'nosniff'); - this.set('Content-Type', 'text/javascript'); + this.set('X-Content-Type-Options', 'nosniff') + this.set('Content-Type', 'text/javascript') // restrict callback charset - callback = callback.replace(/[^\[\]\w$.]/g, ''); + callback = callback.replace(/[^\[\]\w$.]/g, '') // replace chars not allowed in JavaScript that are in JSON body = body .replace(/\u2028/g, '\\u2028') - .replace(/\u2029/g, '\\u2029'); + .replace(/\u2029/g, '\\u2029') // the /**/ is a specific security mitigation for "Rosetta Flash JSONP abuse" // the typeof check is just to reduce client error noise - body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');'; + body = '/**/ typeof ' + callback + ' === \'function\' && ' + callback + '(' + body + ');' } - return this.send(body); -}; + return this.send(body) +} /** * Send given HTTP status code. @@ -350,14 +350,14 @@ res.jsonp = function jsonp(obj) { * @public */ -res.sendStatus = function sendStatus(statusCode) { - var body = statuses[statusCode] || String(statusCode) +res.sendStatus = function sendStatus (statusCode) { + const body = statuses[statusCode] || String(statusCode) - this.statusCode = statusCode; - this.type('txt'); + this.statusCode = statusCode + this.type('txt') - return this.send(body); -}; + return this.send(body) +} /** * Transfer the file at the given `path`. @@ -400,15 +400,15 @@ res.sendStatus = function sendStatus(statusCode) { * @public */ -res.sendFile = function sendFile(path, options, callback) { - var done = callback; - var req = this.req; - var res = this; - var next = req.next; - var opts = options || {}; +res.sendFile = function sendFile (path, options, callback) { + let done = callback + const req = this.req + const res = this + const next = req.next + let opts = options || {} if (!path) { - throw new TypeError('path argument is required to res.sendFile'); + throw new TypeError('path argument is required to res.sendFile') } if (typeof path !== 'string') { @@ -417,29 +417,29 @@ res.sendFile = function sendFile(path, options, callback) { // support function as second arg if (typeof options === 'function') { - done = options; - opts = {}; + done = options + opts = {} } if (!opts.root && !isAbsolute(path)) { - throw new TypeError('path must be absolute or specify root to res.sendFile'); + throw new TypeError('path must be absolute or specify root to res.sendFile') } // create file stream - var pathname = encodeURI(path); - var file = send(req, pathname, opts); + const pathname = encodeURI(path) + const file = send(req, pathname, opts) // transfer sendfile(res, file, opts, function (err) { - if (done) return done(err); - if (err && err.code === 'EISDIR') return next(); + if (done) return done(err) + if (err && err.code === 'EISDIR') return next() // next() all but write errors if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') { - next(err); + next(err) } - }); -}; + }) +} /** * Transfer the file at the given `path`. @@ -483,35 +483,35 @@ res.sendFile = function sendFile(path, options, callback) { */ res.sendfile = function (path, options, callback) { - var done = callback; - var req = this.req; - var res = this; - var next = req.next; - var opts = options || {}; + let done = callback + const req = this.req + const res = this + const next = req.next + let opts = options || {} // support function as second arg if (typeof options === 'function') { - done = options; - opts = {}; + done = options + opts = {} } // create file stream - var file = send(req, path, opts); + const file = send(req, path, opts) // transfer sendfile(res, file, opts, function (err) { - if (done) return done(err); - if (err && err.code === 'EISDIR') return next(); + if (done) return done(err) + if (err && err.code === 'EISDIR') return next() // next() all but write errors if (err && err.code !== 'ECONNABORTED' && err.syscall !== 'write') { - next(err); + next(err) } - }); -}; + }) +} res.sendfile = deprecate.function(res.sendfile, - 'res.sendfile: Use res.sendFile instead'); + 'res.sendfile: Use res.sendFile instead') /** * Transfer the file at the given `path` as an attachment. @@ -532,14 +532,14 @@ res.sendfile = deprecate.function(res.sendfile, */ res.download = function download (path, filename, options, callback) { - var done = callback; - var name = filename; - var opts = options || null + let done = callback + let name = filename + let opts = options || null // support function as second or third arg if (typeof filename === 'function') { - done = filename; - name = null; + done = filename + name = null opts = null } else if (typeof options === 'function') { done = options @@ -547,15 +547,15 @@ res.download = function download (path, filename, options, callback) { } // set Content-Disposition when file is sent - var headers = { + const headers = { 'Content-Disposition': contentDisposition(name || path) - }; + } // merge user-provided headers if (opts && opts.headers) { - var keys = Object.keys(opts.headers) - for (var i = 0; i < keys.length; i++) { - var key = keys[i] + const keys = Object.keys(opts.headers) + for (let i = 0; i < keys.length; i++) { + const key = keys[i] if (key.toLowerCase() !== 'content-disposition') { headers[key] = opts.headers[key] } @@ -567,11 +567,11 @@ res.download = function download (path, filename, options, callback) { opts.headers = headers // Resolve the full path for sendFile - var fullPath = resolve(path); + const fullPath = resolve(path) // send file return this.sendFile(fullPath, opts, done) -}; +} /** * Set _Content-Type_ response header with `type` through `mime.lookup()` @@ -591,13 +591,13 @@ res.download = function download (path, filename, options, callback) { */ res.contentType = -res.type = function contentType(type) { - var ct = type.indexOf('/') === -1 +res.type = function contentType (type) { + const ct = type.indexOf('/') === -1 ? mime.lookup(type) - : type; + : type - return this.set('Content-Type', ct); -}; + return this.set('Content-Type', ct) +} /** * Respond to the Acceptable formats using an `obj` @@ -656,34 +656,34 @@ res.type = function contentType(type) { * @public */ -res.format = function(obj){ - var req = this.req; - var next = req.next; +res.format = function (obj) { + const req = this.req + const next = req.next - var fn = obj.default; - if (fn) delete obj.default; - var keys = Object.keys(obj); + const fn = obj.default + if (fn) delete obj.default + const keys = Object.keys(obj) - var key = keys.length > 0 + const key = keys.length > 0 ? req.accepts(keys) - : false; + : false - this.vary("Accept"); + this.vary('Accept') if (key) { - this.set('Content-Type', normalizeType(key).value); - obj[key](req, this, next); + this.set('Content-Type', normalizeType(key).value) + obj[key](req, this, next) } else if (fn) { - fn(); + fn() } else { - var err = new Error('Not Acceptable'); - err.status = err.statusCode = 406; - err.types = normalizeTypes(keys).map(function(o){ return o.value }); - next(err); + const err = new Error('Not Acceptable') + err.status = err.statusCode = 406 + err.types = normalizeTypes(keys).map(function (o) { return o.value }) + next(err) } - return this; -}; + return this +} /** * Set _Content-Disposition_ header to _attachment_ with optional `filename`. @@ -693,15 +693,15 @@ res.format = function(obj){ * @public */ -res.attachment = function attachment(filename) { +res.attachment = function attachment (filename) { if (filename) { - this.type(extname(filename)); + this.type(extname(filename)) } - this.set('Content-Disposition', contentDisposition(filename)); + this.set('Content-Disposition', contentDisposition(filename)) - return this; -}; + return this +} /** * Append additional header `field` with value `val`. @@ -718,19 +718,19 @@ res.attachment = function attachment(filename) { * @public */ -res.append = function append(field, val) { - var prev = this.get(field); - var value = val; +res.append = function append (field, val) { + const prev = this.get(field) + let value = val if (prev) { // concat the new and prev vals value = Array.isArray(prev) ? prev.concat(val) : Array.isArray(val) ? [prev].concat(val) - : [prev, val]; + : [prev, val] } - return this.set(field, value); -}; + return this.set(field, value) +} /** * Set header `field` to `val`, or pass @@ -751,31 +751,31 @@ res.append = function append(field, val) { */ res.set = -res.header = function header(field, val) { +res.header = function header (field, val) { if (arguments.length === 2) { - var value = Array.isArray(val) + let value = Array.isArray(val) ? val.map(String) - : String(val); + : String(val) // add charset to content-type if (field.toLowerCase() === 'content-type') { if (Array.isArray(value)) { - throw new TypeError('Content-Type cannot be set to an Array'); + throw new TypeError('Content-Type cannot be set to an Array') } if (!charsetRegExp.test(value)) { - var charset = mime.charsets.lookup(value.split(';')[0]); - if (charset) value += '; charset=' + charset.toLowerCase(); + const charset = mime.charsets.lookup(value.split(';')[0]) + if (charset) value += '; charset=' + charset.toLowerCase() } } - this.setHeader(field, value); + this.setHeader(field, value) } else { - for (var key in field) { - this.set(key, field[key]); + for (const key in field) { + this.set(key, field[key]) } } - return this; -}; + return this +} /** * Get value for header `field`. @@ -785,9 +785,9 @@ res.header = function header(field, val) { * @public */ -res.get = function(field){ - return this.getHeader(field); -}; +res.get = function (field) { + return this.getHeader(field) +} /** * Clear cookie `name`. @@ -798,11 +798,11 @@ res.get = function(field){ * @public */ -res.clearCookie = function clearCookie(name, options) { - var opts = merge({ expires: new Date(1), path: '/' }, options); +res.clearCookie = function clearCookie (name, options) { + const opts = merge({ expires: new Date(1), path: '/' }, options) - return this.cookie(name, '', opts); -}; + return this.cookie(name, '', opts) +} /** * Set cookie `name` to `value`, with the given `options`. @@ -829,35 +829,35 @@ res.clearCookie = function clearCookie(name, options) { */ res.cookie = function (name, value, options) { - var opts = merge({}, options); - var secret = this.req.secret; - var signed = opts.signed; + const opts = merge({}, options) + const secret = this.req.secret + const signed = opts.signed if (signed && !secret) { - throw new Error('cookieParser("secret") required for signed cookies'); + throw new Error('cookieParser("secret") required for signed cookies') } - var val = typeof value === 'object' + let val = typeof value === 'object' ? 'j:' + JSON.stringify(value) - : String(value); + : String(value) if (signed) { - val = 's:' + sign(val, secret); + val = 's:' + sign(val, secret) } if ('maxAge' in opts) { - opts.expires = new Date(Date.now() + opts.maxAge); - opts.maxAge /= 1000; + opts.expires = new Date(Date.now() + opts.maxAge) + opts.maxAge /= 1000 } if (opts.path == null) { - opts.path = '/'; + opts.path = '/' } - this.append('Set-Cookie', cookie.serialize(name, String(val), opts)); + this.append('Set-Cookie', cookie.serialize(name, String(val), opts)) - return this; -}; + return this +} /** * Set the location header to `url`. @@ -876,17 +876,17 @@ res.cookie = function (name, value, options) { * @public */ -res.location = function location(url) { - var loc = url; +res.location = function location (url) { + let loc = url // "back" is an alias for the referrer if (url === 'back') { - loc = this.req.get('Referrer') || '/'; + loc = this.req.get('Referrer') || '/' } // set location - return this.set('Location', encodeUrl(loc)); -}; + return this.set('Location', encodeUrl(loc)) +} /** * Redirect to the given `url` with optional response `status` @@ -906,55 +906,55 @@ res.location = function location(url) { * @public */ -res.redirect = function redirect(url) { - var address = url; +res.redirect = function redirect (url) { + let address = url const base = this.req.app.set('base') if (base && address.startsWith('/')) address = base + address.substr(1) - var body; - var status = 302; + let body + let status = 302 // allow status / url if (arguments.length === 2) { if (typeof arguments[0] === 'number') { - status = arguments[0]; - address = arguments[1]; + status = arguments[0] + address = arguments[1] } else { - deprecate('res.redirect(url, status): Use res.redirect(status, url) instead'); - status = arguments[1]; + deprecate('res.redirect(url, status): Use res.redirect(status, url) instead') + status = arguments[1] } } // Set location header - address = this.location(address).get('Location'); + address = this.location(address).get('Location') // Support text/{plain,html} by default this.format({ - text: function(){ + text: function () { body = statuses[status] + '. Redirecting to ' + address }, - html: function(){ - var u = escapeHtml(address); + html: function () { + const u = escapeHtml(address) body = '
' + statuses[status] + '. Redirecting to ' + u + '
' }, - default: function(){ - body = ''; + default: function () { + body = '' } - }); + }) // Respond - this.statusCode = status; - this.set('Content-Length', Buffer.byteLength(body)); + this.statusCode = status + this.set('Content-Length', Buffer.byteLength(body)) if (this.req.method === 'HEAD') { - this.end(); + this.end() } else { - this.end(body); + this.end(body) } -}; +} /** * Add `field` to Vary. If already present in the Vary set, then @@ -965,17 +965,17 @@ res.redirect = function redirect(url) { * @public */ -res.vary = function(field){ +res.vary = function (field) { // checks for back-compat if (!field || (Array.isArray(field) && !field.length)) { - deprecate('res.vary(): Provide a field name'); - return this; + deprecate('res.vary(): Provide a field name') + return this } - vary(this, field); + vary(this, field) - return this; -}; + return this +} /** * Render `view` with the given `options` and optional callback `fn`. @@ -990,121 +990,121 @@ res.vary = function(field){ * @public */ -res.render = function render(view, options, callback) { - var app = this.req.app; - var done = callback; - var opts = options || {}; - var req = this.req; - var self = this; +res.render = function render (view, options, callback) { + const app = this.req.app + let done = callback + let opts = options || {} + const req = this.req + const self = this // support callback function as second arg if (typeof options === 'function') { - done = options; - opts = {}; + done = options + opts = {} } // merge res.locals - opts._locals = self.locals; + opts._locals = self.locals // default callback to respond done = done || function (err, str) { - if (err) return req.next(err); - self.send(str); - }; + if (err) return req.next(err) + self.send(str) + } // render - app.render(view, opts, done); -}; + app.render(view, opts, done) +} // pipe the send file stream -function sendfile(res, file, options, callback) { - var done = false; - var streaming; +function sendfile (res, file, options, callback) { + let done = false + let streaming // request aborted - function onaborted() { - if (done) return; - done = true; + function onaborted () { + if (done) return + done = true - var err = new Error('Request aborted'); - err.code = 'ECONNABORTED'; - callback(err); + const err = new Error('Request aborted') + err.code = 'ECONNABORTED' + callback(err) } // directory - function ondirectory() { - if (done) return; - done = true; + function ondirectory () { + if (done) return + done = true - var err = new Error('EISDIR, read'); - err.code = 'EISDIR'; - callback(err); + const err = new Error('EISDIR, read') + err.code = 'EISDIR' + callback(err) } // errors - function onerror(err) { - if (done) return; - done = true; - callback(err); + function onerror (err) { + if (done) return + done = true + callback(err) } // ended - function onend() { - if (done) return; - done = true; - callback(); + function onend () { + if (done) return + done = true + callback() } // file - function onfile() { - streaming = false; + function onfile () { + streaming = false } // finished - function onfinish(err) { - if (err && err.code === 'ECONNRESET') return onaborted(); - if (err) return onerror(err); - if (done) return; + function onfinish (err) { + if (err && err.code === 'ECONNRESET') return onaborted() + if (err) return onerror(err) + if (done) return setImmediate(function () { if (streaming !== false && !done) { - onaborted(); - return; + onaborted() + return } - if (done) return; - done = true; - callback(); - }); + if (done) return + done = true + callback() + }) } // streaming - function onstream() { - streaming = true; + function onstream () { + streaming = true } - file.on('directory', ondirectory); - file.on('end', onend); - file.on('error', onerror); - file.on('file', onfile); - file.on('stream', onstream); - onFinished(res, onfinish); + file.on('directory', ondirectory) + file.on('end', onend) + file.on('error', onerror) + file.on('file', onfile) + file.on('stream', onstream) + onFinished(res, onfinish) if (options.headers) { // set headers on successful transfer - file.on('headers', function headers(res) { - var obj = options.headers; - var keys = Object.keys(obj); + file.on('headers', function headers (res) { + const obj = options.headers + const keys = Object.keys(obj) - for (var i = 0; i < keys.length; i++) { - var k = keys[i]; - res.setHeader(k, obj[k]); + for (let i = 0; i < keys.length; i++) { + const k = keys[i] + res.setHeader(k, obj[k]) } - }); + }) } // pipe - file.pipe(res); + file.pipe(res) } /** @@ -1122,9 +1122,9 @@ function sendfile(res, file, options, callback) { function stringify (value, replacer, spaces, escape) { // v8 checks arguments.length for optimizing simple call // https://bugs.chromium.org/p/v8/issues/detail?id=4730 - var json = replacer || spaces + let json = replacer || spaces ? JSON.stringify(value, replacer, spaces) - : JSON.stringify(value); + : JSON.stringify(value) if (escape) { json = json.replace(/[<>&]/g, function (c) { diff --git a/routes/adminSettings/index.js b/routes/adminSettings/index.js index 4e43dc7..a7a45c3 100644 --- a/routes/adminSettings/index.js +++ b/routes/adminSettings/index.js @@ -1,31 +1,30 @@ -const verifyAuth = require('../../middlewares/verifyAuth'); -const bcrypt = require('bcrypt-nodejs'); -const express = require('express'); +const verifyAuth = require('../../middlewares/verifyAuth') +const express = require('express') const { nanoid } = require('nanoid') const SECRET_TOKEN_LENGTH = 32 const SECRET_TOKEN_LIFETIME = // One week, approximately. Doesn't need to be perfect. - 1000 // milliseconds - * 60 // seconds - * 60 // minutes - * 24 // hours - * 07 // days + 1000 * // milliseconds + 60 * // seconds + 60 * // minutes + 24 * // hours + 7 // days module.exports = (db) => { - const router = express.Router(); + const router = express.Router() router.get('/', verifyAuth(), (req, res) => { - if (!req.user.admin) return res.redirect('/'); + if (!req.user.admin) return res.redirect('/') db.allDocs({ include_docs: true }) .then(docs => { res.render('adminSettings', { title: 'Admin Settings', users: docs.rows }) }) - .catch(err => { throw err; }); - }); + .catch(err => { throw err }) + }) router.post('/add', verifyAuth(), async (req, res) => { - if (!req.user.admin) return res.redirect('/'); + if (!req.user.admin) return res.redirect('/') await db.put({ _id: req.body.newUserUsername.trim(), admin: false, @@ -33,44 +32,44 @@ module.exports = (db) => { signupToken: nanoid(SECRET_TOKEN_LENGTH), expiry: new Date().getTime() + SECRET_TOKEN_LIFETIME - - }); + + }) res.redirect(`/admin-settings/edit/${req.body.newUserUsername.trim()}`) - }); + }) router.get('/edit/:userToEdit', verifyAuth(), async (req, res) => { - if (!req.user.admin) return res.redirect('/'); + if (!req.user.admin) return res.redirect('/') const doc = await db.get(req.params.userToEdit) delete doc.password - res.render('admin-user-edit', { user: doc }); - }); + res.render('admin-user-edit', { user: doc }) + }) router.post('/edit/refresh-signup-token/:userToEdit', verifyAuth(), async (req, res) => { - if (!req.user.admin) return res.redirect('/'); + if (!req.user.admin) return res.redirect('/') const doc = await db.get(req.params.userToEdit) doc.signupToken = nanoid(SECRET_TOKEN_LENGTH) doc.expiry = new Date().getTime() + SECRET_TOKEN_LIFETIME await db.put(doc) return res.redirect(`/admin-settings/edit/${req.params.userToEdit}`) - }); + }) router.post('/edit/resetpw/:userToEdit', verifyAuth(), async (req, res) => { - if (!req.user.admin) return res.redirect('/'); + if (!req.user.admin) return res.redirect('/') const doc = await db.get(req.params.userToEdit) doc.pwToken = nanoid(SECRET_TOKEN_LENGTH) doc.pwExpiry = new Date().getTime() + SECRET_TOKEN_LIFETIME await db.put(doc) return res.redirect(`/admin-settings/edit/${req.params.userToEdit}`) - }); + }) router.post('/edit/cancelresetpw/:userToEdit', verifyAuth(), async (req, res) => { - if (!req.user.admin) return res.redirect('/'); + if (!req.user.admin) return res.redirect('/') const doc = await db.get(req.params.userToEdit) delete doc.pwToken delete doc.pwExpiry await db.put(doc) return res.redirect(`/admin-settings/edit/${req.params.userToEdit}`) - }); + }) router.post('/edit/rename/:userToRename', verifyAuth(), async (req, res) => { if (!req.user.admin && req.user._id !== req.params.userToRename) return res.redirect('/') @@ -104,7 +103,7 @@ module.exports = (db) => { await db.bulkDocs(usersBulk) await db.remove(await db.get(oldName)) - + await req.flash('success', 'Renamed user!') return res.redirect(`/wishlist/${newName}`) } catch (error) { @@ -119,7 +118,7 @@ module.exports = (db) => { }) router.post('/edit/impersonate/:userToEdit', verifyAuth(), async (req, res) => { - if (!req.user.admin) return res.redirect('/'); + if (!req.user.admin) return res.redirect('/') req.login({ _id: req.params.userToEdit }, err => { if (err) { req.flash('error', err.message) @@ -128,29 +127,29 @@ module.exports = (db) => { req.flash('success', `You are now ${req.params.userToEdit}.`) res.redirect('/') }) - }); + }) router.post('/edit/remove/:userToRemove', verifyAuth(), async (req, res) => { - if (!req.user.admin) return res.redirect('/'); - const doc = await db.get(req.params.userToRemove); + if (!req.user.admin) return res.redirect('/') + const doc = await db.get(req.params.userToRemove) if (doc.admin) { - req.flash('error', 'Failed to remove: user is admin.'); - return res.redirect('/admin-settings'); + req.flash('error', 'Failed to remove: user is admin.') + return res.redirect('/admin-settings') } - await db.remove(doc); - const docs = await db.allDocs({ include_docs: true }); - for (let i = 0; i < docs.length; i++) { - for (let j = 0; j < docs[i].doc.wishlist.length; j++) { - if (docs[i].doc.wishlist[j].pledgedBy === req.params.userToRemove) { - docs[i].doc.wishlist[j].pledgedBy === undefined; - if (docs[i].doc.wishlist[j].addedBy === req.params.userToRemove) await db.remove(doc); - else await db.put(docs[i].doc); + await db.remove(doc) + const { rows } = await db.allDocs({ include_docs: true }) + for (let i = 0; i < rows.length; i++) { + for (let j = 0; j < rows[i].doc.wishlist.length; j++) { + if (rows[i].doc.wishlist[j].pledgedBy === req.params.userToRemove) { + rows[i].doc.wishlist[j].pledgedBy = undefined + if (rows[i].doc.wishlist[j].addedBy === req.params.userToRemove) rows[i].doc.wishlist.splice(j, 1) + await db.put(rows[i].doc) } } } - req.flash('success', `Successfully removed user ${req.params.userToRemove}`); + req.flash('success', `Successfully removed user ${req.params.userToRemove}`) res.redirect('/admin-settings') - }); + }) - return router; -}; \ No newline at end of file + return router +} diff --git a/routes/api/index.js b/routes/api/index.js index 029d3d8..8b6acb4 100644 --- a/routes/api/index.js +++ b/routes/api/index.js @@ -1,9 +1,8 @@ -const verifyAuth = require('../../middlewares/verifyAuth'); -const express = require('express'); -const path = require('path'); +const verifyAuth = require('../../middlewares/verifyAuth') +const express = require('express') module.exports = ({ db, config }) => { - const router = express.Router(); + const router = express.Router() router.use(verifyAuth()) @@ -13,7 +12,7 @@ module.exports = ({ db, config }) => { }) }) - router.use('/wishlist', require('./wishlist')({ db })); + router.use('/wishlist', require('./wishlist')({ db })) - return router; -} \ No newline at end of file + return router +} diff --git a/routes/api/wishlist/index.js b/routes/api/wishlist/index.js index 8faa0d9..3fcd42b 100644 --- a/routes/api/wishlist/index.js +++ b/routes/api/wishlist/index.js @@ -1,8 +1,6 @@ -const verifyAuth = require('../../../middlewares/verifyAuth') const express = require('express') -const path = require('path') -module.exports = ({ db, config }) => { +module.exports = ({ db }) => { const router = express.Router() router.get('/', (req, res) => { @@ -19,12 +17,12 @@ module.exports = ({ db, config }) => { if (req.params.direction === 'up') wishlist.reverse() let moveFromIndex wishlist.forEach(wish => { - if (wish.id === req.params.id) return moveFromIndex = wishlist.indexOf(wish) + if (wish.id === req.params.id) moveFromIndex = wishlist.indexOf(wish) }) const moveToIndex = wishlist.findIndex(wish => { - return ( wishlist.indexOf(wish) > moveFromIndex && wish.addedBy === req.user._id ) + return (wishlist.indexOf(wish) > moveFromIndex && wish.addedBy === req.user._id) }) - if (moveToIndex < 0 || moveToIndex > wishlist.length) return res.send({ error: 'Invalid move '}) + if (moveToIndex < 0 || moveToIndex > wishlist.length) return res.send({ error: 'Invalid move ' }) const original = wishlist[moveToIndex] wishlist[moveToIndex] = wishlist[moveFromIndex] wishlist[moveFromIndex] = original @@ -39,4 +37,4 @@ module.exports = ({ db, config }) => { }) return router -} \ No newline at end of file +} diff --git a/routes/confirm-account/index.js b/routes/confirm-account/index.js index 5ba62e0..0f5c464 100644 --- a/routes/confirm-account/index.js +++ b/routes/confirm-account/index.js @@ -1,8 +1,8 @@ -const bcrypt = require('bcrypt-nodejs'); -const express = require('express'); +const bcrypt = require('bcrypt-nodejs') +const express = require('express') module.exports = (db) => { - const router = express.Router(); + const router = express.Router() router.get('/:code', async (req, res) => { const row = (await db.allDocs({ include_docs: true })) @@ -10,7 +10,7 @@ module.exports = (db) => { .find(({ doc }) => doc.signupToken === req.params.code) res.render('confirm-account', { doc: row ? row.doc : undefined }) - }); + }) router.post('/:code', async (req, res) => { const { doc } = (await db.allDocs({ include_docs: true })) @@ -20,7 +20,7 @@ module.exports = (db) => { if (doc.expiry < new Date().getTime()) return res.redirect(`/confirm-account/${req.params.code}`) bcrypt.hash(req.body.password, null, null, async (err, passwordHash) => { - if (err) throw err; + if (err) throw err doc.password = passwordHash delete doc.signupToken @@ -34,11 +34,11 @@ module.exports = (db) => { req.flash('error', err.message) return res.redirect('/') } - req.flash('success', `Welcome to ${_CC.config.siteTitle}!`); - res.redirect('/'); + req.flash('success', `Welcome to ${_CC.config.siteTitle}!`) + res.redirect('/') }) - }); - }); + }) + }) - return router; -}; \ No newline at end of file + return router +} diff --git a/routes/index.js b/routes/index.js index 126f4ef..3bd1a40 100644 --- a/routes/index.js +++ b/routes/index.js @@ -1,44 +1,44 @@ -const verifyAuth = require('../middlewares/verifyAuth'); -const express = require('express'); -const path = require('path'); +const verifyAuth = require('../middlewares/verifyAuth') +const express = require('express') +const path = require('path') module.exports = ({ db, config }) => { - const router = express.Router(); + const router = express.Router() - router.use('/', express.static(path.join(__dirname, '../static'))); + router.use('/', express.static(path.join(__dirname, '../static'))) router.get('/', async (req, res, next) => { - dbInfo = await db.info(); + const dbInfo = await db.info() if (dbInfo.doc_count === 0) { - res.redirect('/setup'); + res.redirect('/setup') } else { - next(); + next() } }, verifyAuth(), (req, res) => { - res.redirect('/wishlist'); + res.redirect('/wishlist') } - ); + ) router.use('/api', require('./api')({ db })) - router.use('/setup', require('./setup')(db)); + router.use('/setup', require('./setup')(db)) - router.use('/login', require('./login')()); - router.use('/logout', require('./logout')()); - router.use('/resetpw', require('./resetpw')(db)); - router.use('/confirm-account', require('./confirm-account')(db)); + router.use('/login', require('./login')()) + router.use('/logout', require('./logout')()) + router.use('/resetpw', require('./resetpw')(db)) + router.use('/confirm-account', require('./confirm-account')(db)) - router.use('/wishlist', require('./wishlist')(db)); + router.use('/wishlist', require('./wishlist')(db)) router.use('/supported-sites', require('./supported-sites')()) - router.use('/profile', require('./profile')(db)); + router.use('/profile', require('./profile')(db)) - router.use('/admin-settings', require('./adminSettings')(db)); + router.use('/admin-settings', require('./adminSettings')(db)) router.use('/manifest.json', require('./manifest.json')({ config })) - return router; -} \ No newline at end of file + return router +} diff --git a/routes/login/index.js b/routes/login/index.js index 1b32eb0..5d0217e 100644 --- a/routes/login/index.js +++ b/routes/login/index.js @@ -1,29 +1,29 @@ -const passport = require('passport'); -const express = require('express'); +const passport = require('passport') +const express = require('express') module.exports = () => { - const router = express.Router(); + const router = express.Router() router.get('/', (req, res) => { if (req.isAuthenticated()) { - res.redirect('/'); + res.redirect('/') } else { - res.render('login'); + res.render('login') } } - ); + ) router.post( '/', (req, res, next) => { - next(); + next() }, passport.authenticate('local', { successRedirect: '/', failureRedirect: '/login', failureFlash: 'Invalid username or password' }) - ); - return router; -}; \ No newline at end of file + ) + return router +} diff --git a/routes/logout/index.js b/routes/logout/index.js index 1353316..bb4ac72 100644 --- a/routes/logout/index.js +++ b/routes/logout/index.js @@ -1,14 +1,14 @@ -const verifyAuth = require('../../middlewares/verifyAuth'); -const express = require('express'); +const verifyAuth = require('../../middlewares/verifyAuth') +const express = require('express') module.exports = () => { - const router = express.Router(); + const router = express.Router() - router.get('/', verifyAuth(), (req, res) => res.render('logout')); + router.get('/', verifyAuth(), (req, res) => res.render('logout')) router.post('/', (req, res) => { - req.logout(); - res.redirect('/'); - }); + req.logout() + res.redirect('/') + }) - return router; -}; \ No newline at end of file + return router +} diff --git a/routes/manifest.json/index.js b/routes/manifest.json/index.js index 1223075..03b25ec 100644 --- a/routes/manifest.json/index.js +++ b/routes/manifest.json/index.js @@ -1,7 +1,7 @@ -const express = require('express'); +const express = require('express') module.exports = ({ config }) => { - const router = express.Router(); + const router = express.Router() router.get('/', (req, res) => { res.send({ @@ -19,7 +19,7 @@ module.exports = ({ config }) => { } ] }) - }); + }) - return router; -}; \ No newline at end of file + return router +} diff --git a/routes/profile/index.js b/routes/profile/index.js index bca3cd0..277a697 100644 --- a/routes/profile/index.js +++ b/routes/profile/index.js @@ -1,39 +1,39 @@ -const verifyAuth = require('../../middlewares/verifyAuth'); -const bcrypt = require('bcrypt-nodejs'); -const express = require('express'); +const verifyAuth = require('../../middlewares/verifyAuth') +const bcrypt = require('bcrypt-nodejs') +const express = require('express') module.exports = (db) => { - const router = express.Router(); + const router = express.Router() - router.get('/', verifyAuth(), (req, res) => res.render('profile', { title: `Profile Settings - ${req.user._id}`})); + router.get('/', verifyAuth(), (req, res) => res.render('profile', { title: `Profile Settings - ${req.user._id}` })) router.post('/', verifyAuth(), (req, res) => { if (req.body.oldPassword && req.body.newPassword) { bcrypt.compare(req.body.oldPassword, req.user.password, (err, correct) => { - if (err) throw err; + if (err) throw err if (correct) { bcrypt.hash(req.body.newPassword, null, null, (err, hash) => { - if (err) throw err; + if (err) throw err db.get(req.user._id) .then(doc => { - doc.password = hash; + doc.password = hash db.put(doc) .then(() => { - req.flash('success', 'Changes saved successfully!'); - res.redirect('/profile'); + req.flash('success', 'Changes saved successfully!') + res.redirect('/profile') }) - .catch(err => { throw err; }); + .catch(err => { throw err }) }) - .catch(err => { throw err; }); - }); + .catch(err => { throw err }) + }) } else { - req.flash('error', 'Incorrect old password'); - res.redirect('/profile'); + req.flash('error', 'Incorrect old password') + res.redirect('/profile') } - }); + }) } else { - res.redirect('/profile'); + res.redirect('/profile') } - }); + }) - return router; -}; \ No newline at end of file + return router +} diff --git a/routes/resetpw/index.js b/routes/resetpw/index.js index d2a8d2f..28e5d80 100644 --- a/routes/resetpw/index.js +++ b/routes/resetpw/index.js @@ -1,17 +1,16 @@ -const bcrypt = require('bcrypt-nodejs'); -const express = require('express'); +const bcrypt = require('bcrypt-nodejs') +const express = require('express') module.exports = (db) => { - const router = express.Router(); + const router = express.Router() router.get('/:code', async (req, res) => { const row = (await db.allDocs({ include_docs: true })) .rows .find(({ doc }) => doc.pwToken === req.params.code) - res.render('resetpw', { doc: row ? row.doc : undefined }) - }); + }) router.post('/:code', async (req, res) => { const { doc } = (await db.allDocs({ include_docs: true })) @@ -21,7 +20,7 @@ module.exports = (db) => { if (doc.expiry < new Date().getTime()) return res.redirect(`/resetpw/${req.params.code}`) bcrypt.hash(req.body.password, null, null, async (err, passwordHash) => { - if (err) throw err; + if (err) throw err doc.password = passwordHash delete doc.pwToken @@ -35,11 +34,11 @@ module.exports = (db) => { req.flash('error', err.message) return res.redirect('/') } - req.flash('success', `Welcome to ${_CC.config.siteTitle}!`); - res.redirect('/'); + req.flash('success', `Welcome to ${_CC.config.siteTitle}!`) + res.redirect('/') }) - }); - }); + }) + }) - return router; -}; \ No newline at end of file + return router +} diff --git a/routes/setup/index.js b/routes/setup/index.js index 9442b77..debadc7 100644 --- a/routes/setup/index.js +++ b/routes/setup/index.js @@ -1,39 +1,39 @@ const bcrypt = require('bcrypt-nodejs') -const express = require('express'); +const express = require('express') module.exports = (db) => { - const router = express.Router(); + const router = express.Router() router.get('/', async (req, res) => { - const dbInfo = await db.info(); + const dbInfo = await db.info() if (dbInfo.doc_count === 0) { - res.render('setup', { title: 'Setup' }); + res.render('setup', { title: 'Setup' }) } else { - res.redirect('/'); + res.redirect('/') } } - ); + ) router.post('/', async (req, res) => { - const dbInfo = await db.info(); + const dbInfo = await db.info() if (dbInfo.doc_count === 0) { bcrypt.hash(req.body.adminPassword, null, null, (err, adminPasswordHash) => { - if (err) throw err; + if (err) throw err db.put({ _id: req.body.adminUsername.trim(), password: adminPasswordHash, admin: true, wishlist: [] }) - res.redirect('/'); - }); + res.redirect('/') + }) } else { - res.redirect('/'); + res.redirect('/') } } - ); + ) - return router; -} \ No newline at end of file + return router +} diff --git a/routes/supported-sites/index.js b/routes/supported-sites/index.js index fce1e49..04acc6a 100644 --- a/routes/supported-sites/index.js +++ b/routes/supported-sites/index.js @@ -8,4 +8,4 @@ module.exports = () => { }) return router -} \ No newline at end of file +} diff --git a/routes/wishlist/index.js b/routes/wishlist/index.js index 49ab018..1cb9db6 100644 --- a/routes/wishlist/index.js +++ b/routes/wishlist/index.js @@ -1,18 +1,18 @@ -const verifyAuth = require('../../middlewares/verifyAuth'); -const getProductName = require('get-product-name'); -const express = require('express'); -const config = require('../../config'); +const verifyAuth = require('../../middlewares/verifyAuth') +const getProductName = require('get-product-name') +const express = require('express') +const config = require('../../config') const u64 = require('u64') const totals = wishlist => { - let unpledged = 0; - let pledged = 0; + let unpledged = 0 + let pledged = 0 wishlist.forEach(wishItem => { - if (wishItem.pledgedBy) pledged += 1; - else unpledged += 1; - }); - return { unpledged, pledged }; -}; + if (wishItem.pledgedBy) pledged += 1 + else unpledged += 1 + }) + return { unpledged, pledged } +} const ValidURL = (string) => { // Ty SO try { @@ -20,40 +20,40 @@ const ValidURL = (string) => { // Ty SO if (process.env.SMILE !== 'false') { if (url.hostname === 'www.amazon.com') url.hostname = 'smile.amazon.com' } - if (url) return url; + if (url) return url } catch (_) { - return false; + return false } } module.exports = (db) => { - const router = express.Router(); + const router = express.Router() router.get('/', verifyAuth(), async (req, res) => { const docs = await db.allDocs({ include_docs: true }) if (process.env.SINGLE_LIST === 'true') { - for (row of docs.rows) { + for (const row of docs.rows) { if (row.doc.admin) return res.redirect(`/wishlist/${row.doc._id}`) } } - res.render('wishlists', { title: 'Wishlists', users: docs.rows, totals}) - }); + res.render('wishlists', { title: 'Wishlists', users: docs.rows, totals }) + }) router.get('/:user', verifyAuth(), async (req, res) => { try { - const dbUser = await db.get(req.params.user); + const dbUser = await db.get(req.params.user) if (process.env.SINGLE_LIST === 'true') { if (!dbUser.admin) { const docs = await db.allDocs({ include_docs: true }) - for (row of docs.rows) { + for (const row of docs.rows) { if (row.doc.admin) return res.redirect(`/wishlist/${row.doc._id}`) } } } - const firstCanSee = dbUser.wishlist.findIndex(element => (element.addedBy === req.params.user)); - const wishlistReverse = [...dbUser.wishlist].reverse(); - const lastCanSeeValue = wishlistReverse.find(element => (element.addedBy === req.params.user)); - const lastCanSee = dbUser.wishlist.indexOf(lastCanSeeValue); + const firstCanSee = dbUser.wishlist.findIndex(element => (element.addedBy === req.params.user)) + const wishlistReverse = [...dbUser.wishlist].reverse() + const lastCanSeeValue = wishlistReverse.find(element => (element.addedBy === req.params.user)) + const lastCanSee = dbUser.wishlist.indexOf(lastCanSeeValue) res.render('wishlist', { title: `Wishlist - ${dbUser._id}`, wishlist: [ @@ -62,40 +62,40 @@ module.exports = (db) => { ], firstCanSee, lastCanSee - }); + }) } catch (error) { - req.flash('error', error); - return res.redirect('/wishlist'); + req.flash('error', error) + return res.redirect('/wishlist') } - }); + }) router.post('/:user', verifyAuth(), async (req, res) => { if (!req.body.itemUrlOrName) { req.flash('error', 'Item URL or Name is required') return res.redirect(`/wishlist/${req.params.user}`) } - const potentialUrl = req.body.itemUrlOrName.split(' ').pop(); - const url = ValidURL(potentialUrl); - const item = {}; - let productData; + const potentialUrl = req.body.itemUrlOrName.split(' ').pop() + const url = ValidURL(potentialUrl) + const item = {} + let productData try { - if (url) productData = await getProductName(url, config.proxyServer); + if (url) productData = await getProductName(url, config.proxyServer) } catch (err) { - req.flash('error', err.toString()); + req.flash('error', err.toString()) } - item.name = (productData ? productData.name : ''); + item.name = (productData ? productData.name : '') item.price = productData?.price item.image = productData?.image - item.addedBy = req.user._id; - item.pledgedBy = (req.user._id === req.params.user ? undefined : req.user._id); - item.note = req.body.note; - if (url) item.url = url; + item.addedBy = req.user._id + item.pledgedBy = (req.user._id === req.params.user ? undefined : req.user._id) + item.note = req.body.note + if (url) item.url = url if (!url) item.name = req.body.itemUrlOrName - item.id = u64.encode(new Date().getTime().toString()); - const doc = await db.get(req.params.user); - doc.wishlist.push(item); + item.id = u64.encode(new Date().getTime().toString()) + const doc = await db.get(req.params.user) + doc.wishlist.push(item) try { - await db.put(doc); + await db.put(doc) } catch { req.flash('error', 'Items are being added too quickly. Please try again.') return res.redirect(`/wishlist/${req.params.user}`) @@ -104,134 +104,134 @@ module.exports = (db) => { 'success', ( req.user._id === req.params.user - ? 'Added item to wishlist' - : `Pleged item for ${req.params.user}` + ? 'Added item to wishlist' + : `Pleged item for ${req.params.user}` ) - ); - res.redirect(`/wishlist/${req.params.user}`); - }); + ) + res.redirect(`/wishlist/${req.params.user}`) + }) router.post('/:user/pledge/:itemId', verifyAuth(), async (req, res) => { - const docs = await db.allDocs({ include_docs: true }); + const docs = await db.allDocs({ include_docs: true }) for (let i = 0; i < docs.rows.length; i++) { for (let j = 0; j < docs.rows[i].doc.wishlist.length; j++) { if (docs.rows[i].doc.wishlist[j].id === req.params.itemId) { if (docs.rows[i].doc.wishlist[j].pledgedBy !== undefined) { - req.flash('error', 'Item already pledged for'); - return res.redirect(`/wishlist/${req.params.user}`); + req.flash('error', 'Item already pledged for') + return res.redirect(`/wishlist/${req.params.user}`) } - docs.rows[i].doc.wishlist[j].pledgedBy = req.user._id; - await db.put(docs.rows[i].doc); - req.flash('success', 'Successfully pledged for item!'); - return res.redirect(`/wishlist/${req.params.user}`); + docs.rows[i].doc.wishlist[j].pledgedBy = req.user._id + await db.put(docs.rows[i].doc) + req.flash('success', 'Successfully pledged for item!') + return res.redirect(`/wishlist/${req.params.user}`) } } } - }); + }) router.post('/:user/unpledge/:itemId', verifyAuth(), async (req, res) => { - const docs = await db.allDocs({ include_docs: true }); + const docs = await db.allDocs({ include_docs: true }) for (let i = 0; i < docs.rows.length; i++) { for (let j = 0; j < docs.rows[i].doc.wishlist.length; j++) { if (docs.rows[i].doc.wishlist[j].id === req.params.itemId) { if (docs.rows[i].doc.wishlist[j].pledgedBy !== req.user._id) { - req.flash('error', 'You did not pledge for this'); - return res.redirect(`/wishlist/${req.params.user}`); + req.flash('error', 'You did not pledge for this') + return res.redirect(`/wishlist/${req.params.user}`) } - docs.rows[i].doc.wishlist[j].pledgedBy = undefined; - if (docs.rows[i].doc.wishlist[j].addedBy === req.user._id) docs.rows[i].doc.wishlist.splice(j, 1); - await db.put(docs.rows[i].doc); - req.flash('success', 'Successfully unpledged for item'); - return res.redirect(`/wishlist/${req.params.user}`); + docs.rows[i].doc.wishlist[j].pledgedBy = undefined + if (docs.rows[i].doc.wishlist[j].addedBy === req.user._id) docs.rows[i].doc.wishlist.splice(j, 1) + await db.put(docs.rows[i].doc) + req.flash('success', 'Successfully unpledged for item') + return res.redirect(`/wishlist/${req.params.user}`) } } } - req.flash('error', 'Failed to find item'); - return res.redirect(`/wishlist/${req.params.user}`); - }); + req.flash('error', 'Failed to find item') + return res.redirect(`/wishlist/${req.params.user}`) + }) router.post('/:user/remove/:itemId', verifyAuth(), async (req, res) => { if (req.user._id !== req.params.user) { - req.flash('error', 'Not correct user'); - return res.redirect(`/wishlist/${req.params.user}`); + req.flash('error', 'Not correct user') + return res.redirect(`/wishlist/${req.params.user}`) } - const doc = await db.get(req.user._id); + const doc = await db.get(req.user._id) for (let i = 0; i < doc.wishlist.length; i++) { if (doc.wishlist[i].id === req.params.itemId) { - doc.wishlist.splice(i, 1); - await db.put(doc); - req.flash('success', 'Successfully removed from wishlist'); - return res.redirect(`/wishlist/${req.params.user}`); + doc.wishlist.splice(i, 1) + await db.put(doc) + req.flash('success', 'Successfully removed from wishlist') + return res.redirect(`/wishlist/${req.params.user}`) } } - req.flash('error', 'Failed to find item'); - return res.redirect(`/wishlist/${req.params.user}`); - }); + req.flash('error', 'Failed to find item') + return res.redirect(`/wishlist/${req.params.user}`) + }) router.post('/:user/move/:direction/:itemId', verifyAuth(), async (req, res) => { if (req.user._id !== req.params.user) { - req.flash('error', 'Not correct user'); - return res.redirect(`/wishlist/${req.params.user}`); + req.flash('error', 'Not correct user') + return res.redirect(`/wishlist/${req.params.user}`) } - const doc = await db.get(req.user._id); - const wishlist = doc.wishlist; - if (req.params.direction === 'up') wishlist.reverse(); - let moveFromIndex; + const doc = await db.get(req.user._id) + const wishlist = doc.wishlist + if (req.params.direction === 'up') wishlist.reverse() + let moveFromIndex wishlist.forEach(wish => { - if (wish.id === req.params.itemId) return moveFromIndex = wishlist.indexOf(wish); - }); - const moveToIndex = wishlist.findIndex(wish => ( wishlist.indexOf(wish) > moveFromIndex && wish.addedBy === req.user._id )); + if (wish.id === req.params.itemId) moveFromIndex = wishlist.indexOf(wish) + }) + const moveToIndex = wishlist.findIndex(wish => (wishlist.indexOf(wish) > moveFromIndex && wish.addedBy === req.user._id)) if (moveToIndex < 0 || moveToIndex > wishlist.length) { - req.flash('error', 'Invalid move'); - return res.redirect(`/wishlist/${req.params.user}`); + req.flash('error', 'Invalid move') + return res.redirect(`/wishlist/${req.params.user}`) } - [ wishlist[moveFromIndex], wishlist[moveToIndex] ] = [ wishlist[moveToIndex], wishlist[moveFromIndex] ]; - if (req.params.direction === 'up') wishlist.reverse(); - doc.wishlist = wishlist; - await db.put(doc); - req.flash('success', 'Successfully moved item!'); - return res.redirect(`/wishlist/${req.params.user}`); - }); + [wishlist[moveFromIndex], wishlist[moveToIndex]] = [wishlist[moveToIndex], wishlist[moveFromIndex]] + if (req.params.direction === 'up') wishlist.reverse() + doc.wishlist = wishlist + await db.put(doc) + req.flash('success', 'Successfully moved item!') + return res.redirect(`/wishlist/${req.params.user}`) + }) router.get('/:user/note/:id', verifyAuth(), async (req, res) => { - const doc = await db.get(req.params.user); + const doc = await db.get(req.params.user) const item = doc.wishlist.find(item => item.id === req.params.id) - res.render('note', { item }); - }); + res.render('note', { item }) + }) router.post('/:user/note/:id', verifyAuth(), async (req, res) => { - const doc = await db.get(req.params.user); - const wishlist = doc.wishlist; - for (let i=0; i < wishlist.length; i++) { - wishlistItem = wishlist[i]; - if (wishlistItem.id !== req.params.id) continue; + const doc = await db.get(req.params.user) + const wishlist = doc.wishlist + for (let i = 0; i < wishlist.length; i++) { + const wishlistItem = wishlist[i] + if (wishlistItem.id !== req.params.id) continue if (req.user._id !== req.params.user && req.user._id !== wishlistItem.addedBy) { - req.flash('error', 'Invalid user'); - return res.redirect(`/wishlist/${req.params.user}`); + req.flash('error', 'Invalid user') + return res.redirect(`/wishlist/${req.params.user}`) } for (const type of [ 'name', 'note', 'url', 'price', 'image' ]) { - if (!req.body.hasOwnProperty(type)) { + if (!Object.prototype.hasOwnProperty.call(req.body, type)) { req.flash('error', `Missing property ${type}`) return res.redirect(`/wishlist/${req.params.user}/note/${req.params.id}`) } wishlistItem[type] = req.body[type] } - wishlist[i] = wishlistItem; + wishlist[i] = wishlistItem } - doc.wishlist = wishlist; - await db.put(doc); - req.flash('success', `Successfully saved note!`); - return res.redirect(`/wishlist/${req.params.user}`); - }); + doc.wishlist = wishlist + await db.put(doc) + req.flash('success', 'Successfully saved note!') + return res.redirect(`/wishlist/${req.params.user}`) + }) router.post('/:user/refresh/:id', verifyAuth(), async (req, res) => { - const doc = await db.get(req.params.user); - const wishlist = doc.wishlist; - for (let i=0; i < wishlist.length; i++) { - wishlistItem = wishlist[i]; - if (wishlistItem.id !== req.params.id) continue; + const doc = await db.get(req.params.user) + const wishlist = doc.wishlist + for (let i = 0; i < wishlist.length; i++) { + const wishlistItem = wishlist[i] + if (wishlistItem.id !== req.params.id) continue if (req.user._id !== req.params.user && req.user._id !== wishlistItem.addedBy) { - req.flash('error', 'Invalid user'); - return res.redirect(`/wishlist/${req.params.user}`); + req.flash('error', 'Invalid user') + return res.redirect(`/wishlist/${req.params.user}`) } if (!wishlistItem.url) { @@ -240,38 +240,39 @@ module.exports = (db) => { } const productData = await getProductName(wishlistItem.url) - for (field of [ 'name', 'price', 'image' ]) { + for (const field of ['name', 'price', 'image']) { if (productData[field]) wishlistItem[field] = productData[field] } - wishlist[i] = wishlistItem; + wishlist[i] = wishlistItem } - doc.wishlist = wishlist; - await db.put(doc); - req.flash('success', `Successfully refreshed data!`); - return res.redirect(`/wishlist/${req.params.user}/note/${req.params.id}`); - }); + doc.wishlist = wishlist + await db.put(doc) + req.flash('success', 'Successfully refreshed data!') + return res.redirect(`/wishlist/${req.params.user}/note/${req.params.id}`) + }) router.post('/:user/note/remove/:id', verifyAuth(), async (req, res) => { - const doc = await db.get(req.params.user); - const wishlist = doc.wishlist; - for (let i=0; i < wishlist.length; i++) { - wishlistItem = wishlist[i]; - if (wishlistItem.id !== req.params.id) continue; + const doc = await db.get(req.params.user) + const wishlist = doc.wishlist + for (let i = 0; i < wishlist.length; i++) { + const wishlistItem = wishlist[i] + if (wishlistItem.id !== req.params.id) continue if (req.user._id !== req.params.user && req.user._id !== wishlistItem.addedBy) { - req.flash('error', 'Invalid user'); - return res.redirect(`/wishlist/${req.params.user}`); + req.flash('error', 'Invalid user') + return res.redirect(`/wishlist/${req.params.user}`) } if (wishlistItem.note) { - wishlistItem.note = undefined; - wishlist[i] = wishlistItem; + wishlistItem.note = undefined + wishlist[i] = wishlistItem } else { - req.flash('error', 'Has no note'); - return res.redirect(`/wishlist/${req.params.user}`); } + req.flash('error', 'Has no note') + return res.redirect(`/wishlist/${req.params.user}`) + } } - doc.wishlist = wishlist; - await db.put(doc); - req.flash('success', 'Successfully removed note'); - return res.redirect(`/wishlist/${req.params.user}`); + doc.wishlist = wishlist + await db.put(doc) + req.flash('success', 'Successfully removed note') + return res.redirect(`/wishlist/${req.params.user}`) }) - return router; -}; \ No newline at end of file + return router +} diff --git a/static/js/nav.js b/static/js/nav.js index 5a3fe43..81a0b36 100644 --- a/static/js/nav.js +++ b/static/js/nav.js @@ -1,8 +1,8 @@ window.onload = () => { - const burger = document.getElementById('navBarBurger'); - const navBarMenu = document.getElementById('navBarMenu'); + const burger = document.getElementById('navBarBurger') + const navBarMenu = document.getElementById('navBarMenu') burger.addEventListener('click', () => { - burger.classList.toggle('is-active'); - navBarMenu.classList.toggle('is-active'); - }); -}; + burger.classList.toggle('is-active') + navBarMenu.classList.toggle('is-active') + }) +} diff --git a/static/js/wishlist.js b/static/js/wishlist.js index 09a2cab..b836ce6 100644 --- a/static/js/wishlist.js +++ b/static/js/wishlist.js @@ -1,37 +1,36 @@ -function animateCSS(node, animationName) { +/* eslint-env browser */ +function animateCSS (node, animationName) { return new Promise(resolve => { node.classList.add('animated', animationName) - - function handleAnimationEnd() { - node.classList.remove('animated', animationName) - node.removeEventListener('animationend', handleAnimationEnd) - - resolve() + + function handleAnimationEnd () { + node.classList.remove('animated', animationName) + node.removeEventListener('animationend', handleAnimationEnd) + + resolve() } - + node.addEventListener('animationend', handleAnimationEnd) }) } // These move function are stolen from // https://stackoverflow.com/a/34914096 -function moveUp(element) { - if(element.previousElementSibling) - element.parentNode.insertBefore(element, element.previousElementSibling); +function moveUp (element) { + if (element.previousElementSibling) { element.parentNode.insertBefore(element, element.previousElementSibling) } } -function moveDown(element) { - if(element.nextElementSibling) - element.parentNode.insertBefore(element.nextElementSibling, element); +function moveDown (element) { + if (element.nextElementSibling) { element.parentNode.insertBefore(element.nextElementSibling, element) } } -function listen(element, upOrDown) { +function listen (element, upOrDown) { element.addEventListener('submit', async event => { try { event.preventDefault() const tr = event.currentTarget.parentElement.parentElement const otherTr = upOrDown === 'up' ? tr.previousSibling : tr.nextSibling - + await Promise.all([ animateCSS(tr, 'zoomOut'), animateCSS(otherTr, 'zoomOut') @@ -66,8 +65,8 @@ function listen(element, upOrDown) { return false } catch (error) { alert(error.message) - throw error location.reload() + throw error // probably useless but just in case reload doesn't do anything } }) } @@ -75,4 +74,4 @@ function listen(element, upOrDown) { setTimeout(() => { document.querySelectorAll('.upForm').forEach(element => listen(element, 'up')) document.querySelectorAll('.downForm').forEach(element => listen(element, 'down')) -}, 0) \ No newline at end of file +}, 0) diff --git a/yarn.lock b/yarn.lock index a4d2599..ce57e98 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,11 +2,27 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + "integrity" "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==" + "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz" + "version" "7.10.4" + dependencies: + "@babel/highlight" "^7.10.4" + "@babel/helper-validator-identifier@^7.10.4": "integrity" "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==" "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz" "version" "7.10.4" +"@babel/highlight@^7.10.4": + "integrity" "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==" + "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz" + "version" "7.10.4" + dependencies: + "@babel/helper-validator-identifier" "^7.10.4" + "chalk" "^2.0.0" + "js-tokens" "^4.0.0" + "@babel/parser@^7.6.0", "@babel/parser@^7.9.6": "integrity" "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==" "resolved" "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz" @@ -21,6 +37,27 @@ "lodash" "^4.17.19" "to-fast-properties" "^2.0.0" +"@eslint/eslintrc@^0.2.1": + "integrity" "sha512-XRUeBZ5zBWLYgSANMpThFddrZZkEbGHgUdt5UJjZfnlN9BGCiUBrf+nvbRupSjMvqzwnQN0qwCmOxITt1cfywA==" + "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.2.1.tgz" + "version" "0.2.1" + dependencies: + "ajv" "^6.12.4" + "debug" "^4.1.1" + "espree" "^7.3.0" + "globals" "^12.1.0" + "ignore" "^4.0.6" + "import-fresh" "^3.2.1" + "js-yaml" "^3.13.1" + "lodash" "^4.17.19" + "minimatch" "^3.0.4" + "strip-json-comments" "^3.1.1" + +"@types/json5@^0.0.29": + "integrity" "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" + "resolved" "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + "version" "0.0.29" + "@types/node@*": "integrity" "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==" "resolved" "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz" @@ -66,6 +103,11 @@ "mime-types" "~2.1.24" "negotiator" "0.6.2" +"acorn-jsx@^5.2.0": + "integrity" "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" + "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz" + "version" "5.3.1" + "acorn@^1.0.3": "integrity" "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" "resolved" "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz" @@ -76,7 +118,7 @@ "resolved" "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz" "version" "5.7.4" -"acorn@^7.1.1": +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^7.1.1", "acorn@^7.4.0": "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" "version" "7.4.1" @@ -88,11 +130,50 @@ dependencies: "es6-promisify" "^5.0.0" +"ajv@^6.10.0", "ajv@^6.10.2", "ajv@^6.12.4": + "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + "version" "6.12.6" + 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" + "amdefine@>=0.0.4": "integrity" "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" "resolved" "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" "version" "1.0.1" +"ansi-colors@^4.1.1": + "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" + "version" "4.1.1" + +"ansi-regex@^4.1.0": + "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" + "version" "4.1.0" + +"ansi-regex@^5.0.0": + "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" + "version" "5.0.0" + +"ansi-styles@^3.2.0": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "^1.9.0" + +"ansi-styles@^3.2.1": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "^1.9.0" + "ansi-styles@^4.1.0": "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" @@ -105,6 +186,13 @@ "resolved" "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" "version" "1.2.0" +"argparse@^1.0.7": + "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" + "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "sprintf-js" "~1.0.2" + "argsarray@0.0.1": "integrity" "sha1-bnIHtOzbObCviDA/pa4ivajfYcs=" "resolved" "https://registry.npmjs.org/argsarray/-/argsarray-0.0.1.tgz" @@ -115,6 +203,23 @@ "resolved" "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" "version" "1.1.1" +"array-includes@^3.1.1": + "integrity" "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==" + "resolved" "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz" + "version" "3.1.1" + dependencies: + "define-properties" "^1.1.3" + "es-abstract" "^1.17.0" + "is-string" "^1.0.5" + +"array.prototype.flat@^1.2.3": + "integrity" "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==" + "resolved" "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz" + "version" "1.2.3" + dependencies: + "define-properties" "^1.1.3" + "es-abstract" "^1.17.0-next.1" + "asap@~2.0.3": "integrity" "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" @@ -135,6 +240,11 @@ "resolved" "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz" "version" "0.9.6" +"astral-regex@^1.0.0": + "integrity" "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz" + "version" "1.0.0" + "attempt-x@^1.1.0", "attempt-x@^1.1.1": "integrity" "sha512-y/+ek8IjxVpTbj/phC87jK5YRhlP5Uu7FlQdCmYuut1DTjNruyrGqUWi5bcX1VKsQX1B0FX16A1hqHomKpHv3A==" "resolved" "https://registry.npmjs.org/attempt-x/-/attempt-x-1.1.3.tgz" @@ -253,7 +363,29 @@ "resolved" "https://registry.npmjs.org/cached-constructors-x/-/cached-constructors-x-1.0.2.tgz" "version" "1.0.2" -"chalk@^4.1.0": +"call-bind@^1.0.0": + "integrity" "sha512-AEXsYIyyDY3MCzbwdhzG3Jx1R0J2wetQyUynn6dYHAO+bg8l1k7jwZtRv4ryryFs7EP+NDlikJlVe59jr0cM2w==" + "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "function-bind" "^1.1.1" + "get-intrinsic" "^1.0.0" + +"callsites@^3.0.0": + "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + "version" "3.1.0" + +"chalk@^2.0.0": + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + "version" "2.4.2" + dependencies: + "ansi-styles" "^3.2.1" + "escape-string-regexp" "^1.0.5" + "supports-color" "^5.3.0" + +"chalk@^4.0.0", "chalk@^4.1.0": "integrity" "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==" "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" "version" "4.1.0" @@ -294,6 +426,13 @@ "resolved" "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz" "version" "1.0.0" +"color-convert@^1.9.0": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" + dependencies: + "color-name" "1.1.3" + "color-convert@^2.0.1": "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" @@ -306,6 +445,11 @@ "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" "version" "1.1.4" +"color-name@1.1.3": + "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" + "commander@^2.5.0": "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" @@ -364,6 +508,11 @@ "@babel/parser" "^7.6.0" "@babel/types" "^7.6.1" +"contains-path@^0.1.0": + "integrity" "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=" + "resolved" "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz" + "version" "0.1.0" + "content-disposition@0.5.3": "integrity" "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==" "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz" @@ -455,6 +604,15 @@ "lru-cache" "^4.0.1" "which" "^1.2.9" +"cross-spawn@^7.0.2": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + "version" "7.0.3" + dependencies: + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" + "crypto-lite@^0.2.0": "integrity" "sha1-OhTPYwOEYaXrhZRd54vwTeTar3M=" "resolved" "https://registry.npmjs.org/crypto-lite/-/crypto-lite-0.2.0.tgz" @@ -475,6 +633,13 @@ "resolved" "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz" "version" "2.1.3" +"debug@^2.6.9", "debug@2.6.9": + "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + "version" "2.6.9" + dependencies: + "ms" "2.0.0" + "debug@^3.1.0": "integrity" "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==" "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" @@ -482,6 +647,13 @@ dependencies: "ms" "^2.1.1" +"debug@^4.0.1": + "integrity" "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==" + "resolved" "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz" + "version" "4.2.0" + dependencies: + "ms" "2.1.2" + "debug@^4.1.1": "integrity" "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==" "resolved" "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz" @@ -489,12 +661,10 @@ dependencies: "ms" "2.1.2" -"debug@2.6.9": - "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" - "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - "version" "2.6.9" - dependencies: - "ms" "2.0.0" +"deep-is@^0.1.3": + "integrity" "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" + "version" "0.1.3" "deferred-leveldown@~2.0.2": "integrity" "sha512-8c2Hv+vIwKNc7qqy4zE3t5DIsln+FQnudcyjLYstHwLFg7XnXZT/H8gQb8lj6xi8xqGM0Bz633ZWcCkonycBTA==" @@ -511,6 +681,13 @@ "abstract-leveldown" "~6.2.1" "inherits" "^2.0.3" +"define-properties@^1.1.3": + "integrity" "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==" + "resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "object-keys" "^1.0.12" + "defined@^1.0.0": "integrity" "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=" "resolved" "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" @@ -544,6 +721,21 @@ "acorn" "^5.2.1" "defined" "^1.0.0" +"doctrine@^3.0.0": + "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" + "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "esutils" "^2.0.2" + +"doctrine@1.5.0": + "integrity" "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=" + "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz" + "version" "1.5.0" + dependencies: + "esutils" "^2.0.2" + "isarray" "^1.0.0" + "doctypes@^1.1.0": "integrity" "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=" "resolved" "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz" @@ -592,6 +784,11 @@ "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" "version" "1.1.1" +"emoji-regex@^7.0.1": + "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" + "version" "7.0.3" + "encodeurl@~1.0.2": "integrity" "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" @@ -614,6 +811,13 @@ dependencies: "write-stream" "~0.4.3" +"enquirer@^2.3.5": + "integrity" "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" + "resolved" "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" + "version" "2.3.6" + dependencies: + "ansi-colors" "^4.1.1" + "entities@^1.1.1", "entities@~1.1.1": "integrity" "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" "resolved" "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz" @@ -633,6 +837,57 @@ dependencies: "prr" "~1.0.1" +"error-ex@^1.2.0": + "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" + "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "is-arrayish" "^0.2.1" + +"es-abstract@^1.17.0", "es-abstract@^1.17.0-next.1": + "integrity" "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==" + "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz" + "version" "1.17.7" + dependencies: + "es-to-primitive" "^1.2.1" + "function-bind" "^1.1.1" + "has" "^1.0.3" + "has-symbols" "^1.0.1" + "is-callable" "^1.2.2" + "is-regex" "^1.1.1" + "object-inspect" "^1.8.0" + "object-keys" "^1.1.1" + "object.assign" "^4.1.1" + "string.prototype.trimend" "^1.0.1" + "string.prototype.trimstart" "^1.0.1" + +"es-abstract@^1.18.0-next.1": + "integrity" "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==" + "resolved" "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz" + "version" "1.18.0-next.1" + dependencies: + "es-to-primitive" "^1.2.1" + "function-bind" "^1.1.1" + "has" "^1.0.3" + "has-symbols" "^1.0.1" + "is-callable" "^1.2.2" + "is-negative-zero" "^2.0.0" + "is-regex" "^1.1.1" + "object-inspect" "^1.8.0" + "object-keys" "^1.1.1" + "object.assign" "^4.1.1" + "string.prototype.trimend" "^1.0.1" + "string.prototype.trimstart" "^1.0.1" + +"es-to-primitive@^1.2.1": + "integrity" "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==" + "resolved" "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "is-callable" "^1.1.4" + "is-date-object" "^1.0.1" + "is-symbol" "^1.0.2" + "es3ify@^0.1.3": "integrity" "sha1-rZ+l3xrjTz8x4SEbWBiy1RB439E=" "resolved" "https://registry.npmjs.org/es3ify/-/es3ify-0.1.4.tgz" @@ -668,11 +923,163 @@ "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" "version" "1.0.3" +"escape-string-regexp@^1.0.5": + "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"eslint-config-standard@^16.0.1": + "integrity" "sha512-WBBiQQZdaPyL+4sPkGWhWrHCDtvJoU195B9j8yXE9uFQnX34gMXI5CeBRm95gx3PMEZPM5OpwET10hH4F4SxCA==" + "resolved" "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-16.0.1.tgz" + "version" "16.0.1" + +"eslint-import-resolver-node@^0.3.4": + "integrity" "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==" + "resolved" "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz" + "version" "0.3.4" + dependencies: + "debug" "^2.6.9" + "resolve" "^1.13.1" + +"eslint-module-utils@^2.6.0": + "integrity" "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==" + "resolved" "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz" + "version" "2.6.0" + dependencies: + "debug" "^2.6.9" + "pkg-dir" "^2.0.0" + +"eslint-plugin-es@^3.0.0": + "integrity" "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==" + "resolved" "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "eslint-utils" "^2.0.0" + "regexpp" "^3.0.0" + +"eslint-plugin-import@^2.22.1": + "integrity" "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==" + "resolved" "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz" + "version" "2.22.1" + dependencies: + "array-includes" "^3.1.1" + "array.prototype.flat" "^1.2.3" + "contains-path" "^0.1.0" + "debug" "^2.6.9" + "doctrine" "1.5.0" + "eslint-import-resolver-node" "^0.3.4" + "eslint-module-utils" "^2.6.0" + "has" "^1.0.3" + "minimatch" "^3.0.4" + "object.values" "^1.1.1" + "read-pkg-up" "^2.0.0" + "resolve" "^1.17.0" + "tsconfig-paths" "^3.9.0" + +"eslint-plugin-node@^11.1.0": + "integrity" "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==" + "resolved" "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz" + "version" "11.1.0" + dependencies: + "eslint-plugin-es" "^3.0.0" + "eslint-utils" "^2.0.0" + "ignore" "^5.1.1" + "minimatch" "^3.0.4" + "resolve" "^1.10.1" + "semver" "^6.1.0" + +"eslint-plugin-promise@^4.2.1": + "integrity" "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==" + "resolved" "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz" + "version" "4.2.1" + +"eslint-scope@^5.1.1": + "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" + "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "esrecurse" "^4.3.0" + "estraverse" "^4.1.1" + +"eslint-utils@^2.0.0", "eslint-utils@^2.1.0": + "integrity" "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==" + "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "eslint-visitor-keys" "^1.1.0" + +"eslint-visitor-keys@^1.1.0": + "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + "version" "1.3.0" + +"eslint-visitor-keys@^1.3.0": + "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" + "version" "1.3.0" + +"eslint-visitor-keys@^2.0.0": + "integrity" "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==" + "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz" + "version" "2.0.0" + +"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0", "eslint@^7.12.1", "eslint@^7.13.0", "eslint@>=4.19.1", "eslint@>=5.16.0": + "integrity" "sha512-uCORMuOO8tUzJmsdRtrvcGq5qposf7Rw0LwkTJkoDbOycVQtQjmnhZSuLQnozLE4TmAzlMVV45eCHmQ1OpDKUQ==" + "resolved" "https://registry.npmjs.org/eslint/-/eslint-7.13.0.tgz" + "version" "7.13.0" + dependencies: + "@babel/code-frame" "^7.0.0" + "@eslint/eslintrc" "^0.2.1" + "ajv" "^6.10.0" + "chalk" "^4.0.0" + "cross-spawn" "^7.0.2" + "debug" "^4.0.1" + "doctrine" "^3.0.0" + "enquirer" "^2.3.5" + "eslint-scope" "^5.1.1" + "eslint-utils" "^2.1.0" + "eslint-visitor-keys" "^2.0.0" + "espree" "^7.3.0" + "esquery" "^1.2.0" + "esutils" "^2.0.2" + "file-entry-cache" "^5.0.1" + "functional-red-black-tree" "^1.0.1" + "glob-parent" "^5.0.0" + "globals" "^12.1.0" + "ignore" "^4.0.6" + "import-fresh" "^3.0.0" + "imurmurhash" "^0.1.4" + "is-glob" "^4.0.0" + "js-yaml" "^3.13.1" + "json-stable-stringify-without-jsonify" "^1.0.1" + "levn" "^0.4.1" + "lodash" "^4.17.19" + "minimatch" "^3.0.4" + "natural-compare" "^1.4.0" + "optionator" "^0.9.1" + "progress" "^2.0.0" + "regexpp" "^3.1.0" + "semver" "^7.2.1" + "strip-ansi" "^6.0.0" + "strip-json-comments" "^3.1.0" + "table" "^5.2.3" + "text-table" "^0.2.0" + "v8-compile-cache" "^2.0.3" + "esmangle-evaluator@^1.0.0": "integrity" "sha1-Yg2GbvSGGzMR91dm1SqFcrs8YzY=" "resolved" "https://registry.npmjs.org/esmangle-evaluator/-/esmangle-evaluator-1.0.1.tgz" "version" "1.0.1" +"espree@^7.3.0": + "integrity" "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==" + "resolved" "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz" + "version" "7.3.0" + dependencies: + "acorn" "^7.4.0" + "acorn-jsx" "^5.2.0" + "eslint-visitor-keys" "^1.3.0" + "esprima-fb@^15001.1.0-dev-harmony-fb": "integrity" "sha1-MKlHMDxrjV6VW+4rmbHSMyBqaQE=" "resolved" "https://registry.npmjs.org/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz" @@ -693,11 +1100,50 @@ "resolved" "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" "version" "2.7.3" +"esprima@^4.0.0": + "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + "version" "4.0.1" + "esprima@~3.1.0": "integrity" "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=" "resolved" "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz" "version" "3.1.3" +"esquery@^1.2.0": + "integrity" "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==" + "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz" + "version" "1.3.1" + dependencies: + "estraverse" "^5.1.0" + +"esrecurse@^4.3.0": + "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" + "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "estraverse" "^5.2.0" + +"estraverse@^4.1.1": + "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + "version" "4.3.0" + +"estraverse@^5.1.0": + "integrity" "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" + "version" "5.2.0" + +"estraverse@^5.2.0": + "integrity" "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" + "version" "5.2.0" + +"esutils@^2.0.2": + "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + "version" "2.0.3" + "etag@~1.8.1": "integrity" "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" @@ -809,6 +1255,21 @@ "isarray" "0.0.1" "object-keys" "^1.0.6" +"fast-deep-equal@^3.1.1": + "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + "version" "3.1.3" + +"fast-json-stable-stringify@^2.0.0": + "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + "version" "2.1.0" + +"fast-levenshtein@^2.0.6": + "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + "version" "2.0.6" + "fetch-cookie@0.10.1": "integrity" "sha512-beB+VEd4cNeVG1PY+ee74+PkuCQnik78pgLi5Ah/7qdUfov8IctU0vLUbBT8/10Ma5GMBeI4wtxhGrEfKNYs2g==" "resolved" "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-0.10.1.tgz" @@ -816,6 +1277,13 @@ dependencies: "tough-cookie" "^2.3.3 || ^3.0.1 || ^4.0.0" +"file-entry-cache@^5.0.1": + "integrity" "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==" + "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "flat-cache" "^2.0.1" + "finalhandler@~1.1.2": "integrity" "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==" "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" @@ -829,6 +1297,27 @@ "statuses" "~1.5.0" "unpipe" "~1.0.0" +"find-up@^2.0.0", "find-up@^2.1.0": + "integrity" "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "locate-path" "^2.0.0" + +"flat-cache@^2.0.1": + "integrity" "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==" + "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "flatted" "^2.0.0" + "rimraf" "2.6.3" + "write" "1.0.3" + +"flatted@^2.0.0": + "integrity" "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + "resolved" "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz" + "version" "2.0.2" + "foreach@^2.0.5": "integrity" "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" "resolved" "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz" @@ -844,6 +1333,11 @@ "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" "version" "0.5.2" +"fs.realpath@^1.0.0": + "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + "function-bind@^1.1.1": "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" @@ -867,6 +1361,15 @@ "gar" "^1.0.4" "tiny-each-async" "2.0.3" +"get-intrinsic@^1.0.0": + "integrity" "sha512-ZnWP+AmS1VUaLgTRy47+zKtjTxz+0xMpx3I52i+aalBK1QP19ggLF3Db89KJX7kjfOfP2eoa01qc++GwPgufPg==" + "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "function-bind" "^1.1.1" + "has" "^1.0.3" + "has-symbols" "^1.0.1" + "get-product-name@1": "integrity" "sha512-+ivby/551lfw1XD6CiQbgYR3Mq7x1ZGI5mOas1doF2C5O0qGtaY0gQN1U9tbVuoQY+c9TNBMGws7ex2xZLa2AQ==" "resolved" "https://registry.npmjs.org/get-product-name/-/get-product-name-1.12.0.tgz" @@ -877,6 +1380,13 @@ "https-proxy-agent" "^2.2.1" "node-fetch" "^2.3.0" +"glob-parent@^5.0.0": + "integrity" "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "is-glob" "^4.0.1" + "glob@^5.0.15": "integrity" "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=" "resolved" "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz" @@ -888,11 +1398,35 @@ "once" "^1.3.0" "path-is-absolute" "^1.0.0" +"glob@^7.1.3": + "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + "version" "7.1.6" + 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" + +"globals@^12.1.0": + "integrity" "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==" + "resolved" "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" + "version" "12.4.0" + dependencies: + "type-fest" "^0.8.1" + "graceful-fs@^4.1.2": "integrity" "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz" "version" "4.2.4" +"has-flag@^3.0.0": + "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" + "has-flag@^4.0.0": "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" @@ -936,6 +1470,11 @@ "resolved" "https://registry.npmjs.org/header-case-normalizer/-/header-case-normalizer-1.0.3.tgz" "version" "1.0.3" +"hosted-git-info@^2.1.4": + "integrity" "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz" + "version" "2.8.8" + "htmlparser2@^3.9.1": "integrity" "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==" "resolved" "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz" @@ -990,6 +1529,16 @@ "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" "version" "1.2.1" +"ignore@^4.0.6": + "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" + "version" "4.0.6" + +"ignore@^5.1.1": + "integrity" "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz" + "version" "5.1.8" + "immediate@^3.2.3", "immediate@3.3.0": "integrity" "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==" "resolved" "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz" @@ -1010,6 +1559,19 @@ "resolved" "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" "version" "3.0.6" +"import-fresh@^3.0.0", "import-fresh@^3.2.1": + "integrity" "sha512-cTPNrlvJT6twpYy+YmKUKrTSjWFs3bjYjAhCwm+z4EOCubZxAuO+hHpRN64TqjEaYSHs7tJAE0w1CKMGmsG/lw==" + "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.2.tgz" + "version" "3.2.2" + dependencies: + "parent-module" "^1.0.0" + "resolve-from" "^4.0.0" + +"imurmurhash@^0.1.4": + "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + "version" "0.1.4" + "infinity-x@^1.0.1": "integrity" "sha512-2Ioz+exrAwlHxFBaDHQIbvUyjKFt0YjIal34/agfzx738aT1zBQwSU5A8Zgb1IQ2r24BtXrkeZZusxE40MyZaQ==" "resolved" "https://registry.npmjs.org/infinity-x/-/infinity-x-1.0.2.tgz" @@ -1057,6 +1619,16 @@ "object-get-own-property-descriptor-x" "^3.2.0" "to-string-tag-x" "^1.4.1" +"is-arrayish@^0.2.1": + "integrity" "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + "version" "0.2.1" + +"is-callable@^1.1.4", "is-callable@^1.2.2": + "integrity" "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==" + "resolved" "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz" + "version" "1.2.2" + "is-core-module@^2.0.0": "integrity" "sha512-jq1AH6C8MuteOoBPwkxHafmByhL9j5q4OaPGdbuD+ZtQJVzH+i6E3BJDQcBA09k57i2Hh2yQbEG8yObZ0jdlWw==" "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.0.0.tgz" @@ -1082,6 +1654,11 @@ "acorn" "^7.1.1" "object-assign" "^4.1.1" +"is-extglob@^2.1.1": + "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" + "is-falsey-x@^1.0.0", "is-falsey-x@^1.0.1": "integrity" "sha512-RWjusR6LXAhGa0Vus7aD1rwJuJwdJsvG3daAVMDvOAgvGuGm4eilNgoSuXhpv2/2qpLDvioAKTNb3t3XYidCNg==" "resolved" "https://registry.npmjs.org/is-falsey-x/-/is-falsey-x-1.0.3.tgz" @@ -1097,6 +1674,11 @@ "infinity-x" "^1.0.1" "is-nan-x" "^1.0.2" +"is-fullwidth-code-point@^2.0.0": + "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + "version" "2.0.0" + "is-function-x@^3.2.0", "is-function-x@^3.3.0": "integrity" "sha512-SreSSU1dlgYaXR5c0mm4qJHKYHIiGiEY+7Cd8/aRLLoMP/VvofD2XcWgBnP833ajpU5XzXbUSpfysnfKZLJFlg==" "resolved" "https://registry.npmjs.org/is-function-x/-/is-function-x-3.3.0.tgz" @@ -1111,6 +1693,13 @@ "to-boolean-x" "^1.0.1" "to-string-tag-x" "^1.4.2" +"is-glob@^4.0.0", "is-glob@^4.0.1": + "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==" + "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "is-extglob" "^2.1.1" + "is-index-x@^1.0.0": "integrity" "sha512-qULKLMepQLGC8rSVdi8uF2vI4LiDrU9XSDg1D+Aa657GIB7GV1jHpga7uXgQvkt/cpQ5mVBHUFTpSehYSqT6+A==" "resolved" "https://registry.npmjs.org/is-index-x/-/is-index-x-1.1.0.tgz" @@ -1127,6 +1716,11 @@ "resolved" "https://registry.npmjs.org/is-nan-x/-/is-nan-x-1.0.3.tgz" "version" "1.0.3" +"is-negative-zero@^2.0.0": + "integrity" "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=" + "resolved" "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz" + "version" "2.0.0" + "is-nil-x@^1.4.1", "is-nil-x@^1.4.2": "integrity" "sha512-9aDY7ir7IGb5HlgqL+b38v2YMxf8S7MEHHxjHGzUhijg2crq47RKdxL37bS6dU0VN87wy2IBZP4akgQtIXmyvg==" "resolved" "https://registry.npmjs.org/is-nil-x/-/is-nil-x-1.4.2.tgz" @@ -1158,25 +1752,30 @@ "resolved" "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz" "version" "2.2.2" -"is-regex@^1.0.3": +"is-regex@^1.0.3", "is-regex@^1.1.1": "integrity" "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==" "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz" "version" "1.1.1" dependencies: "has-symbols" "^1.0.1" -"is-string@^1.0.4": +"is-string@^1.0.4", "is-string@^1.0.5": "integrity" "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==" "resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz" "version" "1.0.5" -"is-symbol@^1.0.1": +"is-symbol@^1.0.1", "is-symbol@^1.0.2": "integrity" "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==" "resolved" "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz" "version" "1.0.3" dependencies: "has-symbols" "^1.0.1" +"isarray@^1.0.0": + "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "version" "1.0.0" + "isarray@~1.0.0": "integrity" "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" @@ -1202,6 +1801,36 @@ "resolved" "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz" "version" "1.0.2" +"js-tokens@^4.0.0": + "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + "version" "4.0.0" + +"js-yaml@^3.13.1": + "integrity" "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==" + "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz" + "version" "3.14.0" + dependencies: + "argparse" "^1.0.7" + "esprima" "^4.0.0" + +"json-schema-traverse@^0.4.1": + "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + "version" "0.4.1" + +"json-stable-stringify-without-jsonify@^1.0.1": + "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + "version" "1.0.1" + +"json5@^1.0.1": + "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==" + "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "minimist" "^1.2.0" + "jstransform@~11.0.0": "integrity" "sha1-CaeJk+CuTU70SH9hVakfYZDLQiM=" "resolved" "https://registry.npmjs.org/jstransform/-/jstransform-11.0.3.tgz" @@ -1350,6 +1979,14 @@ "level-iterator-stream" "~2.0.0" "xtend" "~4.0.0" +"levn@^0.4.1": + "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" + "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + "version" "0.4.1" + dependencies: + "prelude-ls" "^1.2.1" + "type-check" "~0.4.0" + "lie@3.0.4": "integrity" "sha1-vHrh6+fxyN45r9zU94kHa0ew9jQ=" "resolved" "https://registry.npmjs.org/lie/-/lie-3.0.4.tgz" @@ -1367,12 +2004,30 @@ dependencies: "immediate" "~3.0.5" +"load-json-file@^2.0.0": + "integrity" "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=" + "resolved" "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "graceful-fs" "^4.1.2" + "parse-json" "^2.2.0" + "pify" "^2.0.0" + "strip-bom" "^3.0.0" + +"locate-path@^2.0.0": + "integrity" "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=" + "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "p-locate" "^2.0.0" + "path-exists" "^3.0.0" + "lodash.isnull@^3.0.0": "integrity" "sha1-+vvlnqHcon7teGU0A53YTC4HxW4=" "resolved" "https://registry.npmjs.org/lodash.isnull/-/lodash.isnull-3.0.0.tgz" "version" "3.0.0" -"lodash@^4.15.0", "lodash@^4.17.19": +"lodash@^4.15.0", "lodash@^4.17.14", "lodash@^4.17.19": "integrity" "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz" "version" "4.17.20" @@ -1475,19 +2130,19 @@ "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" "version" "1.6.0" -"minimatch@2 || 3": +"minimatch@^3.0.4", "minimatch@2 || 3": "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" "version" "3.0.4" dependencies: "brace-expansion" "^1.1.7" -"minimist@^1.2.5": +"minimist@^1.2.0", "minimist@^1.2.5": "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" "version" "1.2.5" -"mkdirp@^0.5.0", "mkdirp@^0.5.5": +"mkdirp@^0.5.0", "mkdirp@^0.5.1", "mkdirp@^0.5.5": "integrity" "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==" "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz" "version" "0.5.5" @@ -1543,6 +2198,11 @@ "resolved" "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz" "version" "2.0.0" +"natural-compare@^1.4.0": + "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + "version" "1.4.0" + "negotiator@0.6.2": "integrity" "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz" @@ -1568,6 +2228,16 @@ "resolved" "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz" "version" "1.2.0" +"normalize-package-data@^2.3.2": + "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==" + "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + "version" "2.5.0" + dependencies: + "hosted-git-info" "^2.1.4" + "resolve" "^1.10.0" + "semver" "2 || 3 || 4 || 5" + "validate-npm-package-license" "^3.0.1" + "normalize-space-x@^3.0.0": "integrity" "sha512-tbCJerqZCCHPst4rRKgsTanLf45fjOyeAU5zE3mhDxJtFJKt66q39g2XArWhXelgTFVib8mNBUm6Wrd0LxYcfQ==" "resolved" "https://registry.npmjs.org/normalize-space-x/-/normalize-space-x-3.0.0.tgz" @@ -1610,11 +2280,36 @@ "to-object-x" "^1.4.1" "to-property-key-x" "^2.0.1" -"object-keys@^1.0.6": +"object-inspect@^1.8.0": + "integrity" "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==" + "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz" + "version" "1.8.0" + +"object-keys@^1.0.12", "object-keys@^1.0.6", "object-keys@^1.1.1": "integrity" "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" "resolved" "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" "version" "1.1.1" +"object.assign@^4.1.1": + "integrity" "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==" + "resolved" "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "call-bind" "^1.0.0" + "define-properties" "^1.1.3" + "has-symbols" "^1.0.1" + "object-keys" "^1.1.1" + +"object.values@^1.1.1": + "integrity" "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==" + "resolved" "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "define-properties" "^1.1.3" + "es-abstract" "^1.17.0-next.1" + "function-bind" "^1.1.1" + "has" "^1.0.3" + "on-finished@^2.3.0", "on-finished@~2.3.0": "integrity" "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=" "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" @@ -1634,6 +2329,44 @@ dependencies: "wrappy" "1" +"optionator@^0.9.1": + "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" + "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" + "version" "0.9.1" + dependencies: + "deep-is" "^0.1.3" + "fast-levenshtein" "^2.0.6" + "levn" "^0.4.1" + "prelude-ls" "^1.2.1" + "type-check" "^0.4.0" + "word-wrap" "^1.2.3" + +"p-limit@^1.1.0": + "integrity" "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz" + "version" "1.3.0" + dependencies: + "p-try" "^1.0.0" + +"p-locate@^2.0.0": + "integrity" "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=" + "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "p-limit" "^1.1.0" + +"p-try@^1.0.0": + "integrity" "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + "resolved" "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz" + "version" "1.0.0" + +"parent-module@^1.0.0": + "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" + "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "callsites" "^3.0.0" + "parse-int-x@^2.0.0": "integrity" "sha512-NIMm52gmd1+0qxJK8lV3OZ4zzWpRH1xcz9xCHXl+DNzddwUdS4NEtd7BmTeK7iCIXoaK5e6BoDMHgieH2eNIhg==" "resolved" "https://registry.npmjs.org/parse-int-x/-/parse-int-x-2.0.0.tgz" @@ -1644,6 +2377,13 @@ "to-string-x" "^1.4.2" "trim-left-x" "^3.0.0" +"parse-json@^2.2.0": + "integrity" "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=" + "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" + "version" "2.2.0" + dependencies: + "error-ex" "^1.2.0" + "parse5@^3.0.1": "integrity" "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==" "resolved" "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz" @@ -1676,11 +2416,21 @@ "passport-strategy" "1.x.x" "pause" "0.0.1" +"path-exists@^3.0.0": + "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + "version" "3.0.0" + "path-is-absolute@^1.0.0": "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" "version" "1.0.1" +"path-key@^3.1.0": + "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" + "path-parse@^1.0.6": "integrity" "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" @@ -1691,11 +2441,30 @@ "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" "version" "0.1.7" +"path-type@^2.0.0": + "integrity" "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=" + "resolved" "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "pify" "^2.0.0" + "pause@0.0.1": "integrity" "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" "resolved" "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz" "version" "0.0.1" +"pify@^2.0.0": + "integrity" "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + "version" "2.3.0" + +"pkg-dir@^2.0.0": + "integrity" "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=" + "resolved" "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "find-up" "^2.1.0" + "pouchdb-abstract-mapreduce@7.2.2": "integrity" "sha512-7HWN/2yV2JkwMnGnlp84lGvFtnm0Q55NiBUdbBcaT810+clCGKvhssBCrXnmwShD1SXTwT83aszsgiSfW+SnBA==" "resolved" "https://registry.npmjs.org/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-7.2.2.tgz" @@ -2128,6 +2897,11 @@ "uuid" "8.1.0" "vuvuzela" "1.0.3" +"prelude-ls@^1.2.1": + "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + "version" "1.2.1" + "private@^0.1.6", "private@~0.1.5": "integrity" "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" "resolved" "https://registry.npmjs.org/private/-/private-0.1.8.tgz" @@ -2138,6 +2912,11 @@ "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" "version" "2.0.1" +"progress@^2.0.0": + "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + "version" "2.0.3" + "promise-nodify@^1.0.2": "integrity" "sha1-DQ+xQ8M0ALAGG0flgSV1VwR9TFo=" "resolved" "https://registry.npmjs.org/promise-nodify/-/promise-nodify-1.0.2.tgz" @@ -2289,7 +3068,7 @@ "pug-runtime" "^3.0.0" "pug-strip-comments" "^2.0.0" -"punycode@^2.1.1": +"punycode@^2.1.0", "punycode@^2.1.1": "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" "version" "2.1.1" @@ -2329,6 +3108,23 @@ "iconv-lite" "0.4.24" "unpipe" "1.0.0" +"read-pkg-up@^2.0.0": + "integrity" "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=" + "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "find-up" "^2.0.0" + "read-pkg" "^2.0.0" + +"read-pkg@^2.0.0": + "integrity" "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=" + "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "load-json-file" "^2.0.0" + "normalize-package-data" "^2.3.2" + "path-type" "^2.0.0" + "readable-stream@^2.0.5", "readable-stream@^2.1.5": "integrity" "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==" "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz" @@ -2406,6 +3202,11 @@ "private" "~0.1.5" "source-map" "~0.5.0" +"regexpp@^3.0.0", "regexpp@^3.1.0": + "integrity" "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" + "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" + "version" "3.1.0" + "replace-comments-x@^2.0.0": "integrity" "sha512-+vMP4jqU+8HboLWms6YMNEiaZG5hh1oR6ENCnGYDF/UQ7aYiJUK/8tcl3+KZAHRCKKa3gqzrfiarlUBHQSgRlg==" "resolved" "https://registry.npmjs.org/replace-comments-x/-/replace-comments-x-2.0.0.tgz" @@ -2429,7 +3230,12 @@ dependencies: "is-nil-x" "^1.4.2" -"resolve@^1.15.1": +"resolve-from@^4.0.0": + "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + "version" "4.0.0" + +"resolve@^1.10.0", "resolve@^1.10.1", "resolve@^1.13.1", "resolve@^1.15.1", "resolve@^1.17.0": "integrity" "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==" "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz" "version" "1.18.1" @@ -2437,6 +3243,13 @@ "is-core-module" "^2.0.0" "path-parse" "^1.0.6" +"rimraf@2.6.3": + "integrity" "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" + "version" "2.6.3" + dependencies: + "glob" "^7.1.3" + "safe-buffer@~5.1.0", "safe-buffer@~5.1.1", "safe-buffer@5.1.2": "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" @@ -2474,6 +3287,21 @@ "resolved" "https://registry.npmjs.org/secure-random/-/secure-random-1.1.2.tgz" "version" "1.1.2" +"semver@^6.1.0": + "integrity" "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "resolved" "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + "version" "6.3.0" + +"semver@^7.2.1": + "integrity" "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" + "version" "7.3.2" + +"semver@2 || 3 || 4 || 5": + "integrity" "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" + "version" "5.7.1" + "send@0.17.1": "integrity" "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==" "resolved" "https://registry.npmjs.org/send/-/send-0.17.1.tgz" @@ -2524,6 +3352,27 @@ "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" "version" "1.2.0" +"shebang-command@^2.0.0": + "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "shebang-regex" "^3.0.0" + +"shebang-regex@^3.0.0": + "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" + +"slice-ansi@^2.1.0": + "integrity" "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==" + "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "ansi-styles" "^3.2.0" + "astral-regex" "^1.0.0" + "is-fullwidth-code-point" "^2.0.0" + "source-map@^0.4.2": "integrity" "sha1-66T12pwNyZneaAMti092FzZSA2s=" "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz" @@ -2553,6 +3402,37 @@ "resolved" "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.1.tgz" "version" "3.0.1" +"spdx-correct@^3.0.0": + "integrity" "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==" + "resolved" "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" + "version" "3.1.1" + dependencies: + "spdx-expression-parse" "^3.0.0" + "spdx-license-ids" "^3.0.0" + +"spdx-exceptions@^2.1.0": + "integrity" "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "resolved" "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + "version" "2.3.0" + +"spdx-expression-parse@^3.0.0": + "integrity" "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==" + "resolved" "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "spdx-exceptions" "^2.1.0" + "spdx-license-ids" "^3.0.0" + +"spdx-license-ids@^3.0.0": + "integrity" "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==" + "resolved" "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz" + "version" "3.0.6" + +"sprintf-js@~1.0.2": + "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + "version" "1.0.3" + "statuses@>= 1.5.0 < 2", "statuses@~1.5.0": "integrity" "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" @@ -2577,6 +3457,55 @@ dependencies: "safe-buffer" "~5.1.0" +"string-width@^3.0.0": + "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "emoji-regex" "^7.0.1" + "is-fullwidth-code-point" "^2.0.0" + "strip-ansi" "^5.1.0" + +"string.prototype.trimend@^1.0.1": + "integrity" "sha512-8oAG/hi14Z4nOVP0z6mdiVZ/wqjDtWSLygMigTzAb+7aPEDTleeFf+WrF+alzecxIRkckkJVn+dTlwzJXORATw==" + "resolved" "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "define-properties" "^1.1.3" + "es-abstract" "^1.18.0-next.1" + +"string.prototype.trimstart@^1.0.1": + "integrity" "sha512-7F6CdBTl5zyu30BJFdzSTlSlLPwODC23Od+iLoVH8X6+3fvDPPuBVVj9iaB1GOsSTSIgVfsfm27R2FGrAPznWg==" + "resolved" "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "define-properties" "^1.1.3" + "es-abstract" "^1.18.0-next.1" + +"strip-ansi@^5.1.0": + "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" + "version" "5.2.0" + dependencies: + "ansi-regex" "^4.1.0" + +"strip-ansi@^6.0.0": + "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" + "version" "6.0.0" + dependencies: + "ansi-regex" "^5.0.0" + +"strip-bom@^3.0.0": + "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + "version" "3.0.0" + +"strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1": + "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + "version" "3.1.1" + "sublevel-pouchdb@6.4.3": "integrity" "sha512-xaT9VesT/AaXfcO4vqZC2rl38TGTZASCUe0eoYDA5+dbpC41VJYQr4kDjJZBXb7+TkdUU7S6b3pD8pXcb91gcg==" "resolved" "https://registry.npmjs.org/sublevel-pouchdb/-/sublevel-pouchdb-6.4.3.tgz" @@ -2587,6 +3516,13 @@ "ltgt" "2.2.0" "readable-stream" "1.0.33" +"supports-color@^5.3.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" + dependencies: + "has-flag" "^3.0.0" + "supports-color@^7.1.0": "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" @@ -2594,6 +3530,21 @@ dependencies: "has-flag" "^4.0.0" +"table@^5.2.3": + "integrity" "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==" + "resolved" "https://registry.npmjs.org/table/-/table-5.4.6.tgz" + "version" "5.4.6" + dependencies: + "ajv" "^6.10.2" + "lodash" "^4.17.14" + "slice-ansi" "^2.1.0" + "string-width" "^3.0.0" + +"text-table@^0.2.0": + "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + "version" "0.2.0" + "through@~2.3.4": "integrity" "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz" @@ -2780,6 +3731,28 @@ dependencies: "utf8-byte-length" "^1.0.1" +"tsconfig-paths@^3.9.0": + "integrity" "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==" + "resolved" "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz" + "version" "3.9.0" + dependencies: + "@types/json5" "^0.0.29" + "json5" "^1.0.1" + "minimist" "^1.2.0" + "strip-bom" "^3.0.0" + +"type-check@^0.4.0", "type-check@~0.4.0": + "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" + "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "prelude-ls" "^1.2.1" + +"type-fest@^0.8.1": + "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + "version" "0.8.1" + "type-is@~1.6.17", "type-is@~1.6.18": "integrity" "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==" "resolved" "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" @@ -2819,6 +3792,13 @@ "recast" "^0.10.1" "through2" "^0.6.2" +"uri-js@^4.2.2": + "integrity" "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==" + "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz" + "version" "4.4.0" + dependencies: + "punycode" "^2.1.0" + "utf8-byte-length@^1.0.1": "integrity" "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" "resolved" "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz" @@ -2849,6 +3829,19 @@ "resolved" "https://registry.npmjs.org/uuid/-/uuid-8.1.0.tgz" "version" "8.1.0" +"v8-compile-cache@^2.0.3": + "integrity" "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==" + "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz" + "version" "2.2.0" + +"validate-npm-package-license@^3.0.1": + "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==" + "resolved" "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "spdx-correct" "^3.0.0" + "spdx-expression-parse" "^3.0.0" + "validate.io-undefined@^1.0.3": "integrity" "sha1-fif8uzFbhB54JDQxiXZxkp4gt/Q=" "resolved" "https://registry.npmjs.org/validate.io-undefined/-/validate.io-undefined-1.0.3.tgz" @@ -2876,6 +3869,13 @@ dependencies: "isexe" "^2.0.0" +"which@^2.0.1": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0" + "white-space-x@^3.0.0": "integrity" "sha512-BwMFXQNPna/4RsNPOgldVYn+FkEv+lc3wUiFzuaW6Z2DH/oSk1UrRD6SBqDgWQO4JU+aBq3PVuPD9Vz0j7mh0w==" "resolved" "https://registry.npmjs.org/white-space-x/-/white-space-x-3.0.1.tgz" @@ -2891,6 +3891,11 @@ "assert-never" "^1.2.1" "babel-walk" "3.0.0-canary-5" +"word-wrap@^1.2.3": + "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" + "version" "1.2.3" + "wrappy@1": "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" @@ -2903,6 +3908,13 @@ dependencies: "readable-stream" "~0.0.2" +"write@1.0.3": + "integrity" "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==" + "resolved" "https://registry.npmjs.org/write/-/write-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "mkdirp" "^0.5.1" + "xmlhttprequest-cookie@^0.9.2": "integrity" "sha512-39xloHdqRonNUa68sTiCqOfXK1AKAEPU0mKCfNsDL+D6zkQoz8DNqJpN/vitCOo1xUvHiHH8K8Z3RiM7wMkxpQ==" "resolved" "https://registry.npmjs.org/xmlhttprequest-cookie/-/xmlhttprequest-cookie-0.9.9.tgz"