diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 859eb592..ef344052 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -10,7 +10,7 @@ assignees: "" Thanks for submitting a bug report or featureq request to help us improve. If you have a support question about how to use the module, no one is monitoring the issues -to answer those. Consider posting on StackOverflow instead using the "passport-saml" tag. +to answer those. Consider posting on StackOverflow instead using the "node-saml" tag. --> ** Spec-driven development ** @@ -25,7 +25,7 @@ that you found no references in the spec concerning your issue. ** Community development model ** -passport-saml is maintained by a number of current users. There is no author or primary maintainer +node-saml is maintained by a number of current users. There is no author or primary maintainer waiting to write your tests and documentation for you. To increase the odds that your issue is promptly dealt with, consider a pull request to address the issue that includes test coverage and updated documentation. @@ -40,4 +40,4 @@ A clear and concise description of what you expected to happen. **Environment** - Node.js version: -- passport-saml version: +- node-saml version: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 9482ae70..94b9d9f6 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,7 +1,7 @@ blank_issues_enabled: false contact_links: - name: Ask a question on Discussions area (NEW!) - url: https://github.com/node-saml/passport-saml/discussions + url: https://github.com/node-saml/node-saml/discussions about: Recommended place for questions, debates, consultation. - name: Ask a question on StackOverflow - url: https://stackoverflow.com/questions/tagged/passport-saml + url: https://stackoverflow.com/questions/tagged/node-saml diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 3b981ea6..48304529 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -10,7 +10,7 @@ assignees: "" Thanks for submitting a bug report or featureq request to help us improve. If you have a support question about how to use the module, no one is monitoring the issues -to answer those. Consider posting on StackOverflow instead using the "passport-saml" tag. +to answer those. Consider posting on StackOverflow instead using the "node-saml" tag. --> ** Spec-driven development ** @@ -25,7 +25,7 @@ that you found no references in the spec concerning your issue. ** Community development model ** -passport-saml is maintained by a number of current users. There is no author or primary maintainer +node-saml is maintained by a number of current users. There is no author or primary maintainer waiting to write your tests and documentation for you. To increase the odds that your issue is promptly dealt with, consider a pull request to address the issue that includes test coverage and updated documentation. diff --git a/.grenrc.js b/.grenrc.js index e1abcde0..ca4f3534 100644 --- a/.grenrc.js +++ b/.grenrc.js @@ -28,7 +28,7 @@ module.exports = { }, changelogFilename: "CHANGELOG.md", username: "node-saml", - repo: "passport-saml", + repo: "node-saml", template: { issue: function (placeholders) { const parts = [ diff --git a/.travis.yml b/.travis.yml index 6189bef6..331909ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,6 @@ language: node_js node_js: - - "8.10" + - "12" - "stable" script: diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e819824..a0750ed7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,458 +1,11 @@ # Changelog -## v2.2.0 (2021-04-23) +## v3.0.0 (2021-05-14) #### πŸ’£ Major Changes: -- Node saml separation [#574](https://github.com/node-saml/passport-saml/pull/574) -- Remove support for deprecated `privateCert` [#569](https://github.com/node-saml/passport-saml/pull/569) - -#### πŸš€ Minor Changes: - -- Add deprecation notices for renamed variables [#568](https://github.com/node-saml/passport-saml/pull/568) -- Move XML functions to utility module [#571](https://github.com/node-saml/passport-saml/pull/571) -- Improve the typing of the Strategy class hierarchy. [#554](https://github.com/node-saml/passport-saml/pull/554) -- Resolve XML-encoded carriage returns during signature validation [#576](https://github.com/node-saml/passport-saml/pull/576) -- Make sure CI builds test latest versions of dependencies [#570](https://github.com/node-saml/passport-saml/pull/570) -- Add WantAssertionsSigned [#536](https://github.com/node-saml/passport-saml/pull/536) - -#### πŸ› Bug Fixes: - -- Resolve XML-encoded carriage returns during signature validation (2.x) [#578](https://github.com/node-saml/passport-saml/pull/578) -- Fix incorrect import of compiled files in tests [#572](https://github.com/node-saml/passport-saml/pull/572) - -#### πŸ“š Documentation: - -- Create of Code of Conduct [#573](https://github.com/node-saml/passport-saml/pull/573) - ---- - -## v2.1.0 (2021-03-19) - -#### πŸ’£ Major Changes: - -- Require cert for every strategy [#548](https://github.com/node-saml/passport-saml/pull/548) - -#### πŸš€ Minor Changes: - -- Update xml-crypto to v2.1.1 [#557](https://github.com/node-saml/passport-saml/pull/557) -- Update xml-crypto to v2.1.1 [#558](https://github.com/node-saml/passport-saml/pull/558) - -#### πŸ”— Dependencies: - -- Update xml-encryption to v1.2.3 [#560](https://github.com/node-saml/passport-saml/pull/560) -- Update xml-encryption to v1.2.3 [#562](https://github.com/node-saml/passport-saml/pull/562) -- Update xml-encryption to v1.2.3 [#567](https://github.com/node-saml/passport-saml/pull/567) - -#### βš™οΈ Technical Tasks: - -- Fix lint npm script to match all files including in src/ [#555](https://github.com/node-saml/passport-saml/pull/555) - -#### πŸ™ˆ Other: - -- Revert "Update xml-encryption to v1.2.3" [#564](https://github.com/node-saml/passport-saml/pull/564) -- Revert "Update xml-encryption to v1.2.3" [#565](https://github.com/node-saml/passport-saml/pull/565) -- Update xml-encryption to v1.2.3 (branch 2.x) [#566](https://github.com/node-saml/passport-saml/pull/566) - ---- - -## v2.0.6 (2021-03-15) - -#### πŸš€ Minor Changes: - -- Allow for authnRequestBinding in SAML options [#529](https://github.com/node-saml/passport-saml/pull/529) - -#### πŸ”— Dependencies: - -- bump xmldom to 0.5.x since all lower versions have security issue [#551](https://github.com/node-saml/passport-saml/pull/551) -- bump xmldom to 0.5.x since all lower versions have security issue (#551) [#553](https://github.com/node-saml/passport-saml/pull/553) - -#### πŸ“š Documentation: - -- Update readme on using multiSamlStrategy [#531](https://github.com/node-saml/passport-saml/pull/531) - -#### βš™οΈ Technical Tasks: - -- remove old callback functions, tests use async/await [#545](https://github.com/node-saml/passport-saml/pull/545) -- async/await for saml.ts [#496](https://github.com/node-saml/passport-saml/pull/496) -- Format code and enforce code style on PR [#527](https://github.com/node-saml/passport-saml/pull/527) -- Tests use typescript [#534](https://github.com/node-saml/passport-saml/pull/534) -- async / await in cache interface [#532](https://github.com/node-saml/passport-saml/pull/532) - ---- - -## v2.0.5 (2021-01-29) - -#### βš™οΈ Technical Tasks: - -- Ignore `test` folder when building npm package [#526](https://github.com/node-saml/passport-saml/pull/526) - ---- - -## v2.0.4 (2021-01-19) - -#### βš™οΈ Technical Tasks: - -- Generating changelog using gren [#518](https://github.com/node-saml/passport-saml/pull/518) - ---- - -## v2.0.3 (2021-01-07) - -#### πŸ› Bug Fixes: - -- normalize signature line endings before loading signature block to xml-crypto [#512](https://github.com/node-saml/passport-saml/pull/512) -- support windows line breaks in keys [#500](https://github.com/node-saml/passport-saml/pull/500) -- add ts-ignore to generated type definitions for multisaml strategy [#508](https://github.com/node-saml/passport-saml/pull/508) - -#### πŸ“š Documentation: - -- docs(scoping): fix for example [#504](https://github.com/node-saml/passport-saml/pull/504) -- minor - fix typo in README [#506](https://github.com/node-saml/passport-saml/pull/506) - ---- - -## v2.0.2 (2020-11-05) - -_No changelog for this release._ - ---- - -## v2.0.1 (2020-11-03) - -_No changelog for this release._ +- Node saml separated from [passport-saml](https://github.com/node-saml/passport-saml) [#574](https://github.com/node-saml/passport-saml/pull/574) --- -## v2.0.0 (2020-11-03) - -#### πŸš€ Minor Changes: - -- feat(authorize-request): idp scoping provider [#428](https://github.com/node-saml/passport-saml/pull/428) - -#### πŸ› Bug Fixes: - -- update version of xml2js to 0.4.23, fixes #479 [#486](https://github.com/node-saml/passport-saml/pull/486) - ---- - -## v1.5.0 (2020-10-30) - -#### πŸš€ Minor Changes: - -- validateSignature: Support XML docs that contain multiple signed nodes [#455](https://github.com/node-saml/passport-saml/pull/455) - -#### βš™οΈ Technical Tasks: - -- outdated Q library was removed [#478](https://github.com/node-saml/passport-saml/pull/478) - ---- - -## v1.4.2 (2020-10-29) - -#### βš™οΈ Technical Tasks: - -- Primary files use typescript [#477](https://github.com/node-saml/passport-saml/pull/477) - ---- - -## v1.4.1 (2020-10-29) - -_No changelog for this release._ - ---- - -## v1.4.0 (2020-10-28) - -#### βš™οΈ Technical Tasks: - -- support typescript compilation [#469](https://github.com/node-saml/passport-saml/pull/469) - ---- - -## v1.3.5 (2020-09-16) - -_No changelog for this release._ - ---- - -## v1.3.4 (2020-07-21) - -_No changelog for this release._ - ---- - -## v1.3.3 (2020-02-19) - -_No changelog for this release._ - ---- - -## v1.3.2 (2020-02-12) - -_No changelog for this release._ - ---- - -## v1.3.1 (2020-02-11) - -_No changelog for this release._ - ---- - -## v1.3.0 (2020-02-06) - -#### πŸš€ Minor Changes: - -- add support for encrypted nameIDs in SLO request handling [#408](https://github.com/node-saml/passport-saml/pull/408) -- Issue #206: Support signing AuthnRequests using the HTTP-POST Binding [#207](https://github.com/node-saml/passport-saml/pull/207) -- convert privateCert to PEM for signing [#390](https://github.com/node-saml/passport-saml/pull/390) - ---- - -## v1.2.0 (2019-09-12) - -_No changelog for this release._ - ---- - -## v1.1.0 (2019-05-10) - -#### πŸš€ Minor Changes: - -- feat: add RequestedAuthnContext Comparison Type parameter [#360](https://github.com/node-saml/passport-saml/pull/360) -- Add option to disable SAML spec AuthnRequest optional value Assertion… [#315](https://github.com/node-saml/passport-saml/pull/315) - ---- - -## v1.0.0 (2018-12-02) - -#### πŸ’£ Major Changes: - -- Adds signing key in the metadata service provider generation. [#306](https://github.com/node-saml/passport-saml/pull/306) - -#### πŸš€ Minor Changes: - -- Support dynamic SAML configuration lookup [#276](https://github.com/node-saml/passport-saml/pull/276) -- Support redirect for Logout flows [#277](https://github.com/node-saml/passport-saml/pull/277) - ---- - -## v0.35.0 (2018-08-14) - -_No changelog for this release._ - ---- - -## v0.34.0 (2018-08-14) - -_No changelog for this release._ - ---- - -## v0.33.0 (2018-02-16) - -_No changelog for this release._ - ---- - -## v0.32.1 (2018-01-03) - -_No changelog for this release._ - ---- - -## v0.31.0 (2017-11-01) - -#### πŸš€ Minor Changes: - -- Support multiple and dynamic signing certificates [#218](https://github.com/node-saml/passport-saml/pull/218) - ---- - -## v0.30.0 (2017-10-12) - -#### πŸ› Bug Fixes: - -- [**security**] Use crypto.randomBytes for ID generation [#235](https://github.com/node-saml/passport-saml/pull/235) -- Fix: "TypeError: Cannot read property 'documentElement' of null" [#239](https://github.com/node-saml/passport-saml/pull/239) - ---- - -## v0.20.2 (2017-10-10) - -_No changelog for this release._ - ---- - -## v0.20.1 (2017-10-10) - -_No changelog for this release._ - ---- - -## v0.20.0 (2017-10-09) - -_No changelog for this release._ - ---- - -## v0.16.2 (2017-10-07) - -_No changelog for this release._ - ---- - -## v0.16.1 (2017-10-05) - -_No changelog for this release._ - ---- - -## v0.16.0 (2017-10-04) - -_No changelog for this release._ - ---- - -## v0.15.0 (2015-12-30) - -_No changelog for this release._ - ---- - -## v0.14.0 (2015-11-01) - -_No changelog for this release._ - ---- - -## v0.13.0 (2015-10-09) - -_No changelog for this release._ - ---- - -## v0.12.0 (2015-08-18) - -_No changelog for this release._ - ---- - -## v0.11.1 (2015-08-18) - -_No changelog for this release._ - ---- - -## v0.11.0 (2015-08-10) - -_No changelog for this release._ - ---- - -## v0.10.0 (2015-06-07) - -_No changelog for this release._ - ---- - -## v0.9.2 (2015-04-25) - -_No changelog for this release._ - ---- - -## v0.9.1 (2015-02-18) - -_No changelog for this release._ - ---- - -## v0.9.0 (2015-02-05) - -_No changelog for this release._ - ---- - -## v0.8.0 (2015-01-23) - -_No changelog for this release._ - ---- - -## v0.7.0 (2015-01-12) - -_No changelog for this release._ - ---- - -## v0.6.2 (2015-01-05) - -_No changelog for this release._ - ---- - -## v0.6.1 (2014-12-18) - -_No changelog for this release._ - ---- - -## v0.6.0 (2014-11-13) - -_No changelog for this release._ - ---- - -## v0.5.3 (2014-09-11) - -_No changelog for this release._ - ---- - -## v0.5.2 (2014-07-02) - -_No changelog for this release._ - ---- - -## v0.5.1 (2014-07-02) - -_No changelog for this release._ - ---- - -## v0.5.0 (2014-07-01) - -_No changelog for this release._ - ---- - -## v0.4.0 (2014-06-20) - -_No changelog for this release._ - ---- - -## v0.3.0 (2014-06-09) - -_No changelog for this release._ - ---- - -## v0.2.1 (2014-06-04) - -_No changelog for this release._ - ---- - -## v0.2.0 (2014-06-02) - -_No changelog for this release._ - ---- - -## v0.1.0 (2014-05-30) - -_No changelog for this release._ +For Changes prior to v3.0.0 see [passport-saml](https://github.com/node-saml/passport-saml) diff --git a/package-lock.json b/package-lock.json index f7520c94..f2ac4eff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "passport-saml", + "name": "node-saml", "version": "3.0.0", "lockfileVersion": 1, "requires": true, @@ -437,16 +437,6 @@ "@types/express": "*" } }, - "@types/passport-strategy": { - "version": "0.2.35", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.35.tgz", - "integrity": "sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==", - "dev": true, - "requires": { - "@types/express": "*", - "@types/passport": "*" - } - }, "@types/qs": { "version": "6.9.6", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.6.tgz", @@ -3673,7 +3663,8 @@ "dependencies": { "JSONStream": { "version": "1.3.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { "jsonparse": "^1.2.0", @@ -3682,12 +3673,14 @@ }, "abbrev": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "agent-base": { "version": "4.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { "es6-promisify": "^5.0.0" @@ -3695,7 +3688,8 @@ }, "agentkeepalive": { "version": "3.5.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", "dev": true, "requires": { "humanize-ms": "^1.2.1" @@ -3703,7 +3697,8 @@ }, "ansi-align": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "dev": true, "requires": { "string-width": "^2.0.0" @@ -3711,12 +3706,14 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "ansi-styles": { "version": "3.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" @@ -3724,27 +3721,32 @@ }, "ansicolors": { "version": "0.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, "ansistyles": { "version": "0.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=", "dev": true }, "aproba": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, "archy": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, "are-we-there-yet": { "version": "1.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", "dev": true, "requires": { "delegates": "^1.0.0", @@ -3753,7 +3755,8 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -3767,7 +3770,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -3777,12 +3781,14 @@ }, "asap": { "version": "2.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, "asn1": { "version": "0.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { "safer-buffer": "~2.1.0" @@ -3790,32 +3796,38 @@ }, "assert-plus": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "asynckit": { "version": "0.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "aws-sign2": { "version": "0.7.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { "version": "1.8.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "balanced-match": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "optional": true, "requires": { @@ -3824,7 +3836,8 @@ }, "bin-links": { "version": "1.1.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-KgmVfx+QqggqP9dA3iIc5pA4T1qEEEL+hOhOhNPaUm77OTrJoOXE/C05SJLNJe6m/2wUK7F1tDSou7n5TfCDzQ==", "dev": true, "requires": { "bluebird": "^3.5.3", @@ -3837,12 +3850,14 @@ }, "bluebird": { "version": "3.5.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", "dev": true }, "boxen": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", "dev": true, "requires": { "ansi-align": "^2.0.0", @@ -3856,7 +3871,8 @@ }, "brace-expansion": { "version": "1.1.11", - "bundled": true, + "resolved": false, + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -3865,27 +3881,32 @@ }, "buffer-from": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==", "dev": true }, "builtins": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", "dev": true }, "byline": { "version": "5.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", "dev": true }, "byte-size": { "version": "5.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", "dev": true }, "cacache": { "version": "12.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", "dev": true, "requires": { "bluebird": "^3.5.5", @@ -3907,27 +3928,32 @@ }, "call-limit": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-5twvci5b9eRBw2wCfPtN0GmlR2/gadZqyFpPhOK6CvMFoFgA+USnZ6Jpu1lhG9h85pQ3Ouil3PfXWRD4EUaRiQ==", "dev": true }, "camelcase": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, "capture-stack-trace": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", "dev": true }, "caseless": { "version": "0.12.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "chalk": { "version": "2.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -3937,17 +3963,20 @@ }, "chownr": { "version": "1.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "ci-info": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "cidr-regex": { "version": "2.0.10", - "bundled": true, + "resolved": false, + "integrity": "sha512-sB3ogMQXWvreNPbJUZMRApxuRYd+KoIo4RGQ81VatjmMW6WJPo+IJZ2846FGItr9VzKo5w7DXzijPLGtSd0N3Q==", "dev": true, "requires": { "ip-regex": "^2.1.0" @@ -3955,12 +3984,14 @@ }, "cli-boxes": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", "dev": true }, "cli-columns": { "version": "3.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZzLZcpee/CrkRKHwjgj6E5yWoY4=", "dev": true, "requires": { "string-width": "^2.0.0", @@ -3969,7 +4000,8 @@ }, "cli-table3": { "version": "0.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "dev": true, "requires": { "colors": "^1.1.2", @@ -3979,7 +4011,8 @@ }, "cliui": { "version": "5.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { "string-width": "^3.1.0", @@ -3989,17 +4022,20 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -4009,7 +4045,8 @@ }, "strip-ansi": { "version": "5.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -4019,12 +4056,14 @@ }, "clone": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, "cmd-shim": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-DtGg+0xiFhQIntSBRzL2fRQBnmtAVwXIDo4Qq46HPpObYquxMaZS4sb82U9nH91qJrlosC1wa9gwr0QyL/HypA==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -4033,12 +4072,14 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "color-convert": { "version": "1.9.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { "color-name": "^1.1.1" @@ -4046,18 +4087,21 @@ }, "color-name": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "colors": { "version": "1.3.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "dev": true, "optional": true }, "columnify": { "version": "1.5.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", "dev": true, "requires": { "strip-ansi": "^3.0.0", @@ -4066,7 +4110,8 @@ }, "combined-stream": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -4074,12 +4119,14 @@ }, "concat-map": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "concat-stream": { "version": "1.6.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -4090,7 +4137,8 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4104,7 +4152,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -4114,7 +4163,8 @@ }, "config-chain": { "version": "1.1.12", - "bundled": true, + "resolved": false, + "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", "dev": true, "requires": { "ini": "^1.3.4", @@ -4123,7 +4173,8 @@ }, "configstore": { "version": "3.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", "dev": true, "requires": { "dot-prop": "^4.2.1", @@ -4136,12 +4187,14 @@ }, "console-control-strings": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", "dev": true }, "copy-concurrently": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { "aproba": "^1.1.1", @@ -4154,24 +4207,28 @@ "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "iferr": { "version": "0.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true } } }, "core-util-is": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "create-error-class": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { "capture-stack-trace": "^1.0.0" @@ -4179,7 +4236,8 @@ }, "cross-spawn": { "version": "5.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { "lru-cache": "^4.0.1", @@ -4189,7 +4247,8 @@ "dependencies": { "lru-cache": { "version": "4.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { "pseudomap": "^1.0.2", @@ -4198,24 +4257,28 @@ }, "yallist": { "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true } } }, "crypto-random-string": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", "dev": true }, "cyclist": { "version": "0.2.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, "dashdash": { "version": "1.14.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -4223,7 +4286,8 @@ }, "debug": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dev": true, "requires": { "ms": "2.0.0" @@ -4231,34 +4295,40 @@ "dependencies": { "ms": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "debuglog": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", "dev": true }, "decamelize": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "decode-uri-component": { "version": "0.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, "deep-extend": { "version": "0.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true }, "defaults": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "requires": { "clone": "^1.0.2" @@ -4266,7 +4336,8 @@ }, "define-properties": { "version": "1.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" @@ -4274,27 +4345,32 @@ }, "delayed-stream": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "delegates": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, "detect-indent": { "version": "5.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", "dev": true }, "detect-newline": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", "dev": true }, "dezalgo": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", "dev": true, "requires": { "asap": "^2.0.0", @@ -4303,7 +4379,8 @@ }, "dot-prop": { "version": "4.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "dev": true, "requires": { "is-obj": "^1.0.0" @@ -4311,17 +4388,20 @@ }, "dotenv": { "version": "5.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==", "dev": true }, "duplexer3": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", "dev": true }, "duplexify": { "version": "3.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -4332,7 +4412,8 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4346,7 +4427,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -4356,7 +4438,8 @@ }, "ecc-jsbn": { "version": "0.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "optional": true, "requires": { @@ -4366,17 +4449,20 @@ }, "editor": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-YMf4e9YrzGqJT6jM1q+3gjok90I=", "dev": true }, "emoji-regex": { "version": "7.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "encoding": { "version": "0.1.12", - "bundled": true, + "resolved": false, + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "dev": true, "requires": { "iconv-lite": "~0.4.13" @@ -4384,7 +4470,8 @@ }, "end-of-stream": { "version": "1.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "^1.4.0" @@ -4392,17 +4479,20 @@ }, "env-paths": { "version": "2.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", "dev": true }, "err-code": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", "dev": true }, "errno": { "version": "0.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { "prr": "~1.0.1" @@ -4410,7 +4500,8 @@ }, "es-abstract": { "version": "1.12.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", "dev": true, "requires": { "es-to-primitive": "^1.1.1", @@ -4422,7 +4513,8 @@ }, "es-to-primitive": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { "is-callable": "^1.1.4", @@ -4432,12 +4524,14 @@ }, "es6-promise": { "version": "4.2.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, "es6-promisify": { "version": "5.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { "es6-promise": "^4.0.3" @@ -4445,12 +4539,14 @@ }, "escape-string-regexp": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "execa": { "version": "0.7.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { "cross-spawn": "^5.0.1", @@ -4464,39 +4560,46 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true } } }, "extend": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extsprintf": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, "figgy-pudding": { "version": "3.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", "dev": true }, "find-npm-prefix": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA==", "dev": true }, "flush-write-stream": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", "dev": true, "requires": { "inherits": "^2.0.1", @@ -4505,7 +4608,8 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4519,7 +4623,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -4529,12 +4634,14 @@ }, "forever-agent": { "version": "0.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.3.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { "asynckit": "^0.4.0", @@ -4544,7 +4651,8 @@ }, "from2": { "version": "2.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { "inherits": "^2.0.1", @@ -4553,7 +4661,8 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4567,7 +4676,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -4577,7 +4687,8 @@ }, "fs-minipass": { "version": "1.2.7", - "bundled": true, + "resolved": false, + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dev": true, "requires": { "minipass": "^2.6.0" @@ -4585,7 +4696,8 @@ "dependencies": { "minipass": { "version": "2.9.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -4596,7 +4708,8 @@ }, "fs-vacuum": { "version": "1.2.10", - "bundled": true, + "resolved": false, + "integrity": "sha1-t2Kb7AekAxolSP35n17PHMizHjY=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -4606,7 +4719,8 @@ }, "fs-write-stream-atomic": { "version": "1.0.10", - "bundled": true, + "resolved": false, + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -4617,12 +4731,14 @@ "dependencies": { "iferr": { "version": "0.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true }, "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -4636,7 +4752,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -4646,17 +4763,20 @@ }, "fs.realpath": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "function-bind": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "gauge": { "version": "2.7.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, "requires": { "aproba": "^1.0.3", @@ -4671,12 +4791,14 @@ "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -4688,12 +4810,14 @@ }, "genfun": { "version": "5.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", "dev": true }, "gentle-fs": { "version": "2.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-OlwBBwqCFPcjm33rF2BjW+Pr6/ll2741l+xooiwTCeaX2CA1ZuclavyMBe0/KlR21/XGsgY6hzEQZ15BdNa13Q==", "dev": true, "requires": { "aproba": "^1.1.2", @@ -4711,24 +4835,28 @@ "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true }, "iferr": { "version": "0.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", "dev": true } } }, "get-caller-file": { "version": "2.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-stream": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" @@ -4736,7 +4864,8 @@ }, "getpass": { "version": "0.1.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -4744,7 +4873,8 @@ }, "glob": { "version": "7.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -4757,7 +4887,8 @@ }, "global-dirs": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { "ini": "^1.3.4" @@ -4765,7 +4896,8 @@ }, "got": { "version": "6.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { "create-error-class": "^3.0.0", @@ -4783,24 +4915,28 @@ "dependencies": { "get-stream": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true } } }, "graceful-fs": { "version": "4.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", "dev": true }, "har-schema": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, "har-validator": { "version": "5.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { "ajv": "^6.12.3", @@ -4809,7 +4945,8 @@ "dependencies": { "ajv": { "version": "6.12.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -4820,19 +4957,22 @@ }, "fast-deep-equal": { "version": "3.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "json-schema-traverse": { "version": "0.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true } } }, "has": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" @@ -4840,32 +4980,38 @@ }, "has-flag": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-symbols": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, "has-unicode": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, "hosted-git-info": { "version": "2.8.9", - "bundled": true, + "resolved": false, + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "http-cache-semantics": { "version": "3.8.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", "dev": true }, "http-proxy-agent": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, "requires": { "agent-base": "4", @@ -4874,7 +5020,8 @@ }, "http-signature": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -4884,7 +5031,8 @@ }, "https-proxy-agent": { "version": "2.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "requires": { "agent-base": "^4.3.0", @@ -4893,7 +5041,8 @@ }, "humanize-ms": { "version": "1.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", "dev": true, "requires": { "ms": "^2.0.0" @@ -4901,7 +5050,8 @@ }, "iconv-lite": { "version": "0.4.23", - "bundled": true, + "resolved": false, + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" @@ -4909,12 +5059,14 @@ }, "iferr": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-9AfeLfji44r5TKInjhz3W9DyZI1zR1JAf2hVBMGhddAKPqBsupb89jGfbCTHIGZd6fGZl9WlHdn4AObygyMKwg==", "dev": true }, "ignore-walk": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", "dev": true, "requires": { "minimatch": "^3.0.4" @@ -4922,22 +5074,26 @@ }, "import-lazy": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", "dev": true }, "imurmurhash": { "version": "0.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "infer-owner": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, "inflight": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", @@ -4946,17 +5102,20 @@ }, "inherits": { "version": "2.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "ini": { "version": "1.3.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true }, "init-package-json": { "version": "1.10.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", "dev": true, "requires": { "glob": "^7.1.1", @@ -4971,22 +5130,26 @@ }, "ip": { "version": "1.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, "ip-regex": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, "is-callable": { "version": "1.1.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, "is-ci": { "version": "1.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "dev": true, "requires": { "ci-info": "^1.5.0" @@ -4994,14 +5157,16 @@ "dependencies": { "ci-info": { "version": "1.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true } } }, "is-cidr": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-8Xnnbjsb0x462VoYiGlhEi+drY8SFwrHiSYuzc/CEwco55vkehTaxAyIjEdpi3EMvLPPJAJi9FlzP+h+03gp0Q==", "dev": true, "requires": { "cidr-regex": "^2.0.10" @@ -5009,12 +5174,14 @@ }, "is-date-object": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" @@ -5022,7 +5189,8 @@ }, "is-installed-globally": { "version": "0.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { "global-dirs": "^0.1.0", @@ -5031,17 +5199,20 @@ }, "is-npm": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", "dev": true }, "is-obj": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, "is-path-inside": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", "dev": true, "requires": { "path-is-inside": "^1.0.1" @@ -5049,12 +5220,14 @@ }, "is-redirect": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", "dev": true }, "is-regex": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { "has": "^1.0.1" @@ -5062,17 +5235,20 @@ }, "is-retry-allowed": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", "dev": true }, "is-stream": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-symbol": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { "has-symbols": "^1.0.0" @@ -5080,53 +5256,63 @@ }, "is-typedarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "isarray": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isstream": { "version": "0.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "jsbn": { "version": "0.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true, "optional": true }, "json-parse-better-errors": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "json-schema": { "version": "0.2.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-stringify-safe": { "version": "5.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "jsonparse": { "version": "1.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, "jsprim": { "version": "1.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", @@ -5137,7 +5323,8 @@ }, "latest-version": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { "package-json": "^4.0.0" @@ -5145,12 +5332,14 @@ }, "lazy-property": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-hN3Es3Bnm6i9TNz6TAa0PVcREUc=", "dev": true }, "libcipm": { "version": "4.0.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-IN3hh2yDJQtZZ5paSV4fbvJg4aHxCCg5tcZID/dSVlTuUiWktsgaldVljJv6Z5OUlYspx6xQkbR0efNodnIrOA==", "dev": true, "requires": { "bin-links": "^1.1.2", @@ -5172,7 +5361,8 @@ }, "libnpm": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-d7jU5ZcMiTfBqTUJVZ3xid44fE5ERBm9vBnmhp2ECD2Ls+FNXWxHSkO7gtvrnbLO78gwPdNPz1HpsF3W4rjkBQ==", "dev": true, "requires": { "bin-links": "^1.1.2", @@ -5199,7 +5389,8 @@ }, "libnpmaccess": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-01512AK7MqByrI2mfC7h5j8N9V4I7MHJuk9buo8Gv+5QgThpOgpjB7sQBDDkeZqRteFb1QM/6YNdHfG7cDvfAQ==", "dev": true, "requires": { "aproba": "^2.0.0", @@ -5210,7 +5401,8 @@ }, "libnpmconfig": { "version": "1.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-9esX8rTQAHqarx6qeZqmGQKBNZR5OIbl/Ayr0qQDy3oXja2iFVQQI81R6GZ2a02bSNZ9p3YOGX1O6HHCb1X7kA==", "dev": true, "requires": { "figgy-pudding": "^3.5.1", @@ -5220,7 +5412,8 @@ "dependencies": { "find-up": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -5228,7 +5421,8 @@ }, "locate-path": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -5237,7 +5431,8 @@ }, "p-limit": { "version": "2.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -5245,7 +5440,8 @@ }, "p-locate": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" @@ -5253,14 +5449,16 @@ }, "p-try": { "version": "2.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true } } }, "libnpmhook": { "version": "5.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-UdNLMuefVZra/wbnBXECZPefHMGsVDTq5zaM/LgKNE9Keyl5YXQTnGAzEo+nFOpdRqTWI9LYi4ApqF9uVCCtuA==", "dev": true, "requires": { "aproba": "^2.0.0", @@ -5271,7 +5469,8 @@ }, "libnpmorg": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-0sRUXLh+PLBgZmARvthhYXQAWn0fOsa6T5l3JSe2n9vKG/lCVK4nuG7pDsa7uMq+uTt2epdPK+a2g6btcY11Ww==", "dev": true, "requires": { "aproba": "^2.0.0", @@ -5282,7 +5481,8 @@ }, "libnpmpublish": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-2yIwaXrhTTcF7bkJKIKmaCV9wZOALf/gsTDxVSu/Gu/6wiG3fA8ce8YKstiWKTxSFNC0R7isPUb6tXTVFZHt2g==", "dev": true, "requires": { "aproba": "^2.0.0", @@ -5298,7 +5498,8 @@ }, "libnpmsearch": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-VTBbV55Q6fRzTdzziYCr64+f8AopQ1YZ+BdPOv16UegIEaE8C0Kch01wo4s3kRTFV64P121WZJwgmBwrq68zYg==", "dev": true, "requires": { "figgy-pudding": "^3.5.1", @@ -5308,7 +5509,8 @@ }, "libnpmteam": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-p420vM28Us04NAcg1rzgGW63LMM6rwe+6rtZpfDxCcXxM0zUTLl7nPFEnRF3JfFBF5skF/yuZDUthTsHgde8QA==", "dev": true, "requires": { "aproba": "^2.0.0", @@ -5319,7 +5521,8 @@ }, "libnpx": { "version": "10.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-BPc0D1cOjBeS8VIBKUu5F80s6njm0wbVt7CsGMrIcJ+SI7pi7V0uVPGpEMH9H5L8csOcclTxAXFE2VAsJXUhfA==", "dev": true, "requires": { "dotenv": "^5.0.1", @@ -5334,7 +5537,8 @@ }, "lock-verify": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-vcLpxnGvrqisKvLQ2C2v0/u7LVly17ak2YSgoK4PrdsYBXQIax19vhKiLfvKNFx7FRrpTnitrpzF/uuCMuorIg==", "dev": true, "requires": { "npm-package-arg": "^6.1.0", @@ -5343,7 +5547,8 @@ }, "lockfile": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", "dev": true, "requires": { "signal-exit": "^3.0.2" @@ -5351,12 +5556,14 @@ }, "lodash._baseindexof": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=", "dev": true }, "lodash._baseuniq": { "version": "4.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-DrtE5FaBSveQXGIS+iybLVG4Qeg=", "dev": true, "requires": { "lodash._createset": "~4.0.0", @@ -5365,17 +5572,20 @@ }, "lodash._bindcallback": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", "dev": true }, "lodash._cacheindexof": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=", "dev": true }, "lodash._createcache": { "version": "3.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=", "dev": true, "requires": { "lodash._getnative": "^3.0.0" @@ -5383,52 +5593,62 @@ }, "lodash._createset": { "version": "4.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=", "dev": true }, "lodash._getnative": { "version": "3.9.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", "dev": true }, "lodash._root": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", "dev": true }, "lodash.clonedeep": { "version": "4.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, "lodash.restparam": { "version": "3.6.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", "dev": true }, "lodash.union": { "version": "4.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=", "dev": true }, "lodash.uniq": { "version": "4.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", "dev": true }, "lodash.without": { "version": "4.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PNRXSgC2e643OpS3SHcmQFB7eqw=", "dev": true }, "lowercase-keys": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, "lru-cache": { "version": "5.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { "yallist": "^3.0.2" @@ -5436,7 +5656,8 @@ }, "make-dir": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { "pify": "^3.0.0" @@ -5444,7 +5665,8 @@ }, "make-fetch-happen": { "version": "5.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", "dev": true, "requires": { "agentkeepalive": "^3.4.1", @@ -5462,17 +5684,20 @@ }, "meant": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-KN+1uowN/NK+sT/Lzx7WSGIj2u+3xe5n2LbwObfjOhPZiA+cCfCm6idVl0RkEfjThkw5XJ96CyRcanq6GmKtUg==", "dev": true }, "mime-db": { "version": "1.35.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", "dev": true }, "mime-types": { "version": "2.1.19", - "bundled": true, + "resolved": false, + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", "dev": true, "requires": { "mime-db": "~1.35.0" @@ -5480,7 +5705,8 @@ }, "minimatch": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -5488,12 +5714,14 @@ }, "minimist": { "version": "1.2.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "minizlib": { "version": "1.3.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dev": true, "requires": { "minipass": "^2.9.0" @@ -5501,7 +5729,8 @@ "dependencies": { "minipass": { "version": "2.9.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -5512,7 +5741,8 @@ }, "mississippi": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { "concat-stream": "^1.5.0", @@ -5529,7 +5759,8 @@ }, "mkdirp": { "version": "0.5.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -5537,14 +5768,16 @@ "dependencies": { "minimist": { "version": "1.2.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true } } }, "move-concurrently": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { "aproba": "^1.1.1", @@ -5557,24 +5790,28 @@ "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true } } }, "ms": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "mute-stream": { "version": "0.0.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "node-fetch-npm": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", "dev": true, "requires": { "encoding": "^0.1.11", @@ -5584,7 +5821,8 @@ }, "node-gyp": { "version": "5.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-OUTryc5bt/P8zVgNUmC6xdXiDJxLMAW8cF5tLQOT9E5sOQj+UeQxnnPy74K3CLCa/SOjjBlbuzDLR8ANwA+wmw==", "dev": true, "requires": { "env-paths": "^2.2.0", @@ -5602,7 +5840,8 @@ }, "nopt": { "version": "4.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", "dev": true, "requires": { "abbrev": "1", @@ -5611,7 +5850,8 @@ }, "normalize-package-data": { "version": "2.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -5622,7 +5862,8 @@ "dependencies": { "resolve": { "version": "1.10.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", "dev": true, "requires": { "path-parse": "^1.0.6" @@ -5632,7 +5873,8 @@ }, "npm-audit-report": { "version": "1.3.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-8nH/JjsFfAWMvn474HB9mpmMjrnKb1Hx/oTAdjv4PT9iZBvBxiZ+wtDUapHCJwLqYGQVPaAfs+vL5+5k9QndXw==", "dev": true, "requires": { "cli-table3": "^0.5.0", @@ -5641,7 +5883,8 @@ }, "npm-bundled": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" @@ -5649,12 +5892,14 @@ }, "npm-cache-filename": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-3tMGxbC/yHCp6fr4I7xfKD4FrhE=", "dev": true }, "npm-install-checks": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-E4kzkyZDIWoin6uT5howP8VDvkM+E8IQDcHAycaAxMbwkqhIg5eEYALnXOl3Hq9MrkdQB/2/g1xwBINXdKSRkg==", "dev": true, "requires": { "semver": "^2.3.0 || 3.x || 4 || 5" @@ -5662,7 +5907,8 @@ }, "npm-lifecycle": { "version": "3.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-lDLVkjfZmvmfvpvBzA4vzee9cn+Me4orq0QF8glbswJVEbIcSNWib7qGOffolysc3teCqbbPZZkzbr3GQZTL1g==", "dev": true, "requires": { "byline": "^5.0.0", @@ -5677,17 +5923,20 @@ }, "npm-logical-tree": { "version": "1.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg==", "dev": true }, "npm-normalize-package-bin": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true }, "npm-package-arg": { "version": "6.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", "dev": true, "requires": { "hosted-git-info": "^2.7.1", @@ -5698,7 +5947,8 @@ }, "npm-packlist": { "version": "1.4.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", "dev": true, "requires": { "ignore-walk": "^3.0.1", @@ -5708,7 +5958,8 @@ }, "npm-pick-manifest": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", "dev": true, "requires": { "figgy-pudding": "^3.5.1", @@ -5718,7 +5969,8 @@ }, "npm-profile": { "version": "4.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-Ta8xq8TLMpqssF0H60BXS1A90iMoM6GeKwsmravJ6wYjWwSzcYBTdyWa3DZCYqPutacBMEm7cxiOkiIeCUAHDQ==", "dev": true, "requires": { "aproba": "^1.1.2 || 2", @@ -5728,7 +5980,8 @@ }, "npm-registry-fetch": { "version": "4.0.7", - "bundled": true, + "resolved": false, + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", "dev": true, "requires": { "JSONStream": "^1.3.4", @@ -5742,14 +5995,16 @@ "dependencies": { "safe-buffer": { "version": "5.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true } } }, "npm-run-path": { "version": "2.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" @@ -5757,12 +6012,14 @@ }, "npm-user-validate": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-uQwcd/tY+h1jnEaze6cdX/LrhWhoBxfSknxentoqmIuStxUExxjWd3ULMLFPiFUrZKbOVMowH6Jq2FRWfmhcEw==", "dev": true }, "npmlog": { "version": "4.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, "requires": { "are-we-there-yet": "~1.1.2", @@ -5773,27 +6030,32 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "oauth-sign": { "version": "0.9.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-assign": { "version": "4.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, "object-keys": { "version": "1.0.12", - "bundled": true, + "resolved": false, + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", "dev": true }, "object.getownpropertydescriptors": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { "define-properties": "^1.1.2", @@ -5802,7 +6064,8 @@ }, "once": { "version": "1.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" @@ -5810,22 +6073,26 @@ }, "opener": { "version": "1.5.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", "dev": true }, "os-homedir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, "os-tmpdir": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, "osenv": { "version": "0.1.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", "dev": true, "requires": { "os-homedir": "^1.0.0", @@ -5834,12 +6101,14 @@ }, "p-finally": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "package-json": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { "got": "^6.7.1", @@ -5850,7 +6119,8 @@ }, "pacote": { "version": "9.5.12", - "bundled": true, + "resolved": false, + "integrity": "sha512-BUIj/4kKbwWg4RtnBncXPJd15piFSVNpTzY0rysSr3VnMowTYgkGKcaHrbReepAkjTr8lH2CVWRi58Spg2CicQ==", "dev": true, "requires": { "bluebird": "^3.5.3", @@ -5887,7 +6157,8 @@ "dependencies": { "minipass": { "version": "2.9.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -5898,7 +6169,8 @@ }, "parallel-transform": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "dev": true, "requires": { "cyclist": "~0.2.2", @@ -5908,7 +6180,8 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -5922,7 +6195,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -5932,57 +6206,68 @@ }, "path-exists": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-is-inside": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, "path-key": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { "version": "1.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "performance-now": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "pify": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "prepend-http": { "version": "1.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", "dev": true }, "process-nextick-args": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", "dev": true }, "promise-inflight": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", "dev": true }, "promise-retry": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", "dev": true, "requires": { "err-code": "^1.0.0", @@ -5991,14 +6276,16 @@ "dependencies": { "retry": { "version": "0.10.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", "dev": true } } }, "promzard": { "version": "0.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", "dev": true, "requires": { "read": "1" @@ -6006,12 +6293,14 @@ }, "proto-list": { "version": "1.2.4", - "bundled": true, + "resolved": false, + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", "dev": true }, "protoduck": { "version": "5.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", "dev": true, "requires": { "genfun": "^5.0.0" @@ -6019,22 +6308,26 @@ }, "prr": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, "pseudomap": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, "psl": { "version": "1.1.29", - "bundled": true, + "resolved": false, + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", "dev": true }, "pump": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -6043,7 +6336,8 @@ }, "pumpify": { "version": "1.5.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { "duplexify": "^3.6.0", @@ -6053,7 +6347,8 @@ "dependencies": { "pump": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -6064,22 +6359,26 @@ }, "punycode": { "version": "1.4.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, "qrcode-terminal": { "version": "0.12.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-EXtzRZmC+YGmGlDFbXKxQiMZNwCLEO6BANKXG4iCtSIM0yqc/pappSx3RIKr4r0uh5JsBckOXeKrB3Iz7mdQpQ==", "dev": true }, "qs": { "version": "6.5.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "query-string": { "version": "6.8.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-J3Qi8XZJXh93t2FiKyd/7Ec6GNifsjKXUsVFkSBj/kjLsDylWhnCz4NT1bkPcKotttPW+QbKGqqPH8OoI2pdqw==", "dev": true, "requires": { "decode-uri-component": "^0.2.0", @@ -6089,12 +6388,14 @@ }, "qw": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-77/cdA+a0FQwRCassYNBLMi5ltQ=", "dev": true }, "rc": { "version": "1.2.8", - "bundled": true, + "resolved": false, + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { "deep-extend": "^0.6.0", @@ -6105,7 +6406,8 @@ }, "read": { "version": "1.0.7", - "bundled": true, + "resolved": false, + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", "dev": true, "requires": { "mute-stream": "~0.0.4" @@ -6113,7 +6415,8 @@ }, "read-cmd-shim": { "version": "1.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-v5yCqQ/7okKoZZkBQUAfTsQ3sVJtXdNfbPnI5cceppoxEVLYA3k+VtV2omkeo8MS94JCy4fSiUwlRBAwCVRPUA==", "dev": true, "requires": { "graceful-fs": "^4.1.2" @@ -6121,7 +6424,8 @@ }, "read-installed": { "version": "4.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", "dev": true, "requires": { "debuglog": "^1.0.1", @@ -6135,7 +6439,8 @@ }, "read-package-json": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==", "dev": true, "requires": { "glob": "^7.1.1", @@ -6147,7 +6452,8 @@ }, "read-package-tree": { "version": "5.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", "dev": true, "requires": { "read-package-json": "^2.0.0", @@ -6157,7 +6463,8 @@ }, "readable-stream": { "version": "3.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -6167,7 +6474,8 @@ }, "readdir-scoped-modules": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", "dev": true, "requires": { "debuglog": "^1.0.1", @@ -6178,7 +6486,8 @@ }, "registry-auth-token": { "version": "3.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dev": true, "requires": { "rc": "^1.1.6", @@ -6187,7 +6496,8 @@ }, "registry-url": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { "rc": "^1.0.1" @@ -6195,7 +6505,8 @@ }, "request": { "version": "2.88.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -6222,27 +6533,32 @@ }, "require-directory": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "resolve-from": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "retry": { "version": "0.12.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, "rimraf": { "version": "2.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" @@ -6250,7 +6566,8 @@ }, "run-queue": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { "aproba": "^1.1.1" @@ -6258,29 +6575,34 @@ "dependencies": { "aproba": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", "dev": true } } }, "safe-buffer": { "version": "5.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safer-buffer": { "version": "2.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "semver": { "version": "5.7.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "semver-diff": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { "semver": "^5.0.3" @@ -6288,12 +6610,14 @@ }, "set-blocking": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "sha": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-DOYnM37cNsLNSGIG/zZWch5CKIRNoLdYUQTQlcgkRkoYIUwDYjqDyye16YcDZg/OPdcbUgTKMjc4SY6TB7ZAPw==", "dev": true, "requires": { "graceful-fs": "^4.1.2" @@ -6301,7 +6625,8 @@ }, "shebang-command": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" @@ -6309,27 +6634,32 @@ }, "shebang-regex": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "slide": { "version": "1.1.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", "dev": true }, "smart-buffer": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", "dev": true }, "socks": { "version": "2.3.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", "dev": true, "requires": { "ip": "1.1.5", @@ -6338,7 +6668,8 @@ }, "socks-proxy-agent": { "version": "4.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", "dev": true, "requires": { "agent-base": "~4.2.1", @@ -6347,7 +6678,8 @@ "dependencies": { "agent-base": { "version": "4.2.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", "dev": true, "requires": { "es6-promisify": "^5.0.0" @@ -6357,12 +6689,14 @@ }, "sorted-object": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-fWMfS9OnmKJK8d/8+/6DM3pd9fw=", "dev": true }, "sorted-union-stream": { "version": "2.1.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-x3lMfgd4gAUv9xqNSi27Sppjisc=", "dev": true, "requires": { "from2": "^1.3.0", @@ -6371,7 +6705,8 @@ "dependencies": { "from2": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-iEE7qqX5pZfP3pIh2GmGzTwGHf0=", "dev": true, "requires": { "inherits": "~2.0.1", @@ -6380,12 +6715,14 @@ }, "isarray": { "version": "0.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, "readable-stream": { "version": "1.1.14", - "bundled": true, + "resolved": false, + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -6396,14 +6733,16 @@ }, "string_decoder": { "version": "0.10.31", - "bundled": true, + "resolved": false, + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", "dev": true } } }, "spdx-correct": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -6412,12 +6751,14 @@ }, "spdx-exceptions": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", "dev": true }, "spdx-expression-parse": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -6426,17 +6767,20 @@ }, "spdx-license-ids": { "version": "3.0.5", - "bundled": true, + "resolved": false, + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "split-on-first": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", "dev": true }, "sshpk": { "version": "1.14.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "dev": true, "requires": { "asn1": "~0.2.3", @@ -6452,7 +6796,8 @@ }, "ssri": { "version": "6.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", "dev": true, "requires": { "figgy-pudding": "^3.5.1" @@ -6460,7 +6805,8 @@ }, "stream-each": { "version": "1.2.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", "dev": true, "requires": { "end-of-stream": "^1.1.0", @@ -6469,7 +6815,8 @@ }, "stream-iterate": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-K9fHcpbBcCpGSIuK1B95hl7s1OE=", "dev": true, "requires": { "readable-stream": "^2.1.5", @@ -6478,7 +6825,8 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -6492,7 +6840,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -6502,17 +6851,20 @@ }, "stream-shift": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, "strict-uri-encode": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=", "dev": true }, "string-width": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", @@ -6521,17 +6873,20 @@ "dependencies": { "ansi-regex": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "strip-ansi": { "version": "4.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" @@ -6541,7 +6896,8 @@ }, "string_decoder": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { "safe-buffer": "~5.2.0" @@ -6549,19 +6905,22 @@ "dependencies": { "safe-buffer": { "version": "5.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true } } }, "stringify-package": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", "dev": true }, "strip-ansi": { "version": "3.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" @@ -6569,17 +6928,20 @@ }, "strip-eof": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-json-comments": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { "version": "5.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "dev": true, "requires": { "has-flag": "^3.0.0" @@ -6587,7 +6949,8 @@ }, "tar": { "version": "4.4.13", - "bundled": true, + "resolved": false, + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "dev": true, "requires": { "chownr": "^1.1.1", @@ -6601,7 +6964,8 @@ "dependencies": { "minipass": { "version": "2.9.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dev": true, "requires": { "safe-buffer": "^5.1.2", @@ -6612,7 +6976,8 @@ }, "term-size": { "version": "1.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { "execa": "^0.7.0" @@ -6620,17 +6985,20 @@ }, "text-table": { "version": "0.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "through": { "version": "2.3.8", - "bundled": true, + "resolved": false, + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { "version": "2.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { "readable-stream": "^2.1.5", @@ -6639,7 +7007,8 @@ "dependencies": { "readable-stream": { "version": "2.3.6", - "bundled": true, + "resolved": false, + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -6653,7 +7022,8 @@ }, "string_decoder": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -6663,17 +7033,20 @@ }, "timed-out": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", "dev": true }, "tiny-relative-date": { "version": "1.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==", "dev": true }, "tough-cookie": { "version": "2.4.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { "psl": "^1.1.24", @@ -6682,7 +7055,8 @@ }, "tunnel-agent": { "version": "0.6.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -6690,28 +7064,33 @@ }, "tweetnacl": { "version": "0.14.5", - "bundled": true, + "resolved": false, + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true, "optional": true }, "typedarray": { "version": "0.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, "uid-number": { "version": "0.0.6", - "bundled": true, + "resolved": false, + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", "dev": true }, "umask": { "version": "1.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=", "dev": true }, "unique-filename": { "version": "1.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { "unique-slug": "^2.0.0" @@ -6719,7 +7098,8 @@ }, "unique-slug": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -6727,7 +7107,8 @@ }, "unique-string": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, "requires": { "crypto-random-string": "^1.0.0" @@ -6735,17 +7116,20 @@ }, "unpipe": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, "unzip-response": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", "dev": true }, "update-notifier": { "version": "2.5.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dev": true, "requires": { "boxen": "^1.2.1", @@ -6762,7 +7146,8 @@ }, "uri-js": { "version": "4.4.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "dev": true, "requires": { "punycode": "^2.1.0" @@ -6770,14 +7155,16 @@ "dependencies": { "punycode": { "version": "2.1.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true } } }, "url-parse-lax": { "version": "1.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { "prepend-http": "^1.0.1" @@ -6785,17 +7172,20 @@ }, "util-deprecate": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, "util-extend": { "version": "1.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=", "dev": true }, "util-promisify": { "version": "2.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3" @@ -6803,12 +7193,14 @@ }, "uuid": { "version": "3.3.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", - "bundled": true, + "resolved": false, + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -6817,7 +7209,8 @@ }, "validate-npm-package-name": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", "dev": true, "requires": { "builtins": "^1.0.3" @@ -6825,7 +7218,8 @@ }, "verror": { "version": "1.10.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -6835,7 +7229,8 @@ }, "wcwidth": { "version": "1.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", "dev": true, "requires": { "defaults": "^1.0.3" @@ -6843,7 +7238,8 @@ }, "which": { "version": "1.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -6851,12 +7247,14 @@ }, "which-module": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { "version": "1.1.2", - "bundled": true, + "resolved": false, + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", "dev": true, "requires": { "string-width": "^1.0.2" @@ -6864,7 +7262,8 @@ "dependencies": { "string-width": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", @@ -6876,7 +7275,8 @@ }, "widest-line": { "version": "2.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, "requires": { "string-width": "^2.1.1" @@ -6884,7 +7284,8 @@ }, "worker-farm": { "version": "1.7.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { "errno": "~0.1.7" @@ -6892,7 +7293,8 @@ }, "wrap-ansi": { "version": "5.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { "ansi-styles": "^3.2.0", @@ -6902,17 +7304,20 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "string-width": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -6922,7 +7327,8 @@ }, "strip-ansi": { "version": "5.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -6932,12 +7338,14 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, + "resolved": false, + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "2.4.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -6947,27 +7355,32 @@ }, "xdg-basedir": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, "xtend": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, "y18n": { "version": "4.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==", "dev": true }, "yallist": { "version": "3.0.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", "dev": true }, "yargs": { "version": "14.2.3", - "bundled": true, + "resolved": false, + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", "dev": true, "requires": { "cliui": "^5.0.0", @@ -6985,12 +7398,14 @@ "dependencies": { "ansi-regex": { "version": "4.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "find-up": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" @@ -6998,12 +7413,14 @@ }, "is-fullwidth-code-point": { "version": "2.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "locate-path": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", @@ -7012,7 +7429,8 @@ }, "p-limit": { "version": "2.3.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -7020,7 +7438,8 @@ }, "p-locate": { "version": "3.0.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" @@ -7028,12 +7447,14 @@ }, "p-try": { "version": "2.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "string-width": { "version": "3.1.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", @@ -7043,7 +7464,8 @@ }, "strip-ansi": { "version": "5.2.0", - "bundled": true, + "resolved": false, + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -7053,7 +7475,8 @@ }, "yargs-parser": { "version": "15.0.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -7062,7 +7485,8 @@ "dependencies": { "camelcase": { "version": "5.3.1", - "bundled": true, + "resolved": false, + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true } } @@ -7418,21 +7842,6 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "passport": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.4.1.tgz", - "integrity": "sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==", - "dev": true, - "requires": { - "passport-strategy": "1.x.x", - "pause": "0.0.1" - } - }, - "passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=" - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7469,12 +7878,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, - "pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=", - "dev": true - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", diff --git a/package.json b/package.json index 8a217617..be5e6b07 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "passport-saml", + "name": "node-saml", "version": "3.0.0", - "description": "SAML 2.0 authentication strategy for Passport", + "description": "SAML 2.0 authentication strategy for Node.js", "keywords": [ "saml", "adfs", @@ -10,7 +10,7 @@ ], "repository": { "type": "git", - "url": "https://github.com/node-saml/passport-saml.git" + "url": "https://github.com/node-saml/node-saml.git" }, "license": "MIT", "author": { @@ -24,9 +24,10 @@ "Peter Loer", "Mark Stosberg", "Chris Barth", - "Andrii Kostenko" + "Andrii Kostenko", + "Andreas Zoellner" ], - "main": "./lib/passport-saml", + "main": "./lib", "files": [ "lib", "README.md", @@ -51,7 +52,6 @@ }, "dependencies": { "debug": "^4.3.1", - "passport-strategy": "^1.0.0", "xml-crypto": "^2.1.2", "xml-encryption": "^1.2.4", "xml2js": "^0.4.23", @@ -62,7 +62,8 @@ "@types/debug": "^4.1.5", "@types/mocha": "^8.2.2", "@types/node": "^14.14.44", - "@types/passport-strategy": "^0.2.35", + "@types/passport": "^1.0.6", + "@types/qs": "^6.9.6", "@types/request": "^2.48.5", "@types/sinon": "^10.0.0", "@types/xml-crypto": "^1.4.1", @@ -81,7 +82,6 @@ "github-release-notes": "^0.17.3", "mocha": "^8.4.0", "onchange": "^7.1.0", - "passport": "^0.4.1", "prettier": "^2.3.0", "prettier-plugin-packagejson": "^2.2.11", "release-it": "^14.6.2", diff --git a/src/node-saml/algorithms.ts b/src/algorithms.ts similarity index 100% rename from src/node-saml/algorithms.ts rename to src/algorithms.ts diff --git a/src/node-saml/index.ts b/src/index.ts similarity index 100% rename from src/node-saml/index.ts rename to src/index.ts diff --git a/src/node-saml/inmemory-cache-provider.ts b/src/inmemory-cache-provider.ts similarity index 100% rename from src/node-saml/inmemory-cache-provider.ts rename to src/inmemory-cache-provider.ts diff --git a/src/passport-saml-types.ts b/src/passport-saml-types.ts new file mode 100644 index 00000000..3a53b8dd --- /dev/null +++ b/src/passport-saml-types.ts @@ -0,0 +1,10 @@ +import * as passport from "passport"; + +export interface AuthenticateOptions extends passport.AuthenticateOptions { + samlFallback?: "login-request" | "logout-request"; + additionalParams?: Record; +} + +export interface AuthorizeOptions extends AuthenticateOptions { + samlFallback?: "login-request" | "logout-request"; +} diff --git a/src/passport-saml/index.ts b/src/passport-saml/index.ts deleted file mode 100644 index 16729eac..00000000 --- a/src/passport-saml/index.ts +++ /dev/null @@ -1,26 +0,0 @@ -import type { CacheItem, CacheProvider } from "../node-saml/inmemory-cache-provider"; -import { SAML } from "../node-saml"; -import { Strategy, AbstractStrategy } from "./strategy"; -import { MultiSamlStrategy } from "./multiSamlStrategy"; - -import type { - Profile, - SamlConfig, - VerifiedCallback, - VerifyWithRequest, - VerifyWithoutRequest, -} from "./types"; - -export { - SAML, - AbstractStrategy, - Strategy, - MultiSamlStrategy, - CacheItem, - CacheProvider, - Profile, - SamlConfig, - VerifiedCallback, - VerifyWithRequest, - VerifyWithoutRequest, -}; diff --git a/src/passport-saml/multiSamlStrategy.ts b/src/passport-saml/multiSamlStrategy.ts deleted file mode 100644 index 48f98ffc..00000000 --- a/src/passport-saml/multiSamlStrategy.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { SAML } from "../node-saml"; -import { AbstractStrategy } from "./strategy"; -import type { Request } from "express"; -import { - AuthenticateOptions, - MultiSamlConfig, - RequestWithUser, - SamlConfig, - VerifyWithoutRequest, - VerifyWithRequest, -} from "./types"; - -export class MultiSamlStrategy extends AbstractStrategy { - static readonly newSamlProviderOnConstruct = false; - _options: SamlConfig & MultiSamlConfig; - - constructor(options: MultiSamlConfig, verify: VerifyWithRequest); - constructor(options: MultiSamlConfig, verify: VerifyWithoutRequest); - constructor(options: MultiSamlConfig, verify: never) { - if (!options || typeof options.getSamlOptions !== "function") { - throw new Error("Please provide a getSamlOptions function"); - } - - // Force the type on this since we've disabled `newOnConstruct` - // so the `SAML` constructor will not be called at this time - // and there are defaults for all `strategy`-required options. - const samlConfig = { - ...options, - } as SamlConfig & MultiSamlConfig; - - super(samlConfig, verify); - this._options = samlConfig; - } - - authenticate(req: RequestWithUser, options: AuthenticateOptions): void { - this._options.getSamlOptions(req, (err, samlOptions) => { - if (err) { - return this.error(err); - } - - const samlService = new SAML({ ...this._options, ...samlOptions }); - const strategy = Object.assign({}, this, { _saml: samlService }); - Object.setPrototypeOf(strategy, this); - super.authenticate.call(strategy, req, options); - }); - } - - logout( - req: RequestWithUser, - callback: (err: Error | null, url?: string | null | undefined) => void - ) { - this._options.getSamlOptions(req, (err, samlOptions) => { - if (err) { - return callback(err); - } - - const samlService = new SAML(Object.assign({}, this._options, samlOptions)); - const strategy = Object.assign({}, this, { _saml: samlService }); - Object.setPrototypeOf(strategy, this); - super.logout.call(strategy, req, callback); - }); - } - - generateServiceProviderMetadata( - req: Request, - decryptionCert: string | null, - signingCert: string | null, - callback: (err: Error | null, metadata?: string) => void - ) { - if (typeof callback !== "function") { - throw new Error("Metadata can't be provided synchronously for MultiSamlStrategy."); - } - - return this._options.getSamlOptions(req, (err, samlOptions) => { - if (err) { - return callback(err); - } - - const samlService = new SAML(Object.assign({}, this._options, samlOptions)); - const strategy = Object.assign({}, this, { _saml: samlService }); - Object.setPrototypeOf(strategy, this); - return callback( - null, - this._generateServiceProviderMetadata.call(strategy, decryptionCert, signingCert) - ); - }); - } - - // This is reduntant, but helps with testing - error(err: Error): void { - super.error(err); - } -} diff --git a/src/passport-saml/strategy.ts b/src/passport-saml/strategy.ts deleted file mode 100644 index e895b7cb..00000000 --- a/src/passport-saml/strategy.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { Strategy as PassportStrategy } from "passport-strategy"; -import { SAML } from "../node-saml"; -import * as url from "url"; -import { - AuthenticateOptions, - RequestWithUser, - SamlConfig, - VerifyWithoutRequest, - VerifyWithRequest, -} from "./types"; -import { Profile } from "./types"; - -export abstract class AbstractStrategy extends PassportStrategy { - static readonly newSamlProviderOnConstruct: boolean; - - name: string; - _verify: VerifyWithRequest | VerifyWithoutRequest; - _saml: SAML | undefined; - _passReqToCallback?: boolean; - - constructor(options: SamlConfig, verify: VerifyWithRequest); - constructor(options: SamlConfig, verify: VerifyWithoutRequest); - constructor(options: SamlConfig, verify: never) { - super(); - if (typeof options === "function") { - throw new Error("Mandatory SAML options missing"); - } - - if (!verify) { - throw new Error("SAML authentication strategy requires a verify function"); - } - - // Customizing the name can be useful to support multiple SAML configurations at the same time. - // Unlike other options, this one gets deleted instead of passed along. - if (options.name) { - this.name = options.name; - } else { - this.name = "saml"; - } - - this._verify = verify; - if ((this.constructor as typeof Strategy).newSamlProviderOnConstruct) { - this._saml = new SAML(options); - } - this._passReqToCallback = !!options.passReqToCallback; - } - - authenticate(req: RequestWithUser, options: AuthenticateOptions): void { - if (this._saml == null) { - throw new Error("Can't get authenticate without a SAML provider defined."); - } - - options.samlFallback = options.samlFallback || "login-request"; - const validateCallback = ({ - profile, - loggedOut, - }: { - profile?: Profile | null; - loggedOut?: boolean; - }) => { - if (loggedOut) { - req.logout(); - if (profile) { - if (this._saml == null) { - throw new Error("Can't get logout response URL without a SAML provider defined."); - } - - const RelayState = - (req.query && req.query.RelayState) || (req.body && req.body.RelayState); - return this._saml.getLogoutResponseUrl(profile, RelayState, options, redirectIfSuccess); - } - return this.pass(); - } - - const verified = ( - err: Error | null, - user?: Record, - info?: Record - ) => { - if (err) { - return this.error(err); - } - - if (!user) { - return this.fail(info, 401); - } - - this.success(user, info); - }; - - if (this._passReqToCallback) { - (this._verify as VerifyWithRequest)(req, profile, verified); - } else { - (this._verify as VerifyWithoutRequest)(profile, verified); - } - }; - - const redirectIfSuccess = (err: Error | null, url?: string | null) => { - if (err) { - this.error(err); - } else { - this.redirect(url!); - } - }; - - if (req.query && (req.query.SAMLResponse || req.query.SAMLRequest)) { - const originalQuery = url.parse(req.url).query; - this._saml - .validateRedirectAsync(req.query, originalQuery) - .then(validateCallback) - .catch((err) => this.error(err)); - } else if (req.body && req.body.SAMLResponse) { - this._saml - .validatePostResponseAsync(req.body) - .then(validateCallback) - .catch((err) => this.error(err)); - } else if (req.body && req.body.SAMLRequest) { - this._saml - .validatePostRequestAsync(req.body) - .then(validateCallback) - .catch((err) => this.error(err)); - } else { - const requestHandler = { - "login-request": async () => { - try { - if (this._saml == null) { - throw new Error("Can't process login request without a SAML provider defined."); - } - - const RelayState = - (req.query && req.query.RelayState) || (req.body && req.body.RelayState); - const host = req.headers && req.headers.host; - if (this._saml.options.authnRequestBinding === "HTTP-POST") { - const data = await this._saml.getAuthorizeFormAsync(RelayState, host); - const res = req.res!; - res.send(data); - } else { - // Defaults to HTTP-Redirect - this.redirect(await this._saml.getAuthorizeUrlAsync(RelayState, host, options)); - } - } catch (err) { - this.error(err); - } - }, - "logout-request": async () => { - if (this._saml == null) { - throw new Error("Can't process logout request without a SAML provider defined."); - } - - try { - const RelayState = - (req.query && req.query.RelayState) || (req.body && req.body.RelayState); - this.redirect( - await this._saml.getLogoutUrlAsync(req.user as Profile, RelayState, options) - ); - } catch (err) { - this.error(err); - } - }, - }[options.samlFallback]; - - if (typeof requestHandler !== "function") { - return this.fail(401); - } - - requestHandler(); - } - } - - logout(req: RequestWithUser, callback: (err: Error | null, url?: string | null) => void): void { - if (this._saml == null) { - throw new Error("Can't logout without a SAML provider defined."); - } - const RelayState = (req.query && req.query.RelayState) || (req.body && req.body.RelayState); - this._saml - .getLogoutUrlAsync(req.user as Profile, RelayState, {}) - .then((url) => callback(null, url)) - .catch((err) => callback(err)); - } - - protected _generateServiceProviderMetadata( - decryptionCert: string | null, - signingCert?: string | null - ): string { - if (this._saml == null) { - throw new Error("Can't generate service provider metadata without a SAML provider defined."); - } - - return this._saml.generateServiceProviderMetadata(decryptionCert, signingCert); - } - - // This is reduntant, but helps with testing - error(err: Error): void { - super.error(err); - } -} - -export class Strategy extends AbstractStrategy { - static readonly newSamlProviderOnConstruct = true; - - generateServiceProviderMetadata( - decryptionCert: string | null, - signingCert?: string | null - ): string { - return this._generateServiceProviderMetadata(decryptionCert, signingCert); - } -} diff --git a/src/passport-saml/types.ts b/src/passport-saml/types.ts deleted file mode 100644 index bdc209d1..00000000 --- a/src/passport-saml/types.ts +++ /dev/null @@ -1,75 +0,0 @@ -import type * as express from "express"; -import * as passport from "passport"; -import type { SamlOptions, MandatorySamlOptions, SamlIDPListConfig } from "../node-saml/types"; - -export interface AuthenticateOptions extends passport.AuthenticateOptions { - samlFallback?: "login-request" | "logout-request"; - additionalParams?: Record; -} - -export interface AuthorizeOptions extends AuthenticateOptions { - samlFallback?: "login-request" | "logout-request"; -} - -export interface StrategyOptions { - name?: string; - passReqToCallback?: boolean; -} - -/** - * These options are availble for configuring a SAML strategy - */ -export type SamlConfig = Partial & StrategyOptions & MandatorySamlOptions; - -export interface Profile { - issuer?: string; - sessionIndex?: string; - nameID?: string; - nameIDFormat?: string; - nameQualifier?: string; - spNameQualifier?: string; - ID?: string; - mail?: string; // InCommon Attribute urn:oid:0.9.2342.19200300.100.1.3 - email?: string; // `mail` if not present in the assertion - ["urn:oid:0.9.2342.19200300.100.1.3"]?: string; - getAssertionXml?(): string; // get the raw assertion XML - getAssertion?(): Record; // get the assertion XML parsed as a JavaScript object - getSamlResponseXml?(): string; // get the raw SAML response XML - [attributeName: string]: unknown; // arbitrary `AttributeValue`s -} - -export interface RequestWithUser extends express.Request { - samlLogoutRequest: any; - user?: Profile; -} - -export type VerifiedCallback = ( - err: Error | null, - user?: Record, - info?: Record -) => void; - -export type VerifyWithRequest = ( - req: express.Request, - profile: Profile | null | undefined, - done: VerifiedCallback -) => void; - -export type VerifyWithoutRequest = ( - profile: Profile | null | undefined, - done: VerifiedCallback -) => void; - -export type SamlOptionsCallback = (err: Error | null, samlOptions?: SamlConfig) => void; - -interface BaseMultiSamlConfig { - getSamlOptions(req: express.Request, callback: SamlOptionsCallback): void; -} - -export type MultiSamlConfig = Partial & StrategyOptions & BaseMultiSamlConfig; - -export class ErrorWithXmlStatus extends Error { - constructor(message: string, public readonly xmlStatus: string) { - super(message); - } -} diff --git a/src/node-saml/saml-post-signing.ts b/src/saml-post-signing.ts similarity index 100% rename from src/node-saml/saml-post-signing.ts rename to src/saml-post-signing.ts diff --git a/src/node-saml/saml.ts b/src/saml.ts similarity index 99% rename from src/node-saml/saml.ts rename to src/saml.ts index aee60fe4..42272f86 100644 --- a/src/node-saml/saml.ts +++ b/src/saml.ts @@ -14,22 +14,19 @@ import { AudienceRestrictionXML, AuthorizeRequestXML, CertCallback, + ErrorWithXmlStatus, LogoutRequestXML, + Profile, SamlIDPListConfig, SamlIDPEntryConfig, SamlOptions, + SamlConfig, ServiceMetadataXML, XMLInput, XMLObject, XMLOutput, } from "./types"; -import { - AuthenticateOptions, - AuthorizeOptions, - Profile, - SamlConfig, - ErrorWithXmlStatus, -} from "../passport-saml/types"; +import { AuthenticateOptions, AuthorizeOptions } from "./passport-saml-types"; import { assertRequired } from "./utility"; import { buildXml2JsObject, diff --git a/src/node-saml/types.ts b/src/types.ts similarity index 74% rename from src/node-saml/types.ts rename to src/types.ts index a338f6ac..9817b249 100644 --- a/src/node-saml/types.ts +++ b/src/types.ts @@ -124,3 +124,36 @@ export interface SamlOptions extends Partial, MandatorySamlO // extras disableRequestAcsUrl: boolean; } + +export interface StrategyOptions { + name?: string; + passReqToCallback?: boolean; +} + +/** + * These options are availble for configuring a SAML strategy + */ +export type SamlConfig = Partial & StrategyOptions & MandatorySamlOptions; + +export interface Profile { + issuer?: string; + sessionIndex?: string; + nameID?: string; + nameIDFormat?: string; + nameQualifier?: string; + spNameQualifier?: string; + ID?: string; + mail?: string; // InCommon Attribute urn:oid:0.9.2342.19200300.100.1.3 + email?: string; // `mail` if not present in the assertion + ["urn:oid:0.9.2342.19200300.100.1.3"]?: string; + getAssertionXml?(): string; // get the raw assertion XML + getAssertion?(): Record; // get the assertion XML parsed as a JavaScript object + getSamlResponseXml?(): string; // get the raw SAML response XML + [attributeName: string]: unknown; // arbitrary `AttributeValue`s +} + +export class ErrorWithXmlStatus extends Error { + constructor(message: string, public readonly xmlStatus: string) { + super(message); + } +} diff --git a/src/node-saml/utility.ts b/src/utility.ts similarity index 100% rename from src/node-saml/utility.ts rename to src/utility.ts diff --git a/src/node-saml/xml.ts b/src/xml.ts similarity index 100% rename from src/node-saml/xml.ts rename to src/xml.ts diff --git a/test/passport-saml/capturedSamlRequests.spec.ts b/test/passport-saml/capturedSamlRequests.spec.ts deleted file mode 100644 index c274bb80..00000000 --- a/test/passport-saml/capturedSamlRequests.spec.ts +++ /dev/null @@ -1,1117 +0,0 @@ -"use strict"; -import * as express from "express"; -import * as bodyParser from "body-parser"; -import * as passport from "passport"; -import { Strategy as SamlStrategy } from "../../src/passport-saml"; -import request = require("request"); -import * as zlib from "zlib"; -import * as querystring from "querystring"; -import { parseString } from "xml2js"; -import * as fs from "fs"; -import { AuthenticateOptions, Profile, VerifiedCallback } from "../../src/passport-saml/types.js"; -import * as should from "should"; -import { Server } from "http"; -import { CapturedCheck, FAKE_CERT, SamlCheck } from "../types"; - -const capturedSamlRequestChecks: SamlCheck[] = [ - { - name: "Empty Config", - config: { cert: FAKE_CERT }, - result: { - "samlp:AuthnRequest": { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Version: "2.0", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - AssertionConsumerServiceURL: "http://localhost:3033/login", - Destination: "https://wwwexampleIdp.com/saml", - }, - "saml:Issuer": [ - { _: "onelogin_saml", $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" } }, - ], - "samlp:NameIDPolicy": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Format: "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - AllowCreate: "true", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", Comparison: "exact" }, - "saml:AuthnContextClassRef": [ - { - _: "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - }, - ], - }, - }, - }, - { - name: "Empty Config w/ HTTP-POST binding", - config: { authnRequestBinding: "HTTP-POST", cert: FAKE_CERT }, - result: { - "samlp:AuthnRequest": { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Version: "2.0", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - AssertionConsumerServiceURL: "http://localhost:3033/login", - Destination: "https://wwwexampleIdp.com/saml", - }, - "saml:Issuer": [ - { _: "onelogin_saml", $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" } }, - ], - "samlp:NameIDPolicy": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Format: "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - AllowCreate: "true", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", Comparison: "exact" }, - "saml:AuthnContextClassRef": [ - { - _: "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - }, - ], - }, - }, - }, - { - name: "Config #2", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - passive: true, - attributeConsumingServiceIndex: "123", - forceAuthn: false, - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Version: "2.0", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - AssertionConsumerServiceURL: "http://localhost:3033/login", - AttributeConsumingServiceIndex: "123", - Destination: "https://wwwexampleIdp.com/saml", - IsPassive: "true", - }, - "saml:Issuer": [ - { - _: "http://exampleSp.com/saml", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Format: "alternateIdentifier", - AllowCreate: "true", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", Comparison: "exact" }, - "saml:AuthnContextClassRef": [ - { - _: "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - }, - ], - }, - }, - }, - { - name: "Uncompressed config #2", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - passive: true, - attributeConsumingServiceIndex: "123", - skipRequestCompression: true, - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Version: "2.0", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - AssertionConsumerServiceURL: "http://localhost:3033/login", - AttributeConsumingServiceIndex: "123", - Destination: "https://wwwexampleIdp.com/saml", - IsPassive: "true", - }, - "saml:Issuer": [ - { - _: "http://exampleSp.com/saml", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Format: "alternateIdentifier", - AllowCreate: "true", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", Comparison: "exact" }, - "saml:AuthnContextClassRef": [ - { - _: "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - }, - ], - }, - }, - }, - { - name: "Config #3", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - passive: true, - attributeConsumingServiceIndex: "123", - skipRequestCompression: true, - disableRequestedAuthnContext: true, - forceAuthn: true, - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Version: "2.0", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - AssertionConsumerServiceURL: "http://localhost:3033/login", - AttributeConsumingServiceIndex: "123", - Destination: "https://wwwexampleIdp.com/saml", - IsPassive: "true", - ForceAuthn: "true", - }, - "saml:Issuer": [ - { - _: "http://exampleSp.com/saml", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Format: "alternateIdentifier", - AllowCreate: "true", - }, - }, - ], - }, - }, - }, - { - name: "Config with AuthnContext", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - passive: true, - attributeConsumingServiceIndex: "123", - authnContext: ["myAuthnContext"], - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Version: "2.0", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - AssertionConsumerServiceURL: "http://localhost:3033/login", - AttributeConsumingServiceIndex: "123", - Destination: "https://wwwexampleIdp.com/saml", - IsPassive: "true", - }, - "saml:Issuer": [ - { - _: "http://exampleSp.com/saml", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Format: "alternateIdentifier", - AllowCreate: "true", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", Comparison: "exact" }, - "saml:AuthnContextClassRef": [ - { - _: "myAuthnContext", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - }, - ], - }, - }, - }, - { - name: "Config with multiple AuthnContext", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - passive: true, - attributeConsumingServiceIndex: "123", - authnContext: ["myAuthnContext", "myAuthnContext2"], - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Version: "2.0", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - AssertionConsumerServiceURL: "http://localhost:3033/login", - AttributeConsumingServiceIndex: "123", - Destination: "https://wwwexampleIdp.com/saml", - IsPassive: "true", - }, - "saml:Issuer": [ - { - _: "http://exampleSp.com/saml", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Format: "alternateIdentifier", - AllowCreate: "true", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", Comparison: "exact" }, - "saml:AuthnContextClassRef": [ - { - _: "myAuthnContext", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - { - _: "myAuthnContext2", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - }, - ], - }, - }, - }, - { - name: "Config with ProviderName", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - providerName: "myProviderName", - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Version: "2.0", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - ProviderName: "myProviderName", - AssertionConsumerServiceURL: "http://localhost:3033/login", - Destination: "https://wwwexampleIdp.com/saml", - }, - "saml:Issuer": [ - { - _: "http://exampleSp.com/saml", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Format: "alternateIdentifier", - AllowCreate: "true", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", Comparison: "exact" }, - "saml:AuthnContextClassRef": [ - { - _: "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport", - $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" }, - }, - ], - }, - ], - }, - }, - }, - { - name: "Remove NameIDPolicy, AuthnRequest, and AssertionConsumerServiceURL Config", - config: { - identifierFormat: null, - disableRequestedAuthnContext: true, - disableRequestAcsUrl: true, - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - Version: "2.0", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - Destination: "https://wwwexampleIdp.com/saml", - }, - "saml:Issuer": [ - { _: "onelogin_saml", $: { "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion" } }, - ], - }, - }, - }, - { - name: "Config with full Scoping config", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - scoping: { - proxyCount: 2, - requesterId: "fooBarRequesterId", - idpList: [ - { - entries: [ - { - providerId: "myScopingProviderId", - name: "myScopingProviderName", - loc: "myScopingProviderLoc", - }, - ], - getComplete: "https://www.getcompleteidplist.com", - }, - ], - }, - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - AssertionConsumerServiceURL: "http://localhost:3033/login", - Destination: "https://wwwexampleIdp.com/saml", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - Version: "2.0", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "saml:Issuer": [ - { - $: { - "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", - }, - _: "http://exampleSp.com/saml", - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - AllowCreate: "true", - Format: "alternateIdentifier", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { - Comparison: "exact", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "saml:AuthnContextClassRef": [ - { - $: { - "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", - }, - _: "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport", - }, - ], - }, - ], - "samlp:Scoping": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - ProxyCount: "2", - }, - "samlp:IDPList": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "samlp:GetComplete": ["https://www.getcompleteidplist.com"], - "samlp:IDPEntry": [ - { - $: { - Loc: "myScopingProviderLoc", - Name: "myScopingProviderName", - ProviderID: "myScopingProviderId", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - ], - }, - ], - "samlp:RequesterID": ["fooBarRequesterId"], - }, - ], - }, - }, - }, - { - name: "Config with Scoping config without proxyCount and requesterId", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - scoping: { - idpList: [ - { - entries: [ - { - providerId: "myScopingProviderId", - name: "myScopingProviderName", - loc: "myScopingProviderLoc", - }, - ], - getComplete: "https://www.getcompleteidplist.com", - }, - ], - }, - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - AssertionConsumerServiceURL: "http://localhost:3033/login", - Destination: "https://wwwexampleIdp.com/saml", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - Version: "2.0", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "saml:Issuer": [ - { - $: { - "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", - }, - _: "http://exampleSp.com/saml", - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - AllowCreate: "true", - Format: "alternateIdentifier", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { - Comparison: "exact", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "saml:AuthnContextClassRef": [ - { - $: { - "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", - }, - _: "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport", - }, - ], - }, - ], - "samlp:Scoping": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "samlp:IDPList": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "samlp:GetComplete": ["https://www.getcompleteidplist.com"], - "samlp:IDPEntry": [ - { - $: { - Loc: "myScopingProviderLoc", - Name: "myScopingProviderName", - ProviderID: "myScopingProviderId", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - ], - }, - ], - }, - ], - }, - }, - }, - { - name: "Config with Scoping config without proxyCount, requesterId, getComplete", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - scoping: { - idpList: [ - { - entries: [ - { - providerId: "myScopingProviderId", - name: "myScopingProviderName", - loc: "myScopingProviderLoc", - }, - ], - }, - ], - }, - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - AssertionConsumerServiceURL: "http://localhost:3033/login", - Destination: "https://wwwexampleIdp.com/saml", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - Version: "2.0", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "saml:Issuer": [ - { - $: { - "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", - }, - _: "http://exampleSp.com/saml", - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - AllowCreate: "true", - Format: "alternateIdentifier", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { - Comparison: "exact", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "saml:AuthnContextClassRef": [ - { - $: { - "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", - }, - _: "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport", - }, - ], - }, - ], - "samlp:Scoping": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "samlp:IDPList": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "samlp:IDPEntry": [ - { - $: { - Loc: "myScopingProviderLoc", - Name: "myScopingProviderName", - ProviderID: "myScopingProviderId", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - ], - }, - ], - }, - ], - }, - }, - }, - { - name: "Config with Scoping config without proxyCount, requesterId, idpList getComplete, entry name, entry loc", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - scoping: { - idpList: [ - { - entries: [ - { - providerId: "myScopingProviderId", - }, - ], - }, - ], - }, - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - AssertionConsumerServiceURL: "http://localhost:3033/login", - Destination: "https://wwwexampleIdp.com/saml", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - Version: "2.0", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "saml:Issuer": [ - { - $: { - "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", - }, - _: "http://exampleSp.com/saml", - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - AllowCreate: "true", - Format: "alternateIdentifier", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { - Comparison: "exact", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "saml:AuthnContextClassRef": [ - { - $: { - "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", - }, - _: "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport", - }, - ], - }, - ], - "samlp:Scoping": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "samlp:IDPList": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "samlp:IDPEntry": [ - { - $: { - ProviderID: "myScopingProviderId", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - ], - }, - ], - }, - ], - }, - }, - }, - { - name: "Config with Scoping and multiple IDPList entries", - config: { - issuer: "http://exampleSp.com/saml", - identifierFormat: "alternateIdentifier", - scoping: { - idpList: [ - { - entries: [ - { - providerId: "myScopingProviderId", - }, - { - providerId: "myOtherScopingProviderId", - }, - ], - }, - ], - }, - cert: FAKE_CERT, - }, - result: { - "samlp:AuthnRequest": { - $: { - AssertionConsumerServiceURL: "http://localhost:3033/login", - Destination: "https://wwwexampleIdp.com/saml", - ProtocolBinding: "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - Version: "2.0", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "saml:Issuer": [ - { - $: { - "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", - }, - _: "http://exampleSp.com/saml", - }, - ], - "samlp:NameIDPolicy": [ - { - $: { - AllowCreate: "true", - Format: "alternateIdentifier", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - ], - "samlp:RequestedAuthnContext": [ - { - $: { - Comparison: "exact", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "saml:AuthnContextClassRef": [ - { - $: { - "xmlns:saml": "urn:oasis:names:tc:SAML:2.0:assertion", - }, - _: "urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport", - }, - ], - }, - ], - "samlp:Scoping": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "samlp:IDPList": [ - { - $: { - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - "samlp:IDPEntry": [ - { - $: { - ProviderID: "myScopingProviderId", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - { - $: { - ProviderID: "myOtherScopingProviderId", - "xmlns:samlp": "urn:oasis:names:tc:SAML:2.0:protocol", - }, - }, - ], - }, - ], - }, - ], - }, - }, - }, -]; - -export const logoutChecks: CapturedCheck[] = [ - { - 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", - }, - }, - ], - }, - ], - }, - }, - }, -]; - -describe("captured SAML requests /", function () { - let server: Server; - - function testForCheck(check: SamlCheck) { - return function (done: Mocha.Done) { - const app = express(); - try { - app.use(bodyParser.urlencoded({ extended: false })); - app.use(passport.initialize()); - const config = check.config; - config.callbackUrl = "http://localhost:3033/login"; - config.entryPoint = "https://wwwexampleIdp.com/saml"; - let profile: Profile; - const strategy = new SamlStrategy(config, function ( - _profile: Profile | null | undefined, - done: VerifiedCallback - ) { - if (_profile) { - profile = _profile; - done(null, profile); - } - }); - passport.use(strategy); - - let userSerialized = false; - passport.serializeUser(function (user, done) { - userSerialized = true; - done(null, user); - }); - } catch (err) { - done(err); - } - - app.get( - "/login", - passport.authenticate("saml", { - samlFallback: "login-request", - session: false, - } as AuthenticateOptions), - function (req, res) { - res.status(200).send("200 OK"); - } - ); - - app.use(function ( - err: Error | null, - req: express.Request, - res: express.Response, - next: express.NextFunction - ) { - if (err) { - done(err); - res.status(500).send("500 Internal Server Error"); - } - }); - - server = app.listen(3033, function () { - const requestOpts = { - url: "http://localhost:3033/login", - method: "get", - followRedirect: false, - }; - - function helper(err: Error | null, samlRequest: Buffer) { - try { - should.not.exist(err); - parseString(samlRequest.toString(), function (err, doc) { - try { - should.not.exist(err); - delete doc["samlp:AuthnRequest"]["$"]["ID"]; - delete doc["samlp:AuthnRequest"]["$"]["IssueInstant"]; - doc.should.eql(check.result); - done(); - } catch (err2) { - done(err2); - } - }); - } catch (err3) { - done(err3); - } - } - - // TODO remove usage of request module - request(requestOpts, function (err: Error | null, response: any, body: any) { - try { - should.not.exist(err); - - let encodedSamlRequest; - if (check.config.authnRequestBinding === "HTTP-POST") { - response.statusCode.should.equal(200); - body.should.match(/[^]*/); - encodedSamlRequest = body.match(/ undefined; - -describe("MultiSamlStrategy()", function () { - it("extends passport Strategy", function () { - function getSamlOptions(): SamlConfig { - return { cert: FAKE_CERT }; - } - const strategy = new MultiSamlStrategy({ getSamlOptions }, noop); - strategy.should.be.an.instanceOf(AbstractStrategy); - strategy.should.be.an.instanceOf(Strategy); - }); - - it("throws if wrong finder is provided", function () { - function createStrategy() { - return new MultiSamlStrategy({} as MultiSamlConfig, noop); - } - assert.throws(createStrategy); - }); -}); - -describe("MultiSamlStrategy#authenticate", function () { - beforeEach(function () { - this.superAuthenticateStub = sinon.stub(AbstractStrategy.prototype, "authenticate"); - }); - - afterEach(function () { - this.superAuthenticateStub.restore(); - }); - - it("calls super with request and auth options", function (done) { - const superAuthenticateStub = this.superAuthenticateStub; - function getSamlOptions(req: express.Request, fn: SamlOptionsCallback) { - try { - fn(null, { cert: FAKE_CERT }); - sinon.assert.calledOnce(superAuthenticateStub); - done(); - } catch (err2) { - done(err2); - } - } - - const strategy = new MultiSamlStrategy( - { - getSamlOptions, - }, - noop - ); - strategy.authenticate("random" as any, "random" as any); - }); - - it("passes options on to saml strategy", function (done) { - const passportOptions = { - passReqToCallback: true, - getSamlOptions: function (req: express.Request, fn: SamlOptionsCallback) { - try { - fn(null, { cert: FAKE_CERT }); - strategy._passReqToCallback!.should.eql(true); - done(); - } catch (err2) { - done(err2); - } - }, - }; - - const strategy = new MultiSamlStrategy(passportOptions, noop); - strategy.authenticate("random" as any, "random" as any); - }); - - it("uses given options to setup internal saml provider", function (done) { - const superAuthenticateStub = this.superAuthenticateStub; - const samlOptions: SamlConfig = { - issuer: "http://foo.issuer", - callbackUrl: "http://foo.callback", - cert: "deadbeef", - host: "lvh", - acceptedClockSkewMs: -1, - identifierFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - path: "/saml/callback", - logoutUrl: "http://foo.slo", - signatureAlgorithm: "sha256", - }; - - function getSamlOptions(req: express.Request, fn: SamlOptionsCallback) { - try { - fn(null, samlOptions); - sinon.assert.calledOnce(superAuthenticateStub); - superAuthenticateStub.calledWith( - Object.assign({}, { cacheProvider: "mock cache provider" }, samlOptions) - ); - done(); - } catch (err2) { - done(err2); - } - } - - const strategy = new MultiSamlStrategy( - { getSamlOptions, cacheProvider: "mock cache provider" as any }, - noop - ); - strategy.authenticate("random" as any, "random" as any); - }); -}); - -describe("MultiSamlStrategy#authorize", function () { - let getAuthorizeFormStub: sinon.SinonStub; - let getAuthorizeUrlStub: sinon.SinonStub; - let errorStub: sinon.SinonStub; - - beforeEach(function () { - getAuthorizeFormStub = sinon.stub(SAML.prototype, "getAuthorizeFormAsync").resolves(); - getAuthorizeUrlStub = sinon.stub(SAML.prototype, "getAuthorizeUrlAsync").resolves(); - errorStub = sinon.stub(MultiSamlStrategy.prototype, "error"); - }); - - afterEach(function () { - getAuthorizeFormStub.restore(); - getAuthorizeUrlStub.restore(); - errorStub.restore(); - }); - - it("calls getAuthorizeForm when authnRequestBinding is HTTP-POST", function () { - function getSamlOptions(req: express.Request, fn: SamlOptionsCallback) { - fn(null, { authnRequestBinding: "HTTP-POST", cert: FAKE_CERT }); - } - const strategy = new MultiSamlStrategy({ getSamlOptions }, noop); - strategy.authenticate({} as RequestWithUser, {}); - sinon.assert.notCalled(errorStub); - sinon.assert.calledOnce(getAuthorizeFormStub); - }); - - it("calls getAuthorizeUrl when authnRequestBinding is not HTTP-POST", function () { - function getSamlOptions(req: express.Request, fn: SamlOptionsCallback) { - fn(null, { cert: FAKE_CERT }); - } - const strategy = new MultiSamlStrategy({ getSamlOptions }, noop); - strategy.authenticate({} as RequestWithUser, {}); - sinon.assert.notCalled(errorStub); - sinon.assert.calledOnce(getAuthorizeUrlStub); - }); -}); - -describe("MultiSamlStrategy#logout", function () { - beforeEach(function () { - this.superLogoutMock = sinon.stub(AbstractStrategy.prototype, "logout"); - }); - - afterEach(function () { - this.superLogoutMock.restore(); - }); - - it("calls super with request and auth options", function (done) { - const superLogoutMock = this.superLogoutMock; - function getSamlOptions(req: express.Request, fn: SamlOptionsCallback) { - try { - fn(null, { cert: FAKE_CERT }); - sinon.assert.calledOnce(superLogoutMock); - done(); - } catch (err2) { - done(err2); - } - } - - const strategy = new MultiSamlStrategy({ getSamlOptions }, noop); - strategy.logout("random" as any, "random" as any); - }); - - it("passes options on to saml strategy", function (done) { - const passportOptions = { - passReqToCallback: true, - getSamlOptions: function (req: express.Request, fn: SamlOptionsCallback) { - try { - fn(null, { cert: FAKE_CERT }); - strategy._passReqToCallback!.should.eql(true); - done(); - } catch (err2) { - done(err2); - } - }, - }; - - const strategy = new MultiSamlStrategy(passportOptions, noop); - strategy.logout("random" as any, "random" as any); - }); - - it("uses given options to setup internal saml provider", function (done) { - const superLogoutMock = this.superLogoutMock; - const samlOptions: SamlConfig = { - issuer: "http://foo.issuer", - callbackUrl: "http://foo.callback", - authnRequestBinding: "HTTP-POST", - cert: "deadbeef", - host: "lvh", - acceptedClockSkewMs: -1, - identifierFormat: "urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress", - path: "/saml/callback", - logoutUrl: "http://foo.slo", - signatureAlgorithm: "sha256", - }; - - function getSamlOptions(req: express.Request, fn: SamlOptionsCallback) { - try { - fn(null, samlOptions); - sinon.assert.calledOnce(superLogoutMock); - superLogoutMock.calledWith(Object.assign({}, samlOptions)); - done(); - } catch (err2) { - done(err2); - } - } - - const strategy = new MultiSamlStrategy({ getSamlOptions }, noop); - strategy.logout("random" as any, sinon.spy()); - }); -}); - -describe("MultiSamlStrategy#generateServiceProviderMetadata", function () { - beforeEach(function () { - this.superGenerateServiceProviderMetadata = sinon - .stub(SAML.prototype, "generateServiceProviderMetadata") - .returns("My Metadata Result"); - }); - - afterEach(function () { - this.superGenerateServiceProviderMetadata.restore(); - }); - - it("calls super with request and generateServiceProviderMetadata options", function (done) { - const superGenerateServiceProviderMetadata = this.superGenerateServiceProviderMetadata; - function getSamlOptions(req: express.Request, fn: SamlOptionsCallback) { - try { - fn(null, { cert: FAKE_CERT }); - sinon.assert.calledOnce(superGenerateServiceProviderMetadata); - superGenerateServiceProviderMetadata.calledWith("bar", "baz"); - req.should.eql("foo"); - done(); - } catch (err2) { - done(err2); - } - } - - const strategy = new MultiSamlStrategy({ getSamlOptions }, noop); - strategy.generateServiceProviderMetadata("foo" as any, "bar", "baz", noop); - }); - - it("passes options on to saml strategy", function (done) { - const passportOptions: MultiSamlConfig = { - passReqToCallback: true, - - getSamlOptions: function (req: express.Request, fn: SamlOptionsCallback) { - try { - fn(null, { cert: FAKE_CERT }); - strategy._passReqToCallback!.should.eql(true); - done(); - } catch (err2) { - done(err2); - } - }, - }; - - const strategy = new MultiSamlStrategy(passportOptions, noop); - strategy.generateServiceProviderMetadata("foo" as any, "bar", "baz", noop); - }); - - it("should pass error to callback function", function (done) { - const passportOptions = { - getSamlOptions: function (req: express.Request, fn: SamlOptionsCallback) { - fn(new Error("My error")); - }, - }; - - const strategy = new MultiSamlStrategy(passportOptions, noop); - strategy.generateServiceProviderMetadata("foo" as any, "bar", "baz", function (error, result) { - try { - should(error?.message).equal("My error"); - done(); - } catch (err2) { - done(err2); - } - }); - }); - - it("should pass result to callback function", function (done) { - const passportOptions = { - getSamlOptions: function (req: express.Request, fn: SamlOptionsCallback) { - fn(null, { cert: FAKE_CERT }); - }, - }; - - const strategy = new MultiSamlStrategy(passportOptions, noop); - strategy.generateServiceProviderMetadata("foo" as any, "bar", "baz", function (error, result) { - try { - should(result).equal("My Metadata Result"); - done(); - } catch (err2) { - done(err2); - } - }); - }); -}); diff --git a/test/passport-saml/strategy.spec.ts b/test/passport-saml/strategy.spec.ts deleted file mode 100644 index 2946836a..00000000 --- a/test/passport-saml/strategy.spec.ts +++ /dev/null @@ -1,46 +0,0 @@ -"use strict"; - -import * as sinon from "sinon"; -import { SAML, Strategy as SamlStrategy } from "../../src/passport-saml"; -import { RequestWithUser } from "../../src/passport-saml/types"; -import { FAKE_CERT } from "../types"; - -const noop = () => undefined; - -describe("strategy#authorize", function () { - let getAuthorizeFormStub: sinon.SinonStub; - let getAuthorizeUrlStub: sinon.SinonStub; - let errorStub: sinon.SinonStub; - - beforeEach(function () { - getAuthorizeFormStub = sinon.stub(SAML.prototype, "getAuthorizeFormAsync").resolves(); - getAuthorizeUrlStub = sinon.stub(SAML.prototype, "getAuthorizeUrlAsync").resolves(); - errorStub = sinon.stub(SamlStrategy.prototype, "error"); - }); - - afterEach(function () { - getAuthorizeFormStub.restore(); - getAuthorizeUrlStub.restore(); - errorStub.restore(); - }); - - it("calls getAuthorizeForm when authnRequestBinding is HTTP-POST", function () { - const strategy = new SamlStrategy( - { - authnRequestBinding: "HTTP-POST", - cert: FAKE_CERT, - }, - noop - ); - strategy.authenticate({} as RequestWithUser, {}); - sinon.assert.notCalled(errorStub); - sinon.assert.calledOnce(getAuthorizeFormStub); - }); - - it("calls getAuthorizeUrl when authnRequestBinding is not HTTP-POST", function () { - const strategy = new SamlStrategy({ cert: FAKE_CERT }, noop); - strategy.authenticate({} as RequestWithUser, {}); - sinon.assert.notCalled(errorStub); - sinon.assert.calledOnce(getAuthorizeUrlStub); - }); -}); diff --git a/test/node-saml/saml-post-signing-tests.spec.ts b/test/saml-post-signing-tests.spec.ts similarity index 97% rename from test/node-saml/saml-post-signing-tests.spec.ts rename to test/saml-post-signing-tests.spec.ts index 4f76c5bf..b4528d00 100644 --- a/test/node-saml/saml-post-signing-tests.spec.ts +++ b/test/saml-post-signing-tests.spec.ts @@ -1,9 +1,9 @@ import * as fs from "fs"; -import { signSamlPost, signAuthnRequestPost } from "../../src/node-saml/saml-post-signing"; -import { SamlSigningOptions } from "../../src/node-saml/types"; -import { parseXml2JsFromString } from "../../src/node-saml/xml"; +import { signSamlPost, signAuthnRequestPost } from "../src/saml-post-signing"; +import { SamlSigningOptions } from "../src/types"; +import { parseXml2JsFromString } from "../src/xml"; -const signingKey = fs.readFileSync(__dirname + "/../static/key.pem"); +const signingKey = fs.readFileSync(__dirname + "/static/key.pem"); describe("SAML POST Signing", function () { it("should sign a simple saml request", async function () { diff --git a/test/node-saml/samlTests.spec.ts b/test/samlTests.spec.ts similarity index 96% rename from test/node-saml/samlTests.spec.ts rename to test/samlTests.spec.ts index 536f84ac..0db0a87c 100644 --- a/test/node-saml/samlTests.spec.ts +++ b/test/samlTests.spec.ts @@ -3,15 +3,10 @@ import * as fs from "fs"; import * as url from "url"; import * as should from "should"; import assert = require("assert"); -import { SAML } from "../../src/node-saml/saml"; -import { - RequestWithUser, - AuthenticateOptions, - AuthorizeOptions, - Profile, -} from "../../src/passport-saml/types"; -import { assertRequired } from "../../src/node-saml/utility"; -import { FAKE_CERT } from "../types"; +import { SAML } from "../src/saml"; +import { AuthenticateOptions, AuthorizeOptions } from "../src/passport-saml-types"; +import { assertRequired } from "../src/utility"; +import { FAKE_CERT, RequestWithUser } from "./types"; describe("SAML.js", function () { describe("get Urls", function () { diff --git a/test/node-saml/test-signatures.spec.ts b/test/test-signatures.spec.ts similarity index 93% rename from test/node-saml/test-signatures.spec.ts rename to test/test-signatures.spec.ts index a593c82e..a8100dd8 100644 --- a/test/node-saml/test-signatures.spec.ts +++ b/test/test-signatures.spec.ts @@ -1,16 +1,16 @@ -import { SAML } from "../../src/node-saml"; +import { SAML } from "../src"; import * as fs from "fs"; import * as sinon from "sinon"; -import { SamlConfig } from "../../src/passport-saml/types"; +import { SamlConfig } from "../src/types"; import assert = require("assert"); -const cert = fs.readFileSync(__dirname + "/../static/cert.pem", "ascii"); +const cert = fs.readFileSync(__dirname + "/static/cert.pem", "ascii"); describe("Signatures", function () { const INVALID_SIGNATURE = "Invalid signature", INVALID_ENCRYPTED_SIGNATURE = "Invalid signature from encrypted assertion", createBody = (pathToXml: string) => ({ - SAMLResponse: fs.readFileSync(__dirname + "/../static/signatures" + pathToXml, "base64"), + SAMLResponse: fs.readFileSync(__dirname + "/static/signatures" + pathToXml, "base64"), }), testOneResponseBody = async ( samlResponseBody: Record, @@ -95,7 +95,7 @@ describe("Signatures", function () { INVALID_ENCRYPTED_SIGNATURE, 2, { - decryptionPvk: fs.readFileSync(__dirname + "/../static/testshib encryption pvk.pem"), + decryptionPvk: fs.readFileSync(__dirname + "/static/testshib encryption pvk.pem"), wantAssertionsSigned: true, } ) @@ -118,7 +118,7 @@ describe("Signatures", function () { INVALID_ENCRYPTED_SIGNATURE, 2, { - decryptionPvk: fs.readFileSync(__dirname + "/../static/testshib encryption pvk.pem"), + decryptionPvk: fs.readFileSync(__dirname + "/static/testshib encryption pvk.pem"), wantAssertionsSigned: true, } ) @@ -264,7 +264,7 @@ describe("Signatures", function () { describe("Signature on saml:Response with non-LF line endings", () => { const samlResponseXml = fs .readFileSync( - __dirname + "/../static/signatures/valid/response.root-signed.assertion-signed.xml" + __dirname + "/static/signatures/valid/response.root-signed.assertion-signed.xml" ) .toString(); const makeBody = (str: string) => ({ SAMLResponse: Buffer.from(str).toString("base64") }); @@ -283,7 +283,7 @@ describe("Signatures", function () { describe("Signature on saml:Response with XML-encoded carriage returns", () => { const samlResponseXml = fs .readFileSync( - __dirname + "/../static/signatures/valid/response.root-unsigned.assertion-signed.xml" + __dirname + "/static/signatures/valid/response.root-unsigned.assertion-signed.xml" ) .toString(); const makeBody = (str: string) => ({ SAMLResponse: Buffer.from(str).toString("base64") }); diff --git a/test/node-saml/tests.spec.ts b/test/tests.spec.ts similarity index 97% rename from test/node-saml/tests.spec.ts rename to test/tests.spec.ts index 0c35ba20..bedac6f4 100644 --- a/test/node-saml/tests.spec.ts +++ b/test/tests.spec.ts @@ -1,16 +1,16 @@ "use strict"; -import { Strategy as SamlStrategy, SAML } from "../../src/passport-saml"; +import { SAML } from "../src/saml"; import url = require("url"); import * as querystring from "querystring"; import { parseString } from "xml2js"; import * as fs from "fs"; import * as sinon from "sinon"; -import { SamlConfig, Profile } from "../../src/passport-saml/types.js"; -import { RacComparision } from "../../src/node-saml/types.js"; +import { SamlConfig } from "../src/types.js"; +import { RacComparision } from "../src/types.js"; import * as should from "should"; import assert = require("assert"); -import { FAKE_CERT, TEST_CERT } from "../types"; -import { signXmlResponse } from "../../src/node-saml/utility"; +import { FAKE_CERT, TEST_CERT } from "./types"; +import { signXmlResponse } from "../src/utility"; export const BAD_TEST_CERT = "MIIEOTCCAyGgAwIBAgIJAKZgJdKdCdL6MA0GCSqGSIb3DQEBBQUAMHAxCzAJBgNVBAYTAkFVMREwDwYDVQQIEwhWaWN0b3JpYTESMBAGA1UEBxMJTWVsYm91cm5lMSEwHwYDVQQKExhUYWJjb3JwIEhvbGRpbmdzIExpbWl0ZWQxFzAVBgNVBAMTDnN0cy50YWIuY29tLmF1MB4XDTE3MDUzMDA4NTQwOFoXDTI3MDUyODA4NTQwOFowcDELMAkGA1UEBhMCQVUxETAPBgNVBAgTCFZpY3RvcmlhMRIwEAYDVQQHEwlNZWxib3VybmUxITAfBgNVBAoTGFRhYmNvcnAgSG9sZGluZ3MgTGltaXRlZDEXMBUGA1UEAxMOc3RzLnRhYi5jb20uYXUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD0NuMcflq3rtupKYDf4a7lWmsXy66fYe9n8jB2DuLMakEJBlzn9j6B98IZftrilTq21VR7wUXROxG8BkN8IHY+l8X7lATmD28fFdZJj0c8Qk82eoq48faemth4fBMx2YrpnhU00jeXeP8dIIaJTPCHBTNgZltMMhphklN1YEPlzefJs3YD+Ryczy1JHbwETxt+BzO1JdjBe1fUTyl6KxAwWvtsNBURmQRYlDOk4GRgdkQnfxBuCpOMeOpV8wiBAi3h65Lab9C5avu4AJlA9e4qbOmWt6otQmgy5fiJVy6bH/d8uW7FJmSmePX9sqAWa9szhjdn36HHVQsfHC+IUEX7AgMBAAGjgdUwgdIwHQYDVR0OBBYEFN6z6cuxY7FTkg1S/lIjnS4x5ARWMIGiBgNVHSMEgZowgZeAFN6z6cuxY7FTkg1S/lIjnS4x5ARWoXSkcjBwMQswCQYDVQQGEwJBVTERMA8GA1UECBMIVmljdG9yaWExEjAQBgNVBAcTCU1lbGJvdXJuZTEhMB8GA1UEChMYVGFiY29ycCBIb2xkaW5ncyBMaW1pdGVkMRcwFQYDVQQDEw5zdHMudGFiLmNvbS5hdYIJAKZgJdKdCdL6MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAMi5HyvXgRa4+kKz3dk4SwAEXzeZRcsbeDJWVUxdb6a+JQxIoG7L9rSbd6yZvP/Xel5TrcwpCpl5eikzXB02/C0wZKWicNmDEBlOfw0Pc5ngdoh6ntxHIWm5QMlAfjR0dgTlojN4Msw2qk7cP1QEkV96e2BJUaqaNnM3zMvd7cfRjPNfbsbwl6hCCCAdwrALKYtBnjKVrCGPwO+xiw5mUJhZ1n6ZivTOdQEWbl26UO60J9ItiWP8VK0d0aChn326Ovt7qC4S3AgDlaJwcKe5Ifxl/UOWePGRwXj2UUuDWFhjtVmRntMmNZbe5yE8MkEvU+4/c6LqGwTCgDenRbK53Dgg"; @@ -276,17 +276,12 @@ describe("node-saml /", function () { ) { const samlObj = new SAML(samlConfig); const decryptionCert = fs.readFileSync( - __dirname + "/../static/testshib encryption cert.pem", + __dirname + "/static/testshib encryption cert.pem", "utf-8" ); - let metadata = samlObj.generateServiceProviderMetadata(decryptionCert, signingCert); + const metadata = samlObj.generateServiceProviderMetadata(decryptionCert, signingCert); // splits are to get a nice diff if they don't match for some reason metadata.split("\n").should.eql(expectedMetadata.split("\n")); - - // verify that we are exposed through Strategy as well - const strategy = new SamlStrategy(samlConfig, noop); - metadata = strategy.generateServiceProviderMetadata(decryptionCert, signingCert); - metadata.split("\n").should.eql(expectedMetadata.split("\n")); } it("config with callbackUrl and decryptionPvk should pass", function () { @@ -294,11 +289,11 @@ describe("node-saml /", function () { issuer: "http://example.serviceprovider.com", callbackUrl: "http://example.serviceprovider.com/saml/callback", identifierFormat: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - decryptionPvk: fs.readFileSync(__dirname + "/../static/testshib encryption pvk.pem"), + decryptionPvk: fs.readFileSync(__dirname + "/static/testshib encryption pvk.pem"), cert: FAKE_CERT, }; const expectedMetadata = fs.readFileSync( - __dirname + "/../static/expected metadata.xml", + __dirname + "/static/expected metadata.xml", "utf-8" ); @@ -313,7 +308,7 @@ describe("node-saml /", function () { cert: FAKE_CERT, }; const expectedMetadata = fs.readFileSync( - __dirname + "/../static/expected metadata without key.xml", + __dirname + "/static/expected metadata without key.xml", "utf-8" ); @@ -327,11 +322,11 @@ describe("node-saml /", function () { host: "example.serviceprovider.com", path: "/saml/callback", identifierFormat: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - decryptionPvk: fs.readFileSync(__dirname + "/../static/testshib encryption pvk.pem"), + decryptionPvk: fs.readFileSync(__dirname + "/static/testshib encryption pvk.pem"), cert: FAKE_CERT, }; const expectedMetadata = fs.readFileSync( - __dirname + "/../static/expected metadata.xml", + __dirname + "/static/expected metadata.xml", "utf-8" ); @@ -348,7 +343,7 @@ describe("node-saml /", function () { cert: FAKE_CERT, }; const expectedMetadata = fs.readFileSync( - __dirname + "/../static/expected metadata without key.xml", + __dirname + "/static/expected metadata without key.xml", "utf-8" ); @@ -362,17 +357,15 @@ describe("node-saml /", function () { host: "example.serviceprovider.com", path: "/saml/callback", identifierFormat: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - decryptionPvk: fs.readFileSync(__dirname + "/../static/testshib encryption pvk.pem"), - privateKey: fs.readFileSync(__dirname + "/../static/acme_tools_com.key"), + decryptionPvk: fs.readFileSync(__dirname + "/static/testshib encryption pvk.pem"), + privateKey: fs.readFileSync(__dirname + "/static/acme_tools_com.key"), cert: FAKE_CERT, }; const expectedMetadata = fs.readFileSync( - __dirname + "/../static/expectedMetadataWithBothKeys.xml", + __dirname + "/static/expectedMetadataWithBothKeys.xml", "utf-8" ); - const signingCert = fs - .readFileSync(__dirname + "/../static/acme_tools_com.cert") - .toString(); + const signingCert = fs.readFileSync(__dirname + "/static/acme_tools_com.cert").toString(); testMetadata(samlConfig, expectedMetadata, signingCert); }); @@ -384,17 +377,15 @@ describe("node-saml /", function () { host: "example.serviceprovider.com", path: "/saml/callback", identifierFormat: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - decryptionPvk: fs.readFileSync(__dirname + "/../static/testshib encryption pvk.pem"), - privateKey: fs.readFileSync(__dirname + "/../static/acme_tools_com.key"), + decryptionPvk: fs.readFileSync(__dirname + "/static/testshib encryption pvk.pem"), + privateKey: fs.readFileSync(__dirname + "/static/acme_tools_com.key"), cert: FAKE_CERT, }; const expectedMetadata = fs.readFileSync( - __dirname + "/../static/expectedMetadataWithBothKeys.xml", + __dirname + "/static/expectedMetadataWithBothKeys.xml", "utf-8" ); - const signingCert = fs - .readFileSync(__dirname + "/../static/acme_tools_com.cert") - .toString(); + const signingCert = fs.readFileSync(__dirname + "/static/acme_tools_com.cert").toString(); testMetadata(samlConfig, expectedMetadata, signingCert); }); @@ -405,14 +396,14 @@ describe("node-saml /", function () { issuer: "http://example.serviceprovider.com", callbackUrl: "http://example.serviceprovider.com/saml/callback", identifierFormat: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - decryptionPvk: fs.readFileSync(__dirname + "/../static/testshib encryption pvk.pem"), + decryptionPvk: fs.readFileSync(__dirname + "/static/testshib encryption pvk.pem"), logoutCallbackUrl: "http://example.serviceprovider.com/logout", cert: FAKE_CERT, }; const samlObj = new SAML(samlConfig); const decryptionCert = fs.readFileSync( - __dirname + "/../static/testshib encryption cert.pem", + __dirname + "/static/testshib encryption cert.pem", "utf-8" ); const metadata = samlObj.generateServiceProviderMetadata(decryptionCert); @@ -426,13 +417,13 @@ describe("node-saml /", function () { issuer: "http://example.serviceprovider.com", callbackUrl: "http://example.serviceprovider.com/saml/callback", identifierFormat: "urn:oasis:names:tc:SAML:2.0:nameid-format:transient", - decryptionPvk: fs.readFileSync(__dirname + "/../static/testshib encryption pvk.pem"), + decryptionPvk: fs.readFileSync(__dirname + "/static/testshib encryption pvk.pem"), wantAssertionsSigned: true, }; const samlObj = new SAML(samlConfig); const decryptionCert = fs.readFileSync( - __dirname + "/../static/testshib encryption cert.pem", + __dirname + "/static/testshib encryption cert.pem", "utf-8" ); const metadata = samlObj.generateServiceProviderMetadata(decryptionCert); @@ -498,11 +489,11 @@ describe("node-saml /", function () { const container = { SAMLResponse: fs - .readFileSync(__dirname + "/../static/response-with-uncomplete-attribute.xml") + .readFileSync(__dirname + "/static/response-with-uncomplete-attribute.xml") .toString("base64"), }; - const signingCert = fs.readFileSync(__dirname + "/../static/cert.pem", "utf-8"); + const signingCert = fs.readFileSync(__dirname + "/static/cert.pem", "utf-8"); const samlObj = new SAML({ cert: signingCert }); const { profile } = await samlObj.validatePostResponseAsync(container); @@ -811,8 +802,8 @@ describe("node-saml /", function () { "" + ""; - const signingKey = fs.readFileSync(__dirname + "/../static/key.pem"); - const signingCert = fs.readFileSync(__dirname + "/../static/cert.pem", "utf-8"); + const signingKey = fs.readFileSync(__dirname + "/static/key.pem"); + const signingCert = fs.readFileSync(__dirname + "/static/cert.pem", "utf-8"); const signedXml = signXmlResponse(xml, { privateKey: signingKey }); const base64xml = Buffer.from(signedXml).toString("base64"); @@ -875,8 +866,8 @@ describe("node-saml /", function () { "" + ""; - const signingKey = fs.readFileSync(__dirname + "/../static/key.pem"); - const signingCert = fs.readFileSync(__dirname + "/../static/cert.pem", "utf-8"); + const signingKey = fs.readFileSync(__dirname + "/static/key.pem"); + const signingCert = fs.readFileSync(__dirname + "/static/cert.pem", "utf-8"); const signedXml = signXmlResponse(xml, { privateKey: signingKey }); const base64xml = Buffer.from(signedXml).toString("base64"); @@ -902,7 +893,7 @@ describe("node-saml /", function () { entryPoint: "https://adfs.acme_tools.com/adfs/ls/", issuer: "acme_tools_com", callbackUrl: "https://relyingparty/adfs/postResponse", - privateKey: fs.readFileSync(__dirname + "/../static/acme_tools_com.key", "utf-8"), + privateKey: fs.readFileSync(__dirname + "/static/acme_tools_com.key", "utf-8"), authnContext: [ "http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password", ], @@ -931,7 +922,7 @@ describe("node-saml /", function () { entryPoint: "", issuer: "acme_tools_com", callbackUrl: "https://relyingparty/adfs/postResponse", - privateKey: fs.readFileSync(__dirname + "/../static/acme_tools_com.key", "utf-8"), + privateKey: fs.readFileSync(__dirname + "/static/acme_tools_com.key", "utf-8"), authnContext: [ "http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password", ], @@ -957,7 +948,7 @@ describe("node-saml /", function () { entryPoint: "https://adfs.acme_tools.com/adfs/ls/", issuer: "acme_tools_com", callbackUrl: "https://relyingparty/adfs/postResponse", - privateKey: fs.readFileSync(__dirname + "/../static/acme_tools_com.key", "utf-8"), + privateKey: fs.readFileSync(__dirname + "/static/acme_tools_com.key", "utf-8"), authnContext: [ "http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password", ], @@ -965,7 +956,7 @@ describe("node-saml /", function () { additionalParams: { customQueryStringParam: "CustomQueryStringParamValue", }, - cert: fs.readFileSync(__dirname + "/../static/acme_tools_com.cert", "utf-8"), + cert: fs.readFileSync(__dirname + "/static/acme_tools_com.cert", "utf-8"), }; const samlObj = new SAML(samlConfig); samlObj._generateUniqueID = function () { @@ -984,7 +975,7 @@ describe("node-saml /", function () { entryPoint: "https://adfs.acme_tools.com/adfs/ls/", issuer: "acme_tools_com", callbackUrl: "https://relyingparty/adfs/postResponse", - privateKey: fs.readFileSync(__dirname + "/../static/acme_tools_com.key", "utf-8"), + privateKey: fs.readFileSync(__dirname + "/static/acme_tools_com.key", "utf-8"), authnContext: [ "http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password", ], @@ -1578,8 +1569,8 @@ describe("node-saml /", function () { '{audience}urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport' + ""; - const signingKey = fs.readFileSync(__dirname + "/../static/key.pem"); - const signingCert = fs.readFileSync(__dirname + "/../static/cert.pem", "utf-8"); + const signingKey = fs.readFileSync(__dirname + "/static/key.pem"); + const signingCert = fs.readFileSync(__dirname + "/static/cert.pem", "utf-8"); const signedXml = signXmlResponse(unsignedXml, { privateKey: signingKey }); const base64xml = Buffer.from(signedXml).toString("base64"); @@ -1663,8 +1654,8 @@ describe("node-saml /", function () { '{audience}urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport' + ""; - const signingKey = fs.readFileSync(__dirname + "/../static/key.pem"); - const signingCert = fs.readFileSync(__dirname + "/../static/cert.pem", "utf-8"); + const signingKey = fs.readFileSync(__dirname + "/static/key.pem"); + const signingCert = fs.readFileSync(__dirname + "/static/cert.pem", "utf-8"); const signedXml = signXmlResponse(unsignedXml, { privateKey: signingKey }); const base64xml = Buffer.from(signedXml).toString("base64"); @@ -1685,8 +1676,8 @@ describe("node-saml /", function () { '{audience}urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport' + ""; - const signingKey = fs.readFileSync(__dirname + "/../static/key.pem"); - const signingCert = fs.readFileSync(__dirname + "/../static/cert.pem", "utf-8"); + const signingKey = fs.readFileSync(__dirname + "/static/key.pem"); + const signingCert = fs.readFileSync(__dirname + "/static/cert.pem", "utf-8"); const signedXml = signXmlResponse(unsignedXml, { privateKey: signingKey }); const base64xml = Buffer.from(signedXml).toString("base64"); @@ -1753,8 +1744,8 @@ describe("node-saml /", function () { `; - const signingKey = fs.readFileSync(__dirname + "/../static/key.pem"); - const signingCert = fs.readFileSync(__dirname + "/../static/cert.pem", "utf-8"); + const signingKey = fs.readFileSync(__dirname + "/static/key.pem"); + const signingCert = fs.readFileSync(__dirname + "/static/cert.pem", "utf-8"); const signedXml = signXmlResponse(unsignedXml, { privateKey: signingKey }); const base64xml = Buffer.from(signedXml).toString("base64"); @@ -1769,7 +1760,7 @@ describe("node-saml /", function () { }); it("onelogin xml document with audience and no AudienceRestriction should not pass", async () => { - const signingCert = fs.readFileSync(__dirname + "/../static/cert.pem", "utf-8"); + const signingCert = fs.readFileSync(__dirname + "/static/cert.pem", "utf-8"); const xml = ` https://app.onelogin.com/saml/metadata/371755 @@ -1811,7 +1802,7 @@ describe("node-saml /", function () { }); it("onelogin xml document with audience not matching AudienceRestriction should not pass", async () => { - const signingCert = fs.readFileSync(__dirname + "/../static/cert.pem", "utf-8"); + const signingCert = fs.readFileSync(__dirname + "/static/cert.pem", "utf-8"); const xml = ` https://app.onelogin.com/saml/metadata/371755 @@ -1857,7 +1848,7 @@ describe("node-saml /", function () { }); it("onelogin xml document with audience matching AudienceRestriction should pass", async () => { - const signingCert = fs.readFileSync(__dirname + "/../static/cert.pem", "utf-8"); + const signingCert = fs.readFileSync(__dirname + "/static/cert.pem", "utf-8"); const xml = ` https://app.onelogin.com/saml/metadata/371755 @@ -1907,7 +1898,7 @@ describe("node-saml /", function () { let samlObj: SAML; beforeEach(function () { samlObj = new SAML({ - cert: fs.readFileSync(__dirname + "/../static/cert.pem", "ascii"), + cert: fs.readFileSync(__dirname + "/static/cert.pem", "ascii"), }); }); @@ -1922,7 +1913,7 @@ describe("node-saml /", function () { it("errors if bad signature", async () => { const body = { SAMLRequest: fs.readFileSync( - __dirname + "/../static/logout_request_with_bad_signature.xml", + __dirname + "/static/logout_request_with_bad_signature.xml", "base64" ), }; @@ -1933,7 +1924,7 @@ describe("node-saml /", function () { it("returns profile for valid signature", async () => { const body = { SAMLRequest: fs.readFileSync( - __dirname + "/../static/logout_request_with_good_signature.xml", + __dirname + "/static/logout_request_with_good_signature.xml", "base64" ), }; @@ -1948,7 +1939,7 @@ describe("node-saml /", function () { it("returns profile for valid signature including session index", async () => { const body = { SAMLRequest: fs.readFileSync( - __dirname + "/../static/logout_request_with_session_index.xml", + __dirname + "/static/logout_request_with_session_index.xml", "base64" ), }; @@ -1963,12 +1954,12 @@ describe("node-saml /", function () { }); it("returns profile for valid signature with encrypted nameID", async () => { const samlObj = new SAML({ - cert: fs.readFileSync(__dirname + "/../static/cert.pem", "ascii"), - decryptionPvk: fs.readFileSync(__dirname + "/../static/key.pem", "ascii"), + cert: fs.readFileSync(__dirname + "/static/cert.pem", "ascii"), + decryptionPvk: fs.readFileSync(__dirname + "/static/key.pem", "ascii"), }); const body = { SAMLRequest: fs.readFileSync( - __dirname + "/../static/logout_request_with_encrypted_name_id.xml", + __dirname + "/static/logout_request_with_encrypted_name_id.xml", "base64" ), }; @@ -1984,12 +1975,12 @@ describe("node-saml /", function () { }); it("validatePostRequest errors for encrypted nameID with wrong decryptionPvk", async () => { const samlObj = new SAML({ - cert: fs.readFileSync(__dirname + "/../static/cert.pem", "ascii"), - decryptionPvk: fs.readFileSync(__dirname + "/../static/acme_tools_com.key", "ascii"), + cert: fs.readFileSync(__dirname + "/static/cert.pem", "ascii"), + decryptionPvk: fs.readFileSync(__dirname + "/static/acme_tools_com.key", "ascii"), }); const body = { SAMLRequest: fs.readFileSync( - __dirname + "/../static/logout_request_with_encrypted_name_id.xml", + __dirname + "/static/logout_request_with_encrypted_name_id.xml", "base64" ), }; @@ -2043,12 +2034,12 @@ describe("node-saml /", function () { let fakeClock: sinon.SinonFakeTimers; beforeEach(function () { samlObj = new SAML({ - cert: fs.readFileSync(__dirname + "/../static/acme_tools_com.cert", "ascii"), + cert: fs.readFileSync(__dirname + "/static/acme_tools_com.cert", "ascii"), idpIssuer: "http://localhost:20000/saml2/idp/metadata.php", }); this.request = Object.assign( {}, - JSON.parse(fs.readFileSync(__dirname + "/../static/idp_slo_redirect.json", "utf8")) + JSON.parse(fs.readFileSync(__dirname + "/static/idp_slo_redirect.json", "utf8")) ); fakeClock = sinon.useFakeTimers(Date.parse("2018-04-11T14:08:00Z")); }); @@ -2106,13 +2097,13 @@ describe("node-saml /", function () { beforeEach(function () { samlObj = new SAML({ - cert: fs.readFileSync(__dirname + "/../static/acme_tools_com.cert", "ascii"), + cert: fs.readFileSync(__dirname + "/static/acme_tools_com.cert", "ascii"), idpIssuer: "http://localhost:20000/saml2/idp/metadata.php", validateInResponseTo: true, }); this.request = Object.assign( {}, - JSON.parse(fs.readFileSync(__dirname + "/../static/sp_slo_redirect.json", "utf8")) + JSON.parse(fs.readFileSync(__dirname + "/static/sp_slo_redirect.json", "utf8")) ); }); afterEach(async function () { @@ -2136,7 +2127,7 @@ describe("node-saml /", function () { }); it("errors if unsuccessful", async function () { this.request = JSON.parse( - fs.readFileSync(__dirname + "/../static/sp_slo_redirect_failure.json", "utf8") + fs.readFileSync(__dirname + "/static/sp_slo_redirect_failure.json", "utf8") ); await assert.rejects( samlObj.validateRedirectAsync(this.request, this.request.originalQuery), @@ -2169,7 +2160,7 @@ describe("node-saml /", function () { it("accepts cert without header and footer line", async function () { samlObj.options.cert = fs.readFileSync( - __dirname + "/../static/acme_tools_com_without_header_and_footer.cert", + __dirname + "/static/acme_tools_com_without_header_and_footer.cert", "ascii" ); await samlObj.cacheProvider.saveAsync("_79db1e7ad12ca1d63e5b", new Date().toISOString()); diff --git a/test/types.ts b/test/types.ts index 65bfd848..c0ce2f1f 100644 --- a/test/types.ts +++ b/test/types.ts @@ -1,4 +1,6 @@ -import { SamlConfig } from "../src/passport-saml/types"; +import { SamlConfig, Profile } from "../src/types"; + +import type * as express from "express"; // a certificate which is re-used by several tests export const TEST_CERT = @@ -24,3 +26,8 @@ export interface SamlCheck { config: SamlConfig; expectedNameIDStartsWith?: string; } + +export interface RequestWithUser extends express.Request { + samlLogoutRequest: any; + user?: Profile; +} diff --git a/test/node-saml/xml.spec.ts b/test/xml.spec.ts similarity index 94% rename from test/node-saml/xml.spec.ts rename to test/xml.spec.ts index cbfbeca3..507c3347 100644 --- a/test/node-saml/xml.spec.ts +++ b/test/xml.spec.ts @@ -9,9 +9,9 @@ export const encrytpXml = util.promisify(xmlenc.encrypt); export const decryptXml = util.promisify(xmlenc.decrypt); describe("xml /", async function () { - const rsa_pub = fs.readFileSync(__dirname + "/../static/testshib encryption pub.pem"); - const pem = fs.readFileSync(__dirname + "/../static/testshib encryption cert.pem"); - const key = fs.readFileSync(__dirname + "/../static/testshib encryption pvk.pem"); + const rsa_pub = fs.readFileSync(__dirname + "/static/testshib encryption pub.pem"); + const pem = fs.readFileSync(__dirname + "/static/testshib encryption cert.pem"); + const key = fs.readFileSync(__dirname + "/static/testshib encryption pvk.pem"); it("should decrypt aes128-cbc/rsa-oaep-mgf1p", async function () { const encryptOptions: xmlenc.EncryptOptions = {