frest
Version:
REST client for browser with Fetch
159 lines (143 loc) • 4.55 kB
text/typescript
import qs from 'querystringify';
import { FrestErrorType } from './types';
const toString = Object.prototype.toString;
/**
* Remove multiple occurrence of **forward** slash in a string.
* This doesn't remove leading and/or trailing slash.
*
* e.g. "http://example.com/a//b/" -> "http://example.com/a/b/"
*
* @public
* @param input The string to clean.
* @returns The `input` string without multiple occurrence of forward slash.
*/
export const trimSlashes = (input: string) =>
input.toString().replace(/([^:]\/)\/+/g, '$1');
/**
* Utility function to parse a query object into string.
*
* @remarks
* This will only do simple and dumb stringify according to `querystringify`
* package. If you want more control use the package directly instead.
*
* @public
* @param query The query to parse. It can be object/string
* @returns Parsed query string
*/
export const parseQuery = (query: any) => {
let q = query || '';
if (typeof q === 'object') {
q = qs.stringify(q, '?');
} else if (q !== '') {
q = q.charAt(0) === '?' ? q : `?${q}`;
}
return q;
};
/**
* A TypeScript utility to determine if a potential error is an instance of
* `FrestError`.
*
* @public
* @param e A potential error to check
* @returns true if `e` is an instance of `FrestError`. TypeScript will then provide
* completions of `FrestError` instance type.
*/
export const isFrestError = (e: any): e is FrestErrorType =>
e.frest != null && e.request != null;
/**
* Determine if an object is a Buffer.
* @remarks
* Taken from `is-buffer` package by Feross Aboukhadijeh <https://feross.org>,
* licensed under MIT and copied here to provide typings for Frest and
* its users.
*
* {@link https://github.com/feross/is-buffer}
*
* @public
* @param val Value to test.
* @returns true if it's a Buffer.
*/
export const isBuffer = (val?: any): val is Buffer =>
val != null &&
val.constructor != null &&
typeof val.constructor.isBuffer === 'function' &&
val.constructor.isBuffer(val);
/**
* Determine if a value is an ArrayBuffer
*
* @param val The value to test
* @returns True if value is an ArrayBuffer, otherwise false
*/
export const isArrayBuffer = (val?: any): val is ArrayBuffer =>
toString.call(val) === '[object ArrayBuffer]';
/**
* Determine if a value is a FormData
*
* @param val The value to test
* @returns True if value is an FormData, otherwise false
*/
export const isFormData = (val?: any): val is FormData =>
typeof FormData !== 'undefined' && val instanceof FormData;
/**
* Determine if a value is a view on an ArrayBuffer
*
* @param val The value to test
* @returns True if value is a view on an ArrayBuffer, otherwise false
*/
export const isArrayBufferView = (val?: any): val is ArrayBufferView => {
let result;
if (typeof ArrayBuffer !== 'undefined' && ArrayBuffer.isView) {
result = ArrayBuffer.isView(val);
} else {
result = val && val.buffer && val.buffer instanceof ArrayBuffer;
}
return result;
};
// These utilities below are all taken from axios' source authored by
// Matt Zabriskie under MIT License.
/**
* Determine if a value is an Object
*
* @param val The value to test
* @returns True if value is an Object, otherwise false
*/
export const isObject = (val?: any) => val !== null && typeof val === 'object';
/**
* Determine if a value is a File
*
* @param val The value to test
* @returns True if value is a File, otherwise false
*/
export const isFile = (val?: any): val is File =>
toString.call(val) === '[object File]';
/**
* Determine if a value is a Blob
*
* @param val The value to test
* @returns True if value is a Blob, otherwise false
*/
export const isBlob = (val?: any): val is Blob =>
toString.call(val) === '[object Blob]';
/**
* Determine if a value is a Function
*
* @param val The value to test
* @returns True if value is a Function, otherwise false
*/
export const isFunction = (val?: any): val is (...args: any[]) => any =>
toString.call(val) === '[object Function]';
/**
* Determine if a value is a Stream
*
* @param val The value to test
* @returns True if value is a Stream, otherwise false
*/
export const isStream = (val?: any) => isObject(val) && isFunction(val.pipe);
/**
* Determine if a value is a URLSearchParams object
*
* @param val The value to test
* @returns True if value is a URLSearchParams object, otherwise false
*/
export const isURLSearchParams = (val?: any): val is URLSearchParams =>
typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;