UNPKG

mappersmith

Version:

It is a lightweight rest client for node.js and the browser

1 lines 6.84 kB
{"version":3,"sources":["../../src/response.ts"],"sourcesContent":["import { lowerCaseObjectKeys } from './utils/index'\nimport { Request } from './request'\nimport type { Headers } from './types'\n\nexport const REGEXP_CONTENT_TYPE_JSON = /^application\\/(json|.*\\+json)/\n\nexport interface ResponseParams {\n readonly status?: number\n readonly rawData?: string\n readonly headers?: Headers\n readonly error?: Error\n}\n\n/**\n * @typedef Response\n * @param {Request} originalRequest, for auth it hides the password\n * @param {Integer} responseStatus\n * @param {String} responseData, defaults to null\n * @param {Object} responseHeaders, defaults to an empty object ({})\n * @param {Array<Error>} errors, defaults to an empty array ([])\n */\ntype SerializableJSON = number | string | boolean | null | Record<string, unknown>\nexport type ParsedJSON = SerializableJSON | SerializableJSON[]\nexport class Response<DataType extends ParsedJSON = ParsedJSON> {\n public readonly originalRequest: Request\n public readonly responseStatus: number\n public readonly responseData: string | null\n public readonly responseHeaders: Headers\n // eslint-disable-next-line no-use-before-define\n public readonly errors: Array<Error | string>\n public timeElapsed: number | null\n\n constructor(\n originalRequest: Request,\n responseStatus: number,\n responseData?: string | null,\n responseHeaders?: Headers,\n errors?: Array<Error | string>\n ) {\n const auth = originalRequest.requestParams && originalRequest.requestParams.auth\n if (auth) {\n const maskedAuth = { ...auth, password: '***' }\n this.originalRequest = originalRequest.enhance({ auth: maskedAuth })\n } else {\n this.originalRequest = originalRequest\n }\n\n this.responseStatus = responseStatus\n this.responseData = responseData ?? null\n this.responseHeaders = responseHeaders || {}\n this.errors = errors || []\n this.timeElapsed = null\n }\n\n public request() {\n return this.originalRequest\n }\n\n public status() {\n // IE sends 1223 instead of 204\n if (this.responseStatus === 1223) {\n return 204\n }\n\n return this.responseStatus\n }\n\n /**\n * Returns true if status is greater or equal 200 or lower than 400\n */\n public success() {\n const status = this.status()\n return status >= 200 && status < 400\n }\n\n /**\n * Returns an object with the headers. Header names are converted to\n * lowercase\n */\n public headers() {\n return lowerCaseObjectKeys(this.responseHeaders)\n }\n\n /**\n * Utility method to get a header value by name\n */\n public header<T extends string | number | boolean>(name: string): T | undefined {\n const key = name.toLowerCase()\n\n if (key in this.headers()) {\n return this.headers()[key] as T\n }\n\n return undefined\n }\n\n /**\n * Returns the original response data\n */\n public rawData() {\n return this.responseData\n }\n\n /**\n * Returns the response data, if \"Content-Type\" is \"application/json\"\n * it parses the response and returns an object.\n * Friendly reminder:\n * - JSON.parse() can return null, an Array or an object.\n */\n public data<T = DataType>() {\n if (this.isContentTypeJSON() && this.responseData !== null) {\n try {\n return JSON.parse(this.responseData) as T\n } catch (e) {} // eslint-disable-line no-empty\n }\n\n return this.responseData as unknown as T\n }\n\n public isContentTypeJSON() {\n const contentType = this.header<string>('content-type')\n\n if (contentType === undefined) {\n return false\n }\n\n return REGEXP_CONTENT_TYPE_JSON.test(contentType)\n }\n\n /**\n * Returns the last error instance that caused the request to fail\n */\n public error() {\n const lastError = this.errors[this.errors.length - 1] || null\n\n if (typeof lastError === 'string') {\n return new Error(lastError)\n }\n\n return lastError\n }\n\n /**\n * Enhances current Response returning a new Response\n *\n * @param {Object} extras\n * @param {Integer} extras.status - it will replace the current status\n * @param {String} extras.rawData - it will replace the current rawData\n * @param {Object} extras.headers - it will be merged with current headers\n * @param {Error} extras.error - it will be added to the list of errors\n */\n public enhance(extras: ResponseParams) {\n const mergedHeaders = { ...this.headers(), ...(extras.headers || {}) }\n const enhancedResponse = new Response<DataType>(\n this.request(),\n extras.status || this.status(),\n extras.rawData || this.rawData(),\n mergedHeaders,\n extras.error ? [...this.errors, extras.error] : [...this.errors]\n )\n enhancedResponse.timeElapsed = this.timeElapsed\n\n return enhancedResponse\n }\n}\n\nexport default Response\n"],"mappings":";AAAA,SAAS,2BAA2B;AAI7B,IAAM,2BAA2B;AAmBjC,IAAM,WAAN,MAAM,UAAmD;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACT;AAAA,EAEP,YACE,iBACA,gBACA,cACA,iBACA,QACA;AACA,UAAM,OAAO,gBAAgB,iBAAiB,gBAAgB,cAAc;AAC5E,QAAI,MAAM;AACR,YAAM,aAAa,EAAE,GAAG,MAAM,UAAU,MAAM;AAC9C,WAAK,kBAAkB,gBAAgB,QAAQ,EAAE,MAAM,WAAW,CAAC;AAAA,IACrE,OAAO;AACL,WAAK,kBAAkB;AAAA,IACzB;AAEA,SAAK,iBAAiB;AACtB,SAAK,eAAe,gBAAgB;AACpC,SAAK,kBAAkB,mBAAmB,CAAC;AAC3C,SAAK,SAAS,UAAU,CAAC;AACzB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEO,UAAU;AACf,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,SAAS;AAEd,QAAI,KAAK,mBAAmB,MAAM;AAChC,aAAO;AAAA,IACT;AAEA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,UAAU;AACf,UAAM,SAAS,KAAK,OAAO;AAC3B,WAAO,UAAU,OAAO,SAAS;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,UAAU;AACf,WAAO,oBAAoB,KAAK,eAAe;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKO,OAA4C,MAA6B;AAC9E,UAAM,MAAM,KAAK,YAAY;AAE7B,QAAI,OAAO,KAAK,QAAQ,GAAG;AACzB,aAAO,KAAK,QAAQ,EAAE,GAAG;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKO,UAAU;AACf,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAqB;AAC1B,QAAI,KAAK,kBAAkB,KAAK,KAAK,iBAAiB,MAAM;AAC1D,UAAI;AACF,eAAO,KAAK,MAAM,KAAK,YAAY;AAAA,MACrC,SAAS,GAAG;AAAA,MAAC;AAAA,IACf;AAEA,WAAO,KAAK;AAAA,EACd;AAAA,EAEO,oBAAoB;AACzB,UAAM,cAAc,KAAK,OAAe,cAAc;AAEtD,QAAI,gBAAgB,QAAW;AAC7B,aAAO;AAAA,IACT;AAEA,WAAO,yBAAyB,KAAK,WAAW;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA,EAKO,QAAQ;AACb,UAAM,YAAY,KAAK,OAAO,KAAK,OAAO,SAAS,CAAC,KAAK;AAEzD,QAAI,OAAO,cAAc,UAAU;AACjC,aAAO,IAAI,MAAM,SAAS;AAAA,IAC5B;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,QAAQ,QAAwB;AACrC,UAAM,gBAAgB,EAAE,GAAG,KAAK,QAAQ,GAAG,GAAI,OAAO,WAAW,CAAC,EAAG;AACrE,UAAM,mBAAmB,IAAI;AAAA,MAC3B,KAAK,QAAQ;AAAA,MACb,OAAO,UAAU,KAAK,OAAO;AAAA,MAC7B,OAAO,WAAW,KAAK,QAAQ;AAAA,MAC/B;AAAA,MACA,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,OAAO,KAAK,IAAI,CAAC,GAAG,KAAK,MAAM;AAAA,IACjE;AACA,qBAAiB,cAAc,KAAK;AAEpC,WAAO;AAAA,EACT;AACF;AAEA,IAAO,mBAAQ;","names":[]}