node-query/lib/Helpers.js

170 lines
3.5 KiB
JavaScript
Raw Permalink Normal View History

const fs = require('fs');
/**
* Various internal helper functions
*
* @private
*/
class Helpers {
/**
* Get the contents of a file
*
* @param {string} file - The path to the file
* @return {Promise<string>} - Promise resolving to the contents of the file
*/
static readFile (file) {
return new Promise((resolve, reject) => {
fs.readFile(file, (err, data) => {
if (err) {
return reject(err);
}
return resolve(Buffer.from(data).toString());
});
});
}
2014-10-23 10:53:16 -04:00
/**
* Wrap String.prototype.trim in a way that is easily mappable
*
* @param {String} str - The string to trim
* @return {String} - The trimmed string
*/
static stringTrim (str) {
return str.trim();
}
2014-10-20 16:56:45 -04:00
/**
* Get the type of the variable passed
*
* @see https://techblog.badoo.com/blog/2013/11/01/type-checking-in-javascript/
* @see http://toddmotto.com/understanding-javascript-types-and-reliable-type-checking/
* @param {mixed} o - Object to type check
* @return {String} - Type of the object
*/
static type (o) {
const type = Object.prototype.toString.call(o).slice(8, -1).toLowerCase();
2014-10-23 10:53:16 -04:00
2015-12-07 17:03:36 -05:00
// handle NaN and Infinity
if (type === 'number') {
if (isNaN(o)) {
return 'nan';
}
if (!isFinite(o)) {
return 'infinity';
}
}
2014-10-23 10:53:16 -04:00
2015-12-07 17:03:36 -05:00
return type;
}
2014-10-20 16:56:45 -04:00
/**
* Determine whether an object is scalar
*
* @param {mixed} obj - Object to test
* @return {boolean} - Is object scalar
*/
static isScalar (obj) {
return ['string', 'number', 'boolean'].includes(Helpers.type(obj));
}
/**
* Get a list of values with a common key from an array of objects
*
* @param {Array} arr - The array of objects to search
* @param {String} key - The key of the object to get
* @return {Array} - The new array of plucked values
*/
static arrayPluck (arr, key) {
const output = [];
// Empty case
2015-12-08 10:40:52 -05:00
if (arr.length === 0) {
return output;
}
arr.forEach(obj => {
if (!Helpers.isUndefined(obj[key])) {
output.push(obj[key]);
}
});
return output;
}
/**
* Determine if a value matching the passed regular expression is
* in the passed array
*
* @param {Array} arr - The array to search
* @param {RegExp} pattern - The pattern to match
* @return {Boolean} - If an array item matches the pattern
*/
static regexInArray (arr, pattern) {
// Empty case(s)
if (!Helpers.isArray(arr) || arr.length === 0) {
2015-12-07 17:03:36 -05:00
return false;
}
const l = arr.length;
for (let i = 0; i < l; i++) {
// Short circuit if any items match
2015-12-07 17:03:36 -05:00
if (pattern.test(arr[i])) {
return true;
}
}
return false;
}
/**
* Make the first constter of the string uppercase
*
* @param {String} str - The string to modify
* @return {String} - The modified string
*/
static upperCaseFirst (str) {
str += '';
const first = str.charAt(0).toUpperCase();
return first + str.substr(1);
}
}
2014-10-23 10:53:16 -04:00
// Define an 'is' method for each type
const types = [
2015-12-07 17:03:36 -05:00
'Null',
'Undefined',
'Object',
'Array',
'String',
'Number',
'Boolean',
'Function',
'RegExp',
'NaN',
'Infinite',
'Promise'
2015-12-07 17:03:36 -05:00
];
types.forEach(t => {
/**
* Determine whether a variable is of the type specified in the
* function name, eg isNumber
*
* Types available are Null, Undefined, Object, Array, String, Number,
* Boolean, Function, RegExp, NaN, Infinite, Promise
*
* @private
* @param {mixed} o - The object to check its type
* @return {Boolean} - If the type matches
*/
Helpers[`is${t}`] = function (o) {
2015-12-07 17:03:36 -05:00
if (t.toLowerCase() === 'infinite') {
t = 'infinity';
}
return Helpers.type(o) === t.toLowerCase();
};
2014-10-23 10:53:16 -04:00
});
module.exports = Helpers;