diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..cef38a07 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +indent_size = 4 +trim_trailing_whitespace = false diff --git a/.travis.yml b/.travis.yml index 637931ab..6189bef6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,8 +1,8 @@ language: node_js node_js: - - "6.0" + - "8.10" - "stable" script: - npm test - - ./node_modules/.bin/jshint lib + - ./node_modules/.bin/eslint lib diff --git a/README.md b/README.md index b6dee9b9..1999d533 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,7 @@ var MultiSamlStrategy = require('suomifi-passport-saml/multiSamlStrategy'); passport.use(new MultiSamlStrategy( { + passReqToCallback: true, //makes req available in callback getSamlOptions: function(request, done) { findProvider(request, function(err, provider) { if (err) { @@ -70,7 +71,7 @@ passport.use(new MultiSamlStrategy( }); } }, - function(profile, done) { + function(req, profile, done) { findByEmail(profile.email, function(err, user) { if (err) { return done(err); @@ -123,6 +124,8 @@ type Profile = { * `privateCert`: see [Security and signatures](#security-and-signatures) * `decryptionPvk`: optional private key that will be used to attempt to decrypt any encrypted assertions that are received * `signatureAlgorithm`: optionally set the signature algorithm for signing requests, valid values are 'sha1' (default), 'sha256', or 'sha512' + * `digestAlgorithm`: optionally set the digest algorithm used to provide a digest for the signed data object, valid values are 'sha1' (default), 'sha256', or 'sha512' + * `xmlSignatureTransforms`: optionally set an array of signature transforms to be used in HTTP-POST signatures. By default this is `[ 'http://www.w3.org/2000/09/xmldsig#enveloped-signature', 'http://www.w3.org/2001/10/xml-exc-c14n#' ]` * **Additional SAML behaviors** * `additionalParams`: dictionary of additional query params to add to all requests; if an object with this key is passed to `authenticate`, the dictionary of additional query params will be appended to those present on the returned URL, overriding any specified by initialization options' additional parameters (`additionalParams`, `additionalAuthorizeParams`, and `additionalLogoutParams`) * `additionalAuthorizeParams`: dictionary of additional query params to add to 'authorize' requests @@ -131,7 +134,7 @@ type Profile = { * `attributeConsumingServiceIndex`: optional `AttributeConsumingServiceIndex` attribute to add to AuthnRequest to instruct the IDP which attribute set to attach to the response ([link](http://blog.aniljohn.com/2014/01/data-minimization-front-channel-saml-attribute-requests.html)) * `disableRequestedAuthnContext`: if truthy, do not request a specific authentication context. This is [known to help when authenticating against Active Directory](https://github.com/bergie/passport-saml/issues/226) (AD FS) servers. * `authnContext`: if truthy, name identifier format to request auth context (default: `urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport`); array of values is also supported - * RACComparison: Requested Authentication Context comparison type. Possible values are 'exact','minimum','maximum','better'. Default is 'exact'. + * `RACComparison`: Requested Authentication Context comparison type. Possible values are 'exact','minimum','maximum','better'. Default is 'exact'. * `forceAuthn`: if set to true, the initial SAML request from the service provider specifies that the IdP should force re-authentication of the user, even if they possess a valid session. * `providerName`: optional human-readable name of the requester for use by the presenter's user agent or the identity provider @@ -252,13 +255,47 @@ The `generateServiceProviderMetadata` method is also available on the `MultiSaml Passport-SAML uses the HTTP Redirect Binding for its `AuthnRequest`s (unless overridden with the `authnRequestBinding` parameter), and expects to receive the messages back via the HTTP POST binding. -Authentication requests sent by Passport-SAML can be signed using RSA-SHA1. To sign them you need to provide a private key in the PEM format via the `privateCert` configuration key. The certificate -should start with `-----BEGIN PRIVATE KEY-----` on its own line and end with `-----END PRIVATE KEY-----` on its own line. +Authentication requests sent by Passport-SAML can be signed using RSA signature with SHA1, SHA256 or SHA512 hashing algorithms. + +To select hashing algorithm, use: + +```js +... + signatureAlgorithm: 'sha1' // (default, but not recommended anymore these days) + signatureAlgorithm: 'sha256', // (preffered - your IDP should support it, otherwise think about upgrading it) + signatureAlgorithm: 'sha512' // (most secure - check if your IDP supports it) +... +``` + +To sign them you need to provide a private key in the PEM format via the `privateCert` configuration key. + +Formats supported for `privateCert` field are, + +1. Well formatted PEM: + +``` +-----BEGIN PRIVATE KEY----- + +-----END PRIVATE KEY----- + +``` +``` +-----BEGIN RSA PRIVATE KEY----- + +-----END RSA PRIVATE KEY----- + +``` +(both versions work) +See example from tests of the first version of [well formatted private key](test/static/acme_tools_com.key). + +2. Alternativelly a single line private key without start/end lines where all rows are joined into single line: + +See example from tests of [singleline private key](test/static/singleline_acme_tools_com.key). -For example: +Add it to strategy options like this: ```javascript - privateCert: fs.readFileSync('./cert.pem', 'utf-8') + privateCert: fs.readFileSync('./privateCert.pem', 'utf-8') ``` @@ -367,6 +404,7 @@ Provide an instance of an object which has these functions passed to the `cacheP Passport-SAML has built in support for SLO including * Signature validation * IdP initiated and SP initiated logouts +* Decryption of encrypted name identifiers in IdP initiated logout * `Redirect` and `POST` SAML Protocol Bindings @@ -379,3 +417,15 @@ See [Releases](https://github.com/vrk-kpa/suomifi-passport-saml/releases) to fin ### Is there an example I can look at? Gerard Braad has provided an example app at https://github.com/gbraad/passport-saml-example/ + +## Node Support Policy + +We only support [Long-Term Support](https://github.com/nodejs/Release) versions of Node. + +We specifically limit our support to LTS versions of Node, not because this package won't work on other versions, but because we have a limited amount of time, and supporting LTS offers the greatest return on that investment. + +It's possible this package will work correctly on newer versions of Node. It may even be possible to use this package on older versions of Node, though that's more unlikely as we'll make every effort to take advantage of features available in the oldest LTS version we support. + +As each Node LTS version reaches its end-of-life we will remove that version from the `node` `engines` property of our package's `package.json` file. Removing a Node version is considered a breaking change and will entail the publishing of a new major version of this package. We will not accept any requests to support an end-of-life version of Node. Any merge requests or issues supporting an end-of-life version of Node will be closed. + +We will accept code that allows this package to run on newer, non-LTS, versions of Node. diff --git a/lib/passport-saml/algorithms.js b/lib/passport-saml/algorithms.js new file mode 100644 index 00000000..cfb19d0a --- /dev/null +++ b/lib/passport-saml/algorithms.js @@ -0,0 +1,34 @@ +var crypto = require('crypto'); + +exports.getSigningAlgorithm = function getSigningAlgorithm (shortName) { + switch(shortName) { + case 'sha256': + return 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; + case 'sha512': + return 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha512'; + default: + return 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'; + } +}; + +exports.getDigestAlgorithm = function getDigestAlgorithm (shortName) { + switch(shortName) { + case 'sha256': + return 'http://www.w3.org/2001/04/xmlenc#sha256'; + case 'sha512': + return 'http://www.w3.org/2001/04/xmlenc#sha512'; + default: + return 'http://www.w3.org/2000/09/xmldsig#sha1'; + } +}; + +exports.getSigner = function getSigner (shortName) { + switch(shortName) { + case 'sha256': + return crypto.createSign('RSA-SHA256'); + case 'sha512': + return crypto.createSign('RSA-SHA512'); + default: + return crypto.createSign('RSA-SHA1'); + } +}; \ No newline at end of file diff --git a/lib/passport-saml/saml-post-signing.js b/lib/passport-saml/saml-post-signing.js new file mode 100644 index 00000000..58e0f3c1 --- /dev/null +++ b/lib/passport-saml/saml-post-signing.js @@ -0,0 +1,29 @@ +var SignedXml = require('xml-crypto').SignedXml; +var algorithms = require('./algorithms'); + +var authnRequestXPath = '/*[local-name(.)="AuthnRequest" and namespace-uri(.)="urn:oasis:names:tc:SAML:2.0:protocol"]'; +var issuerXPath = '/*[local-name(.)="Issuer" and namespace-uri(.)="urn:oasis:names:tc:SAML:2.0:assertion"]'; +var defaultTransforms = [ 'http://www.w3.org/2000/09/xmldsig#enveloped-signature', 'http://www.w3.org/2001/10/xml-exc-c14n#' ]; + +function signSamlPost(samlMessage, xpath, options) { + if (!samlMessage) throw new Error('samlMessage is required'); + if (!xpath) throw new Error('xpath is required'); + if (!options || !options.privateCert) throw new Error('options.privateCert is required'); + + var transforms = options.xmlSignatureTransforms || defaultTransforms; + var sig = new SignedXml(); + if (options.signatureAlgorithm) { + sig.signatureAlgorithm = algorithms.getSigningAlgorithm(options.signatureAlgorithm); + } + sig.addReference(xpath, transforms, algorithms.getDigestAlgorithm(options.digestAlgorithm)); + sig.signingKey = options.privateCert; + sig.computeSignature(samlMessage, { location: { reference: xpath + issuerXPath, action: 'after' }}); + return sig.getSignedXml(); +} + +function signAuthnRequestPost(authnRequest, options) { + return signSamlPost(authnRequest, authnRequestXPath, options); +} + +exports.signSamlPost = signSamlPost; +exports.signAuthnRequestPost = signAuthnRequestPost; diff --git a/lib/passport-saml/saml.js b/lib/passport-saml/saml.js index b03a076f..effdb993 100644 --- a/lib/passport-saml/saml.js +++ b/lib/passport-saml/saml.js @@ -10,11 +10,11 @@ var xmlbuilder = require('xmlbuilder'); var xmlenc = require('xml-encryption'); var xpath = xmlCrypto.xpath; var InMemoryCacheProvider = require('./inmemory-cache-provider.js').CacheProvider; +var algorithms = require('./algorithms'); +var signAuthnRequestPost = require('./saml-post-signing').signAuthnRequestPost; var Q = require('q'); var SAML = function (options) { - var self = this; - this.options = this.initialize(options); this.cacheProvider = this.options.cacheProvider; }; @@ -24,7 +24,7 @@ SAML.prototype.initialize = function (options) { options = {}; } - if (options.hasOwnProperty('cert') && !options.cert) { + if (Object.prototype.hasOwnProperty.call(options, 'cert') && !options.cert) { throw new Error('Invalid property: cert must not be empty'); } @@ -159,20 +159,8 @@ SAML.prototype.generateInstant = function () { SAML.prototype.signRequest = function (samlMessage) { var signer; var samlMessageToSign = {}; - switch(this.options.signatureAlgorithm) { - case 'sha256': - samlMessage.SigAlg = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256'; - signer = crypto.createSign('RSA-SHA256'); - break; - case 'sha512': - samlMessage.SigAlg = 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha512'; - signer = crypto.createSign('RSA-SHA512'); - break; - default: - samlMessage.SigAlg = 'http://www.w3.org/2000/09/xmldsig#rsa-sha1'; - signer = crypto.createSign('RSA-SHA1'); - break; - } + samlMessage.SigAlg = algorithms.getSigningAlgorithm(this.options.signatureAlgorithm); + signer = algorithms.getSigner(this.options.signatureAlgorithm); if (samlMessage.SAMLRequest) { samlMessageToSign.SAMLRequest = samlMessage.SAMLRequest; } @@ -186,23 +174,22 @@ SAML.prototype.signRequest = function (samlMessage) { samlMessageToSign.SigAlg = samlMessage.SigAlg; } signer.update(querystring.stringify(samlMessageToSign)); - samlMessage.Signature = signer.sign(this.options.privateCert, 'base64'); + samlMessage.Signature = signer.sign(this.keyToPEM(this.options.privateCert), 'base64'); }; -SAML.prototype.generateAuthorizeRequest = function (req, isPassive, reqOptions, callback) { - var self = this; - var id = "_" + self.generateUniqueID(); - var instant = self.generateInstant(); - var forceAuthn = self.options.forceAuthn || false; +SAML.prototype.generateAuthorizeRequest = function (req, isPassive, isHttpPostBinding, reqOptions, callback) { + var id = "_" + this.generateUniqueID(); + var instant = this.generateInstant(); + var forceAuthn = this.options.forceAuthn || false; - Q.fcall(function() { - if(self.options.validateInResponseTo) { - return Q.ninvoke(self.cacheProvider, 'save', id, instant); + Q.fcall(() => { + if(this.options.validateInResponseTo) { + return Q.ninvoke(this.cacheProvider, 'save', id, instant); } else { return Q(); } }) - .then(function(){ + .then(() => { var request = { 'samlp:AuthnRequest': { '@xmlns:samlp': 'urn:oasis:names:tc:SAML:2.0:protocol', @@ -210,10 +197,10 @@ SAML.prototype.generateAuthorizeRequest = function (req, isPassive, reqOptions, '@Version': '2.0', '@IssueInstant': instant, '@ProtocolBinding': 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST', - '@Destination': self.options.entryPoint, + '@Destination': this.options.entryPoint, 'saml:Issuer' : { '@xmlns:saml' : 'urn:oasis:names:tc:SAML:2.0:assertion', - '#text': self.options.issuer + '#text': this.options.issuer } } }; @@ -225,21 +212,21 @@ SAML.prototype.generateAuthorizeRequest = function (req, isPassive, reqOptions, request['samlp:AuthnRequest']['@ForceAuthn'] = true; } - if (!self.options.disableRequestACSUrl) { - request['samlp:AuthnRequest']['@AssertionConsumerServiceURL'] = self.getCallbackUrl(req); + if (!this.options.disableRequestACSUrl) { + request['samlp:AuthnRequest']['@AssertionConsumerServiceURL'] = this.getCallbackUrl(req); } - if (self.options.identifierFormat) { + if (this.options.identifierFormat) { request['samlp:AuthnRequest']['samlp:NameIDPolicy'] = { '@xmlns:samlp': 'urn:oasis:names:tc:SAML:2.0:protocol', - '@Format': self.options.identifierFormat, + '@Format': this.options.identifierFormat, '@AllowCreate': 'true' }; } - if (!self.options.disableRequestedAuthnContext) { + if (!this.options.disableRequestedAuthnContext) { var authnContextClassRefs = []; - self.options.authnContext.forEach(function(value) { + this.options.authnContext.forEach(function(value) { authnContextClassRefs.push({ '@xmlns:saml': 'urn:oasis:names:tc:SAML:2.0:assertion', '#text': value @@ -248,24 +235,28 @@ SAML.prototype.generateAuthorizeRequest = function (req, isPassive, reqOptions, request['samlp:AuthnRequest']['samlp:RequestedAuthnContext'] = { '@xmlns:samlp': 'urn:oasis:names:tc:SAML:2.0:protocol', - '@Comparison': self.options.RACComparison, + '@Comparison': this.options.RACComparison, 'saml:AuthnContextClassRef': authnContextClassRefs }; } - if (self.options.attributeConsumingServiceIndex) { - request['samlp:AuthnRequest']['@AttributeConsumingServiceIndex'] = self.options.attributeConsumingServiceIndex; + if (this.options.attributeConsumingServiceIndex != null) { + request['samlp:AuthnRequest']['@AttributeConsumingServiceIndex'] = this.options.attributeConsumingServiceIndex; } - if (self.options.providerName) { - request['samlp:AuthnRequest']['@ProviderName'] = self.options.providerName; + if (this.options.providerName) { + request['samlp:AuthnRequest']['@ProviderName'] = this.options.providerName; } if (reqOptions && reqOptions.vetumaLang) { addVetumaLangExtension(request['samlp:AuthnRequest'], reqOptions.vetumaLang); } - callback(null, xmlbuilder.create(request).end()); + var stringRequest = xmlbuilder.create(request).end(); + if (isHttpPostBinding && this.options.privateCert) { + stringRequest = signAuthnRequestPost(stringRequest, this.options); + } + callback(null, stringRequest); }) .fail(function(err){ callback(err); @@ -363,23 +354,18 @@ SAML.prototype.generateLogoutResponse = function (req, logoutRequest) { }; SAML.prototype.requestToUrl = function (request, response, operation, additionalParameters, callback) { - var self = this; - if (self.options.skipRequestCompression) - requestToUrlHelper(null, Buffer.from(request || response, 'utf8')); - else - zlib.deflateRaw(request || response, requestToUrlHelper); - function requestToUrlHelper(err, buffer) { + const requestToUrlHelper = (err, buffer) => { if (err) { return callback(err); } var base64 = buffer.toString('base64'); - var target = url.parse(self.options.entryPoint, true); + var target = url.parse(this.options.entryPoint, true); if (operation === 'logout') { - if (self.options.logoutUrl) { - target = url.parse(self.options.logoutUrl, true); + if (this.options.logoutUrl) { + target = url.parse(this.options.logoutUrl, true); } } else if (operation !== 'authorize') { return callback(new Error("Unknown operation: "+operation)); @@ -390,24 +376,24 @@ SAML.prototype.requestToUrl = function (request, response, operation, additional } : { SAMLResponse: base64 }; - Object.keys(additionalParameters).forEach(function(k) { + Object.keys(additionalParameters).forEach(k => { samlMessage[k] = additionalParameters[k]; }); - if (self.options.privateCert) { + if (this.options.privateCert) { try { - if (!self.options.entryPoint) { + if (!this.options.entryPoint) { throw new Error('"entryPoint" config parameter is required for signed messages'); } // sets .SigAlg and .Signature - self.signRequest(samlMessage); + this.signRequest(samlMessage); } catch (ex) { return callback(ex); } } - Object.keys(samlMessage).forEach(function(k) { + Object.keys(samlMessage).forEach(k => { target.query[k] = samlMessage[k]; }); @@ -416,6 +402,13 @@ SAML.prototype.requestToUrl = function (request, response, operation, additional delete target.search; callback(null, url.format(target)); + }; + + if (this.options.skipRequestCompression) { + requestToUrlHelper(null, Buffer.from(request || response, 'utf8')); + } + else { + zlib.deflateRaw(request || response, requestToUrlHelper); } }; @@ -453,19 +446,16 @@ SAML.prototype.getAdditionalParams = function (req, operation, overrideParams) { }; SAML.prototype.getAuthorizeUrl = function (req, options, callback) { - var self = this; - self.generateAuthorizeRequest(req, self.options.passive, options, function(err, request){ + this.generateAuthorizeRequest(req, this.options.passive, false, options,(err, request) => { if (err) return callback(err); var operation = 'authorize'; var overrideParams = options ? options.additionalParams || {} : {}; - self.requestToUrl(request, null, operation, self.getAdditionalParams(req, operation, overrideParams), callback); + this.requestToUrl(request, null, operation, this.getAdditionalParams(req, operation, overrideParams), callback); }); }; SAML.prototype.getAuthorizeForm = function (req, reqOptions, callback) { - var self = this; - // The quoteattr() function is used in a context, where the result will not be evaluated by javascript // but must be interpreted by an XML or HTML parser, and it must absolutely avoid breaking the syntax // of an element attribute. @@ -483,22 +473,22 @@ SAML.prototype.getAuthorizeForm = function (req, reqOptions, callback) { .replace(/[\r\n]/g, preserveCR); }; - var getAuthorizeFormHelper = function(err, buffer) { + const getAuthorizeFormHelper = (err, buffer) => { if (err) { return callback(err); } var operation = 'authorize'; - var additionalParameters = self.getAdditionalParams(req, operation); + var additionalParameters = this.getAdditionalParams(req, operation); var samlMessage = { SAMLRequest: buffer.toString('base64') }; - Object.keys(additionalParameters).forEach(function(k) { + Object.keys(additionalParameters).forEach(k => { samlMessage[k] = additionalParameters[k] || ''; }); - var formInputs = Object.keys(samlMessage).map(function(k) { + var formInputs = Object.keys(samlMessage).map(k => { return ''; }).join('\r\n'); @@ -513,7 +503,7 @@ SAML.prototype.getAuthorizeForm = function (req, reqOptions, callback) { '', - '
', + '', formInputs, '', '
', @@ -523,12 +513,12 @@ SAML.prototype.getAuthorizeForm = function (req, reqOptions, callback) { ].join('\r\n')); }; - self.generateAuthorizeRequest(req, self.options.passive, reqOptions, function(err, request) { + this.generateAuthorizeRequest(req, this.options.passive, true, reqOptions,(err, request) => { if (err) { return callback(err); } - if (self.options.skipRequestCompression) { + if (this.options.skipRequestCompression) { getAuthorizeFormHelper(null, Buffer.from(request, 'utf8')); } else { zlib.deflateRaw(request, getAuthorizeFormHelper); @@ -538,12 +528,11 @@ SAML.prototype.getAuthorizeForm = function (req, reqOptions, callback) { }; SAML.prototype.getLogoutUrl = function(req, options, callback) { - var self = this; - return self.generateLogoutRequest(req, options) - .then(function(request) { - var operation = 'logout'; - var overrideParams = options ? options.additionalParams || {} : {}; - return self.requestToUrl(request, null, operation, self.getAdditionalParams(req, operation, overrideParams), callback); + return this.generateLogoutRequest(req) + .then(request => { + const operation = 'logout'; + const overrideParams = options ? options.additionalParams || {} : {}; + return this.requestToUrl(request, null, operation, this.getAdditionalParams(req, operation, overrideParams), callback); }); }; @@ -582,20 +571,19 @@ SAML.prototype.keyToPEM = function(key) { // End suomifi additions SAML.prototype.certsToCheck = function () { - var self = this; - if (!self.options.cert) { + if (!this.options.cert) { return Q(); } - if (typeof(self.options.cert) === 'function') { - return Q.nfcall(self.options.cert) - .then(function(certs) { + if (typeof(this.options.cert) === 'function') { + return Q.nfcall(this.options.cert) + .then(certs => { if (!Array.isArray(certs)) { certs = [certs]; } return Q(certs); }); } - var certs = self.options.cert; + var certs = this.options.cert; if (!Array.isArray(certs)) { certs = [certs]; } @@ -608,31 +596,27 @@ SAML.prototype.certsToCheck = function () { // See https://github.com/bergie/passport-saml/issues/19 for references to some of the attack // vectors against SAML signature verification. SAML.prototype.validateSignature = function (fullXml, currentNode, certs) { - var self = this; - var xpathSigQuery = ".//*[local-name(.)='Signature' and " + + const xpathSigQuery = ".//*[local-name(.)='Signature' and " + "namespace-uri(.)='http://www.w3.org/2000/09/xmldsig#']"; - var signatures = xpath(currentNode, xpathSigQuery); + const signatures = xpath(currentNode, xpathSigQuery); // This function is expecting to validate exactly one signature, so if we find more or fewer // than that, reject. - if (signatures.length != 1) + if (signatures.length != 1) { return false; - var signature = signatures[0]; - return certs.some(function (certToCheck) { - return self.validateSignatureForCert(signature, certToCheck, fullXml, currentNode); + } + + const signature = signatures[0]; + return certs.some(certToCheck => { + return this.validateSignatureForCert(signature, certToCheck, fullXml, currentNode); }); }; // This function checks that the |signature| is signed with a given |cert|. SAML.prototype.validateSignatureForCert = function (signature, cert, fullXml, currentNode) { - var self = this; - var sig = new xmlCrypto.SignedXml(); + const sig = new xmlCrypto.SignedXml(); sig.keyInfoProvider = { - getKeyInfo: function (key) { - return ""; - }, - getKey: function (keyInfo) { - return self.certToPEM(cert); - } + getKeyInfo: key => "", + getKey: keyInfo => this.certToPEM(cert), }; sig.loadSignature(signature); // We expect each signature to contain exactly one reference to the top level of the xml we @@ -649,22 +633,22 @@ SAML.prototype.validateSignatureForCert = function (signature, cert, fullXml, cu // multiple candidate references is bad news) var totalReferencedNodes = xpath(currentNode.ownerDocument, "//*[@" + idAttribute + "='" + refId + "']"); - if (totalReferencedNodes.length > 1) + + if (totalReferencedNodes.length > 1) { return false; + } return sig.checkSignature(fullXml); }; SAML.prototype.validatePostResponse = function (container, callback) { - var self = this; - var xml, doc, inResponseTo; - Q.fcall(function(){ + Q.fcall(() => { xml = Buffer.from(container.SAMLResponse, 'base64').toString('utf8'); doc = new xmldom.DOMParser({ }).parseFromString(xml); - if (!doc.hasOwnProperty('documentElement')) + if (!Object.prototype.hasOwnProperty.call(doc, 'documentElement')) throw new Error('SAMLResponse is not valid base64-encoded XML'); inResponseTo = xpath(doc, "/*[local-name()='Response']/@InResponseTo"); @@ -672,21 +656,19 @@ SAML.prototype.validatePostResponse = function (container, callback) { if (inResponseTo) { inResponseTo = inResponseTo.length ? inResponseTo[0].nodeValue : null; - return self.validateInResponseTo(inResponseTo); + return this.validateInResponseTo(inResponseTo); } }) - .then(function() { - return self.certsToCheck(); - }) - .then(function(certs) { + .then(() => this.certsToCheck()) + .then(certs => { // Check if this document has a valid top-level signature var validSignature = false; - if (self.options.cert && self.validateSignature(xml, doc.documentElement, certs)) { + if (this.options.cert && this.validateSignature(xml, doc.documentElement, certs)) { validSignature = true; } // start suomifi additions if (validSignature !== true && - self.options.suomifiAdditions.disablePostResponseTopLevelSignatureValidationEnforcementForUnitTestPurposes !== true) + this.options.suomifiAdditions.disablePostResponseTopLevelSignatureValidationEnforcementForUnitTestPurposes !== true) { // Enforce document level signature checking. // @@ -722,7 +704,7 @@ SAML.prototype.validatePostResponse = function (container, callback) { var assertions = xpath(doc, "/*[local-name()='Response']/*[local-name()='Assertion']"); var encryptedAssertions = xpath(doc, - "/*[local-name()='Response']/*[local-name()='EncryptedAssertion']"); + "/*[local-name()='Response']/*[local-name()='EncryptedAssertion']"); if (assertions.length + encryptedAssertions.length > 1) { // There's no reason I know of that we want to handle multiple assertions, and it seems like a @@ -732,7 +714,7 @@ SAML.prototype.validatePostResponse = function (container, callback) { // start suomifi additions if (assertions.length > 0 && - self.options.suomifiAdditions.disableEncryptedAssertionsOnlyPolicyEnforcementForUnitTestPurposes !== true ) + this.options.suomifiAdditions.disableEncryptedAssertionsOnlyPolicyEnforcementForUnitTestPurposes !== true ) { // There should not be any reason to process unencrypted assertion. // I.e. if assertion(s) are not encrypted there must be some configuration @@ -753,7 +735,7 @@ SAML.prototype.validatePostResponse = function (container, callback) { if (assertions.length == 1) { // start suomifi addition - if (self.options.suomifiAdditions.disableAssertionSignatureVerificationEnforcementForUnitTestPurposes !== true) + if (this.options.suomifiAdditions.disableAssertionSignatureVerificationEnforcementForUnitTestPurposes !== true) { // At the time of writing this comment passport-saml's (0.32.1) default behaviour is/was that if // documents top level signature is valid then validation of assertion's signature is skipped. @@ -770,35 +752,35 @@ SAML.prototype.validatePostResponse = function (container, callback) { // outside of this suomifi addition code block is changed check that same changes // are reflected inside this code block also - if (self.validateSignature(xml, assertions[0], certs) !== true) { + if (this.validateSignature(xml, assertions[0], certs) !== true) { throw new Error('Invalid assertion signature'); } } // end suomifi addition...passport-saml's default code block is executed also... - if (self.options.cert && + if (this.options.cert && !validSignature && - !self.validateSignature(xml, assertions[0], certs)) { + !this.validateSignature(xml, assertions[0], certs)) { throw new Error('Invalid signature'); } - return self.processValidlySignedAssertion(assertions[0].toString(), xml, inResponseTo, callback); + return this.processValidlySignedAssertion(assertions[0].toString(), xml, inResponseTo, callback); } if (encryptedAssertions.length == 1) { - if (!self.options.decryptionPvk) + if (!this.options.decryptionPvk) throw new Error('No decryption key for encrypted SAML response'); var encryptedAssertionXml = encryptedAssertions[0].toString(); - var xmlencOptions = { key: self.options.decryptionPvk }; + var xmlencOptions = { key: this.options.decryptionPvk }; return Q.ninvoke(xmlenc, 'decrypt', encryptedAssertionXml, xmlencOptions) - .then(function(decryptedXml) { - var decryptedDoc = new xmldom.DOMParser().parseFromString(decryptedXml); - var decryptedAssertions = xpath(decryptedDoc, "/*[local-name()='Assertion']"); - if (decryptedAssertions.length != 1) - throw new Error('Invalid EncryptedAssertion content'); + .then(decryptedXml => { + var decryptedDoc = new xmldom.DOMParser().parseFromString(decryptedXml); + var decryptedAssertions = xpath(decryptedDoc, "/*[local-name()='Assertion']"); + if (decryptedAssertions.length != 1) + throw new Error('Invalid EncryptedAssertion content'); // start suomifi addition - if (self.options.suomifiAdditions.disableAssertionSignatureVerificationEnforcementForUnitTestPurposes !== true) + if (this.options.suomifiAdditions.disableAssertionSignatureVerificationEnforcementForUnitTestPurposes !== true) { // At the time of writing this comment passport-saml's (0.32.1) default behaviour is/was that if // documents top level signature is valid then validation of assertion's signature is skipped. @@ -818,18 +800,18 @@ SAML.prototype.validatePostResponse = function (container, callback) { // NOTE4: this processes decryptedXml and decryptedAssertions (just a side note if following // check is copy pasted at some point in the future due some change from unencrypted // assertions code block) - if (self.validateSignature(decryptedXml, decryptedAssertions[0], certs) !== true) { + if (this.validateSignature(decryptedXml, decryptedAssertions[0], certs) !== true) { throw new Error('Invalid assertion signature'); } } // end suomifi addition...passport-saml's default code block is executed also... - if (self.options.cert && + if (this.options.cert && !validSignature && - !self.validateSignature(decryptedXml, decryptedAssertions[0], certs)) + !this.validateSignature(decryptedXml, decryptedAssertions[0], certs)) throw new Error('Invalid signature from encrypted assertion'); - self.processValidlySignedAssertion(decryptedAssertions[0].toString(), xml, inResponseTo, callback); - }); + this.processValidlySignedAssertion(decryptedAssertions[0].toString(), xml, inResponseTo, callback); + }); } // If there's no assertion, fall back on xml2js response parsing for the status & @@ -842,30 +824,30 @@ SAML.prototype.validatePostResponse = function (container, callback) { }; var parser = new xml2js.Parser(parserConfig); return Q.ninvoke( parser, 'parseString', xml) - .then(function(doc) { - var response = doc.Response; - if (response) { - var assertion = response.Assertion; - if (!assertion) { - var status = response.Status; - if (status) { - var statusCode = status[0].StatusCode; - if (statusCode && statusCode[0].$.Value === "urn:oasis:names:tc:SAML:2.0:status:Responder") { - var nestedStatusCode = statusCode[0].StatusCode; - if (nestedStatusCode && nestedStatusCode[0].$.Value === "urn:oasis:names:tc:SAML:2.0:status:NoPassive") { - if (self.options.cert && !validSignature) { - throw new Error('Invalid signature: NoPassive'); - } - return callback(null, null, false); + .then(doc => { + var response = doc.Response; + if (response) { + var assertion = response.Assertion; + if (!assertion) { + var status = response.Status; + if (status) { + var statusCode = status[0].StatusCode; + if (statusCode && statusCode[0].$.Value === "urn:oasis:names:tc:SAML:2.0:status:Responder") { + var nestedStatusCode = statusCode[0].StatusCode; + if (nestedStatusCode && nestedStatusCode[0].$.Value === "urn:oasis:names:tc:SAML:2.0:status:NoPassive") { + if (this.options.cert && !validSignature) { + throw new Error('Invalid signature: NoPassive'); } + return callback(null, null, false); } + } - // Note that we're not requiring a valid signature before this logic -- since we are - // throwing an error in any case, and some providers don't sign error results, - // let's go ahead and give the potentially more helpful error. - if (statusCode && statusCode[0].$.Value) { - var msgType = statusCode[0].$.Value.match(/[^:]*$/)[0]; - if (msgType != 'Success') { + // Note that we're not requiring a valid signature before this logic -- since we are + // throwing an error in any case, and some providers don't sign error results, + // let's go ahead and give the potentially more helpful error. + if (statusCode && statusCode[0].$.Value) { + var msgType = statusCode[0].$.Value.match(/[^:]*$/)[0]; + if (msgType != 'Success') { var msg = 'unspecified'; if (status[0].StatusMessage) { msg = status[0].StatusMessage[0]._; @@ -885,7 +867,7 @@ SAML.prototype.validatePostResponse = function (container, callback) { throw new Error('Missing SAML assertion'); } } else { - if (self.options.cert && !validSignature) { + if (this.options.cert && !validSignature) { throw new Error('Invalid signature: No response found'); } var logoutResponse = doc.LogoutResponse; @@ -897,10 +879,10 @@ SAML.prototype.validatePostResponse = function (container, callback) { } }); }) - .fail(function(err) { + .fail(err => { debug('validatePostResponse resulted in an error: %s', err); - if (self.options.validateInResponseTo) { - Q.ninvoke(self.cacheProvider, 'remove', inResponseTo) + if (this.options.validateInResponseTo) { + Q.ninvoke(this.cacheProvider, 'remove', inResponseTo) .then(function() { callback(err); }); @@ -915,7 +897,7 @@ SAML.prototype.validateInResponseTo = function (inResponseTo) { if (this.options.validateInResponseTo) { if (inResponseTo) { return Q.ninvoke(this.cacheProvider, 'get', inResponseTo) - .then(function(result) { + .then(result => { if (!result) throw new Error('InResponseTo is not valid'); return Q(); @@ -929,40 +911,33 @@ SAML.prototype.validateInResponseTo = function (inResponseTo) { }; SAML.prototype.validateRedirect = function(container, originalQuery, callback) { - var self = this; - var samlMessageType = container.SAMLRequest ? 'SAMLRequest' : 'SAMLResponse'; + const samlMessageType = container.SAMLRequest ? 'SAMLRequest' : 'SAMLResponse'; - var data = Buffer.from(container[samlMessageType], "base64"); - zlib.inflateRaw(data, function(err, inflated) { + const data = Buffer.from(container[samlMessageType], "base64"); + zlib.inflateRaw(data, (err, inflated) => { if (err) { return callback(err); } - var dom = new xmldom.DOMParser().parseFromString(inflated.toString()); - var parserConfig = { + const dom = new xmldom.DOMParser().parseFromString(inflated.toString()); + const parserConfig = { explicitRoot: true, explicitCharkey: true, tagNameProcessors: [xml2js.processors.stripPrefix] }; - var parser = new xml2js.Parser(parserConfig); - parser.parseString(inflated, function (err, doc) { + const parser = new xml2js.Parser(parserConfig); + parser.parseString(inflated, (err, doc) => { if (err) { return callback(err); } - Q.fcall(function () { + Q.fcall(() => { return samlMessageType === 'SAMLResponse' ? - self.verifyLogoutResponse(doc) : self.verifyLogoutRequest(doc); - }) - .then(function() { - return self.hasValidSignatureForRedirect(container, originalQuery); + this.verifyLogoutResponse(doc) : this.verifyLogoutRequest(doc); }) - .then(function () { - processValidlySignedSamlLogout(self, doc, dom, callback); - }) - .fail(function(err) { - callback(err); - }); + .then(() => this.hasValidSignatureForRedirect(container, originalQuery)) + .then(() => processValidlySignedSamlLogout(this, doc, dom, callback)) + .fail(err => callback(err)); }); }); }; @@ -981,10 +956,9 @@ function processValidlySignedSamlLogout(self, doc, dom, callback) { } SAML.prototype.hasValidSignatureForRedirect = function (container, originalQuery) { - var self = this; - var tokens = originalQuery.split('&'); - var getParam = function (key) { - var exists = tokens.filter(function(t) { return new RegExp(key).test(t); }); + const tokens = originalQuery.split('&'); + var getParam = key => { + var exists = tokens.filter(t => { return new RegExp(key).test(t); }); return exists[0]; }; @@ -998,9 +972,9 @@ SAML.prototype.hasValidSignatureForRedirect = function (container, originalQuery urlString += '&' + getParam('SigAlg'); return this.certsToCheck() - .then(function(certs) { - var hasValidQuerySignature = certs.some(function (cert) { - return self.validateSignatureForRedirect( + .then(certs => { + var hasValidQuerySignature = certs.some(cert => { + return this.validateSignatureForRedirect( urlString, container.Signature, container.SigAlg, cert ); }); @@ -1019,7 +993,7 @@ SAML.prototype.validateSignatureForRedirect = function (urlString, signature, al function hasMatch (ourAlgo) { // The incoming algorithm is forwarded as a URL. // We trim everything before the last # get something we can compare to the Node.js list - var algFromURI = alg.toLowerCase().replace(/.*#(.*)$/,'$1'); + const algFromURI = alg.toLowerCase().replace(/.*#(.*)$/,'$1'); return ourAlgo.toLowerCase() === algFromURI; } var i = crypto.getHashes().findIndex(hasMatch); @@ -1050,17 +1024,15 @@ SAML.prototype.verifyLogoutRequest = function (doc) { }; SAML.prototype.verifyLogoutResponse = function (doc) { - var self = this; - - return Q.fcall(function() { + return Q.fcall(() => { var statusCode = doc.LogoutResponse.Status[0].StatusCode[0].$.Value; if (statusCode !== "urn:oasis:names:tc:SAML:2.0:status:Success") throw 'Bad status code: ' + statusCode; - self.verifyIssuer(doc.LogoutResponse); + this.verifyIssuer(doc.LogoutResponse); var inResponseTo = doc.LogoutResponse.$.InResponseTo; if (inResponseTo) { - return self.validateInResponseTo(inResponseTo); + return this.validateInResponseTo(inResponseTo); } return Q(true); @@ -1080,7 +1052,6 @@ SAML.prototype.verifyIssuer = function (samlMessage) { }; SAML.prototype.processValidlySignedAssertion = function(xml, samlResponseXml, inResponseTo, callback) { - var self = this; var msg; var parserConfig = { explicitRoot: true, @@ -1093,8 +1064,8 @@ SAML.prototype.processValidlySignedAssertion = function(xml, samlResponseXml, in var parsedAssertion; var parser = new xml2js.Parser(parserConfig); Q.ninvoke(parser, 'parseString', xml) - .then(function(doc) { - parsedAssertion = doc; + .then(doc => { + parsedAssertion = doc; assertion = doc.Assertion; var issuer = assertion.Issuer; @@ -1102,6 +1073,10 @@ SAML.prototype.processValidlySignedAssertion = function(xml, samlResponseXml, in profile.issuer = issuer[0]._; } + if (inResponseTo) { + profile.inResponseTo = inResponseTo; + } + var authnStatement = assertion.AuthnStatement; if (authnStatement) { if (authnStatement[0].$ && authnStatement[0].$.SessionIndex) { @@ -1137,7 +1112,7 @@ SAML.prototype.processValidlySignedAssertion = function(xml, samlResponseXml, in var subjectNotBefore = confirmData.$.NotBefore; var subjectNotOnOrAfter = confirmData.$.NotOnOrAfter; - var subjErr = self.checkTimestampsValidityError( + var subjErr = this.checkTimestampsValidityError( nowMs, subjectNotBefore, subjectNotOnOrAfter); if (subjErr) { throw subjErr; @@ -1147,8 +1122,8 @@ SAML.prototype.processValidlySignedAssertion = function(xml, samlResponseXml, in } // start suomifi additions - if ( ! self.options.validateInResponseTo && - self.options.suomifiAdditions.disableValidateInResponseEnforcementForUnitTestingPurposes !== true ) + if ( ! this.options.validateInResponseTo && + this.options.suomifiAdditions.disableValidateInResponseEnforcementForUnitTestingPurposes !== true ) { // Assertions must not be processed if validateInResponseTo check is switched off due e.g. // configuration error. @@ -1167,27 +1142,27 @@ SAML.prototype.processValidlySignedAssertion = function(xml, samlResponseXml, in // Test to see that if we have a SubjectConfirmation InResponseTo that it matches // the 'InResponseTo' attribute set in the Response - if (self.options.validateInResponseTo) { + if (this.options.validateInResponseTo) { if (subjectConfirmation) { if (confirmData && confirmData.$) { var subjectInResponseTo = confirmData.$.InResponseTo; if (inResponseTo && subjectInResponseTo && subjectInResponseTo != inResponseTo) { - return Q.ninvoke(self.cacheProvider, 'remove', inResponseTo) - .then(function(){ + return Q.ninvoke(this.cacheProvider, 'remove', inResponseTo) + .then(() => { throw new Error('InResponseTo is not valid'); }); } else if (subjectInResponseTo) { var foundValidInResponseTo = false; - return Q.ninvoke(self.cacheProvider, 'get', subjectInResponseTo) - .then(function(result){ + return Q.ninvoke(this.cacheProvider, 'get', subjectInResponseTo) + .then(result => { if (result) { var createdAt = new Date(result); - if (nowMs < createdAt.getTime() + self.options.requestIdExpirationPeriodMs) + if (nowMs < createdAt.getTime() + this.options.requestIdExpirationPeriodMs) foundValidInResponseTo = true; } - return Q.ninvoke(self.cacheProvider, 'remove', inResponseTo ); + return Q.ninvoke(this.cacheProvider, 'remove', inResponseTo ); }) - .then(function(){ + .then(() => { if (!foundValidInResponseTo) { throw new Error('InResponseTo is not valid'); } @@ -1196,35 +1171,35 @@ SAML.prototype.processValidlySignedAssertion = function(xml, samlResponseXml, in } } } else { - return Q.ninvoke(self.cacheProvider, 'remove', inResponseTo); + return Q.ninvoke(this.cacheProvider, 'remove', inResponseTo); } } else { return Q(); } }) - .then(function(){ + .then(() => { var conditions = assertion.Conditions ? assertion.Conditions[0] : null; if (assertion.Conditions && assertion.Conditions.length > 1) { msg = 'Unable to process multiple conditions in SAML assertion'; throw new Error(msg); } if(conditions && conditions.$) { - var conErr = self.checkTimestampsValidityError( + var conErr = this.checkTimestampsValidityError( nowMs, conditions.$.NotBefore, conditions.$.NotOnOrAfter); if(conErr) throw conErr; } - if (self.options.audience) { - var audienceErr = self.checkAudienceValidityError( - self.options.audience, conditions.AudienceRestriction); + if (this.options.audience) { + var audienceErr = this.checkAudienceValidityError( + this.options.audience, conditions.AudienceRestriction); if(audienceErr) throw audienceErr; } // start suomifi additions - if ( ! self.options.audience && - self.options.suomifiAdditions.disableAudienceCheckEnforcementForUnitTestPurposes !== true ) + if ( ! this.options.audience && + this.options.suomifiAdditions.disableAudienceCheckEnforcementForUnitTestPurposes !== true ) { // Enforce that audience check was done. I.e. if options.audience was not configured // (and thus audience checking is not performed) throw exception. @@ -1261,19 +1236,19 @@ SAML.prototype.processValidlySignedAssertion = function(xml, samlResponseXml, in var attributeStatement = assertion.AttributeStatement; if (attributeStatement) { - var attributes = [].concat.apply([], attributeStatement.filter(function (attr) { - return Array.isArray(attr.Attribute); - }).map(function (attr) { - return attr.Attribute; - })); + var attributes = [].concat + .apply([], + attributeStatement.filter(attr => Array.isArray(attr.Attribute)) + .map(attr => attr.Attribute) + ); var attrValueMapper = function(value) { return typeof value === 'string' ? value : value._; }; if (attributes) { - attributes.forEach(function (attribute) { - if(!attribute.hasOwnProperty('AttributeValue')) { + attributes.forEach(attribute => { + if(!Object.prototype.hasOwnProperty.call(attribute, 'AttributeValue')) { // if attributes has no AttributeValue child, continue return; } @@ -1297,31 +1272,28 @@ SAML.prototype.processValidlySignedAssertion = function(xml, samlResponseXml, in profile.email = profile.mail; } - profile.getAssertionXml = function() { return xml; }; - profile.getAssertion = function() { return parsedAssertion; }; - profile.getSamlResponseXml = function() { return samlResponseXml; }; + profile.getAssertionXml = () => xml; + profile.getAssertion = () => parsedAssertion; + profile.getSamlResponseXml = () => samlResponseXml; callback(null, profile, false); }) - .fail(function(err) { - callback(err); - }) + .fail(err => callback(err)) .done(); }; SAML.prototype.checkTimestampsValidityError = function(nowMs, notBefore, notOnOrAfter) { - var self = this; - if (self.options.acceptedClockSkewMs == -1) + if (this.options.acceptedClockSkewMs == -1) return null; if (notBefore) { var notBeforeMs = Date.parse(notBefore); - if (nowMs + self.options.acceptedClockSkewMs < notBeforeMs) + if (nowMs + this.options.acceptedClockSkewMs < notBeforeMs) return new Error('SAML assertion not yet valid'); } if (notOnOrAfter) { var notOnOrAfterMs = Date.parse(notOnOrAfter); - if (nowMs - self.options.acceptedClockSkewMs >= notOnOrAfterMs) + if (nowMs - this.options.acceptedClockSkewMs >= notOnOrAfterMs) return new Error('SAML assertion expired'); } @@ -1329,7 +1301,6 @@ SAML.prototype.checkTimestampsValidityError = function(nowMs, notBefore, notOnOr }; SAML.prototype.checkAudienceValidityError = function(expectedAudience, audienceRestrictions) { - var self = this; if (!audienceRestrictions || audienceRestrictions.length < 1) { return new Error('SAML assertion has no AudienceRestriction'); } @@ -1341,7 +1312,7 @@ SAML.prototype.checkAudienceValidityError = function(expectedAudience, audienceR return new Error('SAML assertion audience mismatch'); } return null; - }).filter(function(result) { + }).filter(result => { return result !== null; }); if (errors.length > 0) { @@ -1351,36 +1322,32 @@ SAML.prototype.checkAudienceValidityError = function(expectedAudience, audienceR }; SAML.prototype.validatePostRequest = function (container, callback) { - var self = this; - var xml = Buffer.from(container.SAMLRequest, 'base64').toString('utf8'); - var dom = new xmldom.DOMParser().parseFromString(xml); - var parserConfig = { + const xml = Buffer.from(container.SAMLRequest, 'base64').toString('utf8'); + const dom = new xmldom.DOMParser().parseFromString(xml); + const parserConfig = { explicitRoot: true, explicitCharkey: true, tagNameProcessors: [xml2js.processors.stripPrefix] }; - var parser = new xml2js.Parser(parserConfig); - parser.parseString(xml, function (err, doc) { + const parser = new xml2js.Parser(parserConfig); + parser.parseString(xml, (err, doc) => { if (err) { return callback(err); } - self.certsToCheck() - .then(function(certs) { + this.certsToCheck() + .then(certs => { // Check if this document has a valid top-level signature - if (self.options.cert && !self.validateSignature(xml, dom.documentElement, certs)) { + if (this.options.cert && !this.validateSignature(xml, dom.documentElement, certs)) { return callback(new Error('Invalid signature on documentElement')); } - processValidlySignedPostRequest(self, doc, dom, callback); + processValidlySignedPostRequest(this, doc, dom, callback); }) - .fail(function(err) { - callback(err); - }); + .fail(err => callback(err)); }); }; - function callBackWithNameID(nameid, callback) { var format = xpath(nameid, "@Format"); return callback(null, { @@ -1557,4 +1524,19 @@ SAML.prototype.generateServiceProviderMetadata = function( decryptionCert, signi return xmlbuilder.create(metadata).end({ pretty: true, indent: ' ', newline: '\n' }); }; +SAML.prototype.keyToPEM = function (key) { + if (!key || typeof key !== 'string') return key; + + const lines = key.split('\n'); + if (lines.length !== 1) return key; + + const wrappedKey = [ + '-----BEGIN PRIVATE KEY-----', + ...key.match(/.{1,64}/g), + '-----END PRIVATE KEY-----', + '' + ].join('\n'); + return wrappedKey; +}; + exports.SAML = SAML; diff --git a/lib/passport-saml/strategy.js b/lib/passport-saml/strategy.js index 586a360f..0999b851 100644 --- a/lib/passport-saml/strategy.js +++ b/lib/passport-saml/strategy.js @@ -17,7 +17,6 @@ function Strategy (options, verify) { // Unlike other options, this one gets deleted instead of passed along. if (options.name) { this.name = options.name; - delete options.name; } else { this.name = 'saml'; diff --git a/package.json b/package.json index 59f04af4..ad17e3a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "suomifi-passport-saml", - "version": "1.2.0-sfi.1", + "version": "1.3.3-sfi.0", "license": "MIT", "keywords": [ "saml", @@ -30,16 +30,16 @@ "debug": "^3.1.0", "passport-strategy": "*", "q": "^1.5.0", - "xml-crypto": "^1.1.4", - "xml-encryption": "^0.11.0", + "xml-crypto": "^1.4.0", + "xml-encryption": "^1.0.0", "xml2js": "0.4.x", "xmlbuilder": "^11.0.0", "xmldom": "0.1.x" }, "devDependencies": { "body-parser": "^1.17.1", + "eslint": "^6.5.1", "express": "^4.16.2", - "jshint": "^2.10.1", "mocha": "^6.0.2", "passport": "0.4.x", "request": "^2.83.0", @@ -47,10 +47,29 @@ "sinon": "^7.2.7" }, "engines": { - "node": ">= 6" + "node": ">= 8" }, "scripts": { - "test": "mocha", - "jshint": "./node_modules/.bin/jshint lib" + "test": "npm run lint && mocha", + "lint": "./node_modules/.bin/eslint lib", + "lint:fix": "./node_modules/.bin/eslint --fix lib" + }, + "eslintConfig": { + "env": { + "node": true, + "es6": false + }, + "extends": "eslint:recommended", + "parserOptions": { + "ecmaVersion": 6 + }, + "rules": { + "no-undefined": "off", + "no-unused-vars": "off", + "semi": [ + "error", + "always" + ] + } } } diff --git a/test/saml-post-signing-tests.js b/test/saml-post-signing-tests.js new file mode 100644 index 00000000..d9fecb9c --- /dev/null +++ b/test/saml-post-signing-tests.js @@ -0,0 +1,44 @@ +const fs = require('fs'); +const should = require('should'); +const samlPostSigning = require('../lib/passport-saml/saml-post-signing'); +const signSamlPost = samlPostSigning.signSamlPost; +const signAuthnRequestPost = samlPostSigning.signAuthnRequestPost; + +const signingKey = fs.readFileSync(__dirname + '/static/key.pem'); + +describe('SAML POST Signing', function () { + it('should sign a simple saml request', function () { + var xml = 'http://example.com'; + var result = signSamlPost(xml, '/SAMLRequest', { privateCert: signingKey }); + result.should.match(/[A-Za-z0-9\/\+\=]+<\/DigestValue>/); + result.should.match(/[A-Za-z0-9\/\+\=]+<\/SignatureValue>/); + }); + + it('should place the Signature element after the Issuer element', function () { + var xml = 'http://example.com'; + var result = signSamlPost(xml, '/SAMLRequest', { privateCert: signingKey }); + result.should.match(/<\/saml2:Issuer>/); + result.should.match(//); + result.should.match(//); + }); + + it('should sign an AuthnRequest', function () { + var xml = 'http://example.com'; + var result = signAuthnRequestPost(xml, { privateCert: signingKey }); + result.should.match(/[A-Za-z0-9\/\+\=]+<\/DigestValue>/); + result.should.match(/[A-Za-z0-9\/\+\=]+<\/SignatureValue>/); + }); +}); diff --git a/test/samlTests.js b/test/samlTests.js index e86c9b70..aab87551 100644 --- a/test/samlTests.js +++ b/test/samlTests.js @@ -1,8 +1,9 @@ 'use strict'; +var fs = require('fs'); +var url = require('url'); +var should = require('should'); var SAML = require('../lib/passport-saml/saml.js').SAML; -var should = require('should'); -var url = require('url'); // Start suomifi additions // @@ -247,5 +248,40 @@ describe('SAML.js', function () { }); }); }); + + describe('keyToPEM', function () { + var [regular, singleline] = [ + 'acme_tools_com.key', + 'singleline_acme_tools_com.key' + ].map(keyFromFile); + + it('formats singleline keys properly', function (done) { + var result = saml.keyToPEM(singleline); + result.should.equal(regular); + done(); + }); + + it('passes all other multiline keys', function (done) { + var result = saml.keyToPEM(regular); + result.should.equal(regular); + done(); + }); + + it('does nothing to falsy', function (done) { + var result = saml.keyToPEM(null); + should.equal(result, null); + done(); + }); + + it('does nothing to non strings', function (done) { + var result = saml.keyToPEM(1); + should.equal(result, 1); + done(); + }); + }); }); }); + +function keyFromFile (file) { + return fs.readFileSync(`./test/static/${file}`).toString(); +} diff --git a/test/static/singleline_acme_tools_com.key b/test/static/singleline_acme_tools_com.key new file mode 100644 index 00000000..12bb0ed2 --- /dev/null +++ b/test/static/singleline_acme_tools_com.key @@ -0,0 +1 @@ +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCXJP47MTKaFpkU1/Hj4cXFlsE/d6C9xSA+8ZrvBYJXu/K4Jq4sGrA7UVCrNpEPGQSKGQeqZTPrcPbm/ZCLEvFfKpoVDxPEMUrBgBO1IvvHkbYbDDnofQvVcaBh01bVqQ/H3Q/5RKZWfVZv//sDBT5NX67iMiApnJNogVZ0WXAGGWng4EQcLJjCeAWAzJWgIGxKbBviJ/syLlPvjon1kxCkL62z6R/OV7Ln03Pnmlrl9EvC7irEVS/ahF1cB/Zku7EHsM9BtEfzb97Blnw3gFQaJDIDA6weCnSxv0kny4Qz+qHJLV1dfGOj6TGwjkdeHGng/lH1UAO46q5osijym0itAgMBAAECggEAOEGbotp/9BxfJAPwU5pwK0gea4oSOTAK/YKd4UNSrWcWQ3aaM25Hk/yDIwbvXQg5yVDhqol6lrJ4I6fTSgBl+L75lMcE22xhX75VF4GK51AT0ONvFlqcsfhV8rNfyazgY8qjLGth4iVKq+tCOXCVLOVlSWnQ0Mwnjak+TZYQfSQb9a6KZWwkTkoMf38q52iSkc3zbqUG0xYoGfpUNhdULrna8C6m6yGh+odG9kennHKBePf38M1sa3cCyriAm0TrKUG+OIAIJPV+PN2q14Vn/o9YW6uxj4GD/abBJZzFgt6aEGhJxSjwogEBT8U9SjhwBGwetL2A7T6NOoQkyWyKHQKBgQDGj4PMYtxUV9Cd50C5ekh2NQBLEsGd6DGrkJe2OrLuqDOmpxOdtGnAI7s0oiBNB2gYuTd8T+zL+FdN9vKJc9OJ9dZ0zgHKVoajff8ZB6QDkvGXGKZNbYjnsbuJYAuMg7fE0HZ7DZnBmArbRO1RtfbRf31Pfj2bpuaEWLPr3BbDewKBgQDC3g9XKKsaS+Eg3phgRYBfLL7j33vM5nGe1GrogVu3gNvirLoQLq60lSCzaWIwq0d9m+7nM9xgY9BeA6rxFWms0wWAxBW5Dj+UrRNjAa5KFav1IPVNBkzkoUfXc+WskgZBneDJt87Xif0NdnwvZPufvTzYLtgp7uf1tACOB0v39wKBgQCkvhglMPULiZyOFnuOKFYMtWbb4uD/ydHEPgCR8lvZRXctUzwkQbbn8v106vsPzhBhSvMtUgbvKMoO5tBOmOovcegQG4hCv82Pwo8vzjYXvQhzS8FXRoUrbzxg+245lGOZiTh0WlFy3VpMmQCqJeZ15Wgr11r4VN63ef01uPKuFwKBgDFTXlS0oaL1ZBYa4j00Ootc2zD5J/A0wLvwjuMto1au0nntOOfRuT1SpkVjvowNPvpnlzCE6xqnCV5S1VlTDz3E6Jawi8Mc/TEYIlkkWsa795wD7LPDjYEt5e5+krt89wJzASxuT3g1oI1g2YxxplPH5ffe2665n5ONLbrF1A//AoGAUKM5N826wiZqmYCa+eC1TVz12iprlIdW0wOoBL5hcDRDd7u0ninTSiv9mAE5RYJVHEF3PchmQFTs9i3OJXGXYDWU73kHhzgYnEC+vDxDq/6Q8BOhicRyBZ7faQ3oNnGTUzIioiBoQtmJ9axJZVNs3tfYUpxvwr43am35OSeC3aI= \ No newline at end of file diff --git a/test/tests.js b/test/tests.js index c7d4dc4c..ce50cacb 100644 --- a/test/tests.js +++ b/test/tests.js @@ -234,6 +234,47 @@ describe( 'passport-saml /', function() { describe( 'captured SAML requests /', function() { + var logoutChecks = [ + { name: "Logout", + config: { + skipRequestCompression: true, + entryPoint: 'https://idp.testshib.org/idp/profile/SAML2/Redirect/SSO', + cert: fs.readFileSync(__dirname + '/static/cert.pem', 'ascii'), + identifierFormat: 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient', + }, + samlRequest: { + SAMLRequest: fs.readFileSync(__dirname + '/static/logout_request_with_good_signature.xml', 'base64'), + }, + expectedStatusCode: 200, + mockDate: '2014-06-02T17:48:56.820Z', + result: { + "samlp:LogoutResponse": { + "$": { + "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", + "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", + "Version": "2.0", + "Destination": "https://wwwexampleIdp.com/saml", + "InResponseTo": "pfxd4d369e8-9ea1-780c-aff8-a1d11a9862a1", + }, + "saml:Issuer": [ + "onelogin_saml" + ], + "samlp:Status": [ + { + "samlp:StatusCode": [ + { + "$": { + "Value": "urn:oasis:names:tc:SAML:2.0:status:Success" + } + } + ] + } + ] + } + }, + }, + ]; + var capturedChecks = [ { name: "Empty Config", config: { suomifiAdditions: suomifiAdditionsOptions }, @@ -523,11 +564,17 @@ describe( 'passport-saml /', function() { config.entryPoint = 'https://wwwexampleIdp.com/saml'; var profile = null; passport.use( new SamlStrategy( config, function(_profile, done) { - profile = _profile; - done(null, { id: profile.nameID } ); + profile = _profile; + done(null, profile ); }) ); + var userSerialized = false; + passport.serializeUser(function(user, done) { + userSerialized = true; + done(null, user); + }); + app.get( '/login', passport.authenticate( "saml", { samlFallback: 'login-request', session: false } ), function(req, res) { @@ -535,7 +582,7 @@ describe( 'passport-saml /', function() { }); app.use( function( err, req, res, next ) { - console.log( err.stack ); + // console.log( err.stack ); res.status(500).send('500 Internal Server Error'); }); @@ -593,11 +640,94 @@ describe( 'passport-saml /', function() { }; } + function testForCheckLogout( check ) { + return function( done ) { + var app = express(); + app.use( bodyParser.urlencoded({extended: false}) ); + app.use( passport.initialize() ); + var config = check.config; + config.callbackUrl = 'http://localhost:3033/login'; + config.entryPoint = 'https://wwwexampleIdp.com/saml'; + var profile = null; + passport.use( new SamlStrategy( config, function(_profile, done) { + profile = _profile; + done(null, profile ); + }) + ); + + var userSerialized = false; + passport.serializeUser(function(user, done) { + userSerialized = true; + done(null, user); + }); + + app.post( '/login', + passport.authenticate( "saml"), + function(req, res) { + res.status(200).send("200 OK"); + }); + + app.use( function( err, req, res, next ) { + // console.log( err.stack ); + res.status(500).send('500 Internal Server Error'); + }); + + server = app.listen( 3033, function() { + var requestOpts = { + url: 'http://localhost:3033/login', + method: 'post', + form: check.samlRequest + }; + + request(requestOpts, function(err, response, body) { + try { + var encodedSamlResponse = querystring.parse(this.uri.query).SAMLResponse; + // An error will exist because the endpoint we're trying to log out of doesn't exist, + // but we can still test to make sure that everything is behaving as it should. + // should.not.exist(err); + + var buffer = Buffer.from(encodedSamlResponse, 'base64'); + if (check.config.skipRequestCompression) + helper(null, buffer); + else + zlib.inflateRaw( buffer, helper ); + + function helper(err, samlResponse) { + try { + should.not.exist( err ); + parseString( samlResponse.toString(), function( err, doc ) { + try { + should.not.exist( err ); + delete doc['samlp:LogoutResponse']['$']["ID"]; + delete doc['samlp:LogoutResponse']['$']["IssueInstant"]; + doc.should.eql( check.result ); + done(); + } catch (err2) { + done(err2); + } + }); + } catch (err2) { + done(err2); + } + } + } catch (err2) { + done(err2); + } + }); + }); + }; + } + for( var i = 0; i < capturedChecks.length; i++ ) { var check = capturedChecks[i]; it( check.name, testForCheck( check ) ); } + for (var i = 0; i < logoutChecks.length; i++) { + var check = logoutChecks[i]; + it(check.name, testForCheckLogout(check)); + } + afterEach( function( done ) { server.close( done ); }); @@ -2196,6 +2326,30 @@ describe( 'passport-saml /', function() { done(err2); } }); + }) + it('returns profile for valid signature with encrypted nameID', function(done) { + var samlObj = new SAML({ + cert: fs.readFileSync(__dirname + '/static/cert.pem', 'ascii'), + decryptionPvk: fs.readFileSync(__dirname + '/static/key.pem', 'ascii') + }); + var body = { + SAMLRequest: fs.readFileSync(__dirname + '/static/logout_request_with_encrypted_name_id.xml', 'base64') + }; + samlObj.validatePostRequest(body, function(err, profile) { + try { + should.not.exist(err); + profile.should.eql({ + ID: 'pfx00cb5227-d9d0-1d4b-bdb2-c7ad6c3c6906', + issuer: 'http://sp.example.com/demo1/metadata.php', + nameID: 'ONELOGIN_f92cc1834efc0f73e9c09f482fce80037a6251e7', + nameIDFormat: 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient', + sessionIndex: '1' + }); + done(); + } catch (err2) { + done(err2); + } + }); }); it('errors if bad privateCert to requestToURL', function(done){ var samlObj = new SAML({ @@ -2419,10 +2573,11 @@ describe( 'passport-saml /', function() { } }); }); + it('accepts cert without header and footer line', function(done) { samlObj.options.cert = fs.readFileSync(__dirname + '/static/acme_tools_com_without_header_and_footer.cert', 'ascii') samlObj.cacheProvider.save('_79db1e7ad12ca1d63e5b', new Date().toISOString(), function(){}); - samlObj.validateRedirect(this.request, this.request.originalQuery,function(err, _data, success) { + samlObj.validateRedirect(this.request, this.request.originalQuery, function(err, _data, success) { should.not.exist(err); success.should.eql(true); done(); diff --git a/yarn.lock b/yarn.lock index 0015e0e0..c952c977 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,51 @@ # yarn lockfile v1 +"@babel/code-frame@^7.0.0": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" + integrity sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw== + dependencies: + "@babel/highlight" "^7.0.0" + +"@babel/highlight@^7.0.0": + version "7.5.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.5.0.tgz#56d11312bd9248fa619591d02472be6e8cb32540" + integrity sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ== + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.4.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.6.0.tgz#ec7670432ae9c8eb710400d112c201a362d83393" + integrity sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/formatio@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-3.2.1.tgz#52310f2f9bcbc67bdac18c94ad4901b95fde267e" + integrity sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ== + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^3.1.0" + +"@sinonjs/samsam@^3.1.0", "@sinonjs/samsam@^3.3.3": + version "3.3.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" + integrity sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ== + dependencies: + "@sinonjs/commons" "^1.3.0" + array-from "^2.1.1" + lodash "^4.17.15" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" @@ -10,6 +55,26 @@ accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" +acorn-jsx@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.2.tgz#84b68ea44b373c4f8686023a551f61a21b7c4a4f" + integrity sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw== + +acorn@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" + integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== + +ajv@^6.10.0, ajv@^6.10.2: + version "6.10.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" + integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^6.5.5: version "6.6.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" @@ -20,11 +85,50 @@ ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= +array-from@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + asn1@~0.2.3: version "0.2.4" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" @@ -37,17 +141,10 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -async@^2.1.5: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" - integrity sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ== - dependencies: - lodash "^4.17.10" - -async@~1.0.0: +astral-regex@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" - integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" + integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== asynckit@^0.4.0: version "0.4.0" @@ -105,33 +202,72 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -cli@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14" - integrity sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ= +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: - exit "0.1.2" - glob "^7.1.1" + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" -colors@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.7" @@ -140,33 +276,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@1.1.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" - content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" @@ -187,15 +301,21 @@ cookie@0.3.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= -core-util-is@1.0.2, core-util-is@~1.0.0: +core-util-is@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cycle@1.0.x: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" - integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= +cross-spawn@^6.0.5: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" dashdash@^1.12.0: version "1.14.1" @@ -204,11 +324,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -216,20 +331,37 @@ debug@2.6.9: dependencies: ms "2.0.0" -debug@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@^3.1.0: +debug@3.2.6, debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" +debug@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -245,43 +377,17 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -diff@3.5.0, diff@^3.1.0: +diff@3.5.0, diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -dom-serializer@0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" - integrity sha1-BzxpdUbOB4DOI75KKOKT5AvDDII= - dependencies: - domelementtype "~1.1.1" - entities "~1.1.1" - -domelementtype@1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.2.1.tgz#578558ef23befac043a1abb0db07635509393479" - integrity sha512-SQVCLFS2E7G5CRCMdn6K9bIhRj1bS6QBWZfF0TUPh4V/BbqrQ619IdSS3/izn0FZ+9l+uODzaZjb08fjOfablA== - -domelementtype@~1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" - integrity sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs= - -domhandler@2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" - integrity sha1-LeWaCCLVAn+r/28DLCsloqir5zg= - dependencies: - domelementtype "1" - -domutils@1.5: - version "1.5.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" - integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8= +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== dependencies: - dom-serializer "0" - domelementtype "1" + esutils "^2.0.2" ecc-jsbn@~0.1.1: version "0.1.2" @@ -296,51 +402,157 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^2.5.6: - version "2.6.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" - integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -entities@1.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" - integrity sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY= - -entities@~1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -es6-promise@^4.0.3: - version "4.2.5" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" - integrity sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg== +es-abstract@^1.5.1: + version "1.14.2" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.14.2.tgz#7ce108fad83068c8783c3cdf62e504e084d8c497" + integrity sha512-DgoQmbpFNOofkjJtKwr87Ma5EW4Dc8fWhD0R+ndq7Oc456ivUfGOOP6oAZTTKl5/CcNMP+EN+e3/iUzgE0veZg== + dependencies: + es-to-primitive "^1.2.0" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.0" + is-callable "^1.1.4" + is-regex "^1.0.4" + object-inspect "^1.6.0" + object-keys "^1.1.1" + string.prototype.trimleft "^2.0.0" + string.prototype.trimright "^2.0.0" + +es-to-primitive@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" + integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" -escape-html@~1.0.3: +escape-html@^1.0.3, escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@1.0.5: +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +eslint-scope@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9" + integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw== + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-utils@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.2.tgz#166a5180ef6ab7eb462f162fd0e6f2463d7309ab" + integrity sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q== + dependencies: + eslint-visitor-keys "^1.0.0" + +eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" + integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== + +eslint@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.5.1.tgz#828e4c469697d43bb586144be152198b91e96ed6" + integrity sha512-32h99BoLYStT1iq1v2P9uwpyznQ4M2jRiFB6acitKz52Gqn+vPaMDUTB1bYi1WN4Nquj2w+t+bimYUG83DC55A== + dependencies: + "@babel/code-frame" "^7.0.0" + ajv "^6.10.0" + chalk "^2.1.0" + cross-spawn "^6.0.5" + debug "^4.0.1" + doctrine "^3.0.0" + eslint-scope "^5.0.0" + eslint-utils "^1.4.2" + eslint-visitor-keys "^1.1.0" + espree "^6.1.1" + esquery "^1.0.1" + esutils "^2.0.2" + file-entry-cache "^5.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.0.0" + globals "^11.7.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + inquirer "^6.4.1" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.14" + minimatch "^3.0.4" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + progress "^2.0.0" + regexpp "^2.0.1" + semver "^6.1.2" + strip-ansi "^5.2.0" + strip-json-comments "^3.0.1" + table "^5.2.3" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.1.tgz#7f80e5f7257fc47db450022d723e356daeb1e5de" + integrity sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ== + dependencies: + acorn "^7.0.0" + acorn-jsx "^5.0.2" + eslint-visitor-keys "^1.1.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= -exit@0.1.2, exit@0.1.x: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - express@^4.16.2: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" @@ -382,15 +594,14 @@ extend@~3.0.2: resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extract-zip@^1.6.5: - version "1.6.7" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" - integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= +external-editor@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== dependencies: - concat-stream "1.6.2" - debug "2.6.9" - mkdirp "0.5.1" - yauzl "2.4.1" + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" extsprintf@1.3.0: version "1.3.0" @@ -402,11 +613,6 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= -eyes@0.1.x: - version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -417,12 +623,24 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: - pend "~1.2.0" + escape-string-regexp "^1.0.5" + +file-entry-cache@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" + integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== + dependencies: + flat-cache "^2.0.1" finalhandler@1.1.1: version "1.1.1" @@ -437,6 +655,34 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +flat-cache@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" + integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== + dependencies: + flatted "^2.0.0" + rimraf "2.6.3" + write "1.0.3" + +flat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" + integrity sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw== + dependencies: + is-buffer "~2.0.3" + +flatted@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08" + integrity sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg== + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -451,13 +697,6 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" -formatio@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" - integrity sha1-87IWfZBoxGmKjVH092CjmlTYGOs= - dependencies: - samsam "1.x" - forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -468,20 +707,26 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -fs-extra@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -489,10 +734,17 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== +glob-parent@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.0.tgz#5f4c1d1e748d30cd73ad2944b3577a81b081e8c2" + integrity sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw== + dependencies: + is-glob "^4.0.1" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -501,10 +753,10 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -513,10 +765,10 @@ glob@^7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.15" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" - integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== +globals@^11.7.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== growl@1.10.5: version "1.10.5" @@ -541,29 +793,22 @@ has-flag@^3.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -hasha@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" - integrity sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE= - dependencies: - is-stream "^1.0.1" - pinkie-promise "^2.0.0" - -he@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= +has-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.0.tgz#ba1a8f1af2a0fc39650f5c850367704122063b44" + integrity sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q= -htmlparser2@3.8.x: - version "3.8.3" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" - integrity sha1-mWwosZFRaovoZQGn15dX5ccMEGg= +has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - domelementtype "1" - domhandler "2.3" - domutils "1.5" - entities "1.0" - readable-stream "1.1" + function-bind "^1.1.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: version "1.6.3" @@ -591,6 +836,31 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +import-fresh@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.1.0.tgz#6d33fa1dcef6df930fae003446f33415af905118" + integrity sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -599,20 +869,85 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= +inquirer@^6.4.1: + version "6.5.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" + integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.12" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.1.0" + through "^2.3.6" + ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= -is-stream@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-buffer@~2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + +is-callable@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" + integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + integrity sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY= + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-glob@^4.0.0, is-glob@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= + +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + integrity sha1-VRdIm1RwkbCTDglWVM7SXul+lJE= + dependencies: + has "^1.0.1" + +is-symbol@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" + integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== + dependencies: + has-symbols "^1.0.0" is-typedarray@~1.0.0: version "1.0.0" @@ -624,44 +959,34 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isstream@0.1.x, isstream@~0.1.2: +isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@3.13.1, js-yaml@^3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= -jshint@*: - version "2.9.6" - resolved "https://registry.yarnpkg.com/jshint/-/jshint-2.9.6.tgz#19b34e578095a34928fe006135a6cb70137b9c08" - integrity sha512-KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA== - dependencies: - cli "~1.0.0" - console-browserify "1.1.x" - exit "0.1.x" - htmlparser2 "3.8.x" - lodash "~4.17.10" - minimatch "~3.0.2" - shelljs "0.3.x" - strip-json-comments "1.0.x" - unicode-5.2.0 "^0.7.5" - optionalDependencies: - phantom "~4.0.1" - phantomjs-prebuilt "~2.1.7" - json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -672,18 +997,16 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= - optionalDependencies: - graceful-fs "^4.1.6" - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -694,27 +1017,43 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" -kew@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" - integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s= +just-extend@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.0.2.tgz#f3f47f7dfca0f989c55410a7ebc8854b07108afc" + integrity sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw== -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= - optionalDependencies: - graceful-fs "^4.1.9" +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" -lodash@^4.17.10, lodash@~4.17.10: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" -lolex@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" - integrity sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY= +lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15: + version "4.17.15" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" + integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== + +log-symbols@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== + dependencies: + chalk "^2.0.1" + +lolex@^4.1.0, lolex@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-4.2.0.tgz#ddbd7f6213ca1ea5826901ab1222b65d714b3cd7" + integrity sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg== media-typer@0.3.0: version "0.3.0" @@ -748,7 +1087,12 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -minimatch@3.0.4, minimatch@^3.0.4, minimatch@~3.0.2: +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +minimatch@3.0.4, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -760,50 +1104,91 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -mkdirp@0.5.1: +mkdirp@0.5.1, mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" -mocha@*: - version "5.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" - integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ== +mocha@^6.0.2: + version "6.2.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-6.2.1.tgz#da941c99437da9bac412097859ff99543969f94c" + integrity sha512-VCcWkLHwk79NYQc8cxhkmI8IigTIhsCwZ6RTxQsqK6go4UvEhzJkYuHm8B2YtlSxcYq2fY+ucr4JBwoD6ci80A== dependencies: + ansi-colors "3.2.3" browser-stdout "1.3.1" - commander "2.15.1" - debug "3.1.0" + debug "3.2.6" diff "3.5.0" escape-string-regexp "1.0.5" - glob "7.1.2" + find-up "3.0.0" + glob "7.1.3" growl "1.10.5" - he "1.1.1" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "2.2.0" minimatch "3.0.4" mkdirp "0.5.1" - supports-color "5.4.0" + ms "2.1.1" + node-environment-flags "1.0.5" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.0" + yargs-parser "13.1.1" + yargs-unparser "1.6.0" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.1, ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== -native-promise-only@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" - integrity sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE= +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +nise@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.2.tgz#b6d29af10e48b321b307e10e065199338eeb2652" + integrity sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA== + dependencies: + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + lolex "^4.1.0" + path-to-regexp "^1.7.0" + +node-environment-flags@1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.5.tgz#fa930275f5bf5dae188d6192b24b4c8bbac3d76a" + integrity sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + node-forge@^0.7.0: version "0.7.6" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" @@ -814,6 +1199,34 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== +object-inspect@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.6.0.tgz#c70b6cbf72f274aab4c34c0c82f5167bf82cf15b" + integrity sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= + dependencies: + define-properties "^1.1.2" + es-abstract "^1.5.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -828,6 +1241,56 @@ once@^1.3.0: dependencies: wrappy "1" +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= + dependencies: + mimic-fn "^1.0.0" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-limit@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" + integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" @@ -846,11 +1309,21 @@ passport@0.4.x: passport-strategy "1.x.x" pause "0.0.1" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= +path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -868,61 +1341,20 @@ pause@0.0.1: resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d" integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10= -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -phantom@~4.0.1: - version "4.0.12" - resolved "https://registry.yarnpkg.com/phantom/-/phantom-4.0.12.tgz#78d18cf3f2a76fea4909f6160fcabf2742d7dbf0" - integrity sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA== - dependencies: - phantomjs-prebuilt "^2.1.16" - split "^1.0.1" - winston "^2.4.0" - -phantomjs-prebuilt@^2.1.16, phantomjs-prebuilt@~2.1.7: - version "2.1.16" - resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" - integrity sha1-79ISpKOWbTZHaE6ouniFSb4q7+8= - dependencies: - es6-promise "^4.0.3" - extract-zip "^1.6.5" - fs-extra "^1.0.0" - hasha "^2.2.0" - kew "^0.7.0" - progress "^1.1.8" - request "^2.81.0" - request-progress "^2.0.1" - which "^1.2.10" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -progress@^1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== proxy-addr@~2.0.4: version "2.0.4" @@ -972,37 +1404,12 @@ raw-body@2.3.3: iconv-lite "0.4.23" unpipe "1.0.0" -readable-stream@1.1: - version "1.1.13" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" - integrity sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.2.2: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -request-progress@^2.0.1: +regexpp@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" - integrity sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg= - dependencies: - throttleit "^1.0.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" + integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -request@^2.81.0, request@^2.83.0: +request@^2.83.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -1028,7 +1435,51 @@ request@^2.81.0, request@^2.83.0: tunnel-agent "^0.6.0" uuid "^3.3.2" -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rimraf@2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= + dependencies: + is-promise "^2.1.0" + +rxjs@^6.4.0: + version "6.5.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" + integrity sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA== + dependencies: + tslib "^1.9.0" + +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -1038,16 +1489,21 @@ safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, s resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -samsam@1.x, samsam@^1.1.3: - version "1.3.0" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" - integrity sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg== - sax@>=0.6.0: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== +semver@^5.5.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.1.2: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -1077,15 +1533,27 @@ serve-static@1.13.2: parseurl "~1.3.2" send "0.16.2" +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== -shelljs@0.3.x: - version "0.3.0" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1" - integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E= +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= should-equal@^2.0.0: version "2.0.0" @@ -1131,26 +1599,37 @@ should@*: should-type-adaptors "^1.0.1" should-util "^1.0.0" -sinon@^2.1.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.4.1.tgz#021fd64b54cb77d9d2fb0d43cdedfae7629c3a36" - integrity sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw== +signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +sinon@^7.2.7: + version "7.5.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.5.0.tgz#e9488ea466070ea908fd44a3d6478fd4923c67ec" + integrity sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q== + dependencies: + "@sinonjs/commons" "^1.4.0" + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/samsam" "^3.3.3" + diff "^3.5.0" + lolex "^4.2.0" + nise "^1.5.2" + supports-color "^5.5.0" + +slice-ansi@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" + integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== dependencies: - diff "^3.1.0" - formatio "1.2.0" - lolex "^1.6.0" - native-promise-only "^0.8.1" - path-to-regexp "^1.7.0" - samsam "^1.1.3" - text-encoding "0.6.4" - type-detect "^4.0.0" + ansi-styles "^3.2.0" + astral-regex "^1.0.0" + is-fullwidth-code-point "^2.0.0" -split@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: version "1.15.2" @@ -1167,11 +1646,6 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - "statuses@>= 1.4.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -1182,45 +1656,104 @@ statuses@~1.4.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= +"string-width@^1.0.2 || 2", string-width@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== dependencies: - safe-buffer "~5.1.0" + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" -strip-json-comments@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" - integrity sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E= +string.prototype.trimleft@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz#6cc47f0d7eb8d62b0f3701611715a3954591d634" + integrity sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +string.prototype.trimright@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz#669d164be9df9b6f7559fa8e89945b168a5a6c58" + integrity sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg== + dependencies: + define-properties "^1.1.3" + function-bind "^1.1.1" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" + integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" -supports-color@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" - integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w== +supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -text-encoding@0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" - integrity sha1-45mpgiV6J22uQou5KEXLcb3CbRk= +table@^5.2.3: + version "5.4.6" + resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" + integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== + dependencies: + ajv "^6.10.2" + lodash "^4.17.14" + slice-ansi "^2.1.0" + string-width "^3.0.0" -throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" - integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through@2: +through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -1229,6 +1762,11 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tslib@^1.9.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" + integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -1241,7 +1779,14 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -type-detect@^4.0.0: +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + +type-detect@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -1254,16 +1799,6 @@ type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -unicode-5.2.0@^0.7.5: - version "0.7.5" - resolved "https://registry.yarnpkg.com/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz#e0df129431a28a95263d8c480fb5e9ab2b0973f0" - integrity sha512-KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA== - unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -1276,11 +1811,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -1291,6 +1821,11 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== +v8-compile-cache@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" + integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -1305,45 +1840,65 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -which@^1.2.10: +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1.3.1, which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -winston@^2.4.0: - version "2.4.4" - resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.4.tgz#a01e4d1d0a103cf4eada6fc1f886b3110d71c34b" - integrity sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q== +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== dependencies: - async "~1.0.0" - colors "1.0.x" - cycle "1.0.x" - eyes "0.1.x" - isstream "0.1.x" - stack-trace "0.0.x" + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= -xml-crypto@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/xml-crypto/-/xml-crypto-1.1.4.tgz#fbd01c1aaa343945f8ee51327e4299ce743ee37b" - integrity sha512-tvRWUUCQF29+K6SKAK9PHP/uMOGg/QKkxapxxovDLTEFHPMCtmolUftNu4wpofShKivmOesO0HhX65xl73ILeA== +write@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" + integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== + dependencies: + mkdirp "^0.5.1" + +xml-crypto@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/xml-crypto/-/xml-crypto-1.4.0.tgz#de1cec8cd31cbd689cd90d3d6e8a27d4ae807de7" + integrity sha512-K8FRdRxICVulK4WhiTUcJrRyAIJFPVOqxfurA3x/JlmXBTxy+SkEENF6GeRt7p/rB6WSOUS9g0gXNQw5n+407g== dependencies: xmldom "0.1.27" xpath "0.0.27" -xml-encryption@^0.11.0: - version "0.11.2" - resolved "https://registry.yarnpkg.com/xml-encryption/-/xml-encryption-0.11.2.tgz#c217f5509547e34b500b829f2c0bca85cca73a21" - integrity sha512-jVvES7i5ovdO7N+NjgncA326xYKjhqeAnnvIgRnY7ROLCfFqEDLwP0Sxp/30SHG0AXQV1048T5yinOFyvwGFzg== +xml-encryption@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/xml-encryption/-/xml-encryption-1.0.0.tgz#fe50d3bbbe2ae06876d6aa95aa3bf958284e1612" + integrity sha512-xTqcgKPN3XOswvDPXrhtyvWZ96IFcO9Azv3vS060kOpBsK5T7OxbQDxb59bPLl4b4c2IgmSZC3kJB0n5WPr2Mw== dependencies: - async "^2.1.5" - ejs "^2.5.6" + escape-html "^1.0.3" node-forge "^0.7.0" xmldom "~0.1.15" xpath "0.0.27" @@ -1356,7 +1911,12 @@ xml2js@0.4.x: sax ">=0.6.0" xmlbuilder "~9.0.1" -xmlbuilder@^9.0.4, xmlbuilder@~9.0.1: +xmlbuilder@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlbuilder@~9.0.1: version "9.0.7" resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= @@ -1371,9 +1931,40 @@ xpath@0.0.27: resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.27.tgz#dd3421fbdcc5646ac32c48531b4d7e9d0c2cfa92" integrity sha512-fg03WRxtkCV6ohClePNAECYsmpKKTv5L8y/X3Dn1hQrec3POx2jHZ/0P2qQ6HvsrU1BmeqXcof3NGGueG6LxwQ== -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yargs-parser@13.1.1, yargs-parser@^13.1.1: + version "13.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" + integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== dependencies: - fd-slicer "~1.0.1" + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + +yargs@13.3.0, yargs@^13.3.0: + version "13.3.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" + integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.1"