diff --git a/.eslintrc.json b/.eslintrc.json index eab735be..d5caf7c7 100755 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -6,7 +6,8 @@ "mocha": true }, "parserOptions": { - "sourceType": "module" + "sourceType": "module", + "ecmaVersion": 2018 }, "extends": "eslint:recommended", "rules": { diff --git a/API.md b/API.md index 23d6bd08..59e05ca4 100755 --- a/API.md +++ b/API.md @@ -45,11 +45,7 @@ ALKS JavaScript API ### alks.create(props) ⇒ [alks](#alks) -Returns a new instance of alks with pre-defined properties (which don't need to be supplied to every method). - -Any of the properties required by other methods can be specified here. - -Properties present on the current object are carried through to the newly created one. +Returns a new instance of alks with pre-defined properties (which don't need to be supplied to every method). Any of the properties required by other methods can be specified here. Properties present on the current object are carried through to the newly created one. **Kind**: instance method of [alks](#alks) **Params** @@ -58,18 +54,7 @@ Properties present on the current object are carried through to the newly create **Example** ```js -var myAlks = alks.create({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', -}) - -myAlks.getKeys({ - account: 'anAccount', - role: 'PowerUser', - sessionTime: 2 -}).then((creds) => { - // creds.accessKey, creds.secretKey, creds.sessionToken -}) +var myAlks = alks.create({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', }) myAlks.getKeys({ account: 'anAccount', role: 'PowerUser', sessionTime: 2 }).then((creds) => { // creds.accessKey, creds.secretKey, creds.sessionToken }) ``` @@ -85,12 +70,7 @@ Returns a Promise for an array of AWS accounts (and roles) accessible by the use **Example** ```js -alks.getAccounts({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', -}).then((accounts) => { - // accounts[0].account, accounts[0].role, accounts[0].iamKeyActive -}) +alks.getAccounts({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', }).then((accounts) => { // accounts[0].account, accounts[0].role, accounts[0].iamKeyActive }) ``` @@ -109,15 +89,7 @@ Returns a Promise for AWS STS credentials from ALKS. **Example** ```js -alks.getKeys({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', - account: 'anAccount', - role: 'PowerUser', - sessionTime: 2 -}).then((creds) => { - // creds.accessKey, creds.secretKey, creds.sessionToken -}) +alks.getKeys({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', account: 'anAccount', role: 'PowerUser', sessionTime: 2 }).then((creds) => { // creds.accessKey, creds.secretKey, creds.sessionToken }) ``` @@ -136,15 +108,7 @@ Returns a Promise for AWS STS credentials with IAM permissions from ALKS. **Example** ```js -alks.getIAMKeys({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', - account: 'anAccount', - role: 'IAMAdmin', - sessionTime: 1 -}).then((creds) => { - // creds.accessKey, creds.secretKey, creds.sessionToken -}) +alks.getIAMKeys({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', account: 'anAccount', role: 'IAMAdmin', sessionTime: 1 }).then((creds) => { // creds.accessKey, creds.secretKey, creds.sessionToken }) ``` @@ -160,12 +124,7 @@ Returns a Promise for an array of available AWS IAM role types **Example** ```js -alks.getAWSRoleTypes({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', -}).then((roleTypes) { - // ['AWS Lambda', 'Amazon EC2', ... ] -}) +alks.getAWSRoleTypes({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', }).then((roleTypes) { // ['AWS Lambda', 'Amazon EC2', ... ] }) ``` @@ -181,12 +140,7 @@ Returns a Promise for an array of available custom role types **Example** ```js -alks.getNonServiceAWSRoleTypes({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', -}).then((roleTypes) => { - // ['AWS Lambda', 'Amazon EC2', ...] -}) +alks.getNonServiceAWSRoleTypes({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', }).then((roleTypes) => { // ['AWS Lambda', 'Amazon EC2', ...] }) ``` @@ -207,17 +161,7 @@ Returns a Promise for the results of creating a new custom AWS IAM account role **Example** ```js -alks.createRole({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', - account: 'anAccount', - role: 'IAMAdmin', - roleName: 'awsRoleName', - roleType: 'Amazon EC2', - includeDefaultPolicy: 1 -}).then((role) => { - // role.roleArn, role.denyArns, role.instanceProfileArn, role.addedRoleToInstanceProfile -}) +alks.createRole({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', account: 'anAccount', role: 'IAMAdmin', roleName: 'awsRoleName', roleType: 'Amazon EC2', includeDefaultPolicy: 1 }).then((role) => { // role.roleArn, role.denyArns, role.instanceProfileArn, role.addedRoleToInstanceProfile }) ``` @@ -240,19 +184,7 @@ Returns a Promise for the results of creating a new custom AWS IAM trust role **Example** ```js -alks.createNonServiceRole({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', - account: 'anAccount', - role: 'IAMAdmin', - roleName: 'awsRoleName', - roleType: 'Amazon EC2', - includeDefaultPolicy: 1, - trustArn: 'anExistingRoleArn', - trustType: 'Cross Account' -}).then((role) => { - // role.roleArn, role.denyArns, role.instanceProfileArn, role.addedRoleToInstanceProfile -}) +alks.createNonServiceRole({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', account: 'anAccount', role: 'IAMAdmin', roleName: 'awsRoleName', roleType: 'Amazon EC2', includeDefaultPolicy: 1, trustArn: 'anExistingRoleArn', trustType: 'Cross Account' }).then((role) => { // role.roleArn, role.denyArns, role.instanceProfileArn, role.addedRoleToInstanceProfile }) ``` @@ -270,14 +202,7 @@ Returns a Promise for an array of AWS custom AWS IAM account roles **Example** ```js -alks.listAWSAccountRoles({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', - account: 'anAccount', - role: 'IAMAdmin', -}).then((roleNames) => { - // ['customRole1', 'customRole2', ...] -}) +alks.listAWSAccountRoles({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', account: 'anAccount', role: 'IAMAdmin', }).then((roleNames) => { // ['customRole1', 'customRole2', ...] }) ``` @@ -296,15 +221,7 @@ Returns a Promise for the Amazon Resource Name (ARN) of a custom AWS IAM account **Example** ```js -alks.getAccountRole({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', - account: 'anAccount', - role: 'IAMAdmin', - roleName: 'awsRoleName' -}).then((roleARN) => { - // arn:aws:iam::123:role/acct-managed/awsRoleName -}) +alks.getAccountRole({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', account: 'anAccount', role: 'IAMAdmin', roleName: 'awsRoleName' }).then((roleARN) => { // arn:aws:iam::123:role/acct-managed/awsRoleName }) ``` @@ -323,15 +240,7 @@ Returns a Promise for a boolean "true" indicating the role was deleted **Example** ```js -alks.deleteRole({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', - account: 'anAccount', - role: 'IAMAdmin', - roleName: 'awsRoleName' -}).then(() => { - // success! -}) +alks.deleteRole({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', account: 'anAccount', role: 'IAMAdmin', roleName: 'awsRoleName' }).then(() => { // success! }) ``` @@ -350,15 +259,7 @@ Returns a Promise for the results of creating new IAM user and long-term access **Example** ```js -alks.createAccessKeys({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', - account: 'anAccount', - role: 'IAMAdmin', - iamUserName: 'iamUserName' -}).then((user) => { - // user.iamUserArn, user.accessKey, user.secretKey, user.addedIAMUserToGroup -}) +alks.createAccessKeys({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', account: 'anAccount', role: 'IAMAdmin', iamUserName: 'iamUserName' }).then((user) => { // user.iamUserArn, user.accessKey, user.secretKey, user.addedIAMUserToGroup }) ``` @@ -377,15 +278,7 @@ Returns a Promise for a boolean "true" indicating the IAM user and long-term acc **Example** ```js -alks.deleteIAMUser({ - baseUrl: 'https://your.alks-host.com', - accessToken: 'abc123', - account: 'anAccount', - role: 'IAMAdmin', - iamUserName: 'iamUserName' -}).then(() => { - // success! -}) +alks.deleteIAMUser({ baseUrl: 'https://your.alks-host.com', accessToken: 'abc123', account: 'anAccount', role: 'IAMAdmin', iamUserName: 'iamUserName' }).then(() => { // success! }) ``` diff --git a/dist/alks.js b/dist/alks.js index f60681ea..868d9fe8 100644 --- a/dist/alks.js +++ b/dist/alks.js @@ -89,18 +89,16 @@ var alks = (function () { var response = ref[0]; var json = ref[1]; if (!response.ok) { - if (json && json.statusMessage && json.statusMessage !== 'Success') { - throw new Error(json.statusMessage) - } else if (json && json.errors && json.errors.length) { - throw new Error(json.errors[0]) - } else { - throw new Error(response.statusText) - } + throw new AlksError(response, json) } return(json) }) }; var pick = function (obj, props) { return props.reduce(function (a, e) { return (a[e] = obj[e], a); }, {}); }; + var AlksError = function (response, json) { return (Object.assign({}, {name: 'AlksError', + message: response.statusText, + status: response.status}, + json)); }; var alks$1 = new alks(); return alks$1; diff --git a/dist/alks.min.js b/dist/alks.min.js index 1c9f94d3..620ce249 100644 --- a/dist/alks.min.js +++ b/dist/alks.min.js @@ -1 +1 @@ -var alks=function(){"use strict";var n=window.fetch.bind(window),t=function(e,t){void 0===t&&(t={}),this.defaults=Object.assign({},t,{_fetch:n},e)};t.prototype.create=function(e){return new t(e,this.defaults)},t.prototype.getAccounts=function(e){return this._doFetch("getAccounts",e).then(function(t){return Object.keys(t.accountListRole).map(function(e){return{account:e,role:t.accountListRole[e][0].role,iamKeyActive:t.accountListRole[e][0].iamKeyActive}})})},t.prototype.getKeys=function(e){return this._doFetch("getKeys",e).then(function(e){return r(e,["accessKey","secretKey","sessionToken"])})},t.prototype.getIAMKeys=function(e){return this._doFetch("getIAMKeys",e).then(function(e){return r(e,["accessKey","secretKey","sessionToken"])})},t.prototype.getAWSRoleTypes=function(e){return this._doFetch("getAWSRoleTypes",e).then(function(e){return JSON.parse(e.roleTypes)})},t.prototype.getNonServiceAWSRoleTypes=function(e){return this._doFetch("getNonServiceAWSRoleTypes",e).then(function(e){return JSON.parse(e.roleTypes)})},t.prototype.createRole=function(e){return this._doFetch("createRole",e).then(function(e){return e.denyArns=e.denyArns.split(","),r(e,["roleArn","denyArns","instanceProfileArn","addedRoleToInstanceProfile"])})},t.prototype.createNonServiceRole=function(e){return this._doFetch("createNonServiceRole",e).then(function(e){return e.denyArns=e.denyArns.split(","),r(e,["roleArn","denyArns","instanceProfileArn","addedRoleToInstanceProfile"])})},t.prototype.listAWSAccountRoles=function(e){return this._doFetch("listAWSAccountRoles",e).then(function(e){return JSON.parse(e.jsonAWSRoleList).map(function(e){return e.split("/").slice(-1)[0]})})},t.prototype.getAccountRole=function(t){return this._doFetch("getAccountRole",t).then(function(e){if(!e.roleExists)throw new Error("Role "+t.roleName+" does not exist in this account");return e.roleARN})},t.prototype.deleteRole=function(e){return this._doFetch("deleteRole",e).then(function(){return!0})},t.prototype.createAccessKeys=function(e){return this._doFetch("accessKeys",e).then(function(e){return r(e,["iamUserArn","accessKey","secretKey","addedIAMUserToGroup"])})},t.prototype.deleteIAMUser=function(e){return this._doFetch("IAMUser",e,"DELETE").then(function(){return!0})},t.prototype._doFetch=function(e,t,n){void 0===t&&(t={}),void 0===n&&(n="POST");var r=Object.assign({},this.defaults,t),o={"Content-Type":"application/json"};r.accessToken&&(o.Authorization="Bearer "+r.accessToken,delete r.accessToken),(r.userid||r.password)&&console.error("The userid and password properties are deprecated and should be replaced with an access token");var s=r._fetch(r.baseUrl+"/"+e+"/",{method:n,headers:o,body:JSON.stringify(r)}),c=s.then(function(e){return e.json()}).catch(function(){});return Promise.all([s,c]).then(function(e){var t=e[0],n=e[1];if(!t.ok)throw n&&n.statusMessage&&"Success"!==n.statusMessage?new Error(n.statusMessage):n&&n.errors&&n.errors.length?new Error(n.errors[0]):new Error(t.statusText);return n})};var r=function(n,e){return e.reduce(function(e,t){return e[t]=n[t],e},{})};return new t}(); +var alks=function(){"use strict";var n=window.fetch.bind(window),t=function(e,t){void 0===t&&(t={}),this.defaults=Object.assign({},t,{_fetch:n},e)};t.prototype.create=function(e){return new t(e,this.defaults)},t.prototype.getAccounts=function(e){return this._doFetch("getAccounts",e).then(function(t){return Object.keys(t.accountListRole).map(function(e){return{account:e,role:t.accountListRole[e][0].role,iamKeyActive:t.accountListRole[e][0].iamKeyActive}})})},t.prototype.getKeys=function(e){return this._doFetch("getKeys",e).then(function(e){return o(e,["accessKey","secretKey","sessionToken"])})},t.prototype.getIAMKeys=function(e){return this._doFetch("getIAMKeys",e).then(function(e){return o(e,["accessKey","secretKey","sessionToken"])})},t.prototype.getAWSRoleTypes=function(e){return this._doFetch("getAWSRoleTypes",e).then(function(e){return JSON.parse(e.roleTypes)})},t.prototype.getNonServiceAWSRoleTypes=function(e){return this._doFetch("getNonServiceAWSRoleTypes",e).then(function(e){return JSON.parse(e.roleTypes)})},t.prototype.createRole=function(e){return this._doFetch("createRole",e).then(function(e){return e.denyArns=e.denyArns.split(","),o(e,["roleArn","denyArns","instanceProfileArn","addedRoleToInstanceProfile"])})},t.prototype.createNonServiceRole=function(e){return this._doFetch("createNonServiceRole",e).then(function(e){return e.denyArns=e.denyArns.split(","),o(e,["roleArn","denyArns","instanceProfileArn","addedRoleToInstanceProfile"])})},t.prototype.listAWSAccountRoles=function(e){return this._doFetch("listAWSAccountRoles",e).then(function(e){return JSON.parse(e.jsonAWSRoleList).map(function(e){return e.split("/").slice(-1)[0]})})},t.prototype.getAccountRole=function(t){return this._doFetch("getAccountRole",t).then(function(e){if(!e.roleExists)throw new Error("Role "+t.roleName+" does not exist in this account");return e.roleARN})},t.prototype.deleteRole=function(e){return this._doFetch("deleteRole",e).then(function(){return!0})},t.prototype.createAccessKeys=function(e){return this._doFetch("accessKeys",e).then(function(e){return o(e,["iamUserArn","accessKey","secretKey","addedIAMUserToGroup"])})},t.prototype.deleteIAMUser=function(e){return this._doFetch("IAMUser",e,"DELETE").then(function(){return!0})},t.prototype._doFetch=function(e,t,n){void 0===t&&(t={}),void 0===n&&(n="POST");var o=Object.assign({},this.defaults,t),r={"Content-Type":"application/json"};o.accessToken&&(r.Authorization="Bearer "+o.accessToken,delete o.accessToken),(o.userid||o.password)&&console.error("The userid and password properties are deprecated and should be replaced with an access token");var s=o._fetch(o.baseUrl+"/"+e+"/",{method:n,headers:r,body:JSON.stringify(o)}),c=s.then(function(e){return e.json()}).catch(function(){});return Promise.all([s,c]).then(function(e){var t=e[0],n=e[1];if(!t.ok)throw new i(t,n);return n})};var o=function(n,e){return e.reduce(function(e,t){return e[t]=n[t],e},{})},i=function(e,t){return Object.assign({},{name:"AlksError",message:e.statusText,status:e.status},t)};return new t}(); diff --git a/lib/alks.node.js b/lib/alks.node.js index b0ed3d52..89b5cb1f 100644 --- a/lib/alks.node.js +++ b/lib/alks.node.js @@ -410,13 +410,7 @@ class alks { return Promise.all([responsePromise, jsonPromise]).then(([response, json]) => { if (!response.ok) { - if (json && json.statusMessage && json.statusMessage !== 'Success') { - throw new Error(json.statusMessage) - } else if (json && json.errors && json.errors.length) { - throw new Error(json.errors[0]) - } else { - throw new Error(response.statusText) - } + throw new AlksError(response, json) } return(json) }) @@ -425,6 +419,13 @@ class alks { const pick = (obj, props) => props.reduce((a, e) => (a[e] = obj[e], a), {}); +const AlksError = (response, json) => ({ + name: 'AlksError', + message: response.statusText, + status: response.status, + ...json +}); + var alks$1 = new alks(); module.exports = alks$1; diff --git a/package-lock.json b/package-lock.json index 8ded83e4..dc9303f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -120,15 +120,15 @@ "dev": true }, "@types/node": { - "version": "10.9.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.9.3.tgz", - "integrity": "sha512-DOzWZKUnmFYG0KUOs+9HEBju2QhBU6oM2zeluunQNt0vnJvnkHvtDNlQPZDkTrkC5pZrNx1TPqeL137zciXZMQ==", + "version": "10.12.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", + "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", "dev": true }, "JSONStream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz", - "integrity": "sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { "jsonparse": "^1.2.0", @@ -170,16 +170,37 @@ } }, "acorn-node": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.5.2.tgz", - "integrity": "sha512-krFKvw/d1F17AN3XZbybIUzEY4YEPNiGo05AfP3dBlfVKrMHETKpgjpuZkSF8qDNt9UkQcqj7am8yJLseklCMg==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", + "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", "dev": true, "requires": { - "acorn": "^5.7.1", - "acorn-dynamic-import": "^3.0.0", + "acorn": "^6.0.2", + "acorn-dynamic-import": "^4.0.0", + "acorn-walk": "^6.1.0", "xtend": "^4.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true + } } }, + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", + "dev": true + }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -783,9 +804,9 @@ "dev": true }, "browserify": { - "version": "16.2.2", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.2.tgz", - "integrity": "sha512-fMES05wq1Oukts6ksGUU2TMVHHp06LyQt0SIwbXIHm7waSrQmNBZePsU0iM/4f94zbvb/wHma+D1YrdzWYnF/A==", + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", "dev": true, "requires": { "JSONStream": "^1.0.3", @@ -864,14 +885,15 @@ } }, "browserify-des": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", - "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { @@ -936,9 +958,9 @@ } }, "buffer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", - "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", "dev": true, "requires": { "base64-js": "^1.0.2", @@ -968,9 +990,9 @@ "dev": true }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "buffer-xor": { @@ -1020,9 +1042,9 @@ } }, "cached-path-relative": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", - "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", "dev": true }, "caller-path": { @@ -1868,9 +1890,9 @@ "dev": true }, "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -2375,14 +2397,15 @@ "dev": true }, "fetch-mock": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-6.5.2.tgz", - "integrity": "sha512-EIvbpCLBTYyDLu4HJiqD7wC8psDwTUaPaWXNKZbhNO/peUYKiNp5PkZGKRJtnTxaPQu71ivqafvjpM7aL+MofQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-7.3.0.tgz", + "integrity": "sha512-KxBeS8vsADFbWPVomuwxYqOJ2obZo6CidgkypjDPeu6zl+tAJvh2GfLDmJ8u//xgBGM9iOGwOxafeqAclilH2A==", "dev": true, "requires": { "babel-polyfill": "^6.26.0", "glob-to-regexp": "^0.4.0", - "path-to-regexp": "^2.2.1" + "path-to-regexp": "^2.2.1", + "whatwg-url": "^6.5.0" } }, "figures": { @@ -3407,13 +3430,13 @@ } }, "hash.js": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.4.tgz", - "integrity": "sha512-A6RlQvvZEtFS5fLU43IDu0QUmBy+fDO9VMdTXvufKwIkt/rFfvICAViCax5fbDO4zdNzaC3/27ZhKUok5bAJyw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.1" } }, "hat": { @@ -4055,9 +4078,9 @@ } }, "karma-browserify": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/karma-browserify/-/karma-browserify-5.3.0.tgz", - "integrity": "sha512-EMaUd1RNyQVGTETI80dtX/fEtYs57/A5sl3rClvzJFImPW1s3EtsbESfqNtk7/OkzfYuAHLh4RSZSSbVgvhNdQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/karma-browserify/-/karma-browserify-6.0.0.tgz", + "integrity": "sha512-G3dGjoy1/6P8I6qTp799fbcAxs4P+1JcyEKUzy9g1/xMakqf9FFPwW2T9iEtCbWoH5WIKD3z+YwGL5ysBhzrsg==", "dev": true, "requires": { "convert-source-map": "^1.1.3", @@ -4208,6 +4231,12 @@ "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -4310,13 +4339,14 @@ "dev": true }, "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "media-typer": { @@ -4493,9 +4523,9 @@ } }, "module-deps": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz", - "integrity": "sha512-NPs5N511VD1rrVJihSso/LiBShRbJALYBKzDW91uZYy7BpjnO4bGnZL3HjZ9yKcFdZUWwaYjDz9zxbuP7vKMuQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", + "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", "dev": true, "requires": { "JSONStream": "^1.0.3", @@ -5915,9 +5945,9 @@ } }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", + "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", "dev": true }, "parents": { @@ -6032,9 +6062,9 @@ "dev": true }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-platform": { @@ -6044,9 +6074,9 @@ "dev": true }, "path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.4.0.tgz", + "integrity": "sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==", "dev": true }, "pathval": { @@ -6056,9 +6086,9 @@ "dev": true }, "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -6144,16 +6174,17 @@ "dev": true }, "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "punycode": { @@ -6476,12 +6507,12 @@ } }, "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "^1.0.6" } }, "resolve-from": { @@ -6548,13 +6579,22 @@ } }, "rollup": { - "version": "0.65.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.65.0.tgz", - "integrity": "sha512-en95i7zwW5IiWay6DR/6QV8TxO2LvWuCjHYDcgP96oVG/gPnWWzsxNViObhoJUs17bAj2RgB67WuBuGmysZZcw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.1.0.tgz", + "integrity": "sha512-NK03gkkOz0CchHBMGomcNqa6U3jLNzHuWK9SI0+1FV475JA6cQxVtjlDcQoKKDNIQ3IwYumIlgoKYDEWUyFBwQ==", "dev": true, "requires": { "@types/estree": "0.0.39", - "@types/node": "*" + "@types/node": "*", + "acorn": "^6.0.5" + }, + "dependencies": { + "acorn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", + "dev": true + } } }, "rollup-plugin-buble": { @@ -7504,6 +7544,23 @@ "punycode": "^1.4.1" } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -8026,6 +8083,23 @@ } } }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", diff --git a/package.json b/package.json index 34543d75..eb7a3e46 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "alks.js", - "version": "0.2.0", + "version": "1.0.0", "description": "JavaScript client for the ALKS API, usable in both modern browsers and node.js", "main": "lib/alks.node.js", "scripts": { @@ -42,15 +42,15 @@ "node-fetch": "^2.2.0" }, "devDependencies": { - "browserify": "^16.1.1", + "browserify": "^16.2.3", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "coveralls": "^3.0.2", "eslint": "^5.3.0", - "fetch-mock": "^6.5.2", + "fetch-mock": "^7.3.0", "jsdoc-to-markdown": "^4.0.1", "karma": "^3.0.0", - "karma-browserify": "^5.2.0", + "karma-browserify": "^6.0.0", "karma-chrome-launcher": "^2.2.0", "karma-mocha": "^1.3.0", "karma-mocha-reporter": "^2.2.5", @@ -58,7 +58,7 @@ "mocha": "^5.0.5", "nyc": "^13.0.1", "rimraf": "^2.6.2", - "rollup": "^0.65.0", + "rollup": "^1.1.0", "rollup-plugin-buble": "^0.19.2", "rollup-plugin-cleanup": "^3.0.0", "rollup-plugin-replace": "^2.0.0", diff --git a/rollup.config.js b/rollup.config.js index 439073a8..8203210a 100755 --- a/rollup.config.js +++ b/rollup.config.js @@ -14,7 +14,9 @@ export default [ } }, plugins: [ - buble(), + buble({ + objectAssign: 'Object.assign' + }), replace({'process.browser': true}), cleanup() ] diff --git a/src/alks.js b/src/alks.js index 619fcec2..7c15dffa 100755 --- a/src/alks.js +++ b/src/alks.js @@ -408,13 +408,7 @@ class alks { return Promise.all([responsePromise, jsonPromise]).then(([response, json]) => { if (!response.ok) { - if (json && json.statusMessage && json.statusMessage !== 'Success') { - throw new Error(json.statusMessage) - } else if (json && json.errors && json.errors.length) { - throw new Error(json.errors[0]) - } else { - throw new Error(response.statusText) - } + throw new AlksError(response, json) } return(json) }) @@ -423,4 +417,11 @@ class alks { const pick = (obj, props) => props.reduce((a, e) => (a[e] = obj[e], a), {}) +const AlksError = (response, json) => ({ + name: 'AlksError', + message: response.statusText, + status: response.status, + ...json +}) + export default new alks() diff --git a/test/test.js b/test/test.js index 96de438d..44a3d55b 100755 --- a/test/test.js +++ b/test/test.js @@ -299,7 +299,11 @@ describe('alks.js', function() { sessionTime: 2, accessToken: 'wrongToken', _fetch - })).to.be.rejectedWith('this is the statusMessage')) + })).to.be.rejectedWith({ + name: 'AlksError', + status: 401, + statusMessage: 'this is the statusMessage' + })) }) it('rejects on error with errors array', function() { @@ -314,7 +318,11 @@ describe('alks.js', function() { sessionTime: 2, accessToken: 'wrongToken', _fetch - })).to.be.rejectedWith('this is an error')) + })).to.be.rejectedWith({ + name: 'AlksError', + status: 401, + errors: ['this is an error'] + })) }) it('handles a server error', function() { @@ -326,7 +334,11 @@ describe('alks.js', function() { sessionTime: 2, accessToken: 'abc123', _fetch - })).to.be.rejectedWith('Server Error')) + })).to.be.rejectedWith({ + name: 'AlksError', + message: 'Server Error', + status: 500 + })) }) it('warns of userid/password deprecation', function(done) {