diff --git a/Makefile b/Makefile index bcc7c81ba..1335d288a 100644 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ clean: install: clean npm install + npx lerna bootstrap test: install yarn test:files diff --git a/packages/client/package.json b/packages/client/package.json index 86d7754ea..16913cf4c 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -28,8 +28,7 @@ }, "dependencies": { "@sendgrid/helpers": "^6.5.5", - "@types/request": "^2.48.4", - "request": "^2.88.0" + "axios": "^0.19.2" }, "tags": [ "http", diff --git a/packages/client/src/classes/client.js b/packages/client/src/classes/client.js index 633d49352..f1f635d0a 100644 --- a/packages/client/src/classes/client.js +++ b/packages/client/src/classes/client.js @@ -3,13 +3,14 @@ /** * Dependencies */ -const http = require('request'); +const axios = require('axios'); const pkg = require('../../package.json'); const { helpers: { mergeData, }, classes: { + Response, ResponseError, }, } = require('@sendgrid/helpers'); @@ -18,7 +19,6 @@ const { * Twilio SendGrid REST Client */ class Client { - /** * Constructor */ @@ -29,13 +29,13 @@ class Client { //Default headers this.defaultHeaders = { - Accept: 'application/json', + 'Accept': 'application/json', + 'Content-Type': 'application/json', 'User-agent': 'sendgrid/' + pkg.version + ';nodejs', }; //Empty default request this.defaultRequest = { - json: true, baseUrl: 'https://api.sendgrid.com/', url: '', method: 'GET', @@ -88,18 +88,22 @@ class Client { */ createRequest(data) { - //Keep URL parameter consistent - if (data.uri) { - data.url = data.uri; - delete data.uri; - } + let options = { + url: data.uri || data.url, + baseUrl: data.baseUrl, + method: data.method, + data: data.body, + params: data.qs, + headers: data.headers, + }; //Merge data with empty request - const request = mergeData(this.defaultRequest, data); + options = mergeData(this.defaultRequest, options); + options.headers = this.createHeaders(options.headers); + options.baseURL = options.baseUrl; + delete options.baseUrl; - //Add headers - request.headers = this.createHeaders(request.headers); - return request; + return options; } /** @@ -108,25 +112,28 @@ class Client { request(data, cb) { //Create request - const request = this.createRequest(data); + data = this.createRequest(data); //Perform request const promise = new Promise((resolve, reject) => { - http(request, (error, response, body) => { - - //Request error - if (error) { + axios(data) + .then(response => { + // Successful response + return resolve([ + new Response(response.status, response.data, response.headers), + response.data, + ]); + }) + .catch(error => { + // Response error + if (error.response) { + if (error.response.status >= 400) { + return reject(new ResponseError(error.response)); + } + } + // Request error return reject(error); - } - - //Response error - if (response.statusCode >= 400) { - return reject(new ResponseError(response)); - } - - //Successful response - resolve([response, body]); - }); + }); }); // Throw and error incase function not passed diff --git a/packages/client/src/client.d.ts b/packages/client/src/client.d.ts index 6fe00371a..10c7a1d2f 100644 --- a/packages/client/src/client.d.ts +++ b/packages/client/src/client.d.ts @@ -3,6 +3,7 @@ import {ClientRequest} from "@sendgrid/client/src/request"; import {ClientResponse} from "@sendgrid/client/src/response"; declare class Client { + constructor(); /** * Set API key */ diff --git a/packages/client/src/request.d.ts b/packages/client/src/request.d.ts index 5ddb74dee..900454c16 100644 --- a/packages/client/src/request.d.ts +++ b/packages/client/src/request.d.ts @@ -1,3 +1,3 @@ -import {OptionsWithUrl} from "request"; +import RequestOptions from "@sendgrid/helpers/classes/request"; -export type ClientRequest = OptionsWithUrl; \ No newline at end of file +export type ClientRequest = RequestOptions; diff --git a/packages/client/src/response.d.ts b/packages/client/src/response.d.ts index 25ddfdcba..3c84e3735 100644 --- a/packages/client/src/response.d.ts +++ b/packages/client/src/response.d.ts @@ -1,3 +1,3 @@ -import {RequestResponse} from "request"; +import Response from "@sendgrid/helpers/classes/response"; -export type ClientResponse = RequestResponse; \ No newline at end of file +export type ClientResponse = Response; diff --git a/packages/helpers/classes/index.d.ts b/packages/helpers/classes/index.d.ts index 0efd26cba..05720cc6e 100644 --- a/packages/helpers/classes/index.d.ts +++ b/packages/helpers/classes/index.d.ts @@ -2,6 +2,7 @@ import Attachment from "@sendgrid/helpers/classes/attachment"; import EmailAddress from "@sendgrid/helpers/classes/email-address"; import Mail from "@sendgrid/helpers/classes/mail" import Personalization from "@sendgrid/helpers/classes/personalization"; +import Response from "@sendgrid/helpers/classes/response"; import ResponseError from "@sendgrid/helpers/classes/response-error"; export { @@ -9,5 +10,6 @@ export { EmailAddress, Mail, Personalization, + Response, ResponseError, -} \ No newline at end of file +} diff --git a/packages/helpers/classes/index.js b/packages/helpers/classes/index.js index 5071b6110..8224b4804 100644 --- a/packages/helpers/classes/index.js +++ b/packages/helpers/classes/index.js @@ -7,6 +7,7 @@ const Attachment = require('./attachment'); const EmailAddress = require('./email-address'); const Mail = require('./mail'); const Personalization = require('./personalization'); +const Response = require('./response'); const ResponseError = require('./response-error'); const Statistics = require('./statistics'); @@ -18,6 +19,7 @@ module.exports = { EmailAddress, Mail, Personalization, + Response, ResponseError, Statistics, }; diff --git a/packages/helpers/classes/request.d.ts b/packages/helpers/classes/request.d.ts new file mode 100644 index 000000000..7b13383b9 --- /dev/null +++ b/packages/helpers/classes/request.d.ts @@ -0,0 +1,10 @@ +type HttpMethod = 'get'|'GET'|'post'|'POST'|'put'|'PUT'|'patch'|'PATCH'|'delete'|'DELETE'; + +export default interface RequestOptions { + url: string; + method?: HttpMethod; + baseUrl?: string; + qs?: TParams; + body?: TData; + headers?: object; +} diff --git a/packages/helpers/classes/response-error.js b/packages/helpers/classes/response-error.js index d422b6efd..abdcecd19 100644 --- a/packages/helpers/classes/response-error.js +++ b/packages/helpers/classes/response-error.js @@ -19,12 +19,12 @@ class ResponseError extends Error { super(); //Extract data from response - const {headers, statusCode, statusMessage, body} = response; + const {headers, status, statusText, data} = response; //Set data - this.code = statusCode; - this.message = statusMessage; - this.response = {headers, body}; + this.code = status; + this.message = statusText; + this.response = {headers, body: data}; //Capture stack trace if (!this.stack) { diff --git a/packages/helpers/classes/response.d.ts b/packages/helpers/classes/response.d.ts new file mode 100644 index 000000000..09d05cda7 --- /dev/null +++ b/packages/helpers/classes/response.d.ts @@ -0,0 +1,7 @@ +export default class Response { + statusCode: number; + body: TPayload; + headers: any; + constructor(statusCode: number, body: TPayload, headers?: any); + toString(): string; +} diff --git a/packages/helpers/classes/response.js b/packages/helpers/classes/response.js new file mode 100644 index 000000000..2b5ef2763 --- /dev/null +++ b/packages/helpers/classes/response.js @@ -0,0 +1,15 @@ +'use strict'; + +class Response { + constructor(statusCode, body, headers) { + this.statusCode = statusCode; + this.body = body; + this.headers = headers; + } + + toString() { + return 'HTTP ' + this.statusCode + ' ' + this.body; + } +} + +module.exports = Response; diff --git a/packages/helpers/helpers/merge-data.js b/packages/helpers/helpers/merge-data.js index c70c23e2b..968863398 100644 --- a/packages/helpers/helpers/merge-data.js +++ b/packages/helpers/helpers/merge-data.js @@ -24,7 +24,7 @@ module.exports = function mergeData(base, data) { merged[key] = data[key]; } else if (data[key] && typeof data[key] === 'object') { merged[key] = Object.assign({}, data[key]); - } else { + } else if (data[key]) { merged[key] = data[key]; } } diff --git a/test/typescript/client.ts b/test/typescript/client.ts index 7cd6d3654..ae295bd6a 100644 --- a/test/typescript/client.ts +++ b/test/typescript/client.ts @@ -26,5 +26,5 @@ const req = Client.createRequest({ Client.request({ url: "/test" }).then(res => { - res[0].headers -}) \ No newline at end of file + res[0].statusCode; +});