diff --git a/.npmignore b/.npmignore new file mode 100644 index 00000000000..d61f7b0ba94 --- /dev/null +++ b/.npmignore @@ -0,0 +1,21 @@ +client/ +cmd/ +compose/ +config/ +docs/ +firewall/ +health/ +integration/ +jwk/ +metrics/ +oauth2/ +pkg/ +policy/ +rand/ +scripts/ +sdk/go/ +vendor/ +warden/ +*.yml +*.go +*.md \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index e803069828d..2996f8ce4d8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,12 +45,23 @@ after_success: - |- [ "${TRAVIS_TAG}" != "" ] && gox -ldflags "-X github.com/ory/hydra/cmd.Version=`git describe --tags` -X github.com/ory/hydra/cmd.BuildTime=`TZ=UTC date -u '+%Y-%m-%dT%H:%M:%SZ'` -X github.com/ory/hydra/cmd.GitHash=`git rev-parse HEAD`" -output "dist/{{.Dir}}-{{.OS}}-{{.Arch}}" + + +before_deploy: + - npm version --no-git-tag-version $(git describe --tag) + deploy: - provider: releases - file_glob: true - api_key: "$GITHUB_TOKEN" - file: "dist/*" - skip_cleanup: true - on: - tags: true - go: 1.9 + - provider: npm + api_key: "$NPM_TOKEN" + email: "$NPM_EMAIL" + skip_cleanup: true + on: + tags: true + - provider: releases + file_glob: true + api_key: "$GITHUB_TOKEN" + file: "dist/*" + skip_cleanup: true + on: + tags: true + go: 1.9 diff --git a/README.md b/README.md index 4abd82c3dee..c43cfc3808f 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ and low resource consumption. ORY Hydra *is not* an identity provider (user sign but connects to your existing identity provider through a [consent app](https://ory.gitbooks.io/hydra/content/oauth2.html#consent-app-flow). Implementing the consent app in a different language is easy, and exemplary consent apps ([Go](https://github.com/ory/hydra-consent-app-go), [Node](https://github.com/ory/hydra-consent-app-express)) and -SDKs ([Go](https://github.com/ory/hydra/tree/update-docs/sdk), [Node](https://github.com/ory/hydra-js)) are provided. +[SDKs](https://ory.gitbooks.io/hydra/content/sdk.html) are provided. Besides mitigating various attack vectors, such as database compromisation and OAuth 2.0 weaknesses, ORY Hydra is able to securely manage JSON Web Keys, and has a sophisticated policy-based access control you can use if you want to. @@ -288,7 +288,6 @@ Fosite (which is what this is based on) is a very good implementation from a sec ## Libraries and third-party projects Official: -* [Consent App SDK For NodeJS](https://github.com/ory/hydra-js) * [Consent App Example written in Go](https://github.com/ory/hydra-consent-app-go) * [Exemplary Consent App with Express and NodeJS](https://github.com/ory/hydra-consent-app-express) diff --git a/package.json b/package.json new file mode 100644 index 00000000000..eabb539daeb --- /dev/null +++ b/package.json @@ -0,0 +1,21 @@ +{ + "name": "ory-hydra-sdk", + "version": "0.0.0-alpha5", + "description": "The official JavaScript / NodeJS SDK for ORY Hydra.", + "license": "Apache 2.0", + "main": "sdk/js/swagger/src/index.js", + "scripts": { + "test": "./node_modules/mocha/bin/mocha --recursive" + }, + "browser": { + "fs": false + }, + "dependencies": { + "superagent": "3.5.2" + }, + "devDependencies": { + "mocha": "~2.3.4", + "sinon": "1.17.3", + "expect.js": "~0.3.1" + } +} diff --git a/scripts/run-gensdk.sh b/scripts/run-gensdk.sh index 87a61d6f48c..b74643a433c 100755 --- a/scripts/run-gensdk.sh +++ b/scripts/run-gensdk.sh @@ -19,4 +19,5 @@ scripts/run-format.sh git add -A . git checkout HEAD -- sdk/go/hydra/swagger/configuration.go -git checkout HEAD -- sdk/go/hydra/swagger/api_client.go \ No newline at end of file +git checkout HEAD -- sdk/go/hydra/swagger/api_client.go +rm -f ./sdk/js/swagger/package.json diff --git a/sdk/js/swagger/docs/Context.md b/sdk/js/swagger/docs/Context.md index 6a99411c4a7..f66aa14da0d 100644 --- a/sdk/js/swagger/docs/Context.md +++ b/sdk/js/swagger/docs/Context.md @@ -3,7 +3,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**cid** | **String** | ClientID is who the token was issued for. This is an OAuth2 app usually. | [optional] +**aud** | **String** | Audience is who the token was issued for. This is an OAuth2 app usually. | [optional] **ext** | **{String: Object}** | Extra represents arbitrary session data. | [optional] **iss** | **String** | Issuer is the id of the issuer, typically an hydra instance. | [optional] **scopes** | **[String]** | GrantedScopes is a list of scopes that the subject authorized when asked for consent. | [optional] diff --git a/sdk/js/swagger/docs/Handler.md b/sdk/js/swagger/docs/Handler.md index ee1689cb759..ca45bb05dee 100644 --- a/sdk/js/swagger/docs/Handler.md +++ b/sdk/js/swagger/docs/Handler.md @@ -3,6 +3,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- +**generators** | [**{String: KeyGenerator}**](KeyGenerator.md) | | [optional] **H** | [**Writer**](Writer.md) | | [optional] **manager** | [**Manager**](Manager.md) | | [optional] **W** | [**Firewall**](Firewall.md) | | [optional] diff --git a/sdk/js/swagger/docs/OAuth2TokenIntrospection.md b/sdk/js/swagger/docs/OAuth2TokenIntrospection.md index 2f5a80b84e3..82619f73d62 100644 --- a/sdk/js/swagger/docs/OAuth2TokenIntrospection.md +++ b/sdk/js/swagger/docs/OAuth2TokenIntrospection.md @@ -4,7 +4,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **active** | **Boolean** | Active is a boolean indicator of whether or not the presented token is currently active. The specifics of a token's \"active\" state will vary depending on the implementation of the authorization server and the information it keeps about its tokens, but a \"true\" value return for the \"active\" property will generally indicate that a given token has been issued by this authorization server, has not been revoked by the resource owner, and is within its given time window of validity (e.g., after its issuance time and before its expiration time). | [optional] -**aud** | **String** | ClientID is a service-specific string identifier or list of string identifiers representing the intended audience for this token. | [optional] +**aud** | **String** | Audience is a service-specific string identifier or list of string identifiers representing the intended audience for this token. | [optional] **clientId** | **String** | ClientID is aclient identifier for the OAuth 2.0 client that requested this token. | [optional] **exp** | **Number** | Expires at is an integer timestamp, measured in the number of seconds since January 1 1970 UTC, indicating when this token will expire. | [optional] **ext** | **{String: Object}** | Extra is arbitrary data set by the session. | [optional] diff --git a/sdk/js/swagger/docs/OAuth2consentRequest.md b/sdk/js/swagger/docs/OAuth2consentRequest.md index 80394706bff..661e8465c6a 100644 --- a/sdk/js/swagger/docs/OAuth2consentRequest.md +++ b/sdk/js/swagger/docs/OAuth2consentRequest.md @@ -3,7 +3,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**audience** | **String** | ClientID is the audience this token is meant for. Usually a URL. | [optional] +**audience** | **String** | Audience is the client id that initiated the OAuth2 request. | [optional] **id** | **String** | ID is the id of this consent request. | [optional] **redirectUrl** | **String** | Redirect URL is the URL where the user agent should be redirected to after the consent has been accepted or rejected. | [optional] **requestedScopes** | **[String]** | RequestedScopes represents a list of scopes that have been requested by the OAuth2 request initiator. | [optional] diff --git a/sdk/js/swagger/package.json b/sdk/js/swagger/package.json deleted file mode 100644 index f9990f030fe..00000000000 --- a/sdk/js/swagger/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "hydra_o_auth2__open_id_connect_server", - "version": "Latest", - "description": "Please_refer_to_the_user_guide_for_in_depth_documentation_httpsory_gitbooks_iohydracontentHydra_offers_OAuth_2_0_and_OpenID_Connect_Core_1_0_capabilities_as_a_service__Hydra_is_different_because_it_works_with_any_existing_authentication_infrastructure_not_just_LDAP_or_SAML__By_implementing_a_consent_app__works_with_any_programming_language_you_build_a_bridge_between_Hydra_and_your_authentication_infrastructure_Hydra_is_able_to_securely_manage_JSON_Web_Keys_and_has_a_sophisticated_policy_based_access_control_you_can_use_if_you_want_to_Hydra_is_suitable_for_green___new_and_brownfield__existing_projects__If_you_are_not_familiar_with_OAuth_2_0_and_are_working_on_a_greenfield_project_we_recommend_evaluating_if_OAuth_2_0_really_serves_your_purpose__Knowledge_of_OAuth_2_0_is_imperative_in_understanding_what_Hydra_does_and_how_it_works_The_official_repository_is_located_at_httpsgithub_comoryhydra_Important_REST_API_Documentation_NotesThe_swagger_generator_used_to_create_this_documentation_does_currently_not_support_example_responses__To_seerequest_and_response_payloads_click_on_Show_JSON_schema_Enable_JSON_Schema_on_Apiary_httpsstorage_googleapis_comory_amhydrajson_schema_pngThe_API_documentation_always_refers_to_the_latest_tagged_version_of_ORY_Hydra__For_previous_API_documentations_pleaserefer_to_httpsgithub_comoryhydrablobtag_iddocsapi_swagger_yaml___for_example0_9_13_httpsgithub_comoryhydrablobv0_9_13docsapi_swagger_yaml0_8_1_httpsgithub_comoryhydrablobv0_8_1docsapi_swagger_yaml", - "license": "Unlicense", - "main": "src/index.js", - "scripts": { - "test": "./node_modules/mocha/bin/mocha --recursive" - }, - "browser": { - "fs": false - }, - "dependencies": { - "superagent": "3.5.2" - }, - "devDependencies": { - "mocha": "~2.3.4", - "sinon": "1.17.3", - "expect.js": "~0.3.1" - } -} diff --git a/sdk/js/swagger/src/model/Context.js b/sdk/js/swagger/src/model/Context.js index 0f0cd484a9d..a166a35d1dc 100644 --- a/sdk/js/swagger/src/model/Context.js +++ b/sdk/js/swagger/src/model/Context.js @@ -67,8 +67,8 @@ if (data) { obj = obj || new exports(); - if (data.hasOwnProperty('cid')) { - obj['cid'] = ApiClient.convertToType(data['cid'], 'String'); + if (data.hasOwnProperty('aud')) { + obj['aud'] = ApiClient.convertToType(data['aud'], 'String'); } if (data.hasOwnProperty('ext')) { obj['ext'] = ApiClient.convertToType(data['ext'], {'String': Object}); @@ -87,10 +87,10 @@ } /** - * ClientID is who the token was issued for. This is an OAuth2 app usually. - * @member {String} cid + * Audience is who the token was issued for. This is an OAuth2 app usually. + * @member {String} aud */ - exports.prototype['cid'] = undefined; + exports.prototype['aud'] = undefined; /** * Extra represents arbitrary session data. * @member {Object.} ext diff --git a/sdk/js/swagger/src/model/Handler.js b/sdk/js/swagger/src/model/Handler.js index ccc1a3e7c9a..d3605d49cfe 100644 --- a/sdk/js/swagger/src/model/Handler.js +++ b/sdk/js/swagger/src/model/Handler.js @@ -17,18 +17,18 @@ (function(root, factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. - define(['ApiClient', 'model/Firewall', 'model/Manager', 'model/Writer'], factory); + define(['ApiClient', 'model/Firewall', 'model/KeyGenerator', 'model/Manager', 'model/Writer'], factory); } else if (typeof module === 'object' && module.exports) { // CommonJS-like environments that support module.exports, like Node. - module.exports = factory(require('../ApiClient'), require('./Firewall'), require('./Manager'), require('./Writer')); + module.exports = factory(require('../ApiClient'), require('./Firewall'), require('./KeyGenerator'), require('./Manager'), require('./Writer')); } else { // Browser globals (root is window) if (!root.HydraOAuth2OpenIdConnectServer) { root.HydraOAuth2OpenIdConnectServer = {}; } - root.HydraOAuth2OpenIdConnectServer.Handler = factory(root.HydraOAuth2OpenIdConnectServer.ApiClient, root.HydraOAuth2OpenIdConnectServer.Firewall, root.HydraOAuth2OpenIdConnectServer.Manager, root.HydraOAuth2OpenIdConnectServer.Writer); + root.HydraOAuth2OpenIdConnectServer.Handler = factory(root.HydraOAuth2OpenIdConnectServer.ApiClient, root.HydraOAuth2OpenIdConnectServer.Firewall, root.HydraOAuth2OpenIdConnectServer.KeyGenerator, root.HydraOAuth2OpenIdConnectServer.Manager, root.HydraOAuth2OpenIdConnectServer.Writer); } -}(this, function(ApiClient, Firewall, Manager, Writer) { +}(this, function(ApiClient, Firewall, KeyGenerator, Manager, Writer) { 'use strict'; @@ -51,6 +51,7 @@ + }; /** @@ -64,6 +65,9 @@ if (data) { obj = obj || new exports(); + if (data.hasOwnProperty('Generators')) { + obj['Generators'] = ApiClient.convertToType(data['Generators'], {'String': KeyGenerator}); + } if (data.hasOwnProperty('H')) { obj['H'] = Writer.constructFromObject(data['H']); } @@ -77,6 +81,10 @@ return obj; } + /** + * @member {Object.} Generators + */ + exports.prototype['Generators'] = undefined; /** * @member {module:model/Writer} H */ diff --git a/sdk/js/swagger/src/model/OAuth2TokenIntrospection.js b/sdk/js/swagger/src/model/OAuth2TokenIntrospection.js index ec073524979..5b42144ed63 100644 --- a/sdk/js/swagger/src/model/OAuth2TokenIntrospection.js +++ b/sdk/js/swagger/src/model/OAuth2TokenIntrospection.js @@ -115,7 +115,7 @@ */ exports.prototype['active'] = undefined; /** - * ClientID is a service-specific string identifier or list of string identifiers representing the intended audience for this token. + * Audience is a service-specific string identifier or list of string identifiers representing the intended audience for this token. * @member {String} aud */ exports.prototype['aud'] = undefined; diff --git a/sdk/js/swagger/src/model/OAuth2consentRequest.js b/sdk/js/swagger/src/model/OAuth2consentRequest.js index 0461c62a8fe..1a0f31bad34 100644 --- a/sdk/js/swagger/src/model/OAuth2consentRequest.js +++ b/sdk/js/swagger/src/model/OAuth2consentRequest.js @@ -82,7 +82,7 @@ } /** - * ClientID is the audience this token is meant for. Usually a URL. + * Audience is the client id that initiated the OAuth2 request. * @member {String} audience */ exports.prototype['audience'] = undefined; diff --git a/sdk/js/swagger/test/model/Context.spec.js b/sdk/js/swagger/test/model/Context.spec.js index 8bcfd08b3c3..5bfeade1790 100644 --- a/sdk/js/swagger/test/model/Context.spec.js +++ b/sdk/js/swagger/test/model/Context.spec.js @@ -57,8 +57,8 @@ //expect(instance).to.be.a(HydraOAuth2OpenIdConnectServer.Context); }); - it('should have the property cid (base name: "cid")', function() { - // uncomment below and update the code to test the property cid + it('should have the property aud (base name: "aud")', function() { + // uncomment below and update the code to test the property aud //var instane = new HydraOAuth2OpenIdConnectServer.Context(); //expect(instance).to.be(); }); diff --git a/sdk/js/swagger/test/model/Handler.spec.js b/sdk/js/swagger/test/model/Handler.spec.js index 7215e86b552..c5890c3f753 100644 --- a/sdk/js/swagger/test/model/Handler.spec.js +++ b/sdk/js/swagger/test/model/Handler.spec.js @@ -57,6 +57,12 @@ //expect(instance).to.be.a(HydraOAuth2OpenIdConnectServer.Handler); }); + it('should have the property generators (base name: "Generators")', function() { + // uncomment below and update the code to test the property generators + //var instane = new HydraOAuth2OpenIdConnectServer.Handler(); + //expect(instance).to.be(); + }); + it('should have the property H (base name: "H")', function() { // uncomment below and update the code to test the property H //var instane = new HydraOAuth2OpenIdConnectServer.Handler(); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000000..7cc092d652f --- /dev/null +++ b/yarn.lock @@ -0,0 +1,267 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +combined-stream@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" + dependencies: + delayed-stream "~1.0.0" + +commander@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" + +commander@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" + +component-emitter@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +cookiejar@^2.0.6: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.1.tgz#41ad57b1b555951ec171412a81942b1e8200d34a" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@^2.2.0: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +escape-string-regexp@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" + +expect.js@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/expect.js/-/expect.js-0.3.1.tgz#b0a59a0d2eff5437544ebf0ceaa6015841d09b5b" + +extend@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +form-data@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +formatio@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" + dependencies: + samsam "~1.1" + +formidable@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9" + +glob@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.3.tgz#e313eeb249c7affaa5c475286b0e115b59839467" + dependencies: + graceful-fs "~2.0.0" + inherits "2" + minimatch "~0.2.11" + +graceful-fs@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-2.0.3.tgz#7cd2cdb228a4a3f36e95efa6cc142de7d1a136d0" + +growl@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.8.1.tgz#4b2dec8d907e93db336624dcec0183502f8c9428" + +inherits@2, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inherits@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +jade@0.26.3: + version "0.26.3" + resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" + dependencies: + commander "0.6.1" + mkdirp "0.3.0" + +lolex@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +methods@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + +mime-types@^2.1.12: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" + +mime@^1.3.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + +mkdirp@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" + dependencies: + minimist "0.0.8" + +mocha@~2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.3.4.tgz#8629a6fb044f2d225aa4b81a2ae2d001699eb266" + dependencies: + commander "2.3.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.2" + glob "3.2.3" + growl "1.8.1" + jade "0.26.3" + mkdirp "0.5.0" + supports-color "1.2.0" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +qs@^6.1.0: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +readable-stream@^2.0.5: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +samsam@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" + +samsam@~1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +sinon@1.17.3: + version "1.17.3" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.3.tgz#44d64bc748d023880046c1543cefcea34c47d17e" + dependencies: + formatio "1.1.1" + lolex "1.3.2" + samsam "1.1.2" + util ">=0.10.3 <1" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +superagent@3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.5.2.tgz#3361a3971567504c351063abeaae0faa23dbf3f8" + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.0.6" + debug "^2.2.0" + extend "^3.0.0" + form-data "^2.1.1" + formidable "^1.1.1" + methods "^1.1.1" + mime "^1.3.4" + qs "^6.1.0" + readable-stream "^2.0.5" + +supports-color@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +"util@>=0.10.3 <1": + version "0.10.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + dependencies: + inherits "2.0.1"