Comparing version 0.3.13 to 0.3.14
@@ -14,9 +14,7 @@ 'use strict'; | ||
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } | ||
function authentication(clientId, secret, logger) { | ||
var credentials = { | ||
const credentials = { | ||
client: { | ||
id: clientId, | ||
secret: secret | ||
secret | ||
}, | ||
@@ -29,9 +27,9 @@ auth: { | ||
}; | ||
var instance = _simpleOauth2.default.create(credentials); | ||
const instance = _simpleOauth2.default.create(credentials); | ||
return { | ||
credentials: credentials, | ||
instance: instance, | ||
credentials, | ||
instance, | ||
getAccessCodeUri: function getAccessCodeUri(redirectUri) { | ||
var authorizationUri = this.instance.authorizationCode.authorizeURL({ | ||
getAccessCodeUri(redirectUri) { | ||
const authorizationUri = this.instance.authorizationCode.authorizeURL({ | ||
redirect_uri: redirectUri, | ||
@@ -43,34 +41,14 @@ scope: 'CompanyFile' | ||
}, | ||
refresh: function refresh(currentToken) { | ||
var _this = this; | ||
return _asyncToGenerator(regeneratorRuntime.mark(function _callee() { | ||
var token, result; | ||
return regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
logger.info('refreshing token', currentToken); | ||
async refresh(currentToken) { | ||
logger.info('refreshing token', currentToken); | ||
token = _this.instance.accessToken.create(currentToken); | ||
_context.next = 4; | ||
return token.refresh(); | ||
case 4: | ||
result = _context.sent; | ||
return _context.abrupt('return', result.token); | ||
case 6: | ||
case 'end': | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, _this); | ||
}))(); | ||
const token = this.instance.accessToken.create(currentToken); | ||
const result = await token.refresh(); | ||
return result.token; | ||
}, | ||
getToken: function getToken(code, redirectUri) { | ||
var _this2 = this; | ||
var params = { | ||
code: code, | ||
getToken(code, redirectUri) { | ||
const params = { | ||
code, | ||
'Content-Type': 'application/x-www-form-urlencoded', | ||
@@ -84,7 +62,5 @@ redirect_uri: redirectUri, | ||
return this.instance.authorizationCode.getToken(params).then(function (result) { | ||
return _this2.instance.accessToken.create(result); | ||
}); | ||
return this.instance.authorizationCode.getToken(params).then(result => this.instance.accessToken.create(result)); | ||
} | ||
}; | ||
} |
@@ -7,4 +7,2 @@ 'use strict'; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
var _axios = require('axios'); | ||
@@ -14,2 +12,6 @@ | ||
var _nullLogger = require('null-logger'); | ||
var _nullLogger2 = _interopRequireDefault(_nullLogger); | ||
var _rate_limit = require('./interceptors/rate_limit'); | ||
@@ -29,40 +31,16 @@ | ||
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } | ||
const pack = require('../package'); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
const MYOB_BASE = 'https://api.myob.com/accountright/'; | ||
var pack = require('../package'); | ||
// FIXME: /info is on the root of the host | ||
// we really need both apiBase and companyFileUrl | ||
var Client = function () { | ||
function Client(_ref) { | ||
var _this = this; | ||
var clientId = _ref.clientId, | ||
secret = _ref.secret, | ||
_ref$token = _ref.token, | ||
token = _ref$token === undefined ? {} : _ref$token, | ||
logger = _ref.logger, | ||
_ref$callback = _ref.callback, | ||
callback = _ref$callback === undefined ? _asyncToGenerator(regeneratorRuntime.mark(function _callee() { | ||
return regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
case 'end': | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, _this); | ||
})) : _ref$callback, | ||
username = _ref.username, | ||
password = _ref.password, | ||
_ref$timeout = _ref.timeout, | ||
timeout = _ref$timeout === undefined ? 5000 : _ref$timeout, | ||
_ref$apiBase = _ref.apiBase, | ||
apiBase = _ref$apiBase === undefined ? 'https://api.myob.com/accountright/' : _ref$apiBase; | ||
_classCallCheck(this, Client); | ||
class Client { | ||
constructor({ clientId = null, | ||
secret = null, | ||
token = {}, logger = _nullLogger2.default, callback = async () => {}, username, password, | ||
timeout = 5000, apiBase = MYOB_BASE }) { | ||
this.apiBase = apiBase; | ||
this.token = token; | ||
this.token = token || {}; | ||
this.logger = logger; | ||
@@ -80,103 +58,80 @@ this.callback = callback; | ||
_createClass(Client, [{ | ||
key: 'getInstance', | ||
value: function getInstance(root) { | ||
this.logger.info('Request Headers', this.getHeaders(root)); | ||
getInstance(root) { | ||
const headers = this.getHeaders(root); | ||
this.logger.info('Request Headers', headers); | ||
var instance = this.adapter.create({ | ||
baseURL: this.apiBase, | ||
timeout: this.timeout, | ||
responseType: 'json', | ||
headers: this.getHeaders(root) | ||
}); | ||
const instance = this.adapter.create({ | ||
baseURL: this.apiBase, | ||
timeout: this.timeout, | ||
responseType: 'json', | ||
headers: headers | ||
}); | ||
(0, _rate_limit2.default)(instance, 5); | ||
(0, _rate_limit2.default)(instance, 5); | ||
if (this.clientId) { | ||
(0, _expired_token2.default)(instance, this, 2); | ||
return instance; | ||
} | ||
}, { | ||
key: 'getHeaders', | ||
value: function getHeaders() { | ||
var root = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; | ||
var headers = { | ||
'x-myobapi-key': this.clientId, | ||
'x-myobapi-version': 'v2', | ||
'User-Agent': 'Ordermentum MYOB Client ' + pack.version, | ||
Authorization: 'Bearer ' + this.token.access_token | ||
}; | ||
return instance; | ||
} | ||
if (!root) { | ||
headers['x-myobapi-cftoken'] = this.getUserToken(); | ||
} | ||
getHeaders(root = false) { | ||
const headers = { | ||
'x-myobapi-version': 'v2', | ||
'User-Agent': `Ordermentum MYOB Client ${pack.version}` | ||
}; | ||
return headers; | ||
if (this.clientId) { | ||
headers['x-myobapi-key'] = this.clientId; | ||
headers.Authorization = `Bearer ${this.token.access_token}`; | ||
} | ||
}, { | ||
key: 'getCompanyFiles', | ||
value: function getCompanyFiles() { | ||
return this.getInstance(true).get('https://api.myob.com/accountright/').then(function (response) { | ||
return response.data; | ||
}); | ||
} | ||
}, { | ||
key: 'getUserToken', | ||
value: function getUserToken() { | ||
return new Buffer(this.username + ':' + this.password).toString('base64'); | ||
} | ||
}, { | ||
key: 'get', | ||
value: function get() { | ||
var _instance; | ||
return (_instance = this.instance).get.apply(_instance, arguments).then(function (r) { | ||
return r.data; | ||
}); | ||
if (!root) { | ||
headers['x-myobapi-cftoken'] = this.getUserToken(); | ||
} | ||
}, { | ||
key: 'post', | ||
value: function post() { | ||
var _instance2; | ||
return (_instance2 = this.instance).post.apply(_instance2, arguments).then(function (r) { | ||
return r.data; | ||
}); | ||
} | ||
}, { | ||
key: 'patch', | ||
value: function patch() { | ||
var _instance3; | ||
return headers; | ||
} | ||
return (_instance3 = this.instance).patch.apply(_instance3, arguments).then(function (r) { | ||
return r.data; | ||
}); | ||
get authentication() { | ||
if (!this.clientId) { | ||
return null; | ||
} | ||
}, { | ||
key: 'put', | ||
value: function put() { | ||
var _instance4; | ||
return (_instance4 = this.instance).put.apply(_instance4, arguments).then(function (r) { | ||
return r.data; | ||
}); | ||
} | ||
}, { | ||
key: 'delete', | ||
value: function _delete() { | ||
var _instance5; | ||
return (0, _authentication2.default)(this.clientId, this.secret, this.logger); | ||
} | ||
return (_instance5 = this.instance).delete.apply(_instance5, arguments).then(function (r) { | ||
return r.data; | ||
}); | ||
} | ||
}, { | ||
key: 'authentication', | ||
get: function get() { | ||
return (0, _authentication2.default)(this.clientId, this.secret, this.logger); | ||
} | ||
}]); | ||
getCompanyFiles() { | ||
return this.getInstance(true).get(this.apiBase).then(response => response.data); | ||
} | ||
return Client; | ||
}(); | ||
getInfo() { | ||
return this.getInstance(true).get('/info').then(response => response.data); | ||
} | ||
getUserToken() { | ||
return new Buffer(`${this.username}:${this.password}`).toString('base64'); | ||
} | ||
get(...args) { | ||
return this.instance.get(...args).then(r => r.data); | ||
} | ||
post(...args) { | ||
return this.instance.post(...args).then(r => r.data); | ||
} | ||
patch(...args) { | ||
return this.instance.patch(...args).then(r => r.data); | ||
} | ||
put(...args) { | ||
return this.instance.put(...args).then(r => r.data); | ||
} | ||
delete(...args) { | ||
return this.instance.delete(...args).then(r => r.data); | ||
} | ||
} | ||
exports.default = Client; |
@@ -23,35 +23,33 @@ 'use strict'; | ||
function createClient(_ref) { | ||
var clientId = _ref.clientId, | ||
secret = _ref.secret, | ||
_ref$token = _ref.token, | ||
token = _ref$token === undefined ? {} : _ref$token, | ||
_ref$logger = _ref.logger, | ||
logger = _ref$logger === undefined ? _nullLogger2.default : _ref$logger, | ||
username = _ref.username, | ||
password = _ref.password, | ||
_ref$timeout = _ref.timeout, | ||
timeout = _ref$timeout === undefined ? 5000 : _ref$timeout, | ||
_ref$apiBase = _ref.apiBase, | ||
apiBase = _ref$apiBase === undefined ? 'https://api.myob.com/accountright/' : _ref$apiBase; | ||
function createClient({ | ||
clientId, | ||
secret, | ||
token = {}, | ||
logger = _nullLogger2.default, | ||
username, | ||
password, | ||
timeout = 5000, | ||
apiBase = 'https://api.myob.com/accountright/' | ||
}) { | ||
const client = new _client2.default({ | ||
clientId, | ||
username, | ||
password, | ||
secret, | ||
token, | ||
apiBase, | ||
timeout, | ||
logger }); | ||
var client = new _client2.default({ | ||
clientId: clientId, | ||
username: username, | ||
password: password, | ||
secret: secret, | ||
token: token, | ||
apiBase: apiBase, | ||
timeout: timeout, | ||
logger: logger }); | ||
return { | ||
client: client, | ||
client, | ||
accounts: _resources2.default.accounts(client), | ||
inventoryItems: _resources2.default.inventoryItems(client), | ||
invoiceItems: _resources2.default.invoiceItems(client), | ||
getCompanyFiles: function getCompanyFiles() { | ||
getCompanyFiles() { | ||
return client.getCompanyFiles(); | ||
}, | ||
getInfo() { | ||
return client.getInfo(); | ||
}, | ||
contactCustomers: _resources2.default.contactCustomers(client), | ||
@@ -58,0 +56,0 @@ employees: _resources2.default.employees(client), |
@@ -7,85 +7,34 @@ 'use strict'; | ||
exports.default = expiredToken; | ||
function expiredToken(instance, client, retries = 5) { | ||
return instance.interceptors.response.use(null, async error => { | ||
const config = error.config; | ||
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } | ||
if (!config) { | ||
return Promise.reject(error); | ||
} | ||
function expiredToken(instance, client) { | ||
var _this = this; | ||
config.expiredTokenRetry = config.expiredTokenRetry || 0; | ||
const accessDenied = error.data && error.data.Message && error.data.Message === 'Access denied'; | ||
const canTry = !config.expiredTokenRetry || config.expiredTokenRetry < retries; | ||
var retries = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5; | ||
if (error.code !== 'ECONNABORTED' && !accessDenied && error.response.status === 401 && canTry) { | ||
config.expiredTokenRetry += 1; | ||
return instance.interceptors.response.use(null, function () { | ||
var _ref = _asyncToGenerator(regeneratorRuntime.mark(function _callee(error) { | ||
var config, accessDenied, canTry, token; | ||
return regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
config = error.config; | ||
if (config) { | ||
_context.next = 3; | ||
break; | ||
} | ||
return _context.abrupt('return', Promise.reject(error)); | ||
case 3: | ||
config.expiredTokenRetry = config.expiredTokenRetry || 0; | ||
accessDenied = error.data && error.data.Message && error.data.Message === 'Access denied'; | ||
canTry = !config.expiredTokenRetry || config.expiredTokenRetry < retries; | ||
if (!(error.code !== 'ECONNABORTED' && !accessDenied && error.response.status === 401 && canTry)) { | ||
_context.next = 28; | ||
break; | ||
} | ||
config.expiredTokenRetry += 1; | ||
_context.prev = 8; | ||
_context.next = 11; | ||
return client.authentication.refresh(client.token); | ||
case 11: | ||
token = _context.sent; | ||
_context.prev = 12; | ||
_context.next = 15; | ||
return client.callback(token); | ||
case 15: | ||
_context.next = 20; | ||
break; | ||
case 17: | ||
_context.prev = 17; | ||
_context.t0 = _context['catch'](12); | ||
client.logger.error(_context.t0); | ||
case 20: | ||
config.headers.Authorization = 'Bearer ' + token.access_token; | ||
return _context.abrupt('return', instance(config)); | ||
case 24: | ||
_context.prev = 24; | ||
_context.t1 = _context['catch'](8); | ||
client.logger.error('could not refresh token', _context.t1, error); | ||
return _context.abrupt('return', Promise.reject(_context.t1)); | ||
case 28: | ||
return _context.abrupt('return', Promise.reject(error)); | ||
case 29: | ||
case 'end': | ||
return _context.stop(); | ||
} | ||
try { | ||
const token = await client.authentication.refresh(client.token); | ||
try { | ||
await client.callback(token); | ||
} catch (e) { | ||
client.logger.error(e); | ||
} | ||
}, _callee, _this, [[8, 24], [12, 17]]); | ||
})); | ||
config.headers.Authorization = `Bearer ${token.access_token}`; | ||
return instance(config); | ||
} catch (e) { | ||
client.logger.error('could not refresh token', e, error); | ||
return Promise.reject(e); | ||
} | ||
} | ||
return function (_x2) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}()); | ||
return Promise.reject(error); | ||
}); | ||
} |
@@ -14,9 +14,6 @@ 'use strict'; | ||
function rateLimit(instance) { | ||
var retries = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 5; | ||
var wait = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1000; | ||
function rateLimit(instance, retries = 5, wait = 1000) { | ||
return instance.interceptors.response.use(null, error => { | ||
const config = error.config; | ||
return instance.interceptors.response.use(null, function (error) { | ||
var config = error.config; | ||
if (!config) { | ||
@@ -27,3 +24,3 @@ return Promise.reject(error); | ||
config.rateRetryRequest = config.rateRetryRequest || 0; | ||
var canTry = !config.rateRetryRequest || config.rateRetryRequest < retries; | ||
const canTry = !config.rateRetryRequest || config.rateRetryRequest < retries; | ||
@@ -43,4 +40,4 @@ if (error.code !== 'ECONNABORTED' && error.response.status === 403 && canTry) { | ||
return new Promise(function (resolve) { | ||
setTimeout(function () { | ||
return new Promise(resolve => { | ||
setTimeout(() => { | ||
resolve(instance(config)); | ||
@@ -47,0 +44,0 @@ }, wait); |
@@ -16,2 +16,5 @@ 'use strict'; | ||
invoiceItems: (0, _resource2.default)('/Sale/Invoice/Item', 'Items'), | ||
invoiceServices: (0, _resource2.default)('/Sale/Invoice/Service', 'Items'), | ||
orderItems: (0, _resource2.default)('/Sale/Order/Item', 'Items'), | ||
orderServices: (0, _resource2.default)('/Sale/Order/Service', 'Items'), | ||
contactCustomers: (0, _resource2.default)('/Contact/Customer', 'Items'), | ||
@@ -18,0 +21,0 @@ employees: (0, _resource2.default)('/Contact/Employee', 'Items'), |
@@ -8,54 +8,41 @@ 'use strict'; | ||
function resource(path, name) { | ||
return function (client) { | ||
return { | ||
path: path, | ||
client: client, | ||
name: name, | ||
return client => ({ | ||
path, | ||
client, | ||
name, | ||
findAll: function findAll() { | ||
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, | ||
_ref$filter = _ref.filter, | ||
filter = _ref$filter === undefined ? null : _ref$filter, | ||
_ref$orderBy = _ref.orderBy, | ||
orderBy = _ref$orderBy === undefined ? null : _ref$orderBy, | ||
_ref$top = _ref.top, | ||
top = _ref$top === undefined ? 400 : _ref$top, | ||
_ref$skip = _ref.skip, | ||
skip = _ref$skip === undefined ? 0 : _ref$skip; | ||
findAll({ filter = null, | ||
orderBy = null, top = 400, skip = 0 } = {}) { | ||
client.logger.info('findAll', { path: this.path, filter, orderBy, top, skip }); | ||
return client.get(this.path, { params: { $filter: filter, $orderby: orderBy, $top: top, $skip: skip } }).then(response => response[name]); | ||
}, | ||
client.logger.info('findAll', { path: this.path, filter: filter, orderBy: orderBy, top: top, skip: skip }); | ||
return client.get(this.path, { params: { $filter: filter, $orderby: orderBy, $top: top, $skip: skip } }).then(function (response) { | ||
return response[name]; | ||
}); | ||
}, | ||
findOne: function findOne() { | ||
return this.findAll.apply(this, arguments).then(function (items) { | ||
return items[0]; | ||
}); | ||
}, | ||
findById: function findById(id) { | ||
client.logger.info('findById', { path: this.path, id: id }); | ||
return client.get(this.path + '/' + id); | ||
}, | ||
get: function get() { | ||
return this.findbyId.apply(this, arguments); | ||
}, | ||
create: function create() { | ||
var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; | ||
findOne(...args) { | ||
return this.findAll(...args).then(items => items[0]); | ||
}, | ||
client.logger.info('create', { path: this.path, params: params }); | ||
return client.post(this.path, params); | ||
}, | ||
destroy: function destroy(id) { | ||
client.logger.info('destory', { path: this.path, id: id }); | ||
return client.delete(this.path + '/' + id); | ||
}, | ||
update: function update(id) { | ||
var params = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; | ||
findById(id) { | ||
client.logger.info('findById', { path: this.path, id }); | ||
return client.get(`${this.path}/${id}`); | ||
}, | ||
client.logger.info('update', { path: this.path, id: id, params: params }); | ||
return client.put(this.path + '/' + id, params); | ||
} | ||
}; | ||
}; | ||
get(...args) { | ||
return this.findbyId(...args); | ||
}, | ||
create(params = {}) { | ||
client.logger.info('create', { path: this.path, params }); | ||
return client.post(this.path, params); | ||
}, | ||
destroy(id) { | ||
client.logger.info('destory', { path: this.path, id }); | ||
return client.delete(`${this.path}/${id}`); | ||
}, | ||
update(id, params = {}) { | ||
client.logger.info('update', { path: this.path, id, params }); | ||
return client.put(`${this.path}/${id}`, params); | ||
} | ||
}); | ||
} |
{ | ||
"name": "myob", | ||
"version": "0.3.13", | ||
"version": "0.3.14", | ||
"main": "lib/index.js", | ||
@@ -38,3 +38,5 @@ "repository": "git@github.com:ordermentum/myob-javascript-sdk.git", | ||
"babel-plugin-transform-runtime": "^6.22.0", | ||
"babel-preset-env": "^1.4.0", | ||
"babel-preset-es2015": "^6.22.0", | ||
"babel-preset-flow": "^6.23.0", | ||
"babel-preset-stage-1": "^6.22.0", | ||
@@ -51,4 +53,4 @@ "babel-register": "^6.22.0", | ||
"nyc": "^10.1.2", | ||
"sinon": "^1.17.7" | ||
"sinon": "^2.1.0" | ||
} | ||
} |
# MYOB AccountRight 2.0 Javascript SDK | ||
[![npm version](https://badge.fury.io/js/myob.svg)](https://badge.fury.io/js/myob) | ||
[![Build Status](https://travis-ci.org/ordermentum/myob-javascript-sdk.svg?branch=master)](https://travis-ci.org/ordermentum/myob-javascript-sdk) | ||
[![dependencies Status](https://david-dm.org/ordermentum/myob-javascript-sdk/status.svg)](https://david-dm.org/ordermentum/myob-javascript-sdk) | ||
[![devDependencies Status](https://david-dm.org/ordermentum/steveo/dev-status.svg)](https://david-dm.org/ordermentum/myob-javascript-sdk?type=dev) | ||
[![npm](https://img.shields.io/npm/l/myob.svg)](https://www.npmjs.com/package/myob) | ||
[![npm](https://img.shields.io/npm/dt/myob.svg)](https://www.npmjs.com/package/myob) | ||
@@ -11,2 +17,5 @@ MYOB AccountRight 2.0 SDK (unofficial) for Node.js. | ||
* /Sale/Invoice/Item | ||
* /Sale/Invoice/Service | ||
* /Sale/Order/Item | ||
* /Sale/Order/Service | ||
* /Contact/Customer | ||
@@ -13,0 +22,0 @@ * /Contact/Employee |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
45
25724
22
10
320
1