pax_global_header00006660000000000000000000000064134757145110014522gustar00rootroot0000000000000052 comment=9abd63730d838135500568ae395f80a02a9d370d oauth-1.0a-2.2.6/000077500000000000000000000000001347571451100133065ustar00rootroot00000000000000oauth-1.0a-2.2.6/.gitignore000066400000000000000000000000341347571451100152730ustar00rootroot00000000000000node_modules/ coverage/ .envoauth-1.0a-2.2.6/LICENSE000066400000000000000000000020561347571451100143160ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2014 Ddo Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. oauth-1.0a-2.2.6/Makefile000066400000000000000000000020411347571451100147430ustar00rootroot00000000000000 test: node_modules .env npm test coverage: coverage/lcov.info node_modules/.bin/istanbul report text coveralls: coverage/lcov.info cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage .PHONY: test coverage coveralls .env: @echo "BITBUCKET_CONSUMER_PUBLIC=" > $@ @echo "BITBUCKET_CONSUMER_SECRET=" >> $@ @echo "" >> $@ @echo "FLICKR_CONSUMER_key=" >> $@ @echo "FLICKR_CONSUMER_SECRET=" >> $@ @echo "" >> $@ @echo "LINKEDIN_CONSUMER_PUBLIC=" >> $@ @echo "LINKEDIN_CONSUMER_SECRET=" >> $@ @echo "" >> $@ @echo "OPENBANK_CONSUMER_PUBLIC=" >> $@ @echo "OPENBANK_CONSUMER_SECRET=" >> $@ @echo "" >> $@ @echo "TWITTER_CONSUMER_PUBLIC=" >> $@ @echo "TWITTER_CONSUMER_SECRET=" >> $@ @echo "TWITTER_TOKEN_PUBLIC=" >> $@ @echo "TWITTER_TOKEN_SECRET=" >> $@ coverage/lcov.info: node_modules package.json oauth-1.0a.js .env test/*.js test/**/*.js test/mocha.opts node_modules/.bin/istanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly node_modules: package.json npm install touch node_modules oauth-1.0a-2.2.6/README.md000066400000000000000000000242751347571451100145770ustar00rootroot00000000000000# OAuth 1.0a Request Authorization [![semaphore][semaphore-img]][semaphore-url] [![Join the chat at https://gitter.im/ddo/oauth-1.0a](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ddo/oauth-1.0a?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![version][version-img]][version-url] [![download][download-img]][download-url] [![coverage][coverage-img]][coverage-url] [![climate][climate-img]][climate-url] [![dependency][dependency-img]][dependency-url] [semaphore-img]: https://semaphoreci.com/api/v1/ddo/oauth-1-0a/branches/master/badge.svg [semaphore-url]: https://semaphoreci.com/ddo/oauth-1-0a [download-img]: https://img.shields.io/npm/dm/oauth-1.0a.svg?style=flat-square [download-url]: https://www.npmjs.com/package/oauth-1.0a [version-img]: https://img.shields.io/npm/v/oauth-1.0a.svg?style=flat-square [version-url]: https://www.npmjs.com/package/oauth-1.0a [dependency-img]: https://img.shields.io/david/ddo/oauth-1.0a.svg?style=flat-square [dependency-url]: https://david-dm.org/ddo/oauth-1.0a [coverage-img]: https://img.shields.io/coveralls/ddo/oauth-1.0a/master.svg?style=flat-square [coverage-url]: https://coveralls.io/r/ddo/oauth-1.0a?branch=master [climate-img]: https://img.shields.io/codeclimate/github/ddo/oauth-1.0a.svg?style=flat-square [climate-url]: https://codeclimate.com/github/ddo/oauth-1.0a OAuth 1.0a Request Authorization for **Node** and **Browser** Send OAuth request with your favorite HTTP client ([request](https://github.com/mikeal/request), [jQuery.ajax](http://api.jquery.com/jQuery.ajax/)...) No more headache about OAuth 1.0a's stuff or "oauth_consumer_key, oauth_nonce, oauth_signature...." parameters, just use your familiar HTTP client to send OAuth requests. Tested on some popular OAuth 1.0a services: - Twitter - Flickr - Bitbucket - Openbankproject(HMAC-SHA256) ## Quick Start ```js const crypto = require('crypto') const OAuth = require('oauth-1.0a') const oauth = OAuth({ consumer: { key: '', secret: '' }, signature_method: 'HMAC-SHA1', hash_function(base_string, key) { return crypto .createHmac('sha1', key) .update(base_string) .digest('base64') }, }) ``` Get OAuth request data that can be easily used with your http client: ```js oauth.authorize(request, token) ``` Or if you want to get as a header key-value pair: ```js oauth.toHeader(oauth_data) ``` ## Crypto Starting with version `2.0.0`, crypto/hash stuff is separated. `oauth-1.0a` will use your `hash_function` to sign. ### Example #### Node.js ```js const crypto = require('crypto') function hash_function_sha1(base_string, key) { return crypto .createHmac('sha1', key) .update(base_string) .digest('base64') } const oauth = OAuth({ consumer: { key: '', secret: '' }, signature_method: 'HMAC-SHA1', hash_function: hash_function_sha1, }) ``` - sha1: `crypto.createHmac('sha1', key).update(base_string).digest('base64');` - sha256: `crypto.createHmac('sha256', key).update(base_string).digest('base64');` #### Browser _Using Google's CryptoJS_ - sha1: `CryptoJS.HmacSHA1(base_string, key).toString(CryptoJS.enc.Base64);` - sha256: `CryptoJS.HmacSHA256(base_string, key).toString(CryptoJS.enc.Base64);` ## Installation ### Node.js ```bash $ npm install oauth-1.0a --production ``` - You can use the native crypto package for `hash_function`. - It is possible for Node.js to be built without including support for the crypto module. In such cases, calling `require('crypto')` will result in an error being thrown. - You can use your own hash function which has format as: ``` function(base_string, key) return ``` ### Browser Download oauth-1.0a.js [here](https://raw.githubusercontent.com/ddo/oauth-1.0a/master/oauth-1.0a.js) And also your crypto lib. For example [CryptoJS](https://code.google.com/archive/p/crypto-js/) ```html ``` ## Example ### Work with the [request](https://github.com/mikeal/request) library (Node.js): ```js // Dependencies const request = require('request') const OAuth = require('oauth-1.0a') const crypto = require('crypto') // Initialize const oauth = OAuth({ consumer: { key: 'xvz1evFS4wEEPTGEFPHBog', secret: 'kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw', }, signature_method: 'HMAC-SHA1', hash_function(base_string, key) { return crypto .createHmac('sha1', key) .update(base_string) .digest('base64') }, }) const request_data = { url: 'https://api.twitter.com/1/statuses/update.json?include_entities=true', method: 'POST', data: { status: 'Hello Ladies + Gentlemen, a signed OAuth request!' }, } // Note: The token is optional for some requests const token = { key: '370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb', secret: 'LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE', } request( { url: request_data.url, method: request_data.method, form: oauth.authorize(request_data, token), }, function(error, response, body) { // Process your data here } ) ``` Or if you want to send OAuth data in request's header: ```js request( { url: request_data.url, method: request_data.method, form: request_data.data, headers: oauth.toHeader(oauth.authorize(request_data, token)), }, function(error, response, body) { // Process your data here } ) ``` ### Work with [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) (Browser): **Caution:** Please make sure you understand what happens when using OAuth protocol on the client side [here](#client-side-usage-caution) ```js // Initialize const oauth = OAuth({ consumer: { key: 'xvz1evFS4wEEPTGEFPHBog', secret: 'kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw', }, signature_method: 'HMAC-SHA1', hash_function(base_string, key) { return CryptoJS.HmacSHA1(base_string, key).toString(CryptoJS.enc.Base64) }, }) const request_data = { url: 'https://api.twitter.com/1/statuses/update.json?include_entities=true', method: 'POST', data: { status: 'Hello Ladies + Gentlemen, a signed OAuth request!' }, } // Note: The token is optional for some requests const token = { key: '370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb', secret: 'LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE', } $.ajax({ url: request_data.url, type: request_data.method, data: oauth.authorize(request_data, token), }).done(function(data) { // Process your data here }) ``` Or if you want to send OAuth data in request's header: ```js $.ajax({ url: request_data.url, type: request_data.method, data: request_data.data, headers: oauth.toHeader(oauth.authorize(request_data, token)), }).done(function(data) { // Process your data here }) ``` ## .authorize(/_ options _/) - url: `String` - method: `String` default `'GET'` - data: `Object` any custom data you want to send with, including extra oauth option `oauth_*` as oauth_callback, oauth_version... - includeBodyHash: `Boolean` default `false` set to true if you want `oauth_body_hash` signing (you will need to have define the `body_hash_function` in most cases - for HMAC-SHA1 Oauth signature method, the `body_hash_function` should return a SHA1 hash). ```js const request_data = { url: 'https://bitbucket.org/api/1.0/oauth/request_token', method: 'POST', data: { oauth_callback: 'http://www.ddo.me' }, } ``` ## .toHeader(/_ signed data _/) Convert signed data into headers: ```js $.ajax({ url: request_data.url, type: request_data.method, data: request_data.data, headers: oauth.toHeader(oauth.authorize(request_data, token)), }).done(function(data) { // Process your data here }) ``` ## Init Options ```js const oauth = OAuth(/* options */) ``` - `consumer`: `Object` `Required` your consumer keys ```js { key: , secret: } ``` - `signature_method`: `String` default `'PLAINTEXT'` - `hash_function`: `Function` if `signature_method` = `'PLAINTEXT'` default `return key` - `body_hash_function`: `Function` default to `hash_function` - `nonce_length`: `Int` default `32` - `version`: `String` default `'1.0'` - `parameter_seperator`: `String` for header only, default `', '`. Note that there is a space after `,` - `realm`: `String` - `last_ampersand`: `Bool` default `true`. For some services if there is no Token Secret then no need `&` at the end. Check [oauth doc](http://oauth.net/core/1.0a/#anchor22) for more information > oauth_signature is set to the concatenated encoded values of the Consumer Secret and Token Secret, separated by a '&' character (ASCII code 38), even if either secret is empty ## Notes - Some OAuth requests without token use `.authorize(request_data)` instead of `.authorize(request_data, {})` - Or just token key only `.authorize(request_data, {key: 'xxxxx'})` - Want easier? Take a look: - Node.js: [oauth-request](https://github.com/ddo/oauth-request) - jquery: _soon_ ## Client Side Usage Caution OAuth is based around allowing tools and websites to talk to each other. However, JavaScript running in web browsers is hampered by security restrictions that prevent code running on one website from accessing data stored or served on another. Before you start hacking, make sure you understand the limitations posed by cross-domain XMLHttpRequest. On the bright side, some platforms use JavaScript as their language, but enable the programmer to access other web sites. Examples include: - **Google/Firefox/Safari extensions** - **Google Gadgets** - **Microsoft Sidebar** For those platforms, this library should come in handy. ## [Changelog](https://github.com/ddo/oauth-1.0a/releases) ## [Contributors](https://github.com/ddo/oauth-1.0a/graphs/contributors) ## License MIToauth-1.0a-2.2.6/oauth-1.0a.d.ts000066400000000000000000000100351347571451100156540ustar00rootroot00000000000000// Type definitions for oauth-1.0a v2.2.3 // Project: oauth1.0a // Definitions by: Ddo export as namespace OAuth; export = OAuth; declare class OAuth { body_hash_function: OAuth.BodyHashFunction; consumer: OAuth.Consumer; hash_function: OAuth.HashFunction; last_ampersand: boolean; nonce_length: number; parameter_seperator: string; realm: string; signature_metho: string; version: string; constructor(opts?: OAuth.Options); /** * Sign a request. */ authorize(request: OAuth.RequestOptions, token?: OAuth.Token): OAuth.Authorization; /** * Generate the oauth signature (i.e. oauth_signature). */ getSignature(request: OAuth.RequestOptions, token_secret: string | undefined, oauth_data: OAuth.Data): string; /** * Generate the body signature (i.e. oauth_body_hash). */ getBodyHash(request: OAuth.RequestOptions, token_secret: string | undefined): string; /** * Encode the request attributes. * * Base String = "&&" */ getBaseString(request: OAuth.RequestOptions, oauth_data: OAuth.Data): string; /** * Encode the oauth data and the request parameter, */ getParameterString(request: OAuth.RequestOptions, oauth_data: OAuth.Data): string; /** * Generate the signing key. * * Key = "&" */ getSigningKey(token_secret: string | undefined): string; /** * Return the the URL without its querystring. */ getBaseUrl(url: string): string; /** * Parse querystring / form data. */ deParam(str: string): OAuth.Param; /** * Parse querystring from an url */ deParamUrl(url: string): OAuth.Param; /** * Form data encoding. */ percentEncode(str: string): string; /** * Convert OAuth authorization data to an http header. */ toHeader(data: OAuth.Authorization): OAuth.Header; /** * Generate a random nonce. */ getNonce(): string; /** * Generate a current timestamp in second. */ getTimeStamp(): number; /** * Merge two object into a new one. */ mergeObject(obj1: T, obj2: U): T & U; /** * Sort an object properties by keys. */ sortObject(obj: O): Array<{key: keyof O, value: O[K]}>; } declare namespace OAuth { /** * OAuth data, including the signature. */ export interface Authorization extends Data { oauth_signature: string; } /** * Method used to generate the body hash. * * Note: the key is used for implementation HMAC algorithms for the body hash, * but typically it should return SHA1 hash of base_string. */ export type BodyHashFunction = (base_string: string, key: string) => string; /** * OAuth key/secret pair. */ export interface Consumer { key: string; secret: string; } /** * OAuth data, excluding the signature. */ export interface Data { oauth_consumer_key: string; oauth_nonce: string; oauth_signature_method: string; oauth_timestamp: number; oauth_version: string; oauth_token?: string; oauth_body_hash?: string; } /** * Method used to hash the the OAuth and form/querystring data. */ export type HashFunction = (base_string: string, key: string) => string; /** * Authorization header. */ export interface Header { Authorization: string; } /** * OAuth options. */ export interface Options { body_hash_function?: BodyHashFunction; consumer: Consumer; hash_function?: HashFunction; last_ampersand?: boolean; nonce_length?: number; parameter_seperator?: string; realm?: string; signature_method?: string; version?: string; } /** * Extra data. */ export interface Param { [key: string]: string | string[]; } /** * Request options. */ export interface RequestOptions { url: string; method: string; data?: any; includeBodyHash?: boolean; } /** * OAuth token key/secret pair. */ export interface Token { key: string; secret: string; } } oauth-1.0a-2.2.6/oauth-1.0a.js000066400000000000000000000234601347571451100154260ustar00rootroot00000000000000if (typeof(module) !== 'undefined' && typeof(exports) !== 'undefined') { module.exports = OAuth; } /** * Constructor * @param {Object} opts consumer key and secret */ function OAuth(opts) { if(!(this instanceof OAuth)) { return new OAuth(opts); } if(!opts) { opts = {}; } if(!opts.consumer) { throw new Error('consumer option is required'); } this.consumer = opts.consumer; this.nonce_length = opts.nonce_length || 32; this.version = opts.version || '1.0'; this.parameter_seperator = opts.parameter_seperator || ', '; this.realm = opts.realm; if(typeof opts.last_ampersand === 'undefined') { this.last_ampersand = true; } else { this.last_ampersand = opts.last_ampersand; } // default signature_method is 'PLAINTEXT' this.signature_method = opts.signature_method || 'PLAINTEXT'; if(this.signature_method == 'PLAINTEXT' && !opts.hash_function) { opts.hash_function = function(base_string, key) { return key; } } if(!opts.hash_function) { throw new Error('hash_function option is required'); } this.hash_function = opts.hash_function; this.body_hash_function = opts.body_hash_function || this.hash_function; } /** * OAuth request authorize * @param {Object} request data * { * method, * url, * data * } * @param {Object} key and secret token * @return {Object} OAuth Authorized data */ OAuth.prototype.authorize = function(request, token) { var oauth_data = { oauth_consumer_key: this.consumer.key, oauth_nonce: this.getNonce(), oauth_signature_method: this.signature_method, oauth_timestamp: this.getTimeStamp(), oauth_version: this.version }; if(!token) { token = {}; } if(token.key !== undefined) { oauth_data.oauth_token = token.key; } if(!request.data) { request.data = {}; } if(request.includeBodyHash) { oauth_data.oauth_body_hash = this.getBodyHash(request, token.secret) } oauth_data.oauth_signature = this.getSignature(request, token.secret, oauth_data); return oauth_data; }; /** * Create a OAuth Signature * @param {Object} request data * @param {Object} token_secret key and secret token * @param {Object} oauth_data OAuth data * @return {String} Signature */ OAuth.prototype.getSignature = function(request, token_secret, oauth_data) { return this.hash_function(this.getBaseString(request, oauth_data), this.getSigningKey(token_secret)); }; /** * Create a OAuth Body Hash * @param {Object} request data */ OAuth.prototype.getBodyHash = function(request, token_secret) { var body = typeof request.data === 'string' ? request.data : JSON.stringify(request.data) if (!this.body_hash_function) { throw new Error('body_hash_function option is required'); } return this.body_hash_function(body, this.getSigningKey(token_secret)) }; /** * Base String = Method + Base Url + ParameterString * @param {Object} request data * @param {Object} OAuth data * @return {String} Base String */ OAuth.prototype.getBaseString = function(request, oauth_data) { return request.method.toUpperCase() + '&' + this.percentEncode(this.getBaseUrl(request.url)) + '&' + this.percentEncode(this.getParameterString(request, oauth_data)); }; /** * Get data from url * -> merge with oauth data * -> percent encode key & value * -> sort * * @param {Object} request data * @param {Object} OAuth data * @return {Object} Parameter string data */ OAuth.prototype.getParameterString = function(request, oauth_data) { var base_string_data; if (oauth_data.oauth_body_hash) { base_string_data = this.sortObject(this.percentEncodeData(this.mergeObject(oauth_data, this.deParamUrl(request.url)))); } else { base_string_data = this.sortObject(this.percentEncodeData(this.mergeObject(oauth_data, this.mergeObject(request.data, this.deParamUrl(request.url))))); } var data_str = ''; //base_string_data to string for(var i = 0; i < base_string_data.length; i++) { var key = base_string_data[i].key; var value = base_string_data[i].value; // check if the value is an array // this means that this key has multiple values if (value && Array.isArray(value)){ // sort the array first value.sort(); var valString = ""; // serialize all values for this key: e.g. formkey=formvalue1&formkey=formvalue2 value.forEach((function(item, i){ valString += key + '=' + item; if (i < value.length){ valString += "&"; } }).bind(this)); data_str += valString; } else { data_str += key + '=' + value + '&'; } } //remove the last character data_str = data_str.substr(0, data_str.length - 1); return data_str; }; /** * Create a Signing Key * @param {String} token_secret Secret Token * @return {String} Signing Key */ OAuth.prototype.getSigningKey = function(token_secret) { token_secret = token_secret || ''; if(!this.last_ampersand && !token_secret) { return this.percentEncode(this.consumer.secret); } return this.percentEncode(this.consumer.secret) + '&' + this.percentEncode(token_secret); }; /** * Get base url * @param {String} url * @return {String} */ OAuth.prototype.getBaseUrl = function(url) { return url.split('?')[0]; }; /** * Get data from String * @param {String} string * @return {Object} */ OAuth.prototype.deParam = function(string) { var arr = string.split('&'); var data = {}; for(var i = 0; i < arr.length; i++) { var item = arr[i].split('='); // '' value item[1] = item[1] || ''; // check if the key already exists // this can occur if the QS part of the url contains duplicate keys like this: ?formkey=formvalue1&formkey=formvalue2 if (data[item[0]]){ // the key exists already if (!Array.isArray(data[item[0]])) { // replace the value with an array containing the already present value data[item[0]] = [data[item[0]]]; } // and add the new found value to it data[item[0]].push(decodeURIComponent(item[1])); } else { // it doesn't exist, just put the found value in the data object data[item[0]] = decodeURIComponent(item[1]); } } return data; }; /** * Get data from url * @param {String} url * @return {Object} */ OAuth.prototype.deParamUrl = function(url) { var tmp = url.split('?'); if (tmp.length === 1) return {}; return this.deParam(tmp[1]); }; /** * Percent Encode * @param {String} str * @return {String} percent encoded string */ OAuth.prototype.percentEncode = function(str) { return encodeURIComponent(str) .replace(/\!/g, "%21") .replace(/\*/g, "%2A") .replace(/\'/g, "%27") .replace(/\(/g, "%28") .replace(/\)/g, "%29"); }; /** * Percent Encode Object * @param {Object} data * @return {Object} percent encoded data */ OAuth.prototype.percentEncodeData = function(data) { var result = {}; for(var key in data) { var value = data[key]; // check if the value is an array if (value && Array.isArray(value)){ var newValue = []; // percentEncode every value value.forEach((function(val){ newValue.push(this.percentEncode(val)); }).bind(this)); value = newValue; } else { value = this.percentEncode(value); } result[this.percentEncode(key)] = value; } return result; }; /** * Get OAuth data as Header * @param {Object} oauth_data * @return {String} Header data key - value */ OAuth.prototype.toHeader = function(oauth_data) { var sorted = this.sortObject(oauth_data); var header_value = 'OAuth '; if (this.realm) { header_value += 'realm="' + this.realm + '"' + this.parameter_seperator; } for(var i = 0; i < sorted.length; i++) { if (sorted[i].key.indexOf('oauth_') !== 0) continue; header_value += this.percentEncode(sorted[i].key) + '="' + this.percentEncode(sorted[i].value) + '"' + this.parameter_seperator; } return { Authorization: header_value.substr(0, header_value.length - this.parameter_seperator.length) //cut the last chars }; }; /** * Create a random word characters string with input length * @return {String} a random word characters string */ OAuth.prototype.getNonce = function() { var word_characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; var result = ''; for(var i = 0; i < this.nonce_length; i++) { result += word_characters[parseInt(Math.random() * word_characters.length, 10)]; } return result; }; /** * Get Current Unix TimeStamp * @return {Int} current unix timestamp */ OAuth.prototype.getTimeStamp = function() { return parseInt(new Date().getTime()/1000, 10); }; ////////////////////// HELPER FUNCTIONS ////////////////////// /** * Merge object * @param {Object} obj1 * @param {Object} obj2 * @return {Object} */ OAuth.prototype.mergeObject = function(obj1, obj2) { obj1 = obj1 || {}; obj2 = obj2 || {}; var merged_obj = obj1; for(var key in obj2) { merged_obj[key] = obj2[key]; } return merged_obj; }; /** * Sort object by key * @param {Object} data * @return {Array} sorted array */ OAuth.prototype.sortObject = function(data) { var keys = Object.keys(data); var result = []; keys.sort(); for(var i = 0; i < keys.length; i++) { var key = keys[i]; result.push({ key: key, value: data[key], }); } return result; }; oauth-1.0a-2.2.6/package-lock.json000066400000000000000000001741531347571451100165350ustar00rootroot00000000000000{ "name": "oauth-1.0a", "version": "2.2.5", "lockfileVersion": 1, "requires": true, "dependencies": { "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", "dev": true }, "ajv": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "amdefine": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", "dev": true, "optional": true }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "dev": true, "requires": { "safer-buffer": "~2.1.0" } }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, "async": { "version": "1.5.2", "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", "dev": true }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { "tweetnacl": "^0.14.3" } }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", "pathval": "^1.1.0", "type-detect": "^4.0.5" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "dependencies": { "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" } }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { "version": "2.17.1", "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true, "optional": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "coveralls": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.3.tgz", "integrity": "sha512-viNfeGlda2zJr8Gj1zqXpDMRjw9uM54p7wzZdvLRyOgnAfCe974Dq4veZkjJdxQXbmdppu6flEajFYseHYaUhg==", "dev": true, "requires": { "growl": "~> 1.10.0", "js-yaml": "^3.11.0", "lcov-parse": "^0.0.10", "log-driver": "^1.2.7", "minimist": "^1.2.0", "request": "^2.86.0" }, "dependencies": { "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } } } }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { "type-detect": "^4.0.0" } }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "dotenv": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.0.0.tgz", "integrity": "sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg==", "dev": true }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" } }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "es-abstract": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", "has": "^1.0.3", "is-callable": "^1.1.4", "is-regex": "^1.0.4", "object-keys": "^1.0.12" } }, "es-to-primitive": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, "escodegen": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, "requires": { "esprima": "^2.7.1", "estraverse": "^1.9.1", "esutils": "^2.0.2", "optionator": "^0.8.1", "source-map": "~0.2.0" }, "dependencies": { "esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true } } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "estraverse": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", "dev": true }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", "dev": true, "requires": { "is-buffer": "~2.0.3" } }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", "dev": true }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" } }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { "inflight": "^1.0.4", "inherits": "2", "minimatch": "2 || 3", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "handlebars": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", "dev": true, "requires": { "async": "^2.5.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" }, "dependencies": { "async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", "dev": true, "requires": { "lodash": "^4.17.10" } }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", "dev": true }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", "dev": true }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-buffer": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", "dev": true }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { "has": "^1.0.1" } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { "has-symbols": "^1.0.0" } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, "istanbul": { "version": "0.4.5", "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", "dev": true, "requires": { "abbrev": "1.0.x", "async": "1.x", "escodegen": "1.8.x", "esprima": "2.7.x", "glob": "^5.0.15", "handlebars": "^4.0.1", "js-yaml": "3.x", "mkdirp": "0.5.x", "nopt": "3.x", "once": "1.x", "resolve": "1.1.x", "supports-color": "^3.1.0", "which": "^1.1.1", "wordwrap": "^1.0.0" }, "dependencies": { "esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", "dev": true } } }, "js-yaml": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", "json-schema": "0.2.3", "verror": "1.10.0" } }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "^2.0.0" } }, "lcov-parse": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", "dev": true }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", "dev": true }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { "chalk": "^2.0.1" } }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" } }, "mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" } }, "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true }, "mime-types": { "version": "2.1.24", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { "mime-db": "1.40.0" } }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.0", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { "minimist": "0.0.8" }, "dependencies": { "minimist": { "version": "0.0.8", "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true } } }, "mocha": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz", "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==", "dev": true, "requires": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", "find-up": "3.0.0", "glob": "7.1.3", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", "log-symbols": "2.2.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", "ms": "2.1.1", "node-environment-flags": "1.0.5", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", "yargs": "13.2.2", "yargs-parser": "13.0.0", "yargs-unparser": "1.5.0" }, "dependencies": { "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-environment-flags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" } }, "nopt": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { "abbrev": "1" } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", "has-symbols": "^1.0.0", "object-keys": "^1.0.11" } }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { "define-properties": "^1.1.2", "es-abstract": "^1.5.1" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { "minimist": "~0.0.1", "wordwrap": "~0.0.2" }, "dependencies": { "minimist": { "version": "0.0.10", "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", "dev": true }, "wordwrap": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true } } }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.4", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "wordwrap": "~1.0.0" } }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" } }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", "dev": true }, "p-limit": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, "psl": { "version": "1.1.29", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", "dev": true }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", "caseless": "~0.12.0", "combined-stream": "~1.0.6", "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", "dev": true }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", "dev": true }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "source-map": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", "dev": true, "optional": true, "requires": { "amdefine": ">=0.0.4" } }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" } }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" } }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" } }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { "has-flag": "^1.0.0" } }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" } }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { "safe-buffer": "^5.0.1" } }, "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, "type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { "prelude-ls": "~1.1.2" } }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "uglify-js": { "version": "3.4.9", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", "dev": true, "optional": true, "requires": { "commander": "~2.17.1", "source-map": "~0.6.1" }, "dependencies": { "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } } }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { "punycode": "^2.1.0" }, "dependencies": { "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true } } }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", "extsprintf": "^1.2.0" } }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { "string-width": "^1.0.2 || 2" } }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" } } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yargs": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", "dev": true, "requires": { "cliui": "^4.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.0.0" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" } } } }, "yargs-parser": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "yargs-unparser": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", "dev": true, "requires": { "flat": "^4.1.0", "lodash": "^4.17.11", "yargs": "^12.0.5" }, "dependencies": { "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" } }, "yargs-parser": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } } } } oauth-1.0a-2.2.6/package.json000066400000000000000000000012751347571451100156010ustar00rootroot00000000000000{ "name": "oauth-1.0a", "version": "2.2.6", "description": "OAuth 1.0a Request Authorization for Node and Browser.", "scripts": { "test": "mocha" }, "main": "oauth-1.0a.js", "types": "oauth-1.0a.d.ts", "repository": "https://github.com/ddo/oauth-1.0a.git", "keywords": [ "oauth", "1.0a", "oauth1.0a", "authorize", "signature", "nonce", "consumer" ], "author": "Ddo", "license": "MIT", "devDependencies": { "chai": "^4.1.2", "coveralls": "^3.0.3", "dotenv": "^8.0.0", "istanbul": "^0.4.5", "mocha": "^6.1.4", "request": "^2.88.0" } } oauth-1.0a-2.2.6/test/000077500000000000000000000000001347571451100142655ustar00rootroot00000000000000oauth-1.0a-2.2.6/test/README.md000066400000000000000000000010451347571451100155440ustar00rootroot00000000000000## Core testing `twitter_sample_data.js` ## Services - Twitter - Flickr - Bitbucket - Openbankproject ## Setup Please these define Node environment variables: - `TWITTER_CONSUMER_PUBLIC` - `TWITTER_CONSUMER_SECRET` - `TWITTER_TOKEN_PUBLIC` - `TWITTER_TOKEN_SECRET` - `FLICKR_CONSUMER_PUBLIC` - `FLICKR_CONSUMER_SECRET` - `FLICKR_TOKEN_PUBLIC` - `FLICKR_SECRET_SECRET` - `BITBUCKET_CONSUMER_PUBLIC` - `BITBUCKET_CONSUMER_SECRET` - `OPENBANK_CONSUMER_PUBLIC` - `OPENBANK_CONSUMER_SECRET` ## Run test `make test`oauth-1.0a-2.2.6/test/getParameterString.js000066400000000000000000000010571347571451100204350ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../oauth-1.0a'); var crypto = require('crypto'); describe("#getParameterString", function() { var oauth = new OAuth({ consumer: {}, }); var request = { url: 'https://api.twitter.com/1/statuses/update.json?&', }; var oauth_data = {}; describe("#getParameterStringEmptyGetParam", function() { it("should be equal to Twitter example", function() { expect(oauth.getParameterString(request, oauth_data)).to.equal('='); }); }); });oauth-1.0a-2.2.6/test/mocha.opts000066400000000000000000000000751347571451100162650ustar00rootroot00000000000000--recursive --reporter spec --require dotenv/config --slow 1 oauth-1.0a-2.2.6/test/oauth_body_hash.js000066400000000000000000000112521347571451100177640ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../oauth-1.0a'); var crypto = require('crypto'); describe("OAuth Body Hash", function() { var oauth, request; beforeEach(function() { var algo = 'sha1'; var enc = 'base64'; oauth = new OAuth({ consumer: { key: '1434affd-4d69-4a1a-bace-cc5c6fe493bc', secret: '932a216f-fb94-43b6-a2d2-e9c6b345cbea' }, signature_method: 'HMAC-SHA1', hash_function: function (base_string, key) { return crypto.createHmac(algo, key).update(base_string).digest(enc); }, body_hash_function: function (data) { return crypto.createHash(algo).update(data).digest(enc); } }); //overide for testing only !!! oauth.getTimeStamp = function () { return 1484599369; }; //overide for testing only !!! oauth.getNonce = function (length) { return 't62lMDp9DLwKZJJbZTpmSAhRINGBEOcF'; }; request = { url: 'http://canvas.docker/api/lti/accounts/1/tool_proxy', method: 'POST', data: { "@context": [ "http://purl.imsglobal.org/ctx/lti/v2/ToolProxy" ], "@type": "ToolProxy", "lti_version": "LTI-2p1", "tool_proxy_guid": "0cf04d67-8a0d-4d41-af61-6e8c6fc3e68c", "tool_consumer_profile": "http://canvas.docker/api/lti/accounts/1/tool_consumer_profile/339b6700-e4cb-47c5-a54f-3ee0064921a9", "tool_profile": { "lti_version": "LTI-2p1", "product_instance": { "guid": "fd75124a-140e-470f-944c-114d2d93db40", "product_info": { "product_name": { "default_value": "TestTool", "key": "tool.name" }, "product_version": "0.1.0", "product_family": { "code": "testtool", "vendor": { "code": "Example.com", "vendor_name": { "default_value": "Example", "key": "tool.vendor.name" } } } } }, "base_url_choice": [ { "default_base_url": "http://example.docker/", "selector": { "applies_to": [ "MessageHandler" ] } } ], "resource_handler": [ { "resource_type": { "code": "testtool" }, "resource_name": { "default_value": "TestTool", "key": "testtool.resource.name" }, "message": [ { "message_type": "basic-lti-launch-request", "path": "lti_launch", "enabled_capability": [ "Canvas.placements.courseNavigation" ] } ] } ] }, "enabled_capability": [ "OAuth.splitSecret" ], "security_contract": { "tp_half_shared_secret": "1c7849d3c9f037a9891575c8508d3aaab6a9e1312b5d0353625f83d68f0d545344f81ff9e1849b6400982a0d3f6bf953c6095265e3b6d700a73f5be94ce5654c" } }, includeBodyHash: true }; }); describe('#getBodyHash', function() { it('should handle data encoded as an object', function() { expect(oauth.getBodyHash(request, '')).to.equal('xpJzRG6xylVIRRtiigLPKX7iRmM=') }); it('should handle data encoded as a string', function() { request.data = 'Hello World!'; expect(oauth.getBodyHash(request, '')).to.equal('Lve95gjOVATpfV8EL5X4nxwjKHE=') }); }); describe('#authorize', function() { it('should properly include an oauth_body_hash param', function() { expect(oauth.authorize(request)).to.eql({ oauth_consumer_key: '1434affd-4d69-4a1a-bace-cc5c6fe493bc', oauth_nonce: 't62lMDp9DLwKZJJbZTpmSAhRINGBEOcF', oauth_signature_method: 'HMAC-SHA1', oauth_timestamp: 1484599369, oauth_version: '1.0', oauth_body_hash: 'xpJzRG6xylVIRRtiigLPKX7iRmM=', oauth_signature: '1Q0U8yhK1bWYguRxlUDs9KHywOE=' }); }); }); describe('#toHeader', function() { it('should properly include an oauth_body_hash header', function() { expect(oauth.toHeader(oauth.authorize(request))).to.have.property('Authorization', 'OAuth oauth_body_hash="xpJzRG6xylVIRRtiigLPKX7iRmM%3D", oauth_consumer_key="1434affd-4d69-4a1a-bace-cc5c6fe493bc", oauth_nonce="t62lMDp9DLwKZJJbZTpmSAhRINGBEOcF", oauth_signature="1Q0U8yhK1bWYguRxlUDs9KHywOE%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1484599369", oauth_version="1.0"'); }); }); }); oauth-1.0a-2.2.6/test/options/000077500000000000000000000000001347571451100157605ustar00rootroot00000000000000oauth-1.0a-2.2.6/test/options/consumer.js000066400000000000000000000006321347571451100201520ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../../oauth-1.0a'); //TODO: check alphabet and numberic only describe("consumer option", function() { describe("required option", function() { it("should throw error on undefined", function() { expect(function() { oauth = OAuth(); }).to.throw('consumer option is required'); }); }); });oauth-1.0a-2.2.6/test/options/last_ampersand.js000066400000000000000000000036011347571451100213130ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../../oauth-1.0a'); var crypto = require('crypto'); function hash_function_SHA1(base_string, key) { return crypto.createHmac('sha1', key).update(base_string).digest('base64'); } describe("last_ampersand option", function() { describe("default (true)", function() { var oauth = OAuth({ consumer: { secret: 'kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw' }, signature_method: 'HMAC-SHA1', hash_function: hash_function_SHA1 }); var token = { secret: 'LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE' }; it("should be equal to Twitter example", function() { expect(oauth.getSigningKey(token.secret)).to.equal('kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE'); }); it("should has the ampersand at the end", function() { expect(oauth.getSigningKey()).to.equal('kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&'); }); }); describe("change to false", function() { var oauth = OAuth({ consumer: { secret: 'kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw' }, signature_method: 'HMAC-SHA1', hash_function: hash_function_SHA1, last_ampersand: false }); var token = { secret: 'LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE' }; it("should be equal to Twitter example", function() { expect(oauth.getSigningKey(token.secret)).to.equal('kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE'); }); it("should not has the ampersand at the end", function() { expect(oauth.getSigningKey()).to.equal('kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw'); }); }); });oauth-1.0a-2.2.6/test/options/multiple_values.js000066400000000000000000000032471347571451100215360ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../../oauth-1.0a'); var crypto = require('crypto'); function hash_function_SHA1(base_string, key) { return crypto.createHmac('sha1', key).update(base_string).digest('base64'); } describe("Signature method", function() { describe("HMAC-SHA1 signature method with multiple values", function() { var oauth = new OAuth({ consumer: { key: "batch-dbc2cd8c-6ca8-463b-96e2-6d8683eac6fd", secret: "4S4Rvm25CJZWv7HBg5HOhhlRTBSZ7npl" }, signature_method: 'HMAC-SHA1', hash_function: hash_function_SHA1 }); //overide for testing only !!! oauth.getTimeStamp = function() { return 1445951836; }; //overide for testing only !!! oauth.getNonce = function(length) { return 'tKOQtKan8PHIrIoOlrl17zHkZQ2H5CsP'; }; var request_data = { url: "http://localhost:3737/rest/profiles/1ea2a42f-e14d-4057-8bcd-3e0b4514a267/properties?alt=json", method: "PUT", data: { currentbrowserversion: [ '1', '5', 'dfadfadfa' ], alt: 'json' } }; var result = oauth.authorize(request_data); it("Signature should match", function() { expect(result.oauth_signature).to.equal("ri0lfv4udd2uQmkg5cCPVqLruyk="); }); it("Nonce should match", function() { expect(result.oauth_nonce).to.equal("tKOQtKan8PHIrIoOlrl17zHkZQ2H5CsP"); }); it("Timestamp should match", function() { expect(result.oauth_timestamp).to.equal(1445951836); }); }); });oauth-1.0a-2.2.6/test/options/multiple_values_qs.js000066400000000000000000000031631347571451100222360ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../../oauth-1.0a'); var crypto = require('crypto'); function hash_function_SHA1(base_string, key) { return crypto.createHmac('sha1', key).update(base_string).digest('base64'); } describe("Signature method", function() { describe("HMAC-SHA1 signature method with multiple duplicate values in the querystring", function() { var oauth = new OAuth({ consumer: { key: "batch-8f4fd2c6-9fa3-4368-9797-52876d723dd1", secret: "ZACXtYe6LQ4C5X0KbJcDkbW77GYtlaoU" }, signature_method: 'HMAC-SHA1', hash_function: hash_function_SHA1 }); //overide for testing only !!! oauth.getTimeStamp = function() { return 1504882975; }; //overide for testing only !!! oauth.getNonce = function(length) { return 'xsEYfvjTEiPTR3TqJbmhCpUdrDoHF6nk'; }; var request_data = { url: "http://localhost:3737/rest/profiles?property=email&value=vel.arcu%40ultriciesornareelit.ca&property=visitdate&value=abc&alt=json", method: "GET" }; var result = oauth.authorize(request_data); it("Signature should match", function() { expect(result.oauth_signature).to.equal("b6nMehqpHnpx0VlZB9IhqFh4Jq0="); }); it("Nonce should match", function() { expect(result.oauth_nonce).to.equal("xsEYfvjTEiPTR3TqJbmhCpUdrDoHF6nk"); }); it("Timestamp should match", function() { expect(result.oauth_timestamp).to.equal(1504882975); }); }); });oauth-1.0a-2.2.6/test/options/nonce_length.js000066400000000000000000000021351347571451100207620ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../../oauth-1.0a'); //TODO: check alphabet and numberic only describe("nonce_length option", function() { describe("default (32)", function() { var oauth = OAuth({ consumer: {} }); it("nonce length should be 32", function() { expect(oauth.getNonce().length).to.equal(32); }); }); describe("length 100", function() { var oauth = OAuth({ consumer: {}, nonce_length: 100 }); it("nonce length should be 100", function() { expect(oauth.getNonce().length).to.equal(100); }); }); describe("random length", function() { var random = parseInt(Math.random()*100, 10); while(random === 0) { random = parseInt(Math.random()*100, 10); } var oauth = new OAuth({ consumer: {}, nonce_length: random }); it("nonce length should be correct", function() { expect(oauth.getNonce().length).to.equal(random); }); }); });oauth-1.0a-2.2.6/test/options/parameter_seperator.js000066400000000000000000000072501347571451100223660ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../../oauth-1.0a'); var crypto = require('crypto'); function hash_function_SHA1(base_string, key) { return crypto.createHmac('sha1', key).update(base_string).digest('base64'); } describe("parameter_seperator option", function() { describe("default (', ')", function() { var oauth = OAuth({ consumer: { key: 'xvz1evFS4wEEPTGEFPHBog', secret: 'kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw' }, signature_method: 'HMAC-SHA1', hash_function: hash_function_SHA1 }); //overide for testing only !!! oauth.getTimeStamp = function() { return 1318622958; }; //overide for testing only !!! oauth.getNonce = function(length) { return 'kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg'; }; var token = { key: '370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb', secret: 'LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE' }; var request = { url: 'https://api.twitter.com/1/statuses/update.json?include_entities=true', method: 'POST', data: { status: 'Hello Ladies + Gentlemen, a signed OAuth request!' } }; it("should be equal to Twitter example", function() { expect(oauth.toHeader(oauth.authorize(request, token))).to.have.property('Authorization', 'OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog", oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1318622958", oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", oauth_version="1.0"'); }); }); describe("-", function() { var oauth = OAuth({ consumer: { key: 'xvz1evFS4wEEPTGEFPHBog', secret: 'kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw' }, signature_method: 'HMAC-SHA1', hash_function: hash_function_SHA1, parameter_seperator: '-' }); //overide for testing only !!! oauth.getTimeStamp = function() { return 1318622958; }; //overide for testing only !!! oauth.getNonce = function(length) { return 'kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg'; }; var token = { key: '370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb', secret: 'LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE' }; var request = { url: 'https://api.twitter.com/1/statuses/update.json?include_entities=true', method: 'POST', data: { status: 'Hello Ladies + Gentlemen, a signed OAuth request!' } }; it("header should be correct", function() { expect(oauth.toHeader(oauth.authorize(request, token))).to.have.property('Authorization', 'OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog"-oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg"-oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D"-oauth_signature_method="HMAC-SHA1"-oauth_timestamp="1318622958"-oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb"-oauth_version="1.0"'); }); }); }); function generateTest(options) { var oauth = new OAuth(options); //overide for testing only !!! oauth.getTimeStamp = function() { return 1318622958; }; //overide for testing only !!! oauth.getNonce = function(length) { return 'kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg'; }; return oauth; }oauth-1.0a-2.2.6/test/options/realm.js000066400000000000000000000034701347571451100174220ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../../oauth-1.0a'); var crypto = require('crypto'); function hash_function_SHA1(base_string, key) { return crypto.createHmac('sha1', key).update(base_string).digest('base64'); } describe("Realm", function() { describe("HMAC-SHA1 signature method with multiple values", function() { var oauth = new OAuth({ consumer: { key: "batch-dbc2cd8c-6ca8-463b-96e2-6d8683eac6fd", secret: "4S4Rvm25CJZWv7HBg5HOhhlRTBSZ7npl" }, // realm: "hi@ddo.me", realm: "https://ddo.me/", signature_method: 'HMAC-SHA1', hash_function: hash_function_SHA1 }); //overide for testing only !!! oauth.getTimeStamp = function() { return 1445951836; }; //overide for testing only !!! oauth.getNonce = function(length) { return 'tKOQtKan8PHIrIoOlrl17zHkZQ2H5CsP'; }; var request_data = { url: "http://localhost:3737/rest/profiles/1ea2a42f-e14d-4057-8bcd-3e0b4514a267/properties?alt=json", method: "PUT", data: { currentbrowserversion: [ '1', '5', 'dfadfadfa' ], alt: 'json' } }; var result = oauth.authorize(request_data); var result_header = oauth.toHeader(result); it("Header with realm should match", function() { expect(result_header).to.eql({ Authorization: 'OAuth realm="https://ddo.me/", oauth_consumer_key="batch-dbc2cd8c-6ca8-463b-96e2-6d8683eac6fd", oauth_nonce="tKOQtKan8PHIrIoOlrl17zHkZQ2H5CsP", oauth_signature="ri0lfv4udd2uQmkg5cCPVqLruyk%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1445951836", oauth_version="1.0"' }); }); }); });oauth-1.0a-2.2.6/test/options/signature_method.js000066400000000000000000000020771347571451100216650ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../../oauth-1.0a'); describe("Signature method", function() { describe("default PLAINTEXT signature method", function() { var oauth = new OAuth({ consumer: {} }); it("hash should be return key only", function() { expect(oauth.signature_method).to.equal('PLAINTEXT'); }); }); describe("default PLAINTEXT hash function", function() { var oauth = new OAuth({ consumer: {}, signature_method: 'PLAINTEXT' }); it("hash should be return key only", function() { expect(oauth.hash_function('base_string', 'key')).to.equal('key'); }); }); describe("missing hash function", function() { it("constructor should throw a error", function() { expect(function() { OAuth({ consumer: {}, signature_method: 'RSA-SHA1', }); }).to.throw('hash_function option is required'); }); }); });oauth-1.0a-2.2.6/test/services/000077500000000000000000000000001347571451100161105ustar00rootroot00000000000000oauth-1.0a-2.2.6/test/services/bitbucket.js000066400000000000000000000052441347571451100204270ustar00rootroot00000000000000var expect = require('chai').expect; var Request = require('request'); var OAuth = require('../../oauth-1.0a'); var crypto = require('crypto'); describe("Bitbucket Personal Consumer", function() { var oauth beforeEach(function () { if ( !process.env.BITBUCKET_CONSUMER_PUBLIC || !process.env.BITBUCKET_CONSUMER_SECRET ) { this.skip('Bitbucket secret not set.'); return; } this.timeout(10000); oauth = new OAuth({ consumer: { key: process.env.BITBUCKET_CONSUMER_PUBLIC, secret: process.env.BITBUCKET_CONSUMER_SECRET }, signature_method: 'HMAC-SHA1', hash_function: function(base_string, key) { return crypto.createHmac('sha1', key).update(base_string).digest('base64'); } }); }); describe("#Request Token", function() { var request = { url: 'https://bitbucket.org/api/1.0/oauth/request_token', method: 'POST', data: { oauth_callback: 'http://www.ddo.me' } }; it("should be a valid response", function(done) { Request({ url: request.url, method: request.method, form: oauth.authorize(request) }, function(err, res, body) { expect(body).to.be.a('string'); body = oauth.deParam(body); expect(body).to.have.property('oauth_callback_confirmed', 'true'); expect(body).to.have.property('oauth_token'); expect(body).to.have.property('oauth_token_secret'); done(); }); }); }); describe("#Request Token by Header", function() { var request = { url: 'https://bitbucket.org/api/1.0/oauth/request_token', method: 'POST', data: { oauth_callback: 'http://www.ddo.me' } }; it("should be a valid response", function(done) { Request({ url: request.url, method: request.method, form: request.data, headers: oauth.toHeader(oauth.authorize(request)) }, function(err, res, body) { expect(body).to.be.a('string'); body = oauth.deParam(body); expect(body).to.have.property('oauth_callback_confirmed', 'true'); expect(body).to.have.property('oauth_token'); expect(body).to.have.property('oauth_token_secret'); done(); }); }); }); });oauth-1.0a-2.2.6/test/services/flickr.js000066400000000000000000000136421347571451100177260ustar00rootroot00000000000000var expect = require('chai').expect; var Request = require('request'); var OAuth = require('../../oauth-1.0a'); var crypto = require('crypto'); describe("Flickr Personal Consumer", function() { var oauth; beforeEach(function () { if ( !process.env.FLICKR_CONSUMER_key || !process.env.FLICKR_CONSUMER_SECRET ) { this.skip('Flickr secret not set.'); return; } this.timeout(10000); oauth = new OAuth({ consumer: { key: process.env.FLICKR_CONSUMER_key, secret: process.env.FLICKR_CONSUMER_SECRET }, signature_method: 'HMAC-SHA1', hash_function: function(base_string, key) { return crypto.createHmac('sha1', key).update(base_string).digest('base64'); } }); }); describe.skip("#Request Token", function() { var request = { url: 'http://www.flickr.com/services/oauth/request_token', method: 'POST', data: { oauth_callback: 'http://www.ddo.me' } }; it("should be a valid response", function(done) { Request({ url: request.url, method: request.method, form: oauth.authorize(request) }, function(err, res, body) { expect(body).to.be.a('string'); body = oauth.deParam(body); expect(body).to.have.property('oauth_callback_confirmed', 'true'); expect(body).to.have.property('oauth_token'); expect(body).to.have.property('oauth_token_secret'); done(); }); }); }); describe.skip("#Request Token by Header", function() { var request = { url: 'http://www.flickr.com/services/oauth/request_token', method: 'POST', data: { oauth_callback: 'http://www.ddo.me' } }; it("should be a valid response", function(done) { Request({ url: request.url, method: request.method, form: request.data, headers: oauth.toHeader(oauth.authorize(request)) }, function(err, res, body) { expect(body).to.be.a('string'); body = oauth.deParam(body); expect(body).to.have.property('oauth_callback_confirmed', 'true'); expect(body).to.have.property('oauth_token'); expect(body).to.have.property('oauth_token_secret'); console.log(body); console.log('http://www.flickr.com/services/oauth/authorize?oauth_token=' + token.key); done(); }); }); }); /* Need to get token from Request Token And oauth_verifier after pass authorize on website */ describe.skip("#Access Token", function() { //this token get from Request Token var token = { key: 'get from Request Token', secret: 'get from Request Token' }; var request = { url: 'http://www.flickr.com/services/oauth/access_token', method: 'POST', data: { oauth_verifier: 'get from Request Token' } }; it("should be a valid response", function(done) { Request({ url: request.url, method: request.method, form: oauth.authorize(request, token) }, function(err, res, body) { expect(body).to.be.a('string'); body = oauth.deParam(body); expect(body).to.have.property('fullname'); expect(body).to.have.property('user_nsid'); expect(body).to.have.property('username'); expect(body).to.have.property('oauth_token'); expect(body).to.have.property('oauth_token_secret'); token.key = body.oauth_token; token.secret = body.oauth_token_secret; done(); }); }); }); /* Need to get token from Access Token */ describe("#flickr.test.login", function() { var token = { key: process.env.FLICKR_TOKEN_PUBLIC, secret: process.env.FLICKR_SECRET_SECRET }; var request = { url: 'http://api.flickr.com/services/rest/?method=flickr.test.login', method: 'GET', data: { api_key: token.key, format: 'json' } }; it("should be a valid response", function(done) { Request({ url: request.url, method: request.method, qs: oauth.authorize(request, token) }, function(err, res, body) { expect(body).to.be.a('string'); expect(body).to.have.string('jsonFlickrApi'); done(); }); }); }); /* Need to get token from Access Token */ describe("#flickr.test.null", function() { var token = { key: process.env.FLICKR_TOKEN_PUBLIC, secret: process.env.FLICKR_SECRET_SECRET }; var request = { url: 'http://api.flickr.com/services/rest/?method=flickr.test.null', method: 'GET', data: { api_key: token.key, format: 'json' } }; it("should be a valid response", function(done) { Request({ url: request.url, method: request.method, qs: oauth.authorize(request, token) }, function(err, res, body) { expect(body).to.be.a('string'); expect(body).to.have.string('jsonFlickrApi'); done(); }); }); }); });oauth-1.0a-2.2.6/test/services/openbank.js000066400000000000000000000035511347571451100202470ustar00rootroot00000000000000var expect = require('chai').expect; var Request = require('request'); var OAuth = require('../../oauth-1.0a'); var crypto = require('crypto'); describe.skip("Openbank Personal Consumer", function() { var oauth; beforeEach(function () { if ( !process.env.OPENBANK_CONSUMER_PUBLIC || !process.env.OPENBANK_CONSUMER_SECRET ) { this.skip('Openbank secret not set.'); return; } this.timeout(10000); oauth = new OAuth({ consumer: { key: process.env.OPENBANK_CONSUMER_PUBLIC, secret: process.env.OPENBANK_CONSUMER_SECRET }, signature_method: 'HMAC-SHA256', hash_function: function(base_string, key) { return crypto.createHmac('sha256', key).update(base_string).digest('base64'); } }); }); //need to send as header describe("#Request Token", function() { var request = { url: 'https://apisandbox.openbankproject.com/oauth/initiate', method: 'POST', data: { oauth_callback: 'http://www.ddo.me' } }; it("should be a valid response", function(done) { Request({ url: request.url, method: request.method, form: request.data, headers: oauth.toHeader(oauth.authorize(request)) }, function(err, res, body) { expect(body).to.be.a('string'); body = oauth.deParam(body); expect(body).to.have.property('oauth_callback_confirmed', 'true'); expect(body).to.have.property('oauth_token'); expect(body).to.have.property('oauth_token_secret'); done(); }); }); }); });oauth-1.0a-2.2.6/test/services/twitter.js000066400000000000000000000133701347571451100201540ustar00rootroot00000000000000var expect = require('chai').expect; var Request = require('request'); var OAuth = require('../../oauth-1.0a'); var crypto = require('crypto'); describe("Twitter Personal Consumer", function() { var oauth, token; beforeEach(function () { if ( !process.env.TWITTER_CONSUMER_PUBLIC || !process.env.TWITTER_CONSUMER_SECRET || !process.env.TWITTER_TOKEN_PUBLIC || !process.env.TWITTER_TOKEN_SECRET ) { this.skip('Twitter secret or token not set.'); return; } this.timeout(10000); oauth = new OAuth({ consumer: { key: process.env.TWITTER_CONSUMER_PUBLIC, secret: process.env.TWITTER_CONSUMER_SECRET }, signature_method: 'HMAC-SHA1', hash_function: function(base_string, key) { return crypto.createHmac('sha1', key).update(base_string).digest('base64'); } }); token = { key: process.env.TWITTER_TOKEN_PUBLIC, secret: process.env.TWITTER_TOKEN_SECRET }; }); describe("#Get user timeline", function() { var request = { url: 'https://api.twitter.com/1.1/statuses/user_timeline.json', method: 'GET' }; it("should be an array of tweets", function(done) { Request({ url: request.url, method: request.method, qs: oauth.authorize(request, token), json: true }, function(err, res, body) { expect(err).to.be.a('null'); expect(body).to.be.an.instanceof(Array); done(); }); }); }); describe("#Get user timeline limit 5", function() { var request = { url: 'https://api.twitter.com/1.1/statuses/user_timeline.json', method: 'GET', data: { count: 5 } }; it("should be an array of tweets (length 5)", function(done) { Request({ url: request.url, method: request.method, qs: oauth.authorize(request, token), json: true }, function(err, res, body) { expect(err).to.be.a('null'); expect(body).to.be.an.instanceof(Array); expect(body).to.have.length(5); done(); }); }); }); describe("#Get user timeline limit 5 by url", function() { var request = { url: 'https://api.twitter.com/1.1/statuses/user_timeline.json?count=5', method: 'GET' }; it("should be an array of tweets", function(done) { Request({ url: request.url, method: request.method, qs: oauth.authorize(request, token), json: true }, function(err, res, body) { expect(err).to.be.a('null'); expect(body).to.be.an.instanceof(Array); expect(body).to.have.length(5); done(); }); }); }); describe("#Get user timeline by header", function() { var request = { url: 'https://api.twitter.com/1.1/statuses/user_timeline.json', method: 'GET' }; it("should be an array of tweets", function(done) { Request({ url: request.url, method: request.method, qs: request.data, headers: oauth.toHeader(oauth.authorize(request, token)), json: true }, function(err, res, body) { expect(err).to.be.a('null'); expect(body).to.be.an.instanceof(Array); done(); }); }); }); describe.skip("#Tweet", function() { var text = 'Testing oauth-1.0a'; var request = { url: 'https://api.twitter.com/1.1/statuses/update.json', method: 'POST', data: { status: text } }; it("should be an success object", function(done) { Request({ url: request.url, method: request.method, form: oauth.authorize(request, token), json: true }, function(err, res, body) { expect(body).to.have.property('entities'); expect(body).to.have.property('created_at'); expect(body).to.have.property('id'); expect(body).to.have.property('text'); expect(body.text).to.equal(text); expect(body.user).to.be.an('object'); done(); }); }); }); describe.skip("#Tweet by header", function() { var text = 'Testing oauth-1.0a'; var request = { url: 'https://api.twitter.com/1.1/statuses/update.json', method: 'POST', data: { status: text } }; it("should be an success object", function(done) { Request({ url: request.url, method: request.method, form: request.data, headers: oauth.toHeader(oauth.authorize(request, token)), json: true }, function(err, res, body) { expect(body).to.have.property('entities'); expect(body).to.have.property('created_at'); expect(body).to.have.property('id'); expect(body).to.have.property('text'); expect(body.text).to.equal(text); expect(body.user).to.be.an('object'); done(); }); }); }); });oauth-1.0a-2.2.6/test/twitter_sample_data.js000066400000000000000000000105401347571451100206570ustar00rootroot00000000000000var expect = require('chai').expect; var OAuth = require('../oauth-1.0a'); var crypto = require('crypto'); describe("Twitter Sample", function() { var oauth = new OAuth({ consumer: { key: 'xvz1evFS4wEEPTGEFPHBog', secret: 'kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw' }, signature_method: 'HMAC-SHA1', hash_function: function(base_string, key) { return crypto.createHmac('sha1', key).update(base_string).digest('base64'); } }); //overide for testing only !!! oauth.getTimeStamp = function() { return 1318622958; }; //overide for testing only !!! oauth.getNonce = function(length) { return 'kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg'; }; var token = { key: '370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb', secret: 'LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE' }; var request = { url: 'https://api.twitter.com/1/statuses/update.json?include_entities=true', method: 'POST', data: { status: 'Hello Ladies + Gentlemen, a signed OAuth request!' } }; var oauth_data = { oauth_consumer_key: oauth.consumer.key, oauth_nonce: oauth.getNonce(), oauth_signature_method: oauth.signature_method, oauth_timestamp: oauth.getTimeStamp(), oauth_version: '1.0', oauth_token: token.key }; describe("#getParameterString", function() { it("should be equal to Twitter example", function() { expect(oauth.getParameterString(request, oauth_data)).to.equal('include_entities=true&oauth_consumer_key=xvz1evFS4wEEPTGEFPHBog&oauth_nonce=kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1318622958&oauth_token=370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb&oauth_version=1.0&status=Hello%20Ladies%20%2B%20Gentlemen%2C%20a%20signed%20OAuth%20request%21'); }); }); describe("#getBaseString", function() { it("should be equal to Twitter example", function() { expect(oauth.getBaseString(request, oauth_data)).to.equal('POST&https%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fupdate.json&include_entities%3Dtrue%26oauth_consumer_key%3Dxvz1evFS4wEEPTGEFPHBog%26oauth_nonce%3DkYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1318622958%26oauth_token%3D370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb%26oauth_version%3D1.0%26status%3DHello%2520Ladies%2520%252B%2520Gentlemen%252C%2520a%2520signed%2520OAuth%2520request%2521'); }); }); describe("#getSigningKey", function() { it("should be equal to Twitter example", function() { expect(oauth.getSigningKey(token.secret)).to.equal('kAcSOqF21Fu85e7zjz7ZN2U4ZRhfV3WpwPAoE3Z7kBw&LswwdoUaIvS8ltyTt5jkRh4J50vUPVVHtR2YPi5kE'); }); }); describe("#getSignature", function() { it("should be equal to Twitter example", function() { expect(oauth.getSignature(request, token.secret, oauth_data)).to.equal('tnnArxj06cWHq44gCs1OSKk/jLY='); }); }); describe("#authorize", function() { it("should be equal to Twitter example", function() { expect(oauth.authorize(request, token)).to.eql({ oauth_consumer_key: 'xvz1evFS4wEEPTGEFPHBog', oauth_nonce: 'kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg', oauth_signature_method: 'HMAC-SHA1', oauth_timestamp: 1318622958, oauth_version: '1.0', oauth_token: '370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb', status: 'Hello Ladies + Gentlemen, a signed OAuth request!', include_entities: 'true', oauth_signature: 'tnnArxj06cWHq44gCs1OSKk/jLY=' }); }); }); describe("#toHeader", function() { it("should be equal to Twitter example", function() { expect(oauth.toHeader(oauth.authorize(request, token))).to.have.property('Authorization', 'OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog", oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg", oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1318622958", oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb", oauth_version="1.0"'); }); }); });