diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a842444 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,19 @@ +{ + "cSpell.words": [ + "Letsecript", + "Optimalbits", + "Proxying", + "Unbundles", + "altnames", + "challege", + "fullchain", + "greenlock", + "letscrypt", + "letsencrypt", + "pems", + "pino", + "privkey", + "unbundle", + "webroot" + ] +} \ No newline at end of file diff --git a/hl-tests/letsencrypt/proxy.js b/hl-tests/letsencrypt/proxy.js index 50a04ee..36f2987 100644 --- a/hl-tests/letsencrypt/proxy.js +++ b/hl-tests/letsencrypt/proxy.js @@ -34,7 +34,7 @@ proxy.register('localhost', '127.0.0.1:3000', { // proxy.register("localhost", "127.0.0.1:3000"); var http = require('http'); -var keepAliveAgent = new http.Agent({ keepAlive: true, maxSockets: 1000 }); +// var keepAliveAgent = new http.Agent({ keepAlive: true, maxSockets: 1000 }); // http.globalAgent = keepAliveAgent; /* diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..4c577c8 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es6" + }, + "include": ["lib/**/*", "samples/**/*"], + "exclude": ["node_modules", "**/node_modules/*"] + } \ No newline at end of file diff --git a/lib/helper/url.js b/lib/helper/url.js new file mode 100644 index 0000000..24eba9d --- /dev/null +++ b/lib/helper/url.js @@ -0,0 +1,8 @@ +const { URL } = require('url'); + +/** @type {(url: string) => URL} */ +const parseUrl = (url) => new URL(url, 'http://xxx'); + +module.exports = { + parseUrl, +}; diff --git a/lib/letsencrypt.js b/lib/letsencrypt.js index 44d2f8e..5d7e994 100644 --- a/lib/letsencrypt.js +++ b/lib/letsencrypt.js @@ -1,8 +1,7 @@ +// @ts-check + /** * Letsecript module for Redbird (c) Optimalbits 2016 - * - * - * */ /** @@ -10,130 +9,188 @@ * * /example.com * / - * - * - * - */ -var leStoreConfig = {}; -var webrootPath = ':configDir/:hostname/.well-known/acme-challenge'; - -function init(certPath, port, logger) { - var http = require('http'); - var path = require('path'); - var url = require('url'); - var fs = require('fs'); - - logger && logger.info('Initializing letsencrypt, path %s, port: %s', certPath, port); - - leStoreConfig = { - configDir: certPath, - privkeyPath: ':configDir/:hostname/privkey.pem', - fullchainPath: ':configDir/:hostname/fullchain.pem', - certPath: ':configDir/:hostname/cert.pem', - chainPath: ':configDir/:hostname/chain.pem', - - workDir: ':configDir/letsencrypt/var/lib', - logsDir: ':configDir/letsencrypt/var/log', - - webrootPath: webrootPath, - debug: false, - }; - - // we need to proxy for example: 'example.com/.well-known/acme-challenge' -> 'localhost:port/example.com/' - http - .createServer(function (req, res) { - var uri = url.parse(req.url).pathname; - var filename = path.join(certPath, uri); - var isForbiddenPath = uri.length < 3 || filename.indexOf(certPath) !== 0; - - if (isForbiddenPath) { - logger && logger.info('Forbidden request on LetsEncrypt port %s: %s', port, filename); - res.writeHead(403); - res.end(); - return; - } - - logger && logger.info('LetsEncrypt CA trying to validate challenge %s', filename); - - fs.stat(filename, function (err, stats) { - if (err || !stats.isFile()) { - res.writeHead(404, { 'Content-Type': 'text/plain' }); - res.write('404 Not Found\n'); - res.end(); - return; - } - - res.writeHead(200); - fs.createReadStream(filename, 'binary').pipe(res); - }); - }) - .listen(port); -} - -/** - * Gets the certificates for the given domain. - * Handles all the LetsEncrypt protocol. Uses - * existing certificates if any, or negotiates a new one. - * Returns a promise that resolves to an object with the certificates. - * TODO: We should use something like https://github.com/PaquitoSoft/memored/blob/master/index.js - * to avoid */ -function getCertificates(domain, email, production, renew, logger) { - var LE = require('greenlock'); - var le; - - // Storage Backend - var leStore = require('le-store-certbot').create(leStoreConfig); - - // ACME Challenge Handlers - var leChallenge = require('le-challenge-fs').create({ - webrootPath: webrootPath, - debug: false, - }); - - le = LE.create({ - server: production - ? 'https://acme-v02.api.letsencrypt.org/directory' - : 'https://acme-staging-v02.api.letsencrypt.org/directory', - store: leStore, // handles saving of config, accounts, and certificates - challenges: { 'http-01': leChallenge }, // handles /.well-known/acme-challege keys and tokens - challengeType: 'http-01', // default to this challenge type - debug: false, - log: function (debug) { - logger && logger.info(arguments, 'Lets encrypt debugger'); - }, - }); - - // Check in-memory cache of certificates for the named domain - return le.check({ domains: [domain] }).then(function (cert) { - var opts = { - domains: [domain], - email: email, - agreeTos: true, - rsaKeySize: 2048, // 2048 or higher - challengeType: 'http-01', - }; - - if (cert) { - if (renew) { - logger && logger.info('renewing cert for ' + domain); - opts.duplicate = true; - return le.renew(opts, cert).catch(function (err) { - logger && logger.error(err, 'Error renewing certificates for ', domain); - }); - } else { - logger && logger.info('Using cached cert for ' + domain); - return cert; - } - } else { - // Register Certificate manually - logger && logger.info('Manually registering certificate for %s', domain); - return le.register(opts).catch(function (err) { - logger && logger.error(err, 'Error registering LetsEncrypt certificates'); - }); - } - }); -} - -module.exports.init = init; -module.exports.getCertificates = getCertificates; + let leStoreConfig = {}; + let webrootPath = ''; + let certPath = ''; + + /** + * + * @param {string} _certPath + * @param {number} port + * @param {*} logger + */ + function init(_certPath, port, logger) { + const http = require('http'); + const path = require('path'); + const fs = require('fs'); + const { parseUrl } = require('./helper/url'); + certPath = _certPath; + webrootPath = `${certPath}/{domain}/.well-known/acme-challenge`; + + logger && logger.info('Initializing letsencrypt, path %s, port: %s', certPath, port); + + // Storage Backend + leStoreConfig = { + basePath: certPath, + module: require.resolve('greenlock-store-fs'), + privkeyPath: ':basePath/:subject/privkey.pem', + fullchainPath: ':basePath/:subject/fullchain.pem', + certPath: ':basePath/:subject/cert.pem', + chainPath: ':basePath/:subject/chain.pem', + + webrootPath, + }; + + // we need to proxy for example: 'example.com/.well-known/acme-challenge' -> 'localhost:port/example.com/' + http + .createServer((req, res) => { + const uri = parseUrl(req.url).pathname; + const filename = path.join(certPath, uri); + const isForbiddenPath = uri.length < 3 || filename.indexOf(certPath) !== 0; + + if (isForbiddenPath) { + logger && logger.info('Forbidden request on LetsEncrypt port %s: %s', port, filename); + res.writeHead(403); + res.end(); + return; + } + + logger && logger.info('LetsEncrypt CA trying to validate challenge %s', filename); + + fs.stat(filename, function (err, stats) { + if (err || !stats.isFile()) { + res.writeHead(404, { 'Content-Type': 'text/plain' }); + res.write('404 Not Found\n'); + res.end(); + return; + } + + res.writeHead(200); + fs.createReadStream(filename, 'binary').pipe(res); + }); + }) + .listen(port); + } + + /** + * Gets the certificates for the given domain. + * Handles all the LetsEncrypt protocol. Uses + * existing certificates if any, or negotiates a new one. + * Returns a promise that resolves to an object with the certificates. + * TODO: We should use something like https://github.com/PaquitoSoft/memored/blob/master/index.js + * to avoid + * @param {string} domain + * @param {string} email + * @param {boolean} [production] + * @param {*} [logger] + * @param {(err: Error, site: any) => void} [siteCallback] + * @param {{packageRoot?: string; configDir?: string; packageAgent?: string;}} [greenlockOpts] + */ + async function getCertificates( + domain, + email, + production = false, + logger, + siteCallback, + greenlockOpts = {} + ) { + const findRoot = require('find-root'); + const LE = require('@root/greenlock'); + greenlockOpts.packageRoot = greenlockOpts.packageRoot || findRoot(certPath); + + if (!greenlockOpts.packageAgent) { + const pkg = require(greenlockOpts.packageRoot + '/package.json'); + greenlockOpts.packageAgent = greenlockOpts.packageAgent || pkg.name + '/' + pkg.version; + } + + if (!siteCallback) { + siteCallback = () => {}; + } + + // ACME Challenge Handlers + const leChallenge = { + module: require.resolve('acme-http-01-webroot'), + webroot: webrootPath, + debug: !production, + }; + + /** + * @see https://git.rootprojects.org/root/acme.js#events + * @param {string} eventName + * @param {*} details + */ + const notifyLogger = (eventName, details) => { + switch (eventName) { + case 'error': + logger.error(details, eventName); + break; + case 'warning': + logger.warn(details, eventName); + break; + default: + logger.debug(details, eventName); + break; + } + }; + + const le = LE.create({ + ...greenlockOpts, + staging: !production, + maintainerEmail: email, + manager: '@greenlock/manager', + notify: notifyLogger, + }); + + le.manager.defaults({ + agreeToTerms: true, + subscriberEmail: email, + challenges: { + // handles /.well-known/acme-challege keys and tokens + 'http-01': leChallenge, + }, + store: leStoreConfig, // handles saving of config, accounts, and certificates + }); + + const onSite = (site) => { + site.pems.fullchain = site.pems.cert + '\n' + site.pems.chain + '\n'; + logger.info('Get LetsEncrypt certificates for ' + domain); + siteCallback(null, site); + }; + + // TODO test me + const onAdd = async (err, event) => { + if (err) { + logger.error(err, 'Error registering LetsEncrypt certificates for ' + domain); + return siteCallback(err); + } + logger.debug(event, 'After add'); + const site = await le.get({ servername: domain }); + if (site) { + return onSite(site); + } + + return siteCallback(new Error(domain + ' was not found in any site config')); + }; + + const site = await le + .get({ + servername: domain, + }); + + if (site) { + return onSite(site) + } + + return le + .add({ + subject: domain, + altnames: [domain], + }) + .then(onAdd.bind(this, null)) + .catch(onAdd); + } + + module.exports.init = init; + module.exports.getCertificates = getCertificates; + \ No newline at end of file diff --git a/lib/proxy.js b/lib/proxy.js index 1d876c0..13b23ad 100755 --- a/lib/proxy.js +++ b/lib/proxy.js @@ -1,23 +1,19 @@ /*eslint-env node */ 'use strict'; -var http = require('http'), - httpProxy = require('http-proxy'), - validUrl = require('valid-url'), - parseUrl = require('url').parse, - path = require('path'), - _ = require('lodash'), - pino = require('pino'), - cluster = require('cluster'), - hash = require('object-hash'), - LRUCache = require('lru-cache'), - routeCache = new LRUCache({ max: 5000 }), - safe = require('safetimeout'), - letsencrypt = require('./letsencrypt.js'), - Promise = require('bluebird'); - -var ONE_DAY = 60 * 60 * 24 * 1000; -var ONE_MONTH = ONE_DAY * 30; +const http = require('http'); +const httpProxy = require('http-proxy'); +const validUrl = require('valid-url'); +const path = require('path'); +const _ = require('lodash'); +const pino = require('pino'); +const cluster = require('cluster'); +const hash = require('object-hash'); +const LRUCache = require('lru-cache'); +const routeCache = new LRUCache({ max: 5000 }); +const letsencrypt = require('./letsencrypt.js'); +const tls = require('tls'); +const { parseUrl } = require('./helper/url'); function ReverseProxy(opts) { if (!(this instanceof ReverseProxy)) { @@ -30,23 +26,25 @@ function ReverseProxy(opts) { this.opts.httpProxy = {}; } - var log; + let log; if (opts.bunyan !== false) { log = this.log = pino( opts.bunyan || { name: 'redbird', + prettyPrint: { + levelFirst: true, + }, + prettifier: require('pino-pretty'), } ); } - var _this = this; - if ((opts.cluster && typeof opts.cluster !== 'number') || opts.cluster > 32) { throw Error('cluster setting must be an integer less than 32'); } if (opts.cluster && cluster.isMaster) { - for (var i = 0; i < opts.cluster; i++) { + for (let i = 0; i < opts.cluster; i++) { cluster.fork(); } @@ -83,7 +81,7 @@ function ReverseProxy(opts) { // // Create a proxy server with custom application logic // - var proxy = (this.proxy = httpProxy.createProxyServer({ + const proxy = (this.proxy = httpProxy.createProxyServer({ xfwd: opts.xfwd != false, prependPath: false, secure: opts.secure !== false, @@ -96,7 +94,7 @@ function ReverseProxy(opts) { */ })); - proxy.on('proxyReq', function (p, req) { + proxy.on('proxyReq', (p, req) => { if (req.host != null) { p.setHeader('host', req.host); } @@ -107,7 +105,7 @@ function ReverseProxy(opts) { // if (opts.ntlm) { proxy.on('proxyRes', function (proxyRes) { - var key = 'www-authenticate'; + const key = 'www-authenticate'; proxyRes.headers[key] = proxyRes.headers[key] && proxyRes.headers[key].split(','); }); } @@ -117,8 +115,8 @@ function ReverseProxy(opts) { // if (opts.ssl) { if (_.isArray(opts.ssl)) { - opts.ssl.forEach(function (sslOpts) { - _this.setupHttpsProxy(proxy, websocketsUpgrade, log, sslOpts); + opts.ssl.forEach((sslOpts) => { + this.setupHttpsProxy(proxy, websocketsUpgrade, log, sslOpts); }); } else { this.setupHttpsProxy(proxy, websocketsUpgrade, log, opts.ssl); @@ -128,7 +126,7 @@ function ReverseProxy(opts) { // // Plain HTTP Proxy // - var server = this.setupHttpProxy(proxy, websocketsUpgrade, log, opts); + const server = this.setupHttpProxy(proxy, websocketsUpgrade, log, opts); server.listen(opts.port, opts.host); @@ -142,11 +140,11 @@ function ReverseProxy(opts) { } function websocketsUpgrade(req, socket, head) { - socket.on('error', function (err) { + socket.on('error', (err) => { log && log.error(err, 'WebSockets error'); }); - var src = _this._getSource(req); - _this._getTarget(src, req).then(function (target) { + const src = this._getSource(req); + this._getTarget(src, req).then((target) => { log && log.info({ headers: req.headers, target: target }, 'upgrade to websockets'); if (target) { if (target.useTargetHostHeader === true) { @@ -186,27 +184,23 @@ function ReverseProxy(opts) { } ReverseProxy.prototype.setupHttpProxy = function (proxy, websocketsUpgrade, log, opts) { - var _this = this; - var httpServerModule = opts.serverModule || http; - var server = (this.server = httpServerModule.createServer(function (req, res) { - var src = _this._getSource(req); - _this - ._getTarget(src, req, res) - .bind(_this) - .then(function (target) { - if (target) { - if (shouldRedirectToHttps(_this.certs, src, target, _this)) { - redirectToHttps(req, res, target, opts.ssl, log); - } else { - proxy.web(req, res, { - target: target, - secure: !proxy.options || proxy.options.secure !== false, - }); - } + const httpServerModule = opts.serverModule || http; + const server = (this.server = httpServerModule.createServer((req, res) => { + const src = this._getSource(req); + this._getTarget(src, req, res).then((target) => { + if (target) { + if (shouldRedirectToHttps(this.certs, src, target, this)) { + redirectToHttps(req, res, target, opts.ssl, log); } else { - respondNotFound(req, res); + proxy.web(req, res, { + target: target, + secure: !proxy.options || proxy.options.secure !== false, + }); } - }); + } else { + respondNotFound(req, res); + } + }); })); // @@ -230,13 +224,13 @@ ReverseProxy.prototype.setupLetsencrypt = function (log, opts) { if (!opts.letsencrypt.path) { throw Error('Missing certificate path for Lets Encrypt'); } - var letsencryptPort = opts.letsencrypt.port || 3000; + const letsencryptPort = opts.letsencrypt.port || 3000; letsencrypt.init(opts.letsencrypt.path, letsencryptPort, log); opts.resolvers = opts.resolvers || []; this.letsencryptHost = '127.0.0.1:' + letsencryptPort; - var targetHost = 'http://' + this.letsencryptHost; - var challengeResolver = function (host, url) { + const targetHost = 'http://' + this.letsencryptHost; + const challengeResolver = (host, url) => { if (/^\/.well-known\/acme-challenge/.test(url)) { return targetHost + '/' + host; } @@ -246,14 +240,10 @@ ReverseProxy.prototype.setupLetsencrypt = function (log, opts) { }; ReverseProxy.prototype.setupHttpsProxy = function (proxy, websocketsUpgrade, log, sslOpts) { - var _this = this; - var https; + let https; + const certs = (this.certs = this.certs || {}); - this.certs = this.certs || {}; - - var certs = this.certs; - - var ssl = { + const ssl = { SNICallback: function (hostname, cb) { if (cb) { cb(null, certs[hostname]); @@ -290,11 +280,11 @@ ReverseProxy.prototype.setupHttpsProxy = function (proxy, websocketsUpgrade, log https = sslOpts.serverModule || require('https'); } - var httpsServer = (this.httpsServer = https.createServer(ssl, function (req, res) { - var src = _this._getSource(req); - var httpProxyOpts = Object.assign({}, _this.opts.httpProxy); + const httpsServer = (this.httpsServer = https.createServer(ssl, (req, res) => { + const src = this._getSource(req); + const httpProxyOpts = Object.assign({}, this.opts.httpProxy); - _this._getTarget(src, req, res).then(function (target) { + this._getTarget(src, req, res).then((target) => { if (target) { httpProxyOpts.target = target; proxy.web(req, res, httpProxyOpts); @@ -306,12 +296,12 @@ ReverseProxy.prototype.setupHttpsProxy = function (proxy, websocketsUpgrade, log httpsServer.on('upgrade', websocketsUpgrade); - httpsServer.on('error', function (err) { + httpsServer.on('error', (err) => { log && log.error(err, 'HTTPS Server Error'); }); - httpsServer.on('clientError', function (err) { - log && log.error(err, 'HTTPS Client Error'); + httpsServer.on('clientError', (err) => { + log && log.error(err, 'HTTPS Client Error'); }); log && log.info('Listening to HTTPS requests on port %s', sslOpts.port); @@ -325,8 +315,7 @@ ReverseProxy.prototype.addResolver = function (resolver) { resolver = [resolver]; } - var _this = this; - resolver.forEach(function (resolveObj) { + resolver.forEach((resolveObj) => { if (!_.isFunction(resolveObj)) { throw new Error('Resolver must be an invokable function.'); } @@ -335,10 +324,10 @@ ReverseProxy.prototype.addResolver = function (resolver) { resolveObj.priority = 0; } - _this.resolvers.push(resolveObj); + this.resolvers.push(resolveObj); }); - _this.resolvers = _.sortBy(_.uniq(_this.resolvers), ['priority']).reverse(); + this.resolvers = _.sortBy(_.uniq(this.resolvers), ['priority']).reverse(); }; ReverseProxy.prototype.removeResolver = function (resolver) { @@ -359,13 +348,12 @@ ReverseProxy.buildTarget = function (target, opts) { }; /** - Register a new route. - - @src {String|URL} A string or a url parsed by node url module. - Note that port is ignored, since the proxy just listens to one port. - - @target {String|URL} A string or a url parsed by node url module. - @opts {Object} Route options. + * Register a new route. + * + * @param {string | URL} src A string or a url parsed by node url module. + * Note that port is ignored, since the proxy just listens to one port. + * @param {string} target A string or a url parsed by node url module. + * @param {*} opts Route options. */ ReverseProxy.prototype.register = function (src, target, opts) { if (this.opts.cluster && cluster.isMaster) return this; @@ -385,12 +373,12 @@ ReverseProxy.prototype.register = function (src, target, opts) { throw Error('Cannot register a new route with unspecified src or target'); } - var routing = this.routing; + const routing = this.routing; src = prepareUrl(src); if (opts) { - var ssl = opts.ssl; + const ssl = opts.ssl; if (ssl) { if (!this.httpsServer) { throw Error('Cannot register https routes without defining a ssl port'); @@ -405,12 +393,7 @@ ReverseProxy.prototype.register = function (src, target, opts) { return; } this.log && this.log.info('Getting Lets Encrypt certificates for %s', src.hostname); - this.updateCertificates( - src.hostname, - ssl.letsencrypt.email, - ssl.letsencrypt.production, - this.opts.letsencrypt.renewWithin || ONE_MONTH - ); + this.updateCertificates(src.hostname, ssl.letsencrypt.email, ssl.letsencrypt.production); } else { // Trigger the use of the default certificates. this.certs[src.hostname] = void 0; @@ -420,9 +403,9 @@ ReverseProxy.prototype.register = function (src, target, opts) { } target = ReverseProxy.buildTarget(target, opts); - var host = (routing[src.hostname] = routing[src.hostname] || []); - var pathname = src.pathname || '/'; - var route = _.find(host, { path: pathname }); + const host = (routing[src.hostname] = routing[src.hostname] || []); + const pathname = src.pathname || '/'; + let route = _.find(host, { path: pathname }); if (!route) { route = { path: pathname, rr: 0, urls: [], opts: Object.assign({}, opts) }; @@ -442,50 +425,53 @@ ReverseProxy.prototype.register = function (src, target, opts) { return this; }; -ReverseProxy.prototype.updateCertificates = function ( +/** + * + * @param {string} domain + * @param {string} email + * @param {boolean} production + * @param {number} renewWithin Deprecated + * @param {boolean} renew Deprecated + */ +ReverseProxy.prototype.updateCertificates = async function ( domain, email, production, - renewWithin, - renew + renewWithin = 0, + renew = false ) { - var _this = this; - return letsencrypt.getCertificates(domain, email, production, renew, this.log).then( - function (certs) { - if (certs) { - var opts = { - key: certs.privkey, - cert: certs.cert + certs.chain, - }; - _this.certs[domain] = tls.createSecureContext(opts).context; - - // - // TODO: cluster friendly - // - var renewTime = certs.expiresAt - Date.now() - renewWithin; - renewTime = - renewTime > 0 ? renewTime : _this.opts.letsencrypt.minRenewTime || 60 * 60 * 1000; - - _this.log && - _this.log.info('Renewal of %s in %s days', domain, Math.floor(renewTime / ONE_DAY)); - - function renewCertificate() { - _this.log && _this.log.info('Renewing letscrypt certificates for %s', domain); - _this.updateCertificates(domain, email, production, renewWithin, true); - } + if (renew) { + logger.warn('renew parameter is deprecated and is automatically detected by greenlock.'); + } + + if (renewWithin) { + logger.warn('production parameter is deprecated.'); + } - _this.certs[domain].renewalTimeout = safe.setTimeout(renewCertificate, renewTime); + const siteCallback = (err, site) => { + if (err) { + if (err.message.contains('ENOENT: no such file or directory')) { + this.log && this.log.warn(err, err.message); } else { - // - // TODO: Try again, but we need an exponential backof to avoid getting banned. - // - _this.log && _this.log.info('Could not get any certs for %s', domain); + this.log && this.log.error(err, 'Error getting LetsEncrypt certificates'); + return; } - }, - function (err) { - console.error('Error getting LetsEncrypt certificates', err); } - ); + if (!site || !site.pems || !site.pems.privkey || !site.pems.fullchain) { + // + // TODO: Try again, but we need an exponential back of to avoid getting banned. + // + this.log && this.log.info('Could not get any certs for %s', domain); + return; + } + const opts = { + key: site.pems.privkey, + cert: site.pems.fullchain, + }; + this.certs[domain] = tls.createSecureContext(opts).context; + }; + + letsencrypt.getCertificates(domain, email, production, this.log, siteCallback); }; ReverseProxy.prototype.unregister = function (src, target) { @@ -496,9 +482,9 @@ ReverseProxy.prototype.unregister = function (src, target) { } src = prepareUrl(src); - var routes = this.routing[src.hostname] || []; - var pathname = src.pathname || '/'; - var i; + const routes = this.routing[src.hostname] || []; + const pathname = src.pathname || '/'; + let i = 0; for (i = 0; i < routes.length; i++) { if (routes[i].path === pathname) { @@ -507,7 +493,7 @@ ReverseProxy.prototype.unregister = function (src, target) { } if (i < routes.length) { - var route = routes[i]; + const route = routes[i]; if (target) { target = prepareUrl(target); @@ -520,11 +506,8 @@ ReverseProxy.prototype.unregister = function (src, target) { if (route.urls.length === 0) { routes.splice(i, 1); - var certs = this.certs; + const certs = this.certs; if (certs) { - if (certs[src.hostname] && certs[src.hostname].renewalTimeout) { - safe.clearTimeout(certs[src.hostname].renewalTimeout); - } delete certs[src.hostname]; } } @@ -542,17 +525,17 @@ ReverseProxy.prototype._defaultResolver = function (host, url) { url = url || '/'; - var routes = this.routing[host]; - var i = 0; + const routes = this.routing[host]; + let i = 0; if (routes) { - var len = routes.length; + const len = routes.length; // // Find path that matches the start of req.url // for (i = 0; i < len; i++) { - var route = routes[i]; + const route = routes[i]; if (route.path === '/' || startsWith(url, route.path)) { return route; @@ -570,18 +553,17 @@ ReverseProxy.prototype._defaultResolver.priority = 0; * @returns {*} */ ReverseProxy.prototype.resolve = function (host, url, req) { - var resolvedValue; - var promiseArray = []; + const promiseArray = []; host = host && host.toLowerCase(); - for (var i = 0; i < this.resolvers.length; i++) { + for (let i = 0; i < this.resolvers.length; i++) { promiseArray.push(this.resolvers[i].call(this, host, url, req)); } return Promise.all(promiseArray) - .then(function (resolverResults) { - for (var i = 0; i < resolverResults.length; i++) { - var route = resolverResults[i]; + .then((resolverResults) => { + for (let i = 0; i < resolverResults.length; i++) { + let route = resolverResults[i]; if (route && (route = ReverseProxy.buildRoute(route))) { // ensure resolved route has path that prefixes URL @@ -607,13 +589,13 @@ ReverseProxy.buildRoute = function (route) { return route; } - var cacheKey = _.isString(route) ? route : hash(route); - var entry = routeCache.get(cacheKey); + const cacheKey = _.isString(route) ? route : hash(route); + const entry = routeCache.get(cacheKey); if (entry) { return entry; } - var routeObject = { rr: 0, isResolved: true }; + const routeObject = { rr: 0, isResolved: true }; if (_.isString(route)) { routeObject.urls = [ReverseProxy.buildTarget(route)]; routeObject.path = '/'; @@ -633,71 +615,69 @@ ReverseProxy.buildRoute = function (route) { }; ReverseProxy.prototype._getTarget = function (src, req, res) { - var url = req.url; + const url = req.url; - return this.resolve(src, url, req) - .bind(this) - .then(function (route) { - if (!route) { - this.log && this.log.warn({ src: src, url: url }, 'no valid route found for given source'); - return; - } - - var pathname = route.path; - if (pathname.length > 1) { - // - // remove prefix from src - // - req._url = url; // save original url - req.url = url.substr(pathname.length) || ''; - } + return this.resolve(src, url, req).then((route) => { + if (!route) { + this.log && this.log.warn({ src: src, url: url }, 'no valid route found for given source'); + return; + } + const pathname = route.path; + if (pathname.length > 1) { // - // Perform Round-Robin on the available targets - // TODO: if target errors with EHOSTUNREACH we should skip this - // target and try with another. + // remove prefix from src // - var urls = route.urls; - var j = route.rr; - route.rr = (j + 1) % urls.length; // get and update Round-robin index. - var target = route.urls[j]; + req._url = url; // save original url + req.url = url.substr(pathname.length) || ''; + } - // - // Fix request url if targetname specified. - // - if (target.pathname) { - if (req.url) { - req.url = path.posix.join(target.pathname, req.url); - } else { - req.url = target.pathname; - } - } + // + // Perform Round-Robin on the available targets + // TODO: if target errors with EHOSTUNREACH we should skip this + // target and try with another. + // + const urls = route.urls; + const j = route.rr; + route.rr = (j + 1) % urls.length; // get and update Round-robin index. + const target = route.urls[j]; - // - // Host headers are passed through from the source by default - // Often we want to use the host header of the target instead - // - if (target.useTargetHostHeader === true) { - req.host = target.host; + // + // Fix request url if target name specified. + // + if (target.pathname) { + if (req.url) { + req.url = path.posix.join(target.pathname, req.url); + } else { + req.url = target.pathname; } + } - if (route.opts.onRequest) { - const resultFromRequestHandler = route.opts.onRequest(req, res, target); - if (resultFromRequestHandler !== undefined) { - this.log && - this.log.info( - 'Proxying %s received result from onRequest handler, returning.', - src + url - ); - return resultFromRequestHandler; - } + // + // Host headers are passed through from the source by default + // Often we want to use the host header of the target instead + // + if (target.useTargetHostHeader === true) { + req.host = target.host; + } + + if (route.opts && route.opts.onRequest) { + const resultFromRequestHandler = route.opts.onRequest(req, res, target); + if (resultFromRequestHandler !== undefined) { + this.log && + this.log.info( + 'Proxying %s received result from onRequest handler, returning.', + src + url + ); + return resultFromRequestHandler; } + } - this.log && - this.log.info('Proxying %s to %s', src + url, path.posix.join(target.host, req.url)); + this.log && + this.log.info('Proxying %s to %s', src + url, path.posix.join(target.host, req.url)); - return target; - }); + return target; + }); }; ReverseProxy.prototype._getSource = function (req) { @@ -742,7 +722,7 @@ ReverseProxy.prototype.close = function () { } */ -var respondNotFound = function (req, res) { +const respondNotFound = function (req, res) { res.statusCode = 404; res.write('Not Found'); res.end(); @@ -759,9 +739,10 @@ ReverseProxy.prototype.notFound = function (callback) { function redirectToHttps(req, res, target, ssl, log) { req.url = req._url || req.url; // Get the original url since we are going to redirect. - var targetPort = ssl.redirectPort || ssl.port; - var hostname = req.headers.host.split(':')[0] + (targetPort ? ':' + targetPort : ''); - var url = 'https://' + path.posix.join(hostname, req.url); + const targetPort = Number(ssl.redirectPort || ssl.port); + const hostname = + req.headers.host.split(':')[0] + (targetPort && targetPort !== 443 ? ':' + targetPort : ''); + const url = 'https://' + path.posix.join(hostname, req.url); log && log.info('Redirecting %s to %s', path.posix.join(req.headers.host, req.url), url); // // We can use 301 for permanent redirect, but its bad for debugging, we may have it as @@ -792,13 +773,13 @@ function prepareUrl(url) { } function getCertData(source, unbundle) { - var fs = require('fs'); - var data; + const fs = require('fs'); + let data; // TODO: Support async source. if (source) { if (_.isArray(source)) { - var sources = source; + const sources = source; return _.flatten( _.map(sources, function (_source) { return getCertData(_source, unbundle); @@ -821,19 +802,19 @@ function getCertData(source, unbundle) { http://www.benjiegillam.com/2012/06/node-dot-js-ssl-certificate-chain/ */ function unbundleCert(bundle) { - var chain = bundle.trim().split('\n'); + const chain = bundle.trim().split('\n'); - var ca = []; - var cert = []; + const ca = []; + let cert = []; - for (var i = 0, len = chain.length; i < len; i++) { - var line = chain[i].trim(); + for (let i = 0, len = chain.length; i < len; i++) { + const line = chain[i].trim(); if (!(line.length !== 0)) { continue; } cert.push(line); if (line.match(/-END CERTIFICATE-/)) { - var joined = cert.join('\n'); + const joined = cert.join('\n'); ca.push(joined); cert = []; } @@ -841,9 +822,8 @@ function unbundleCert(bundle) { return ca; } -var tls = require('tls'); function createCredentialContext(key, cert, ca) { - var opts = {}; + const opts = {}; opts.key = getCertData(key); opts.cert = getCertData(cert); @@ -851,7 +831,7 @@ function createCredentialContext(key, cert, ca) { opts.ca = getCertData(ca, true); } - var credentials = tls.createSecureContext(opts); + const credentials = tls.createSecureContext(opts); return credentials.context; } @@ -859,11 +839,11 @@ function createCredentialContext(key, cert, ca) { // // https://stackoverflow.com/questions/18052919/javascript-regular-expression-to-add-protocol-to-url-string/18053700#18053700 // Adds http protocol if non specified. -function setHttp(link) { +const setHttp = (link) => { if (link.search(/^http[s]?\:\/\//) === -1) { link = 'http://' + link; } return link; -} +}; module.exports = ReverseProxy; diff --git a/package-lock.json b/package-lock.json index ab5d266..524c1c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,48 +1,152 @@ { "name": "redbird", - "version": "0.9.1", + "version": "0.10.0", "lockfileVersion": 1, "requires": true, "dependencies": { + "@greenlock/manager": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@greenlock/manager/-/manager-3.1.0.tgz", + "integrity": "sha512-PBy5CMK+j4oD7sj7hF5qE+xKEOSiiuL2hHd5X5ttEbtnTSDKjNeqbrR5k2ZddwVNdjOVeBIeuqlm81IFZ+Ftew==", + "requires": { + "greenlock-manager-fs": "^3.1.0" + } + }, + "@hapi/bourne": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-2.0.0.tgz", + "integrity": "sha512-WEezM1FWztfbzqIUbsDzFRVMxSoLy3HugVcux6KDDtTqzPsLE8NDRHfXvev66aH1i2oOKKar3/XDjbvh/OUBdg==" + }, + "@root/acme": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@root/acme/-/acme-3.1.0.tgz", + "integrity": "sha512-GAyaW63cpSYd2KvVp5lHLbCWeEhJPKZK9nsJvZJOKsD9Uv88KEttn4FpDZEJ+2q3Jsey0DWpuQ2I4ft0JV9p2w==", + "requires": { + "@root/csr": "^0.8.1", + "@root/encoding": "^1.0.1", + "@root/keypairs": "^0.10.0", + "@root/pem": "^1.0.4", + "@root/request": "^1.6.1", + "@root/x509": "^0.7.2" + }, + "dependencies": { + "@root/keypairs": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@root/keypairs/-/keypairs-0.10.1.tgz", + "integrity": "sha512-LuBheiQwMLCN5iWmhjyW9Mgc7uX16+gABSDfFafaBQnSPVylnOksHa22bqZmDkMCsinOOjUecgy2UgREOT3cOg==", + "requires": { + "@root/encoding": "^1.0.1", + "@root/pem": "^1.0.4", + "@root/x509": "^0.7.2" + } + } + } + }, + "@root/asn1": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@root/asn1/-/asn1-1.0.0.tgz", + "integrity": "sha512-0lfZNuOULKJDJmdIkP8V9RnbV3XaK6PAHD3swnFy4tZwtlMDzLKoM/dfNad7ut8Hu3r91wy9uK0WA/9zym5mig==", + "requires": { + "@root/encoding": "^1.0.1" + } + }, + "@root/csr": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@root/csr/-/csr-0.8.1.tgz", + "integrity": "sha512-hKl0VuE549TK6SnS2Yn9nRvKbFZXn/oAg+dZJU/tlKl/f/0yRXeuUzf8akg3JjtJq+9E592zDqeXZ7yyrg8fSQ==", + "requires": { + "@root/asn1": "^1.0.0", + "@root/pem": "^1.0.4", + "@root/x509": "^0.7.2" + } + }, + "@root/encoding": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@root/encoding/-/encoding-1.0.1.tgz", + "integrity": "sha512-OaEub02ufoU038gy6bsNHQOjIn8nUjGiLcaRmJ40IUykneJkIW5fxDqKxQx48cszuNflYldsJLPPXCrGfHs8yQ==" + }, + "@root/greenlock": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@root/greenlock/-/greenlock-4.0.5.tgz", + "integrity": "sha512-KR9w3mYE9aH33FCibI8oSYBQV+f7lc3MVPdZ9nxY2tqRLmJp05cMOMz340mtG14VnWDuznLj4TbBj3sHIuoQPQ==", + "requires": { + "@greenlock/manager": "^3.1.0", + "@root/acme": "^3.1.0", + "@root/csr": "^0.8.1", + "@root/keypairs": "^0.10.0", + "@root/mkdirp": "^1.0.0", + "@root/request": "^1.6.1", + "acme-http-01-standalone": "^3.0.5", + "cert-info": "^1.5.1", + "greenlock-store-fs": "^3.2.2", + "safe-replace": "^1.1.0" + }, + "dependencies": { + "@root/keypairs": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@root/keypairs/-/keypairs-0.10.1.tgz", + "integrity": "sha512-LuBheiQwMLCN5iWmhjyW9Mgc7uX16+gABSDfFafaBQnSPVylnOksHa22bqZmDkMCsinOOjUecgy2UgREOT3cOg==", + "requires": { + "@root/encoding": "^1.0.1", + "@root/pem": "^1.0.4", + "@root/x509": "^0.7.2" + } + } + } + }, "@root/mkdirp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@root/mkdirp/-/mkdirp-1.0.0.tgz", "integrity": "sha512-hxGAYUx5029VggfG+U9naAhQkoMSXtOeXtbql97m3Hi6/sQSRL/4khKZPyOF6w11glyCOU38WCNLu9nUcSjOfA==" }, + "@root/pem": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@root/pem/-/pem-1.0.4.tgz", + "integrity": "sha512-rEUDiUsHtild8GfIjFE9wXtcVxeS+ehCJQBwbQQ3IVfORKHK93CFnRtkr69R75lZFjcmKYVc+AXDB+AeRFOULA==" + }, "@root/request": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@root/request/-/request-1.4.2.tgz", - "integrity": "sha512-J8FM4+SJuc7WRC+Jz17m+VT2lgI7HtatHhxN1F2ck5aIKUAxJEaR4u/gLBsgT60mVHevKCjKN0O8115UtJjwLw==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@root/request/-/request-1.6.1.tgz", + "integrity": "sha512-8wrWyeBLRp7T8J36GkT3RODJ6zYmL0/maWlAUD5LOXT28D3TDquUepyYDKYANNA3Gc8R5ZCgf+AXvSTYpJEWwQ==" }, - "acme": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/acme/-/acme-1.3.5.tgz", - "integrity": "sha512-KIFVyMho7y3RxRSTzkuX031TmfXwzl0ioy8+r2pnfLz6YWFQ5q7a/cYUDTgIbrFMPe/syY26Qv1DOdHQ5ARWcw==", + "@root/x509": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@root/x509/-/x509-0.7.2.tgz", + "integrity": "sha512-ENq3LGYORK5NiMFHEVeNMt+fTXaC7DTS6sQXoqV+dFdfT0vmiL5cDLjaXQhaklJQq0NiwicZegzJRl1ZOTp3WQ==", "requires": { - "acme-v2": "^1.8.6" + "@root/asn1": "^1.0.0", + "@root/encoding": "^1.0.1" } }, - "acme-dns-01-cli": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/acme-dns-01-cli/-/acme-dns-01-cli-3.0.7.tgz", - "integrity": "sha512-Aa4bUpq6ftX1VODiShOetOY5U0tsXY5EV7+fQwme3Q8Y9rjYBArBXHgFCAVKtK1AF+Ev8pIuF6Z42hzMFa73/w==" + "acme-http-01-standalone": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/acme-http-01-standalone/-/acme-http-01-standalone-3.0.5.tgz", + "integrity": "sha512-W4GfK+39GZ+u0mvxRVUcVFCG6gposfzEnSBF20T/NUwWAKG59wQT1dUbS1NixRIAsRuhpGc4Jx659cErFQH0Pg==" }, - "acme-v2": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/acme-v2/-/acme-v2-1.8.6.tgz", - "integrity": "sha512-LWdicUYHTGDtYX7LlgsQurmM9txwfAFydg7mQLPKHrFMnNNtfJEtHC2fWfr+pFGNb3XKIbvyFUoyFB6cOmWRpA==", + "acme-http-01-webroot": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acme-http-01-webroot/-/acme-http-01-webroot-3.0.0.tgz", + "integrity": "sha512-K63egONklWEOYz0rgl9w2a24eIZ+KkDxCJdxgjN4a0l5vVUys7lUIcwj8MtVjBcGvMBwXfWDwOshLDH+UrNscA==", "requires": { - "@root/request": "^1.3.11", - "rsa-compat": "^2.0.8" + "@root/mkdirp": "^1.0.0" } }, "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "dependencies": { + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + } } }, "ansi-regex": { @@ -72,6 +176,63 @@ "sprintf-js": "~1.0.2" } }, + "args": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz", + "integrity": "sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==", + "requires": { + "camelcase": "5.0.0", + "chalk": "2.4.2", + "leven": "2.1.0", + "mri": "1.1.4" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "arr-diff": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", @@ -123,9 +284,9 @@ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" }, "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assertion-error": { "version": "1.0.0", @@ -133,20 +294,43 @@ "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=", "dev": true }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "dev": true, + "requires": { + "async": "^2.4.0" + } + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "balanced-match": { "version": "1.0.0", @@ -174,14 +358,6 @@ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.x.x" - } - }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", @@ -232,6 +408,11 @@ } } }, + "camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -277,15 +458,23 @@ "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", "dev": true }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { "delayed-stream": "~1.0.0" } @@ -338,14 +527,6 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.x.x" - } - }, "d": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", @@ -488,11 +669,6 @@ "version": "2.11.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" } } }, @@ -534,10 +710,66 @@ "jsbn": "~0.1.0" } }, - "eckles": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/eckles/-/eckles-1.4.1.tgz", - "integrity": "sha512-auWyk/k8oSkVHaD4RxkPadKsLUcIwKgr/h8F7UZEueFDBO7BsE4y+H6IMUDbfqKIFPg/9MxV6KcBdJCmVVcxSA==" + "electrode-confippet": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/electrode-confippet/-/electrode-confippet-1.5.0.tgz", + "integrity": "sha1-aEFlFNEp5fsqzP2jazEoSbnjrzY=", + "dev": true, + "requires": { + "js-yaml": "^3.5.3", + "lodash": "^4.13.1" + } + }, + "electrode-server": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/electrode-server/-/electrode-server-2.5.0.tgz", + "integrity": "sha512-zUqnUZMq8nrgaxmoTmfb85aCPyUgugyrucBhhllE5XGA16y/vjvCpc2Gtb4T0imdt81NEXWXyiT0+JgAt/gG9g==", + "dev": true, + "requires": { + "async-eventemitter": "^0.2.2", + "bluebird": ">= 2.10.0 <= 3.x.x", + "chalk": "^4.1.0", + "electrode-confippet": "^1.2.10", + "hapi": "^17.5.0", + "lodash": "^4.17.20", + "require-at": "^1.0.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, "end-of-stream": { "version": "0.1.5", @@ -632,8 +864,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escope": { "version": "3.6.0", @@ -758,9 +989,9 @@ } }, "eventemitter3": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", - "integrity": "sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg==" + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "expand-brackets": { "version": "0.1.5", @@ -792,7 +1023,8 @@ "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true }, "extglob": { "version": "0.3.2", @@ -835,9 +1067,9 @@ "dev": true }, "fast-redact": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-2.0.0.tgz", - "integrity": "sha512-zxpkULI9W9MNTK2sJ3BpPQrTEXFNESd2X6O1tXMFpK/XM0G5c5Rll2EVYZH2TqI3xRGK/VaJ+eEOt7pnENJpeA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.0.0.tgz", + "integrity": "sha512-a/S/Hp6aoIjx7EmugtzLqXmcNsyFszqbt6qQ99BdG61QjBZF6shNis0BYR6TsZOQ1twYc0FN2Xdhwwbv6+KD0w==" }, "fast-safe-stringify": { "version": "2.0.7", @@ -869,6 +1101,11 @@ "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", "dev": true }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "findup-sync": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", @@ -923,27 +1160,9 @@ "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==" }, "follow-redirects": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", - "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==" }, "for-in": { "version": "1.0.2", @@ -966,12 +1185,12 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -1211,41 +1430,13 @@ "natives": "^1.1.0" } }, - "greenlock": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/greenlock/-/greenlock-2.8.8.tgz", - "integrity": "sha512-U2pqxXXf0naeZc2363Xe174C6/T9lXGZYQjXBqa/PMb1CYRQuHwXlAqFEUu75JkxyHAzFGj/uliqSyQwIc91Yg==", + "greenlock-manager-fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/greenlock-manager-fs/-/greenlock-manager-fs-3.1.1.tgz", + "integrity": "sha512-np6qdnPIOZx40PAcSQcqK1eMPWjTKxsxcgRd/OVg0ai49WC1Ds74CTrwmB84pq2n53ikbnDBQFmKEQ4AC0DK8w==", "requires": { - "acme": "^1.3.5", - "acme-dns-01-cli": "^3.0.0", - "acme-v2": "^1.8.6", - "cert-info": "^1.5.1", - "greenlock-store-fs": "^3.0.2", - "keypairs": "^1.2.14", - "le-challenge-fs": "^2.0.2", - "le-sni-auto": "^2.1.9", - "le-store-certbot": "^2.2.3", - "rsa-compat": "^2.0.8" - }, - "dependencies": { - "le-store-certbot": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/le-store-certbot/-/le-store-certbot-2.2.3.tgz", - "integrity": "sha512-c4ACR+v+JKMiAOOshLh6gdCKA7wIWR16+mROMLpQjq3rXJ3Vm8FaBHe2H+crT+flP+g7FmciAwUlfOJEJpIuCQ==", - "requires": { - "@root/mkdirp": "^1.0.0", - "pyconf": "^1.1.7", - "safe-replace": "^1.1.0" - } - }, - "pyconf": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/pyconf/-/pyconf-1.1.7.tgz", - "integrity": "sha512-v4clh33m68sjtMsh8XMpjhGWb/MQODAYZ1y7ORG5Qv58UK25OddoB+oXyexgDkK8ttFui/lZm2sQDgA2Ftjfkw==", - "requires": { - "safe-replace": "^1.0.2" - } - } + "@root/mkdirp": "^1.0.0", + "safe-replace": "^1.1.0" } }, "greenlock-store-fs": { @@ -1386,22 +1577,331 @@ } }, "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "hapi": { + "version": "17.8.5", + "resolved": "https://registry.npmjs.org/hapi/-/hapi-17.8.5.tgz", + "integrity": "sha512-+RnMWK/HI3VCvzfy0vO28YycMX19OiY8h9tYaDzjjOJ1eTh/HY2URvhFNkcqxZ1R1uoUdiB+pnjGi9e+vkaPEw==", + "dev": true, + "requires": { + "accept": "3.x.x", + "ammo": "3.x.x", + "boom": "7.x.x", + "bounce": "1.x.x", + "call": "5.x.x", + "catbox": "10.x.x", + "catbox-memory": "3.x.x", + "heavy": "6.x.x", + "hoek": "6.x.x", + "joi": "14.x.x", + "mimos": "4.x.x", + "podium": "3.x.x", + "shot": "4.x.x", + "somever": "2.x.x", + "statehood": "6.x.x", + "subtext": "6.x.x", + "teamwork": "3.x.x", + "topo": "3.x.x" + }, + "dependencies": { + "accept": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/accept/-/accept-3.1.3.tgz", + "integrity": "sha512-OgOEAidVEOKPup+Gv2+2wdH2AgVKI9LxsJ4hicdJ6cY0faUuZdZoi56kkXWlHp9qicN1nWQLmW5ZRGk+SBS5xg==", + "dev": true, + "requires": { + "boom": "7.x.x", + "hoek": "6.x.x" + } + }, + "ammo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ammo/-/ammo-3.0.3.tgz", + "integrity": "sha512-vo76VJ44MkUBZL/BzpGXaKzMfroF4ZR6+haRuw9p+eSWfoNaH2AxVc8xmiEPC08jhzJSeM6w7/iMUGet8b4oBQ==", + "dev": true, + "requires": { + "hoek": "6.x.x" + } + }, + "b64": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/b64/-/b64-4.1.2.tgz", + "integrity": "sha512-+GUspBxlH3CJaxMUGUE1EBoWM6RKgWiYwUDal0qdf8m3ArnXNN1KzKVo5HOnE/FSq4HHyWf3TlHLsZI8PKQgrQ==", + "dev": true, + "requires": { + "hoek": "6.x.x" + } + }, + "big-time": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/big-time/-/big-time-2.0.1.tgz", + "integrity": "sha512-qtwYYoocwpiAxTXC5sIpB6nH5j6ckt+n/jhD7J5OEiFHnUZEFn0Xk8STUaE5s10LdazN/87bTDMe+fSihaW7Kg==", + "dev": true + }, + "boom": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-7.2.2.tgz", + "integrity": "sha512-IFUbOa8PS7xqmhIjpeStwT3d09hGkNYQ6aj2iELSTxcVs2u0aKn1NzhkdUQSzsRg1FVkj3uit3I6mXQCBixw+A==", + "dev": true, + "requires": { + "hoek": "6.x.x" + } + }, + "bounce": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/bounce/-/bounce-1.2.2.tgz", + "integrity": "sha512-1LPcXg3fkGVhjdA/P3DcR5cDktKEYtDpruJv9Nhmy36RoYaoxZfC82Zr2JmS3vysDJKqMtP0qJw3/P6iisTASg==", + "dev": true, + "requires": { + "boom": "7.x.x", + "hoek": "6.x.x" + } + }, + "bourne": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bourne/-/bourne-1.1.1.tgz", + "integrity": "sha512-Ou0l3W8+n1FuTOoIfIrCk9oF9WVWc+9fKoAl67XQr9Ws0z7LgILRZ7qtc9xdT4BveSKtnYXfKPgn8pFAqeQRew==", + "dev": true + }, + "call": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/call/-/call-5.0.3.tgz", + "integrity": "sha512-eX16KHiAYXugbFu6VifstSdwH6aMuWWb4s0qvpq1nR1b+Sf+u68jjttg8ixDBEldPqBi30bDU35OJQWKeTLKxg==", + "dev": true, + "requires": { + "boom": "7.x.x", + "hoek": "6.x.x" + } + }, + "catbox": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/catbox/-/catbox-10.0.5.tgz", + "integrity": "sha512-5SpI/tEP3SiLE1qkkV+/hdVW48sHVBEbzPX4jBiwl6hsZh/gkl4bqfGLkvh7mjpMK5evJ0Rm/6NRlhF/Jsy9ow==", + "dev": true, + "requires": { + "boom": "7.x.x", + "hoek": "6.x.x", + "joi": "14.x.x" + } + }, + "catbox-memory": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/catbox-memory/-/catbox-memory-3.1.4.tgz", + "integrity": "sha512-1tDnll066au0HXBSDHS/YQ34MQ2omBsmnA9g/jseyq/M3m7UPrajVtPDZK/rXgikSC1dfjo9Pa+kQ1qcyG2d3g==", + "dev": true, + "requires": { + "big-time": "2.x.x", + "boom": "7.x.x", + "hoek": "6.x.x" + } + }, + "content": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/content/-/content-4.0.6.tgz", + "integrity": "sha512-lR9ND3dXiMdmsE84K6l02rMdgiBVmtYWu1Vr/gfSGHcIcznBj2QxmSdUgDuNFOA+G9yrb1IIWkZ7aKtB6hDGyA==", + "dev": true, + "requires": { + "boom": "7.x.x" + } + }, + "cryptiles": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.3.tgz", + "integrity": "sha512-gT9nyTMSUC1JnziQpPbxKGBbUg8VL7Zn2NB4E1cJYvuXdElHrwxrV9bmltZGDzet45zSDGyYceueke1TjynGzw==", + "dev": true, + "requires": { + "boom": "7.x.x" + } + }, + "heavy": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/heavy/-/heavy-6.1.2.tgz", + "integrity": "sha512-cJp884bqhiebNcEHydW0g6V1MUGYOXRPw9c7MFiHQnuGxtbWuSZpsbojwb2kxb3AA1/Rfs8CNiV9MMOF8pFRDg==", + "dev": true, + "requires": { + "boom": "7.x.x", + "hoek": "6.x.x", + "joi": "14.x.x" + } + }, + "hoek": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.0.1.tgz", + "integrity": "sha512-3PvUwBerLNVJiIVQdpkWF9F/M0ekgb2NPJWOhsE28RXSQPsY42YSnaJ8d1kZjcAz58TZ/Fk9Tw64xJsENFlJNw==", + "dev": true + }, + "iron": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/iron/-/iron-5.0.6.tgz", + "integrity": "sha512-zYUMOSkEXGBdwlV/AXF9zJC0aLuTJUKHkGeYS5I2g225M5i6SrxQyGJGhPgOR8BK1omL6N5i6TcwfsXbP8/Exw==", + "dev": true, + "requires": { + "b64": "4.x.x", + "boom": "7.x.x", + "cryptiles": "4.x.x", + "hoek": "6.x.x" + } + }, + "joi": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/joi/-/joi-14.0.4.tgz", + "integrity": "sha512-KUXRcinDUMMbtlOk7YLGHQvG73dLyf8bmgE+6sBTkdJbZpeGVGAlPXEHLiQBV7KinD/VLD5OA0EUgoTTfbRAJQ==", + "dev": true, + "requires": { + "hoek": "6.x.x", + "isemail": "3.x.x", + "topo": "3.x.x" + } + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "dev": true + }, + "mimos": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/mimos/-/mimos-4.0.2.tgz", + "integrity": "sha512-5XBsDqBqzSN88XPPH/TFpOalWOjHJM5Z2d3AMx/30iq+qXvYKd/8MPhqBwZDOLtoaIWInR3nLzMQcxfGK9djXA==", + "dev": true, + "requires": { + "hoek": "6.x.x", + "mime-db": "1.x.x" + } + }, + "nigel": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/nigel/-/nigel-3.0.4.tgz", + "integrity": "sha512-3SZCCS/duVDGxFpTROHEieC+itDo4UqL9JNUyQJv3rljudQbK6aqus5B4470OxhESPJLN93Qqxg16rH7DUjbfQ==", + "dev": true, + "requires": { + "hoek": "6.x.x", + "vise": "3.x.x" + } + }, + "pez": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pez/-/pez-4.0.5.tgz", + "integrity": "sha512-HvL8uiFIlkXbx/qw4B8jKDCWzo7Pnnd65Uvanf9OOCtb20MRcb9gtTVBf9NCnhETif1/nzbDHIjAWC/sUp7LIQ==", + "dev": true, + "requires": { + "b64": "4.x.x", + "boom": "7.x.x", + "content": "4.x.x", + "hoek": "6.x.x", + "nigel": "3.x.x" + } + }, + "podium": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/podium/-/podium-3.1.5.tgz", + "integrity": "sha512-+fAPmAj3d5fWKx5oSjQKeBIcl46/qZnGLhzyi/dJ/HzNiOpuxyX/Y4091LiVxZQ4ALdf/LCS7siV6ai5nNLlOg==", + "dev": true, + "requires": { + "hoek": "6.x.x", + "joi": "14.x.x" + } + }, + "shot": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/shot/-/shot-4.0.7.tgz", + "integrity": "sha512-RKaKAGKxJ11EjJl0cf2fYVSsd4KB5Cncb9J0v7w+0iIaXpxNqFWTYNDNhBX7f0XSyDrjOH9a4OWZ9Gp/ZML+ew==", + "dev": true, + "requires": { + "hoek": "6.x.x", + "joi": "14.x.x" + } + }, + "somever": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/somever/-/somever-2.0.0.tgz", + "integrity": "sha512-9JaIPP+HxwYGqCDqqK3tRaTqdtQHoK6Qy3IrXhIt2q5x8fs8RcfU7BMWlFTCOgFazK8p88zIv1tHQXvAwtXMyw==", + "dev": true, + "requires": { + "bounce": "1.x.x", + "hoek": "6.x.x" + } + }, + "statehood": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/statehood/-/statehood-6.0.9.tgz", + "integrity": "sha512-jbFg1+MYEqfC7ABAoWZoeF4cQUtp3LUvMDUGExL76cMmleBHG7I6xlZFsE8hRi7nEySIvutHmVlLmBe9+2R5LQ==", + "dev": true, + "requires": { + "boom": "7.x.x", + "bounce": "1.x.x", + "bourne": "1.x.x", + "cryptiles": "4.x.x", + "hoek": "6.x.x", + "iron": "5.x.x", + "joi": "14.x.x" + } + }, + "subtext": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/subtext/-/subtext-6.0.12.tgz", + "integrity": "sha512-yT1wCDWVgqvL9BIkWzWqgj5spUSYo/Enu09iUV8t2ZvHcr2tKGTGg2kc9tUpVEsdhp1ihsZeTAiDqh0TQciTPQ==", + "dev": true, + "requires": { + "boom": "7.x.x", + "bourne": "1.x.x", + "content": "4.x.x", + "hoek": "6.x.x", + "pez": "4.x.x", + "wreck": "14.x.x" + } + }, + "teamwork": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/teamwork/-/teamwork-3.0.2.tgz", + "integrity": "sha512-tpG01+9Qws/oGhMBiZN3BnB32gn5QeKY84AmLxxaCJw4mNeRzhEZ6jEj/vBhKerHD7Hgq9/vOZ58pyryYSn9gA==", + "dev": true + }, + "topo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", + "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", + "dev": true, + "requires": { + "hoek": "6.x.x" + } + }, + "vise": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vise/-/vise-3.0.1.tgz", + "integrity": "sha512-7BJNjsv2o83+E6AHAFSnjQF324UTgypsR/Sw/iFmLvr7RgJrEXF1xNBvb5LJfi+1FvWQXjJK4X41WMuHMeunPQ==", + "dev": true, + "requires": { + "hoek": "6.x.x" + } + }, + "wreck": { + "version": "14.1.3", + "resolved": "https://registry.npmjs.org/wreck/-/wreck-14.1.3.tgz", + "integrity": "sha512-hb/BUtjX3ObbwO3slCOLCenQ4EP8e+n8j6FmTne3VhEFp5XV1faSJojiyxVSvw34vgdeTG5baLTl4NmjwokLlw==", + "dev": true, + "requires": { + "boom": "7.x.x", + "hoek": "6.x.x" + } + } + } }, "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "requires": { - "ajv": "^4.9.1", - "har-schema": "^1.0.5" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" } }, "has-ansi": { @@ -1413,6 +1913,11 @@ "ansi-regex": "^2.0.0" } }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, "has-gulplog": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", @@ -1422,22 +1927,6 @@ "sparkles": "^1.0.0" } }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, "homedir-polyfill": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", @@ -1464,9 +1953,9 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1493,9 +1982,9 @@ "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" }, "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -1503,15 +1992,24 @@ } }, "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "requires": { - "assert-plus": "^0.2.0", + "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1669,6 +2167,23 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isemail": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", + "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", + "dev": true, + "requires": { + "punycode": "2.x.x" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1713,6 +2228,16 @@ } } }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, + "joycon": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-2.2.5.tgz", + "integrity": "sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==" + }, "js-yaml": { "version": "3.9.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.9.1.tgz", @@ -1747,24 +2272,11 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } - }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -1783,15 +2295,6 @@ } } }, - "keypairs": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/keypairs/-/keypairs-1.2.14.tgz", - "integrity": "sha512-ZoZfZMygyB0QcjSlz7Rh6wT2CJasYEHBPETtmHZEfxuJd7bnsOG5AdtPZqHZBT+hoHvuWCp/4y8VmvTvH0Y9uA==", - "requires": { - "eckles": "^1.4.1", - "rasha": "^1.2.4" - } - }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -1801,28 +2304,10 @@ "is-buffer": "^1.1.5" } }, - "le-challenge-fs": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/le-challenge-fs/-/le-challenge-fs-2.0.9.tgz", - "integrity": "sha512-stzI6rxd+aXGxBl87QJKKY/i/wl3uz6EoWzX2xSazJvCPSYBQys1RVNgOcf0SfUQPh6TBCFJFSJkiR4mznb4sg==", - "requires": { - "@root/mkdirp": "^1.0.0" - } - }, - "le-sni-auto": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/le-sni-auto/-/le-sni-auto-2.1.9.tgz", - "integrity": "sha512-QmQHNwQDi/56GY8+qczFZ06FZbxaeJQjbjEhwwQHhkJ9IHhIQFkPfCT/OyDfLj4gqLIrg5ZX8CemxxVZnLEYfg==" - }, - "le-store-certbot": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/le-store-certbot/-/le-store-certbot-2.2.3.tgz", - "integrity": "sha512-c4ACR+v+JKMiAOOshLh6gdCKA7wIWR16+mROMLpQjq3rXJ3Vm8FaBHe2H+crT+flP+g7FmciAwUlfOJEJpIuCQ==", - "requires": { - "@root/mkdirp": "^1.0.0", - "pyconf": "^1.1.7", - "safe-replace": "^1.1.0" - } + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" }, "levn": { "version": "0.2.5", @@ -1852,9 +2337,9 @@ } }, "lodash": { - "version": "4.17.15", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash._basecopy": { "version": "3.0.1", @@ -1994,11 +2479,11 @@ } }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" } }, "map-cache": { @@ -2029,16 +2514,16 @@ } }, "mime-db": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.29.0.tgz", - "integrity": "sha1-SNJtI1WJZRcErFkWygYAGRQmaHg=" + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" }, "mime-types": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", - "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", "requires": { - "mime-db": "~1.29.0" + "mime-db": "1.45.0" } }, "minimalistic-assert": { @@ -2140,6 +2625,11 @@ } } }, + "mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==" + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -2161,6 +2651,34 @@ "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=", "dev": true }, + "needle": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz", + "integrity": "sha512-KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==", + "dev": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, "node-addon-api": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.6.2.tgz", @@ -2341,9 +2859,9 @@ } }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "3.0.0", @@ -2352,9 +2870,9 @@ "dev": true }, "object-hash": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-1.3.1.tgz", - "integrity": "sha1-/eRSCYqVHLFF8Dm7fUVUSd3BJt8=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz", + "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==" }, "object.defaults": { "version": "1.1.0", @@ -2413,7 +2931,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -2512,27 +3029,82 @@ "dev": true }, "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pino": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-5.15.0.tgz", - "integrity": "sha512-7+FXMTA3H3sNP5+2miY2K9JKnAAW5GKuhHfNWsukFCsPprGQY3ctqpwbV74wAHW3Nl93cEEQ1G82MgOLM8P7TQ==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.10.0.tgz", + "integrity": "sha512-ZFGE/Wq930gFb1h0RI6S/QOfkyzNj94Xubwlyo4XpxNUgrG1C0iEqnlooG5Fymx6yrUUtEJ8j/u8NCGwgwTXaQ==", "requires": { - "fast-redact": "^2.0.0", + "fast-redact": "^3.0.0", "fast-safe-stringify": "^2.0.7", "flatstr": "^1.0.12", - "pino-std-serializers": "^2.4.2", - "quick-format-unescaped": "^3.0.3", - "sonic-boom": "^0.7.5" + "pino-std-serializers": "^3.1.0", + "quick-format-unescaped": "^4.0.1", + "sonic-boom": "^1.0.2" + } + }, + "pino-pretty": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-4.3.0.tgz", + "integrity": "sha512-uEc9SUCCGVEs0goZvyznKXBHtI1PNjGgqHviJHxOCEFEWZN6Z/IQKv5pO9gSdm/b+WfX+/dfheWhtZUyScqjlQ==", + "requires": { + "@hapi/bourne": "^2.0.0", + "args": "^5.0.1", + "chalk": "^4.0.0", + "dateformat": "^3.0.3", + "fast-safe-stringify": "^2.0.7", + "jmespath": "^0.15.0", + "joycon": "^2.2.5", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "split2": "^3.1.1", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } } }, "pino-std-serializers": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.4.2.tgz", - "integrity": "sha512-WaL504dO8eGs+vrK+j4BuQQq6GLKeCCcHaMB2ItygzVURcL1CycwNEUHTD/lHFHs/NL5qAz2UKrjYWXKSf4aMQ==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.1.1.tgz", + "integrity": "sha512-Ud4+WzgEr/swOlfQdkxqKP2hlwuQlIqQ5YwYpo9MczNg2mpsKKyKgwQXW5KnP5tgH3/Cy9QRhAhLM8k1K+gfnA==" }, "prelude-ls": { "version": "1.1.2", @@ -2546,6 +3118,12 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "prettier": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz", + "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==", + "dev": true + }, "pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", @@ -2563,23 +3141,34 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + } + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" }, - "pyconf": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/pyconf/-/pyconf-1.1.7.tgz", - "integrity": "sha512-v4clh33m68sjtMsh8XMpjhGWb/MQODAYZ1y7ORG5Qv58UK25OddoB+oXyexgDkK8ttFui/lZm2sQDgA2Ftjfkw==", - "requires": { - "safe-replace": "^1.0.2" - } - }, "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "querystringify": { "version": "2.1.0", @@ -2587,9 +3176,9 @@ "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==" }, "quick-format-unescaped": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.3.tgz", - "integrity": "sha512-dy1yjycmn9blucmJLXOfZDx1ikZJUi6E8bBZLnhPG5gBrVhHXx2xVyqqgKBubVNEXmx51dBACMHpoMQK/N/AXQ==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz", + "integrity": "sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A==" }, "randomatic": { "version": "1.1.7", @@ -2632,15 +3221,10 @@ } } }, - "rasha": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/rasha/-/rasha-1.2.5.tgz", - "integrity": "sha512-KxtX+/fBk+wM7O3CNgwjSh5elwFilLvqWajhr6wFr2Hd63JnKTTi43Tw+Jb1hxJQWOwoya+NZWR2xztn3hCrTw==" - }, "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -2648,9 +3232,9 @@ }, "dependencies": { "safe-buffer": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "string_decoder": { "version": "1.3.0", @@ -2706,34 +3290,50 @@ "dev": true }, "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" + "uuid": "^3.3.2" + }, + "dependencies": { + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } } }, + "require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "dev": true + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -2758,13 +3358,11 @@ "global-modules": "^0.2.3" } }, - "rsa-compat": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/rsa-compat/-/rsa-compat-2.0.8.tgz", - "integrity": "sha512-BFiiSEbuxzsVdaxpejbxfX07qs+rtous49Y6mL/zw6YHh9cranDvm2BvBmqT3rso84IsxNlP5BXnuNvm1Wn3Tw==", - "requires": { - "keypairs": "^1.2.14" - } + "run-verify": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/run-verify/-/run-verify-1.2.5.tgz", + "integrity": "sha512-vMKbyKGcGDcQlAoXuMlrOYIwxoDVct2JRXWV4qF7kmPYwn5xeYS6ZNFD35iNBoIAmvVISX2YWaBQ5/hAflBX0w==", + "dev": true }, "safe-buffer": { "version": "5.1.1", @@ -2776,11 +3374,23 @@ "resolved": "https://registry.npmjs.org/safe-replace/-/safe-replace-1.1.0.tgz", "integrity": "sha512-9/V2E0CDsKs9DWOOwJH7jYpSl9S3N05uyevNjvsnDauBqRowBPOyot1fIvV5N2IuZAbYyvrTXrYFVG0RZInfFw==" }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "safetimeout": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/safetimeout/-/safetimeout-0.1.2.tgz", "integrity": "sha1-0oXjqf2N1tm6tUbiVXldaq3TzXQ=" }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -2804,19 +3414,12 @@ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", "dev": true }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.x.x" - } - }, "sonic-boom": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.6.tgz", - "integrity": "sha512-k9E2QQ4zxuVRLDW+ZW6ISzJs3wlEorVdmM7ApDgor7wsGKSDG5YGHsGmgLY4XYh4DMlr/2ap2BWAE7yTFJtWnQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.3.0.tgz", + "integrity": "sha512-4nX6OYvOYr6R76xfQKi6cZpTO3YSWe/vd+QdIfoH0lBy0MnPkeAbb2rRWgmgADkXUeCKPwO1FZAKlAVWAadELw==", "requires": { + "atomic-sleep": "^1.0.0", "flatstr": "^1.0.12" } }, @@ -2827,9 +3430,9 @@ "dev": true }, "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -2839,11 +3442,11 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -2867,11 +3470,11 @@ }, "dependencies": { "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "ms": { @@ -2881,6 +3484,14 @@ } } }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "requires": { + "readable-stream": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -2921,11 +3532,6 @@ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -3021,11 +3627,19 @@ "dev": true }, "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "requires": { - "punycode": "^1.4.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } } }, "tunnel-agent": { @@ -3111,9 +3725,9 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha1-PdPT55Crwk17DToDT/q6vijrvAQ=" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8flags": { "version": "2.1.1", @@ -3245,8 +3859,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "xml-escape": { "version": "1.0.0", @@ -3261,9 +3874,9 @@ "dev": true }, "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/package.json b/package.json index 3e07d6e..20342cc 100644 --- a/package.json +++ b/package.json @@ -28,19 +28,22 @@ }, "homepage": "https://github.com/OptimalBits/redbird", "dependencies": { - "bluebird": "^2.11.0 || ^3.7.2", - "dolphin": "*", - "greenlock": "^2.8.8", - "http-proxy": "^1.18.0", - "le-challenge-fs": "^2.0.9", - "le-store-certbot": "^2.2.3", - "lodash": "^4.17.15", - "lru-cache": "^5.1.1", + "@greenlock/manager": "^3.1.0", + "@root/greenlock": "^4.0.5", + "acme-http-01-webroot": "^3.0.0", + "bluebird": "^3.7.2", + "dolphin": "latest", + "find-root": "^1.1.0", + "greenlock-store-fs": "^3.2.2", + "http-proxy": "^1.18.1", + "lodash": "^4.17.20", + "lru-cache": "^6.0.0", "node-etcd": "^7.0.0", - "object-hash": "^1.3.1", - "pino": "^5.15.0", + "object-hash": "^2.1.1", + "pino": "^6.10.0", + "pino-pretty": "^4.3.0", "safetimeout": "^0.1.2", - "spdy": "^4.0.1", + "spdy": "^4.0.2", "valid-url": "^1.0.9" }, "devDependencies": {