├── .gitignore ├── .travis.yml ├── COPYING ├── demos ├── retrieve-a-charge.js ├── refund-a-charge.js ├── create-a-customer-using-card-token.js ├── create-a-charge-using-card-token.js ├── create-a-charge-using-customer-token.js ├── create-a-card.js ├── create-a-customer.js └── create-a-charge.js ├── package.json ├── LICENSE ├── README.md ├── lib └── pin.js ├── test └── test.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 0.8 -------------------------------------------------------------------------------- /COPYING: -------------------------------------------------------------------------------- 1 | All code is copyright 2012 Api Engine 2 | 3 | All code is licensed under a 3-point BSD style license. 4 | 5 | See LICENSE or https://github.com/apiengine/pinjs -------------------------------------------------------------------------------- /demos/retrieve-a-charge.js: -------------------------------------------------------------------------------- 1 | var Pin = require('../'); 2 | 3 | var pin = Pin.setup({ 4 | key: 'your-private-key', 5 | production: false 6 | }); 7 | 8 | pin.retrieveCharge('ch_WsscVf6IqlfUaLFtLUa5vA', function (response) { 9 | console.log(response.body); 10 | }); -------------------------------------------------------------------------------- /demos/refund-a-charge.js: -------------------------------------------------------------------------------- 1 | var Pin = require('../'); 2 | 3 | var pin = Pin.setup({ 4 | key: 'your-private-key', 5 | production: false 6 | }); 7 | 8 | pin.refundCharge('ch_WsscVf6IqlfUaLFtLUa5vA', { 9 | amount: 400 10 | }, function (response) { 11 | console.log(response.body); 12 | }); -------------------------------------------------------------------------------- /demos/create-a-customer-using-card-token.js: -------------------------------------------------------------------------------- 1 | var Pin = require('../'); 2 | 3 | var pin = Pin.setup({ 4 | key: 'your-private-key', 5 | production: false 6 | }); 7 | 8 | pin.createCustomer({ 9 | email: 'roland@pinpayments.com', 10 | card_token: 'card_NmEoTFipYK2PAM1cTH5Glw' 11 | }, function (response) { 12 | console.log(response.body); 13 | }); 14 | -------------------------------------------------------------------------------- /demos/create-a-charge-using-card-token.js: -------------------------------------------------------------------------------- 1 | var Pin = require('../'); 2 | 3 | var pin = Pin.setup({ 4 | key: 'your-private-key', 5 | production: false 6 | }); 7 | 8 | pin.createCharge({ 9 | amount: 400, 10 | description: 'test charge', 11 | email: 'roland@pinpayments.com', 12 | ip_address: '203.192.1.172', 13 | card_token: 'tok_nytGw7koRg23EEp9NTmz9w' 14 | }, function (response) { 15 | console.log(response.body); 16 | }); 17 | -------------------------------------------------------------------------------- /demos/create-a-charge-using-customer-token.js: -------------------------------------------------------------------------------- 1 | var Pin = require('../'); 2 | 3 | var pin = Pin.setup({ 4 | key: 'your-private-key', 5 | production: false 6 | }); 7 | 8 | pin.createCharge({ 9 | amount: 400, 10 | description: 'test charge', 11 | email: 'roland@pinpayments.com', 12 | ip_address: '203.192.1.172', 13 | customer_token: 'cus_oX-JRX780mLzQaTcke-Tiw' 14 | }, function (response) { 15 | console.log(response.body); 16 | }); 17 | -------------------------------------------------------------------------------- /demos/create-a-card.js: -------------------------------------------------------------------------------- 1 | var Pin = require('../'); 2 | 3 | var pin = Pin.setup({ 4 | key: 'pk_DSA-1XmSdIIViXp4bJO8SA', 5 | production: false 6 | }); 7 | 8 | pin.createCard({ 9 | number: 5520000000000000, 10 | expiry_month: '05', 11 | expiry_year: 2013, 12 | cvc: 519, 13 | name: 'Roland Robot', 14 | address_line1: '42 Sevenoaks St', 15 | address_city: 'Lathlain', 16 | address_postcode: 6454, 17 | address_state: 'WA', 18 | address_country: 'AU' 19 | }, function (response) { 20 | console.log(response.body); 21 | }); 22 | 23 | -------------------------------------------------------------------------------- /demos/create-a-customer.js: -------------------------------------------------------------------------------- 1 | var Pin = require('../'); 2 | 3 | var pin = Pin.setup({ 4 | key: 'your-private-key', 5 | production: false 6 | }); 7 | 8 | pin.createCustomer({ 9 | email: 'roland@pinpayments.com', 10 | card: { 11 | number: 5520000000000000, 12 | expiry_month: '05', 13 | expiry_year: 2013, 14 | cvc: 123, 15 | name: 'Roland Robot', 16 | address_line1: '42 Sevenoaks St', 17 | address_city: 'Lathlain', 18 | address_postcode: 6454, 19 | address_state: 'WA', 20 | address_country: 'AU' 21 | } 22 | }, function (response) { 23 | console.log(response.body); 24 | }) 25 | -------------------------------------------------------------------------------- /demos/create-a-charge.js: -------------------------------------------------------------------------------- 1 | var Pin = require('../'); 2 | 3 | var pin = Pin.setup({ 4 | key: 'your-private-key', 5 | production: false 6 | }); 7 | 8 | pin.createCharge({ 9 | amount: 400, 10 | description: 'test charge', 11 | email: 'roland@pinpayments.com', 12 | ip_address: '203.192.1.172', 13 | card: { 14 | number: 5520000000000000, 15 | expiry_month: '05', 16 | expiry_year: 2013, 17 | cvc: 123, 18 | name: 'Roland Robot', 19 | address_line1: '42 Sevenoaks St', 20 | address_city: 'Lathlain', 21 | address_postcode: 6454, 22 | address_state: 'WA', 23 | address_country: 'AU' 24 | } 25 | }, function (response) { 26 | console.log(response.body); 27 | }); 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pinjs", 3 | "author": "Thomas Davis (https://martinwheeler.com.au/)" 6 | ], 7 | "description": "Api client for pinpayments.com - Australia's payment gateway", 8 | "scripts": { 9 | "test": "mocha -R list -t 5000" 10 | }, 11 | "main": "./lib/pin", 12 | "version": "1.1.4", 13 | "dependencies": { 14 | "got": "^10.7.0" 15 | }, 16 | "devDependencies": { 17 | "chai": "^3.5.0", 18 | "chai-things": "^0.2.0", 19 | "mocha": "^7.1.1", 20 | "moment": "^2.13.0", 21 | "underscore": "~1.12.1" 22 | }, 23 | "keywords": [ 24 | "payment", 25 | "transactions" 26 | ], 27 | "license": "bsd", 28 | "engines": { 29 | "node": ">=10.13.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012, Api Engine 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | 1) Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | 8 | 2) Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 9 | 10 | 3) Neither the name of the Api Engine nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 11 | 12 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 13 | 14 | http://apiengine.io -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pin.js - Node.js module for [pinpayments.com](http://pinpayments.com) 2 | 3 | [![Build Status](https://secure.travis-ci.org/ApiEngine/pinjs.png?branch=master)](http://travis-ci.org/ApiEngine/pinjs) 4 | 5 | Pin.js is an node.js API client for [Pin](https://pinpayments.com/) which is an Australian payment gateway. 6 | The module has wrapped all documented Pin resources. 7 | 8 | Down under we don't have access to some of the cooler payment gateways so we are looking forward to Pin giving us more options than just Paypal. 9 | 10 | ## Getting started 11 | 12 | ``` 13 | npm install pinjs 14 | ``` 15 | 16 | ## Methods 17 | 18 | First instantiate pinjs by passing in your api key 19 | 20 | ```javascript 21 | var Pin = require('pinjs'); 22 | 23 | var pin = Pin.setup({ 24 | key: 'yourkey', 25 | production: false 26 | }); 27 | // fields is an object, see the example for more info 28 | pin.createCard(fields, callback) 29 | pin.createCustomer(fields, callback) 30 | pin.refundCharge(chargeId, fields, callback) 31 | pin.retrieveCharge(chargeId, callback) 32 | pin.createCharge(fields, callback) 33 | pin.captureCharge(uncapturedChargeToken, callback) 34 | ``` 35 | 36 | ## Example 37 | 38 | This is the basic syntax of how to create a new charge, checkout the demos folder for the rest of the methods 39 | 40 | > Note: As of v1.0.2 the callback parameters have been updated. Please check the example bellow. 41 | 42 | ```javascript 43 | var Pin = require('pinjs'); 44 | 45 | var pin = Pin.setup({ 46 | key: 'your-api-key', 47 | production: false 48 | }); 49 | 50 | pin.createCharge({ 51 | amount: 400, 52 | description: 'test charge', 53 | email: 'roland@pinpayments.com', 54 | ip_address: '203.192.1.172', 55 | card: { 56 | number: 5520000000000000, 57 | expiry_month: '05', 58 | expiry_year: 2013, 59 | cvc: 123, 60 | name: 'Roland Robot', 61 | address_line1: '42 Sevenoaks St', 62 | address_city: 'Lathlain', 63 | address_postcode: 6454, 64 | address_state: 'WA', 65 | address_country: 'AU' 66 | } 67 | }, 68 | /** 69 | * @param error - Error response from the API 70 | * @param response - A HTTP response object. 71 | * @param body - The JSON response body. 72 | */ 73 | function (error, response, body) { 74 | console.log(body); 75 | }); 76 | ``` 77 | 78 | ## Author 79 | 80 | Built by the team at [API Engine](http://apiengine.io). 81 | 82 | Contact: thomasalwyndavis@gmail.com 83 | 84 | Clicky 85 | -------------------------------------------------------------------------------- /lib/pin.js: -------------------------------------------------------------------------------- 1 | const got = require('got'); 2 | 3 | const liveUrl = 'https://api.pinpayments.com'; 4 | const testUrl = 'https://test-api.pinpayments.com'; 5 | 6 | var Pin = function(options) { 7 | 8 | const client = got.extend({ 9 | prefixUrl: options.url, 10 | headers: { 'user-agent': 'pinjs (https://github.com/thomasdavis/pinjs)' }, 11 | username: options.key, 12 | responseType: 'json' 13 | }); 14 | 15 | this.createCard = function(fields, callback) { 16 | client.post('/1/cards', { json: fields }) 17 | .then(response => callback(null, response, response.body)) 18 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 19 | }; 20 | 21 | this.createCustomer = function(fields, callback) { 22 | client.post('/1/customers', { json: fields }) 23 | .then(response => callback(null, response, response.body)) 24 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 25 | }; 26 | 27 | this.retrieveCustomer = function(token, callback) { 28 | client.get(`/1/customers/${token}`) 29 | .then(response => callback(null, response, response.body)) 30 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 31 | }; 32 | 33 | this.createCustomerCard = function(token, fields, callback) { 34 | client.post(`/1/customers/${token}/cards`, { json: fields }) 35 | .then(response => callback(null, response, response.body)) 36 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 37 | }; 38 | 39 | this.retrieveCustomerCards = function(token, callback) { 40 | client.get(`/1/customers/${token}/cards`) 41 | .then(response => callback(null, response, response.body)) 42 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 43 | } 44 | 45 | this.refundCharge = function(chargeId, fields, callback) { 46 | client.post(`/1/charges/${chargeId}/refunds`, { json: fields }) 47 | .then(response => callback(null, response, response.body)) 48 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 49 | }; 50 | 51 | this.retrieveChargeRefunds = function(chargeId, callback) { 52 | client.get(`/1/charges/${chargeId}/refunds`) 53 | .then(response => callback(null, response, response.body)) 54 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 55 | }; 56 | 57 | this.retrieveCharge = function(chargeId, callback) { 58 | client.get(`/1/charges/${chargeId}`) 59 | .then(response => callback(null, response, response.body)) 60 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 61 | }; 62 | 63 | this.createCharge = function(fields, callback) { 64 | client.post('/1/charges', { json: fields }) 65 | .then(response => callback(null, response, response.body)) 66 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 67 | }; 68 | 69 | //Recipients 70 | this.createRecipient = function(fields, callback) { 71 | client.post('/1/recipients', { json: fields }) 72 | .then(response => callback(null, response, response.body)) 73 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 74 | } 75 | 76 | this.getRecipientsList = function(callback) { 77 | client.get('/1/recipients') 78 | .then(response => callback(null, response, response.body)) 79 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 80 | } 81 | 82 | this.getRecipientData = function(token, callback) { 83 | client.get(`/1/recipients/${token}`) 84 | .then(response => callback(null, response, response.body)) 85 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 86 | } 87 | 88 | this.updateRecipientData = function(token, fields, callback) { 89 | client.put(`/1/recipients/${token}`, { json: fields }) 90 | .then(response => callback(null, response, response.body)) 91 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 92 | } 93 | 94 | this.getRecipientTransfers = function(token, callback) { 95 | client.get(`/1/recipients/${token}/transfers`) 96 | .then(response => callback(null, response, response.body)) 97 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 98 | } 99 | 100 | this.createTransfer = function(fields, callback) { 101 | client.post('/1/transfers', { json: fields }) 102 | .then(response => callback(null, response, response.body)) 103 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 104 | } 105 | 106 | this.getTransfersList = function(callback) { 107 | client.get('/1/transfers') 108 | .then(response => callback(null, response, response.body)) 109 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 110 | } 111 | 112 | this.getTransferDetails = function(transferToken, callback) { 113 | client.get(`/1/transfers/${transferToken}`) 114 | .then(response => callback(null, response, response.body)) 115 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 116 | } 117 | 118 | this.getTransferLineItems = function(transferToken, callback) { 119 | client.get(`/1/transfers/${transferToken}/line_items`) 120 | .then(response => callback(null, response, response.body)) 121 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 122 | } 123 | 124 | this.captureCharge = function(nonCapturedToken, callback) { 125 | client.put(`/1/charges/${nonCapturedToken}/capture`) 126 | .then(response => callback(null, response, response.body)) 127 | .catch(error => callback(error, error.response, error.response ? error.response.body : null)); 128 | } 129 | }; 130 | 131 | var setup = function (options) { 132 | options.url = liveUrl; 133 | if(!options.production) { 134 | options.url = testUrl; 135 | } 136 | var pin = new Pin(options); 137 | return pin; 138 | }; 139 | 140 | exports.setup = setup; 141 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | var Pin = require('../'); 2 | var _ = require('underscore'); 3 | var chai = require('chai'); 4 | var expect = chai.expect; 5 | var moment = require('moment'); 6 | chai.use(require('chai-things')); 7 | 8 | var key = 'lLlpdn5KOO-vusSMnBYq_A'; 9 | var pin = Pin.setup({ 10 | key: key, 11 | production: false 12 | }); 13 | 14 | var nextYear = moment().add(1, "year").format("YYYY"); 15 | 16 | var testChargeToken, testCustomerToken, testCardToken, testRecipient, testTransfer; 17 | var nonCapturedCharge; 18 | 19 | if(key.length > 0) { 20 | 21 | describe('Create a card', function () { 22 | it('should return successfully', function (done) { 23 | pin.createCard({ 24 | number: 5520000000000000, 25 | expiry_month: '05', 26 | expiry_year: nextYear, 27 | cvc: 519, 28 | name: 'Roland Robot', 29 | address_line1: '42 Sevenoaks St', 30 | address_city: 'Lathlain', 31 | address_postcode: 6454, 32 | address_state: 'WA', 33 | address_country: 'AU' 34 | }, function (err,res,body) { 35 | if (err) { 36 | console.error(err, res, body); 37 | throw err 38 | }; 39 | testCardToken = body.response.token; 40 | done(); 41 | }); 42 | 43 | }); 44 | }); 45 | 46 | describe('Create a charge', function () { 47 | it('should return successfully', function (done) { 48 | pin.createCharge({ 49 | amount: 400, 50 | description: 'test charge', 51 | email: 'roland@pinpayments.com', 52 | ip_address: '203.192.1.172', 53 | card: { 54 | number: 5520000000000000, 55 | expiry_month: '05', 56 | expiry_year: nextYear, 57 | cvc: 123, 58 | name: 'Roland Robot', 59 | address_line1: '42 Sevenoaks St', 60 | address_city: 'Lathlain', 61 | address_postcode: 6454, 62 | address_state: 'WA', 63 | address_country: 'AU' 64 | } 65 | }, function (err,res,body) { 66 | if (err) { 67 | console.error(err, res, body); 68 | throw err 69 | }; 70 | testChargeToken = body.response.token; 71 | done(); 72 | }); 73 | }); 74 | }); 75 | 76 | describe('Create a charge and not capture', function () { 77 | it('should return successfully', function (done) { 78 | pin.createCharge({ 79 | amount: 400, 80 | currency: "AUD", 81 | description: 'test charge', 82 | email: 'roland@pinpayments.com', 83 | ip_address: '203.192.1.172', 84 | capture: false, 85 | card: { 86 | number: 5520000000000000, 87 | expiry_month: '05', 88 | expiry_year: nextYear, 89 | cvc: 123, 90 | name: 'Roland Robot', 91 | address_line1: '42 Sevenoaks St', 92 | address_line2: "", 93 | address_city: 'Lathlain', 94 | address_postcode: 6454, 95 | address_state: 'WA', 96 | address_country: 'Australia' 97 | } 98 | }, function (err,res,body) { 99 | if (err) { 100 | console.error(err, res, body); 101 | throw err 102 | }; 103 | nonCapturedCharge = body.response.token; 104 | done(); 105 | }); 106 | }); 107 | }); 108 | 109 | describe('Create a customer', function () { 110 | it('should return successfully', function (done) { 111 | pin.createCustomer({ 112 | email: 'roland@pinpayments.com', 113 | card: { 114 | number: 5520000000000000, 115 | expiry_month: '05', 116 | expiry_year: nextYear, 117 | cvc: 123, 118 | name: 'Roland Robot', 119 | address_line1: '42 Sevenoaks St', 120 | address_city: 'Lathlain', 121 | address_postcode: 6454, 122 | address_state: 'WA', 123 | address_country: 'AU' 124 | } 125 | }, function (err,res,body) { 126 | if (err) { 127 | console.error(err, res, body); 128 | throw err 129 | }; 130 | testCustomerToken = body.response.token; 131 | done(); 132 | }) 133 | }); 134 | }); 135 | 136 | describe('Retrieve a customer', function () { 137 | it('should return successfully', function (done) { 138 | pin.retrieveCustomer(testCustomerToken, function (err,res,body) { 139 | if (err) { throw err } 140 | done(); 141 | }); 142 | }); 143 | }); 144 | 145 | describe('Retrieve customer cards', function () { 146 | it('should return successfully', function (done) { 147 | pin.retrieveCustomerCards(testCustomerToken, function(err, res, body) { 148 | if (err) { 149 | console.log(err); 150 | throw err 151 | } 152 | expect(res.statusCode).to.eq(200); 153 | expect(res.headers['content-type']).to.equal('application/json; charset=utf-8'); 154 | expect(body.response[0].token).to.match(/card_(\w+)/); 155 | expect(body.response[0].scheme).to.match(/master|visa/); 156 | expect(body.response[0].customer_token).to.match(/cus_(\w+)/); 157 | done(); 158 | }); 159 | }); 160 | }); 161 | 162 | describe('Add a customer card', function () { 163 | it('should return successfully', function (done) { 164 | var otherCard = { 165 | number: 372000000000000, 166 | expiry_month: '11', 167 | expiry_year: nextYear, 168 | cvc: 1234, 169 | name: 'Roland Robot', 170 | address_line1: '42 Sevenoaks St', 171 | address_city: 'Lathlain', 172 | address_postcode: 6454, 173 | address_state: 'WA', 174 | address_country: 'AU' 175 | }; 176 | pin.createCustomerCard(testCustomerToken, otherCard, function (err,res,body) { 177 | if (err) { throw err }; 178 | expect(res.statusCode).to.equal(201); // Created 179 | expect(body.response.customer_token).to.equal(testCustomerToken); 180 | done(); 181 | }); 182 | }); 183 | }); 184 | 185 | describe('Refund a charge', function () { 186 | it('should return successfully', function (done) { 187 | pin.refundCharge(testChargeToken, { 188 | amount: 400 189 | }, function (err,res,body) { 190 | if (err) { throw err }; 191 | done(); 192 | }); 193 | }); 194 | }); 195 | 196 | describe('Retrieve a charge', function () { 197 | it('should return successfully', function (done) { 198 | pin.retrieveCharge(testChargeToken, function (err,res) { 199 | if (err) { throw err }; 200 | done(); 201 | }); 202 | }); 203 | }); 204 | 205 | describe('Create a charge using a card token', function () { 206 | it('should return successfully', function (done) { 207 | pin.createCharge({ 208 | amount: 400, 209 | description: 'test charge', 210 | email: 'roland@pinpayments.com', 211 | ip_address: '203.192.1.172', 212 | card_token: testCardToken 213 | }, function (err,res) { 214 | if (err) { throw err }; 215 | done(); 216 | }); 217 | }); 218 | }); 219 | 220 | describe('Create a charge using a customer token', function () { 221 | it('should return successfully', function (done) { 222 | pin.createCharge({ 223 | amount: 400, 224 | description: 'test charge', 225 | email: 'roland@pinpayments.com', 226 | ip_address: '203.192.1.172', 227 | customer_token: testCustomerToken 228 | }, function (err,res) { 229 | if (err) { throw err }; 230 | done(); 231 | }); 232 | }); 233 | }); 234 | 235 | describe('Create a customer using a card token', function () { 236 | it('should return successfully', function (done) { 237 | pin.createCard({ 238 | number: 5520000000000000, 239 | expiry_month: '05', 240 | expiry_year: nextYear, 241 | cvc: 519, 242 | name: 'Roland Robot', 243 | address_line1: '42 Sevenoaks St', 244 | address_city: 'Lathlain', 245 | address_postcode: 6454, 246 | address_state: 'WA', 247 | address_country: 'AU' 248 | }, function (err,res,body) { 249 | testCardToken = body.response.token; 250 | pin.createCustomer({ 251 | email: 'roland@pinpayments.com', 252 | card_token: testCardToken 253 | }, function (err,res) { 254 | if (err) { throw err }; 255 | done(); 256 | }); 257 | }); 258 | 259 | }); 260 | }); 261 | 262 | describe('Create recipient', function(){ 263 | it('should return successfully', function(done){ 264 | testRecipient = { 265 | email : 'dino@thefat.com', 266 | name : 'Fat Dinosaur', 267 | bank_account : { 268 | "name": "Mr Fat Dinosaur", 269 | "bsb": "342088", 270 | "number": "987654321" 271 | } 272 | } 273 | pin.createRecipient(testRecipient,function(err,res,body){ 274 | if(err) {throw err}; 275 | testRecipient = body.response; 276 | done(); 277 | }); 278 | }); 279 | }); 280 | 281 | describe('Create recipient with incorrect BSB', function() { 282 | it('should return a validation error', function(done) { 283 | recipientWrongBsb = { 284 | email : 'dino@thefat.com', 285 | name : 'Fat Dinosaur', 286 | bank_account : { 287 | "name": "Mr Fat Dinosaur", 288 | "bsb": "123456", 289 | "number": "987654321" 290 | } 291 | } 292 | pin.createRecipient(recipientWrongBsb, function(err, res, body) { 293 | if (err) { 294 | expect(res.statusCode).to.equal(422); 295 | expect(body.error).to.equal('invalid_resource'); 296 | expect(body.error_description).to.equal('One or more parameters were missing or invalid'); 297 | expect(body.messages[0].param).to.equal('bank_account'); 298 | expect(body.messages[0].code).to.equal('bank_account_invalid'); 299 | expect(body.messages[0].message).to.equal('Bank account is invalid'); 300 | done(); 301 | } else { 302 | throw 'Expecting an error'; 303 | }; 304 | }); 305 | }); 306 | }); 307 | 308 | describe('Get recipient data', function(){ 309 | it('should return successfully',function(done){ 310 | pin.getRecipientData(testRecipient.token, function(err,res,body){ 311 | if(err) {throw err}; 312 | if(JSON.stringify(body.response) !== JSON.stringify(testRecipient)) {throw new Error('get recipient data failed')} 313 | done(); 314 | }); 315 | }) 316 | }); 317 | 318 | describe('Get recipients list', function(){ 319 | it('should return successfully', function(done){ 320 | pin.getRecipientsList(function(err,res){ 321 | if(err) { throw err } 322 | done(); 323 | }); 324 | }); 325 | }); 326 | 327 | describe('Get recipient transfers', function(){ 328 | it('should return successfully', function(done){ 329 | pin.getRecipientTransfers(testRecipient.token, function(err,res){ 330 | if(err) {throw err}; 331 | done(); 332 | }); 333 | }); 334 | }); 335 | 336 | describe('Update recipient data', function(){ 337 | it('should update email', function(done){ 338 | pin.updateRecipientData(testRecipient.token,{email : 'test@test.com'},function(err,res,body){ 339 | if(err) {throw err}; 340 | expect(body.response.email).to.equal('test@test.com'); 341 | done(); 342 | }); 343 | }); 344 | it('should update recipient name', function(done){ 345 | pin.updateRecipientData(testRecipient.token,{name : 'slim pterodactyl'},function(err,res,body){ 346 | if(err) {throw err}; 347 | expect(body.response.name).to.equal('slim pterodactyl'); 348 | done(); 349 | }); 350 | }); 351 | it('should update recipient bank account', function(done){ 352 | var bankUpdate = {"name": "Mr Roland Robot","bsb": "342088","number": "987654321"}; 353 | pin.updateRecipientData(testRecipient.token,{bank_account: bankUpdate},function(err,res,body){ 354 | if(err) {throw err }; 355 | expect(body.response.bank_account.name).to.equal(bankUpdate.name); 356 | expect(body.response.bank_account.bsb).to.equal(bankUpdate.bsb); 357 | done(); 358 | }); 359 | }); 360 | }); 361 | 362 | describe('Create transfer', function(){ 363 | it('should return successfully', function(done){ 364 | pin.createTransfer({ 365 | description : "test transfer", 366 | amount : 10, 367 | currency : "AUD", 368 | recipient : testRecipient.token 369 | },function(err,res,body){ 370 | if(err) {throw err}; 371 | testTransfer = body.response; 372 | done(); 373 | }); 374 | }); 375 | }); 376 | 377 | describe('Get all transfers', function(){ 378 | it('should return array of transfers', function(done){ 379 | pin.getTransfersList(function(err,res){ 380 | if(err) {throw err}; 381 | done(); 382 | }); 383 | }); 384 | }); 385 | 386 | describe('Get transfer details', function(){ 387 | it('should return successfully', function(done){ 388 | pin.getTransferDetails(testTransfer.token,function(err,res){ 389 | if(err) {throw err}; 390 | done(); 391 | }); 392 | }); 393 | }); 394 | 395 | describe('Get transfer line items', function(){ 396 | it('should return successfully', function(done){ 397 | pin.getTransferLineItems(testTransfer.token, function(err,res){ 398 | if(err) {throw err}; 399 | done(); 400 | }); 401 | }); 402 | }); 403 | 404 | describe('Capture a charge', function () { 405 | it('should capture a non captured charge', function (done) { 406 | pin.captureCharge(nonCapturedCharge, function (err, res) { 407 | if(err) {throw err}; 408 | done(); 409 | }) 410 | }) 411 | }) 412 | 413 | } else{ 414 | describe('You will need a valid api key to run tests', function () { 415 | it('should return successfully', function () { 416 | return true; 417 | }); 418 | }); 419 | } 420 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@sindresorhus/is@^2.0.0": 6 | version "2.1.1" 7 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-2.1.1.tgz#ceff6a28a5b4867c2dd4a1ba513de278ccbe8bb1" 8 | 9 | "@szmarczak/http-timer@^4.0.0": 10 | version "4.0.5" 11 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152" 12 | dependencies: 13 | defer-to-connect "^2.0.0" 14 | 15 | "@types/cacheable-request@^6.0.1": 16 | version "6.0.1" 17 | resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" 18 | dependencies: 19 | "@types/http-cache-semantics" "*" 20 | "@types/keyv" "*" 21 | "@types/node" "*" 22 | "@types/responselike" "*" 23 | 24 | "@types/http-cache-semantics@*": 25 | version "4.0.0" 26 | resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a" 27 | 28 | "@types/keyv@*", "@types/keyv@^3.1.1": 29 | version "3.1.1" 30 | resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7" 31 | dependencies: 32 | "@types/node" "*" 33 | 34 | "@types/node@*": 35 | version "13.13.4" 36 | resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.4.tgz#1581d6c16e3d4803eb079c87d4ac893ee7501c2c" 37 | 38 | "@types/responselike@*": 39 | version "1.0.0" 40 | resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" 41 | dependencies: 42 | "@types/node" "*" 43 | 44 | ansi-colors@3.2.3: 45 | version "3.2.3" 46 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" 47 | 48 | ansi-regex@^3.0.0: 49 | version "3.0.1" 50 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" 51 | 52 | ansi-regex@^4.1.0: 53 | version "4.1.0" 54 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 55 | 56 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 57 | version "3.2.1" 58 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 59 | dependencies: 60 | color-convert "^1.9.0" 61 | 62 | anymatch@~3.1.1: 63 | version "3.1.1" 64 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 65 | dependencies: 66 | normalize-path "^3.0.0" 67 | picomatch "^2.0.4" 68 | 69 | argparse@^1.0.7: 70 | version "1.0.10" 71 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 72 | dependencies: 73 | sprintf-js "~1.0.2" 74 | 75 | assertion-error@^1.0.1: 76 | version "1.0.2" 77 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" 78 | 79 | balanced-match@^1.0.0: 80 | version "1.0.0" 81 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 82 | 83 | binary-extensions@^2.0.0: 84 | version "2.0.0" 85 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" 86 | 87 | brace-expansion@^1.1.7: 88 | version "1.1.11" 89 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 90 | dependencies: 91 | balanced-match "^1.0.0" 92 | concat-map "0.0.1" 93 | 94 | braces@~3.0.2: 95 | version "3.0.2" 96 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 97 | dependencies: 98 | fill-range "^7.0.1" 99 | 100 | browser-stdout@1.3.1: 101 | version "1.3.1" 102 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 103 | 104 | cacheable-lookup@^2.0.0: 105 | version "2.0.1" 106 | resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-2.0.1.tgz#87be64a18b925234875e10a9bb1ebca4adce6b38" 107 | dependencies: 108 | "@types/keyv" "^3.1.1" 109 | keyv "^4.0.0" 110 | 111 | cacheable-request@^7.0.1: 112 | version "7.0.1" 113 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58" 114 | dependencies: 115 | clone-response "^1.0.2" 116 | get-stream "^5.1.0" 117 | http-cache-semantics "^4.0.0" 118 | keyv "^4.0.0" 119 | lowercase-keys "^2.0.0" 120 | normalize-url "^4.1.0" 121 | responselike "^2.0.0" 122 | 123 | camelcase@^5.0.0: 124 | version "5.3.1" 125 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 126 | 127 | chai-things@^0.2.0: 128 | version "0.2.0" 129 | resolved "https://registry.yarnpkg.com/chai-things/-/chai-things-0.2.0.tgz#c55128378f9bb399e994f00052151984ed6ebe70" 130 | 131 | chai@^3.5.0: 132 | version "3.5.0" 133 | resolved "https://registry.yarnpkg.com/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" 134 | dependencies: 135 | assertion-error "^1.0.1" 136 | deep-eql "^0.1.3" 137 | type-detect "^1.0.0" 138 | 139 | chalk@^2.4.2: 140 | version "2.4.2" 141 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 142 | dependencies: 143 | ansi-styles "^3.2.1" 144 | escape-string-regexp "^1.0.5" 145 | supports-color "^5.3.0" 146 | 147 | chokidar@3.3.0: 148 | version "3.3.0" 149 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" 150 | dependencies: 151 | anymatch "~3.1.1" 152 | braces "~3.0.2" 153 | glob-parent "~5.1.0" 154 | is-binary-path "~2.1.0" 155 | is-glob "~4.0.1" 156 | normalize-path "~3.0.0" 157 | readdirp "~3.2.0" 158 | optionalDependencies: 159 | fsevents "~2.1.1" 160 | 161 | cliui@^5.0.0: 162 | version "5.0.0" 163 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 164 | dependencies: 165 | string-width "^3.1.0" 166 | strip-ansi "^5.2.0" 167 | wrap-ansi "^5.1.0" 168 | 169 | clone-response@^1.0.2: 170 | version "1.0.2" 171 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" 172 | dependencies: 173 | mimic-response "^1.0.0" 174 | 175 | color-convert@^1.9.0: 176 | version "1.9.3" 177 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 178 | dependencies: 179 | color-name "1.1.3" 180 | 181 | color-name@1.1.3: 182 | version "1.1.3" 183 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 184 | 185 | concat-map@0.0.1: 186 | version "0.0.1" 187 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 188 | 189 | debug@3.2.6: 190 | version "3.2.6" 191 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 192 | dependencies: 193 | ms "^2.1.1" 194 | 195 | decamelize@^1.2.0: 196 | version "1.2.0" 197 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 198 | 199 | decompress-response@^5.0.0: 200 | version "5.0.0" 201 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-5.0.0.tgz#7849396e80e3d1eba8cb2f75ef4930f76461cb0f" 202 | dependencies: 203 | mimic-response "^2.0.0" 204 | 205 | deep-eql@^0.1.3: 206 | version "0.1.3" 207 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" 208 | dependencies: 209 | type-detect "0.1.1" 210 | 211 | defer-to-connect@^2.0.0: 212 | version "2.0.0" 213 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" 214 | 215 | define-properties@^1.1.2, define-properties@^1.1.3: 216 | version "1.1.3" 217 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 218 | dependencies: 219 | object-keys "^1.0.12" 220 | 221 | diff@3.5.0: 222 | version "3.5.0" 223 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 224 | 225 | duplexer3@^0.1.4: 226 | version "0.1.4" 227 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 228 | 229 | emoji-regex@^7.0.1: 230 | version "7.0.3" 231 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 232 | 233 | end-of-stream@^1.1.0: 234 | version "1.4.4" 235 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 236 | dependencies: 237 | once "^1.4.0" 238 | 239 | es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: 240 | version "1.17.5" 241 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" 242 | dependencies: 243 | es-to-primitive "^1.2.1" 244 | function-bind "^1.1.1" 245 | has "^1.0.3" 246 | has-symbols "^1.0.1" 247 | is-callable "^1.1.5" 248 | is-regex "^1.0.5" 249 | object-inspect "^1.7.0" 250 | object-keys "^1.1.1" 251 | object.assign "^4.1.0" 252 | string.prototype.trimleft "^2.1.1" 253 | string.prototype.trimright "^2.1.1" 254 | 255 | es-to-primitive@^1.2.1: 256 | version "1.2.1" 257 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 258 | dependencies: 259 | is-callable "^1.1.4" 260 | is-date-object "^1.0.1" 261 | is-symbol "^1.0.2" 262 | 263 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 264 | version "1.0.5" 265 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 266 | 267 | esprima@^4.0.0: 268 | version "4.0.1" 269 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 270 | 271 | fill-range@^7.0.1: 272 | version "7.0.1" 273 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 274 | dependencies: 275 | to-regex-range "^5.0.1" 276 | 277 | find-up@3.0.0, find-up@^3.0.0: 278 | version "3.0.0" 279 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 280 | dependencies: 281 | locate-path "^3.0.0" 282 | 283 | flat@^4.1.0: 284 | version "4.1.0" 285 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 286 | dependencies: 287 | is-buffer "~2.0.3" 288 | 289 | fs.realpath@^1.0.0: 290 | version "1.0.0" 291 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 292 | 293 | fsevents@~2.1.1: 294 | version "2.1.3" 295 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" 296 | 297 | function-bind@^1.1.1: 298 | version "1.1.1" 299 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 300 | 301 | get-caller-file@^2.0.1: 302 | version "2.0.5" 303 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 304 | 305 | get-stream@^5.0.0, get-stream@^5.1.0: 306 | version "5.1.0" 307 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9" 308 | dependencies: 309 | pump "^3.0.0" 310 | 311 | glob-parent@~5.1.0: 312 | version "5.1.2" 313 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 314 | dependencies: 315 | is-glob "^4.0.1" 316 | 317 | glob@7.1.3: 318 | version "7.1.3" 319 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 320 | dependencies: 321 | fs.realpath "^1.0.0" 322 | inflight "^1.0.4" 323 | inherits "2" 324 | minimatch "^3.0.4" 325 | once "^1.3.0" 326 | path-is-absolute "^1.0.0" 327 | 328 | got@^10.7.0: 329 | version "10.7.0" 330 | resolved "https://registry.yarnpkg.com/got/-/got-10.7.0.tgz#62889dbcd6cca32cd6a154cc2d0c6895121d091f" 331 | dependencies: 332 | "@sindresorhus/is" "^2.0.0" 333 | "@szmarczak/http-timer" "^4.0.0" 334 | "@types/cacheable-request" "^6.0.1" 335 | cacheable-lookup "^2.0.0" 336 | cacheable-request "^7.0.1" 337 | decompress-response "^5.0.0" 338 | duplexer3 "^0.1.4" 339 | get-stream "^5.0.0" 340 | lowercase-keys "^2.0.0" 341 | mimic-response "^2.1.0" 342 | p-cancelable "^2.0.0" 343 | p-event "^4.0.0" 344 | responselike "^2.0.0" 345 | to-readable-stream "^2.0.0" 346 | type-fest "^0.10.0" 347 | 348 | growl@1.10.5: 349 | version "1.10.5" 350 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 351 | 352 | has-flag@^3.0.0: 353 | version "3.0.0" 354 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 355 | 356 | has-symbols@^1.0.0, has-symbols@^1.0.1: 357 | version "1.0.1" 358 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 359 | 360 | has@^1.0.3: 361 | version "1.0.3" 362 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 363 | dependencies: 364 | function-bind "^1.1.1" 365 | 366 | he@1.2.0: 367 | version "1.2.0" 368 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 369 | 370 | http-cache-semantics@^4.0.0: 371 | version "4.1.0" 372 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" 373 | 374 | inflight@^1.0.4: 375 | version "1.0.6" 376 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 377 | dependencies: 378 | once "^1.3.0" 379 | wrappy "1" 380 | 381 | inherits@2: 382 | version "2.0.4" 383 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 384 | 385 | is-binary-path@~2.1.0: 386 | version "2.1.0" 387 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 388 | dependencies: 389 | binary-extensions "^2.0.0" 390 | 391 | is-buffer@~2.0.3: 392 | version "2.0.4" 393 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" 394 | 395 | is-callable@^1.1.4, is-callable@^1.1.5: 396 | version "1.1.5" 397 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" 398 | 399 | is-date-object@^1.0.1: 400 | version "1.0.2" 401 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 402 | 403 | is-extglob@^2.1.1: 404 | version "2.1.1" 405 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 406 | 407 | is-fullwidth-code-point@^2.0.0: 408 | version "2.0.0" 409 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 410 | 411 | is-glob@^4.0.1, is-glob@~4.0.1: 412 | version "4.0.1" 413 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 414 | dependencies: 415 | is-extglob "^2.1.1" 416 | 417 | is-number@^7.0.0: 418 | version "7.0.0" 419 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 420 | 421 | is-regex@^1.0.5: 422 | version "1.0.5" 423 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" 424 | dependencies: 425 | has "^1.0.3" 426 | 427 | is-symbol@^1.0.2: 428 | version "1.0.3" 429 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 430 | dependencies: 431 | has-symbols "^1.0.1" 432 | 433 | isexe@^2.0.0: 434 | version "2.0.0" 435 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 436 | 437 | js-yaml@3.13.1: 438 | version "3.13.1" 439 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 440 | dependencies: 441 | argparse "^1.0.7" 442 | esprima "^4.0.0" 443 | 444 | json-buffer@3.0.1: 445 | version "3.0.1" 446 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 447 | 448 | keyv@^4.0.0: 449 | version "4.0.0" 450 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.0.tgz#2d1dab694926b2d427e4c74804a10850be44c12f" 451 | dependencies: 452 | json-buffer "3.0.1" 453 | 454 | locate-path@^3.0.0: 455 | version "3.0.0" 456 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 457 | dependencies: 458 | p-locate "^3.0.0" 459 | path-exists "^3.0.0" 460 | 461 | lodash@^4.17.15: 462 | version "4.17.21" 463 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 464 | 465 | log-symbols@3.0.0: 466 | version "3.0.0" 467 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" 468 | dependencies: 469 | chalk "^2.4.2" 470 | 471 | lowercase-keys@^2.0.0: 472 | version "2.0.0" 473 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" 474 | 475 | mimic-response@^1.0.0: 476 | version "1.0.1" 477 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" 478 | 479 | mimic-response@^2.0.0, mimic-response@^2.1.0: 480 | version "2.1.0" 481 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" 482 | 483 | minimatch@3.0.4, minimatch@^3.0.4: 484 | version "3.0.4" 485 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 486 | dependencies: 487 | brace-expansion "^1.1.7" 488 | 489 | minimist@^1.2.5: 490 | version "1.2.6" 491 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" 492 | 493 | mkdirp@0.5.5: 494 | version "0.5.5" 495 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 496 | dependencies: 497 | minimist "^1.2.5" 498 | 499 | mocha@^7.1.1: 500 | version "7.1.2" 501 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" 502 | dependencies: 503 | ansi-colors "3.2.3" 504 | browser-stdout "1.3.1" 505 | chokidar "3.3.0" 506 | debug "3.2.6" 507 | diff "3.5.0" 508 | escape-string-regexp "1.0.5" 509 | find-up "3.0.0" 510 | glob "7.1.3" 511 | growl "1.10.5" 512 | he "1.2.0" 513 | js-yaml "3.13.1" 514 | log-symbols "3.0.0" 515 | minimatch "3.0.4" 516 | mkdirp "0.5.5" 517 | ms "2.1.1" 518 | node-environment-flags "1.0.6" 519 | object.assign "4.1.0" 520 | strip-json-comments "2.0.1" 521 | supports-color "6.0.0" 522 | which "1.3.1" 523 | wide-align "1.1.3" 524 | yargs "13.3.2" 525 | yargs-parser "13.1.2" 526 | yargs-unparser "1.6.0" 527 | 528 | moment@^2.13.0: 529 | version "2.29.2" 530 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.2.tgz#00910c60b20843bcba52d37d58c628b47b1f20e4" 531 | 532 | ms@2.1.1: 533 | version "2.1.1" 534 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 535 | 536 | ms@^2.1.1: 537 | version "2.1.2" 538 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 539 | 540 | node-environment-flags@1.0.6: 541 | version "1.0.6" 542 | resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" 543 | dependencies: 544 | object.getownpropertydescriptors "^2.0.3" 545 | semver "^5.7.0" 546 | 547 | normalize-path@^3.0.0, normalize-path@~3.0.0: 548 | version "3.0.0" 549 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 550 | 551 | normalize-url@^4.1.0: 552 | version "4.5.1" 553 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" 554 | 555 | object-inspect@^1.7.0: 556 | version "1.7.0" 557 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 558 | 559 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 560 | version "1.1.1" 561 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 562 | 563 | object.assign@4.1.0, object.assign@^4.1.0: 564 | version "4.1.0" 565 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 566 | dependencies: 567 | define-properties "^1.1.2" 568 | function-bind "^1.1.1" 569 | has-symbols "^1.0.0" 570 | object-keys "^1.0.11" 571 | 572 | object.getownpropertydescriptors@^2.0.3: 573 | version "2.1.0" 574 | resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" 575 | dependencies: 576 | define-properties "^1.1.3" 577 | es-abstract "^1.17.0-next.1" 578 | 579 | once@^1.3.0, once@^1.3.1, once@^1.4.0: 580 | version "1.4.0" 581 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 582 | dependencies: 583 | wrappy "1" 584 | 585 | p-cancelable@^2.0.0: 586 | version "2.0.0" 587 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e" 588 | 589 | p-event@^4.0.0: 590 | version "4.1.0" 591 | resolved "https://registry.yarnpkg.com/p-event/-/p-event-4.1.0.tgz#e92bb866d7e8e5b732293b1c8269d38e9982bf8e" 592 | dependencies: 593 | p-timeout "^2.0.1" 594 | 595 | p-finally@^1.0.0: 596 | version "1.0.0" 597 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 598 | 599 | p-limit@^2.0.0: 600 | version "2.3.0" 601 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 602 | dependencies: 603 | p-try "^2.0.0" 604 | 605 | p-locate@^3.0.0: 606 | version "3.0.0" 607 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 608 | dependencies: 609 | p-limit "^2.0.0" 610 | 611 | p-timeout@^2.0.1: 612 | version "2.0.1" 613 | resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" 614 | dependencies: 615 | p-finally "^1.0.0" 616 | 617 | p-try@^2.0.0: 618 | version "2.2.0" 619 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 620 | 621 | path-exists@^3.0.0: 622 | version "3.0.0" 623 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 624 | 625 | path-is-absolute@^1.0.0: 626 | version "1.0.1" 627 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 628 | 629 | picomatch@^2.0.4: 630 | version "2.2.2" 631 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 632 | 633 | pump@^3.0.0: 634 | version "3.0.0" 635 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" 636 | dependencies: 637 | end-of-stream "^1.1.0" 638 | once "^1.3.1" 639 | 640 | readdirp@~3.2.0: 641 | version "3.2.0" 642 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" 643 | dependencies: 644 | picomatch "^2.0.4" 645 | 646 | require-directory@^2.1.1: 647 | version "2.1.1" 648 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 649 | 650 | require-main-filename@^2.0.0: 651 | version "2.0.0" 652 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 653 | 654 | responselike@^2.0.0: 655 | version "2.0.0" 656 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723" 657 | dependencies: 658 | lowercase-keys "^2.0.0" 659 | 660 | semver@^5.7.0: 661 | version "5.7.1" 662 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 663 | 664 | set-blocking@^2.0.0: 665 | version "2.0.0" 666 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 667 | 668 | sprintf-js@~1.0.2: 669 | version "1.0.3" 670 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 671 | 672 | "string-width@^1.0.2 || 2": 673 | version "2.1.1" 674 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 675 | dependencies: 676 | is-fullwidth-code-point "^2.0.0" 677 | strip-ansi "^4.0.0" 678 | 679 | string-width@^3.0.0, string-width@^3.1.0: 680 | version "3.1.0" 681 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 682 | dependencies: 683 | emoji-regex "^7.0.1" 684 | is-fullwidth-code-point "^2.0.0" 685 | strip-ansi "^5.1.0" 686 | 687 | string.prototype.trimend@^1.0.0: 688 | version "1.0.1" 689 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 690 | dependencies: 691 | define-properties "^1.1.3" 692 | es-abstract "^1.17.5" 693 | 694 | string.prototype.trimleft@^2.1.1: 695 | version "2.1.2" 696 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" 697 | dependencies: 698 | define-properties "^1.1.3" 699 | es-abstract "^1.17.5" 700 | string.prototype.trimstart "^1.0.0" 701 | 702 | string.prototype.trimright@^2.1.1: 703 | version "2.1.2" 704 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" 705 | dependencies: 706 | define-properties "^1.1.3" 707 | es-abstract "^1.17.5" 708 | string.prototype.trimend "^1.0.0" 709 | 710 | string.prototype.trimstart@^1.0.0: 711 | version "1.0.1" 712 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 713 | dependencies: 714 | define-properties "^1.1.3" 715 | es-abstract "^1.17.5" 716 | 717 | strip-ansi@^4.0.0: 718 | version "4.0.0" 719 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 720 | dependencies: 721 | ansi-regex "^3.0.0" 722 | 723 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 724 | version "5.2.0" 725 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 726 | dependencies: 727 | ansi-regex "^4.1.0" 728 | 729 | strip-json-comments@2.0.1: 730 | version "2.0.1" 731 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 732 | 733 | supports-color@6.0.0: 734 | version "6.0.0" 735 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" 736 | dependencies: 737 | has-flag "^3.0.0" 738 | 739 | supports-color@^5.3.0: 740 | version "5.5.0" 741 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 742 | dependencies: 743 | has-flag "^3.0.0" 744 | 745 | to-readable-stream@^2.0.0: 746 | version "2.1.0" 747 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-2.1.0.tgz#82880316121bea662cdc226adb30addb50cb06e8" 748 | 749 | to-regex-range@^5.0.1: 750 | version "5.0.1" 751 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 752 | dependencies: 753 | is-number "^7.0.0" 754 | 755 | type-detect@0.1.1: 756 | version "0.1.1" 757 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" 758 | 759 | type-detect@^1.0.0: 760 | version "1.0.0" 761 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" 762 | 763 | type-fest@^0.10.0: 764 | version "0.10.0" 765 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.10.0.tgz#7f06b2b9fbfc581068d1341ffabd0349ceafc642" 766 | 767 | underscore@~1.12.1: 768 | version "1.12.1" 769 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.12.1.tgz#7bb8cc9b3d397e201cf8553336d262544ead829e" 770 | 771 | which-module@^2.0.0: 772 | version "2.0.0" 773 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 774 | 775 | which@1.3.1: 776 | version "1.3.1" 777 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 778 | dependencies: 779 | isexe "^2.0.0" 780 | 781 | wide-align@1.1.3: 782 | version "1.1.3" 783 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 784 | dependencies: 785 | string-width "^1.0.2 || 2" 786 | 787 | wrap-ansi@^5.1.0: 788 | version "5.1.0" 789 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 790 | dependencies: 791 | ansi-styles "^3.2.0" 792 | string-width "^3.0.0" 793 | strip-ansi "^5.0.0" 794 | 795 | wrappy@1: 796 | version "1.0.2" 797 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 798 | 799 | y18n@^4.0.0: 800 | version "4.0.1" 801 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" 802 | 803 | yargs-parser@13.1.2, yargs-parser@^13.1.2: 804 | version "13.1.2" 805 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 806 | dependencies: 807 | camelcase "^5.0.0" 808 | decamelize "^1.2.0" 809 | 810 | yargs-unparser@1.6.0: 811 | version "1.6.0" 812 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" 813 | dependencies: 814 | flat "^4.1.0" 815 | lodash "^4.17.15" 816 | yargs "^13.3.0" 817 | 818 | yargs@13.3.2, yargs@^13.3.0: 819 | version "13.3.2" 820 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 821 | dependencies: 822 | cliui "^5.0.0" 823 | find-up "^3.0.0" 824 | get-caller-file "^2.0.1" 825 | require-directory "^2.1.1" 826 | require-main-filename "^2.0.0" 827 | set-blocking "^2.0.0" 828 | string-width "^3.0.0" 829 | which-module "^2.0.0" 830 | y18n "^4.0.0" 831 | yargs-parser "^13.1.2" 832 | --------------------------------------------------------------------------------