66 lines
2.4 KiB
JavaScript
66 lines
2.4 KiB
JavaScript
// ==========================================================================
|
|
// Type checking utils
|
|
// ==========================================================================
|
|
|
|
const getConstructor = input => (input !== null && typeof input !== 'undefined' ? input.constructor : null);
|
|
const instanceOf = (input, constructor) => Boolean(input && constructor && input instanceof constructor);
|
|
const isNullOrUndefined = input => input === null || typeof input === 'undefined';
|
|
const isObject = input => getConstructor(input) === Object;
|
|
const isNumber = input => getConstructor(input) === Number && !Number.isNaN(input);
|
|
const isString = input => getConstructor(input) === String;
|
|
const isBoolean = input => getConstructor(input) === Boolean;
|
|
const isFunction = input => getConstructor(input) === Function;
|
|
const isArray = input => Array.isArray(input);
|
|
const isWeakMap = input => instanceOf(input, WeakMap);
|
|
const isNodeList = input => instanceOf(input, NodeList);
|
|
const isElement = input => instanceOf(input, Element);
|
|
const isTextNode = input => getConstructor(input) === Text;
|
|
const isEvent = input => instanceOf(input, Event);
|
|
const isKeyboardEvent = input => instanceOf(input, KeyboardEvent);
|
|
const isCue = input => instanceOf(input, window.TextTrackCue) || instanceOf(input, window.VTTCue);
|
|
const isTrack = input => instanceOf(input, TextTrack) || (!isNullOrUndefined(input) && isString(input.kind));
|
|
|
|
const isEmpty = input =>
|
|
isNullOrUndefined(input) ||
|
|
((isString(input) || isArray(input) || isNodeList(input)) && !input.length) ||
|
|
(isObject(input) && !Object.keys(input).length);
|
|
|
|
const isUrl = input => {
|
|
// Accept a URL object
|
|
if (instanceOf(input, window.URL)) {
|
|
return true;
|
|
}
|
|
|
|
// Add the protocol if required
|
|
let string = input;
|
|
if (!input.startsWith('http://') || !input.startsWith('https://')) {
|
|
string = `http://${input}`;
|
|
}
|
|
|
|
try {
|
|
return !isEmpty(new URL(string).hostname);
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
export default {
|
|
nullOrUndefined: isNullOrUndefined,
|
|
object: isObject,
|
|
number: isNumber,
|
|
string: isString,
|
|
boolean: isBoolean,
|
|
function: isFunction,
|
|
array: isArray,
|
|
weakMap: isWeakMap,
|
|
nodeList: isNodeList,
|
|
element: isElement,
|
|
textNode: isTextNode,
|
|
event: isEvent,
|
|
keyboardEvent: isKeyboardEvent,
|
|
cue: isCue,
|
|
track: isTrack,
|
|
url: isUrl,
|
|
empty: isEmpty,
|
|
};
|