nordnet-next-api
Advanced tools
Comparing version 2.1.0 to 2.2.0
@@ -35,7 +35,6 @@ 'use strict'; | ||
function initResponses() { | ||
sandbox.server.respondWith('/next/2/accounts', JSON.stringify([{ accno: 123 }])); | ||
sandbox.server.respondWith('/next/2/accounts/123', JSON.stringify({ accno: 123 })); | ||
sandbox.server.respondWith('/next/2/accounts', [200, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, JSON.stringify([{ accno: 123 }])]); | ||
sandbox.server.respondWith('/next/2/accounts/123', [200, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, JSON.stringify({ accno: 123 })]); | ||
sandbox.server.respondWith('/next/2/accounts/456', [401, {}, '']); | ||
sandbox.server.respondWith('/next/2/instruments/123?positions=456,789&accno=987', JSON.stringify({ instrument_id: 123 })); | ||
sandbox.server.respondWith('/next/2/accounts/123', JSON.stringify({ accno: 123 })); | ||
sandbox.server.respondWith('GET', '/next/2/user/settings/foo', [204, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, '']); | ||
@@ -45,3 +44,3 @@ sandbox.server.respondWith('POST', '/next/2/user/settings/bar', [200, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, JSON.stringify([{ key: 'bar', value: { bar: 'bar' } }])]); | ||
sandbox.server.respondWith('DELETE', '/next/2/user/settings/bar', [200, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, '']); | ||
sandbox.server.respondWith('/next/2/news?days=0', JSON.stringify([{ news_id: 1 }])); | ||
sandbox.server.respondWith('/next/2/news?days=0', [200, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, JSON.stringify([{ news_id: 1 }])]); | ||
} | ||
@@ -48,0 +47,0 @@ |
@@ -19,8 +19,28 @@ 'use strict'; | ||
var _lodash = require('lodash'); | ||
var _lodashObjectMerge = require('lodash/object/merge'); | ||
var _lodash2 = _interopRequireDefault(_lodash); | ||
var _lodashObjectMerge2 = _interopRequireDefault(_lodashObjectMerge); | ||
var _lodashObjectOmit = require('lodash/object/omit'); | ||
var _lodashObjectOmit2 = _interopRequireDefault(_lodashObjectOmit); | ||
var _lodashObjectKeys = require('lodash/object/keys'); | ||
var _lodashObjectKeys2 = _interopRequireDefault(_lodashObjectKeys); | ||
var _lodashCollectionFind = require('lodash/collection/find'); | ||
var _lodashCollectionFind2 = _interopRequireDefault(_lodashCollectionFind); | ||
var _lodashLangIsPlainObject = require('lodash/lang/isPlainObject'); | ||
var _lodashLangIsPlainObject2 = _interopRequireDefault(_lodashLangIsPlainObject); | ||
_es6Promise2['default'].polyfill(); | ||
var HTTP_NO_CONTENT = 204; | ||
var HTTP_BAD_REQUEST = 400; | ||
var HTTP_OK = 200; | ||
var defaultHeaders = { | ||
@@ -30,3 +50,3 @@ Accept: 'application/json' | ||
var postDefaultHeaders = _lodash2['default'].merge({ | ||
var postDefaultHeaders = (0, _lodashObjectMerge2['default'])({ | ||
'Content-type': 'application/x-www-form-urlencoded' | ||
@@ -108,7 +128,7 @@ }, defaultHeaders); | ||
var path = buildPath(options.url, options.params); | ||
var params = buildParams(_lodash2['default'].omit(options.params, getPathParams(options.url))); | ||
var params = buildParams((0, _lodashObjectOmit2['default'])(options.params, getPathParams(options.url))); | ||
var query = hasQuery(options.method) ? params : undefined; | ||
var body = hasBody(options.method) ? params.join('&') : undefined; | ||
var headers = buildHeaders(options.method, options.headers); | ||
var body = buildBody(options.method, params, headers); | ||
@@ -124,13 +144,19 @@ var fetchUrl = buildUrl(path, query); | ||
return fetch(fetchUrl, fetchParams).then(validateStatus).then(saveNTag).then(toJSON); | ||
return fetch(fetchUrl, fetchParams).then(validateStatus).then(saveNTag).then(processResponse); | ||
} | ||
function validateStatus(response) { | ||
if (response.status >= 200 && response.status < 300) { | ||
return Promise.resolve(response); | ||
if (response.status < HTTP_BAD_REQUEST) { | ||
return response; | ||
} | ||
return Promise.reject(response); | ||
return toErrorResponse(response); | ||
} | ||
function toErrorResponse(response) { | ||
return parseContent(response).then(function (response) { | ||
return Promise.reject(response); | ||
}); | ||
} | ||
function saveNTag(response) { | ||
@@ -141,12 +167,23 @@ state.nTag = response.headers.get('ntag') || state.nTag; | ||
function toJSON(response) { | ||
if (response.status === 204) { | ||
function processResponse(response) { | ||
if (response.status === HTTP_NO_CONTENT) { | ||
return { status: response.status }; | ||
} | ||
return response.json().then(function (json) { | ||
return { status: response.status, data: json }; | ||
return parseContent(response); | ||
} | ||
function parseContent(response) { | ||
var contentType = response.headers.get('Content-type'); | ||
var method = isJSON(contentType) ? 'json' : 'text'; | ||
return response[method]().then(function (data) { | ||
return { data: data, status: response.status }; | ||
}); | ||
} | ||
function isJSON(contentType) { | ||
return contains('application/json')(contentType); | ||
} | ||
function validateUrl(url) { | ||
@@ -205,10 +242,23 @@ if (!url) { | ||
if (method === 'post' || method === 'put') { | ||
return _lodash2['default'].merge({ ntag: state.nTag }, postDefaultHeaders, headers); | ||
return (0, _lodashObjectMerge2['default'])({ ntag: state.nTag }, postDefaultHeaders, headers); | ||
} else if (method === 'delete') { | ||
return _lodash2['default'].merge({ ntag: state.nTag }, defaultHeaders, headers); | ||
return (0, _lodashObjectMerge2['default'])({ ntag: state.nTag }, defaultHeaders, headers); | ||
} | ||
return _lodash2['default'].merge({}, headers, defaultHeaders); | ||
return (0, _lodashObjectMerge2['default'])({}, headers, defaultHeaders); | ||
} | ||
function buildBody(method, params, headers) { | ||
if (!hasBody(method)) { | ||
return; | ||
} | ||
return isJsonContentType(headers) ? JSON.stringify(params) : params.join('&'); | ||
} | ||
function isJsonContentType(headers) { | ||
var contentType = (0, _lodashCollectionFind2['default'])((0, _lodashObjectKeys2['default'])(headers), contains('content-type')); | ||
return isJSON(headers[contentType]); | ||
} | ||
function uriEncode(value) { | ||
@@ -218,3 +268,3 @@ var encoded = undefined; | ||
encoded = value.join(','); | ||
} else if (_lodash2['default'].isPlainObject(value)) { | ||
} else if ((0, _lodashLangIsPlainObject2['default'])(value)) { | ||
encoded = JSON.stringify(value); | ||
@@ -234,2 +284,8 @@ } else { | ||
return method === 'post' || method === 'put'; | ||
} | ||
function contains(string) { | ||
return function (value) { | ||
return !!value && value.toLowerCase().indexOf(string) !== -1; | ||
}; | ||
} |
{ | ||
"name": "nordnet-next-api", | ||
"version": "2.1.0", | ||
"version": "2.2.0", | ||
"description": "Nordnet nExt API Javascript client", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
@@ -29,7 +29,6 @@ import 'test-helper'; | ||
function initResponses() { | ||
sandbox.server.respondWith('/next/2/accounts', JSON.stringify([{ accno: 123 }])); | ||
sandbox.server.respondWith('/next/2/accounts/123', JSON.stringify({ accno: 123 })); | ||
sandbox.server.respondWith('/next/2/accounts', [200, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, JSON.stringify([{ accno: 123 }])]); | ||
sandbox.server.respondWith('/next/2/accounts/123', [200, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, JSON.stringify({ accno: 123 })]); | ||
sandbox.server.respondWith('/next/2/accounts/456', [401, {}, '']); | ||
sandbox.server.respondWith('/next/2/instruments/123?positions=456,789&accno=987', JSON.stringify({ instrument_id: 123 })); | ||
sandbox.server.respondWith('/next/2/accounts/123', JSON.stringify({ accno: 123 })); | ||
sandbox.server.respondWith('GET', '/next/2/user/settings/foo', | ||
@@ -43,3 +42,3 @@ [204, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, '']); | ||
[200, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, '']); | ||
sandbox.server.respondWith('/next/2/news?days=0', JSON.stringify([{ news_id: 1 }])); | ||
sandbox.server.respondWith('/next/2/news?days=0', [200, { 'Content-Type': 'application/json; charset=UTF-8', ntag: ntag }, JSON.stringify([{ news_id: 1 }])]); | ||
} | ||
@@ -46,0 +45,0 @@ |
@@ -6,4 +6,13 @@ import es6Promise from 'es6-promise'; | ||
import 'isomorphic-fetch'; | ||
import _ from 'lodash'; | ||
import merge from 'lodash/object/merge'; | ||
import omit from 'lodash/object/omit'; | ||
import keys from 'lodash/object/keys'; | ||
import find from 'lodash/collection/find'; | ||
import isPlainObject from 'lodash/lang/isPlainObject'; | ||
const HTTP_NO_CONTENT = 204; | ||
const HTTP_BAD_REQUEST = 400; | ||
const HTTP_OK = 200; | ||
const defaultHeaders = { | ||
@@ -13,3 +22,3 @@ Accept: 'application/json', | ||
const postDefaultHeaders = _.merge({ | ||
const postDefaultHeaders = merge({ | ||
'Content-type': 'application/x-www-form-urlencoded', | ||
@@ -79,7 +88,7 @@ }, defaultHeaders); | ||
const path = buildPath(options.url, options.params); | ||
const params = buildParams(_.omit(options.params, getPathParams(options.url))); | ||
const params = buildParams(omit(options.params, getPathParams(options.url))); | ||
const query = hasQuery(options.method) ? params : undefined; | ||
const body = hasBody(options.method) ? params.join('&') : undefined; | ||
const headers = buildHeaders(options.method, options.headers); | ||
const body = buildBody(options.method, params, headers); | ||
@@ -98,13 +107,17 @@ const fetchUrl = buildUrl(path, query); | ||
.then(saveNTag) | ||
.then(toJSON); | ||
.then(processResponse); | ||
} | ||
function validateStatus(response) { | ||
if (response.status >= 200 && response.status < 300) { | ||
return Promise.resolve(response); | ||
if (response.status < HTTP_BAD_REQUEST) { | ||
return response; | ||
} | ||
return Promise.reject(response); | ||
return toErrorResponse(response); | ||
} | ||
function toErrorResponse(response) { | ||
return parseContent(response).then(response => Promise.reject(response)); | ||
} | ||
function saveNTag(response) { | ||
@@ -115,12 +128,21 @@ state.nTag = response.headers.get('ntag') || state.nTag; | ||
function toJSON(response) { | ||
if (response.status === 204) { | ||
function processResponse(response) { | ||
if (response.status === HTTP_NO_CONTENT) { | ||
return { status: response.status }; | ||
} | ||
return response.json().then(json => { | ||
return { status: response.status, data: json }; | ||
}); | ||
return parseContent(response); | ||
} | ||
function parseContent(response) { | ||
const contentType = response.headers.get('Content-type'); | ||
const method = isJSON(contentType) ? 'json' : 'text'; | ||
return response[method]().then(data => ({ data, status: response.status })); | ||
} | ||
function isJSON(contentType) { | ||
return contains('application/json')(contentType); | ||
} | ||
function validateUrl(url) { | ||
@@ -171,10 +193,23 @@ if (!url) { | ||
if (method === 'post' || method === 'put') { | ||
return _.merge({ ntag: state.nTag }, postDefaultHeaders, headers); | ||
return merge({ ntag: state.nTag }, postDefaultHeaders, headers); | ||
} else if (method === 'delete') { | ||
return _.merge({ ntag: state.nTag }, defaultHeaders, headers); | ||
return merge({ ntag: state.nTag }, defaultHeaders, headers); | ||
} | ||
return _.merge({}, headers, defaultHeaders); | ||
return merge({}, headers, defaultHeaders); | ||
} | ||
function buildBody(method, params, headers) { | ||
if (!hasBody(method)) { | ||
return; | ||
} | ||
return isJsonContentType(headers) ? JSON.stringify(params) : params.join('&'); | ||
} | ||
function isJsonContentType(headers) { | ||
const contentType = find(keys(headers), contains('content-type')); | ||
return isJSON(headers[contentType]); | ||
} | ||
function uriEncode(value) { | ||
@@ -184,3 +219,3 @@ let encoded; | ||
encoded = value.join(','); | ||
} else if (_.isPlainObject(value)) { | ||
} else if (isPlainObject(value)) { | ||
encoded = JSON.stringify(value); | ||
@@ -201,1 +236,7 @@ } else { | ||
} | ||
function contains(string) { | ||
return function(value) { | ||
return !!value && value.toLowerCase().indexOf(string) !== -1; | ||
}; | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
48910
1067