cloudcmd/lib/util.js
2016-05-24 20:09:03 +03:00

357 lines
9.9 KiB
JavaScript

(function(scope) {
'use strict';
var exec,
rendy,
Scope = scope.window ? window : global;
if (typeof module === 'object' && module.exports) {
exec = require('execon');
rendy = require('rendy');
module.exports = new UtilProto(exec);
} else if (!Scope.Util) {
exec = window.exec;
rendy = window.rendy;
Scope.Util = new UtilProto(exec);
}
function UtilProto(exec) {
var Util = this;
this.check = new checkProto();
function checkProto() {
/**
* Check is all arguments with names present
*
* @param name
* @param arg
*/
function check(args, names) {
var msg = '',
name = '',
template = '{{ name }} coud not be empty!',
indexOf = Array.prototype.indexOf,
lenNames = names.length,
lenArgs = args.length,
lessArgs = lenArgs < lenNames,
emptyIndex = indexOf.call(args),
isEmpty = ~emptyIndex && emptyIndex <= lenNames - 1;
if (lessArgs || isEmpty) {
if (lessArgs)
name = names[lenNames - 1];
else
name = names[emptyIndex];
msg = rendy(template, {
name: name
});
throw(Error(msg));
}
return check;
}
check.check = check;
/**
* Check is type of arg with name is equal to type
*
* @param name
* @param arg
* @param type
*/
check.type = function(name, arg, type) {
var is = Util.type(arg) === type;
if (!is)
throw(Error(name + ' should be ' + type));
return check;
};
return check;
}
/**
* Copy properties from from to to
*
* @param from
* @param to
*/
this.copyObj = function(to, from) {
if (!from) {
from = to;
to = {};
}
if (to)
Object.keys(from).forEach(function(name) {
to[name] = from[name];
});
return to;
};
/**
* copy objFrom properties to target
*
* @target
* @objFrom
*/
this.extend = function(target, objFrom) {
var obj,
keys,
proto,
isFunc = Util.type.function(objFrom),
isArray = Util.type.array(objFrom),
isObj = Util.type.object(target),
ret = isObj ? target : {};
if (isArray)
objFrom.forEach(function(item) {
ret = Util.extend(target, item);
});
else if (objFrom) {
obj = isFunc ? new objFrom() : objFrom;
keys = Object.keys(obj);
if (!keys.length) {
proto = Object.getPrototypeOf(objFrom);
keys = Object.keys(proto);
}
keys.forEach(function(name) {
ret[name] = obj[name];
});
}
return ret;
};
/**
* extend proto
*
* @obj
*/
this.extendProto = function(obj) {
var ret, F = function() {};
F.prototype = Util.extend({}, obj);
ret = new F();
return ret;
};
this.json = new JsonProto();
function JsonProto() {
/**
* @param str
*/
this.parse = function(str) {
var obj;
Util.exec.try(function() {
obj = JSON.parse(str);
});
return obj;
},
/**
* @param obj
*/
this.stringify = function(obj) {
var str;
Util.exec.try(function() {
str = JSON.stringify(obj, null, 4);
});
return str;
};
}
this.escapeRegExp = function(str) {
var isStr = Util.type.string(str);
if (isStr)
str = str.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
return str;
};
/**
* get regexp from wild card
*/
this.getRegExp = function(wildcard) {
var regExp;
if (!wildcard)
wildcard = '*';
wildcard = '^' + wildcard /* search from start of line */
.replace('.', '\\.')
.replace('*', '.*')
.replace('?', '.?');
wildcard += '$'; /* search to end of line */
regExp = new RegExp(wildcard);
return regExp;
};
this.type = new TypeProto();
function TypeProto() {
/**
* get type of variable
*
* @param variable
*/
function type(variable) {
var regExp = /\s([a-zA-Z]+)/,
str = {}.toString.call(variable),
typeBig = str.match(regExp)[1],
result = typeBig.toLowerCase();
return result;
}
/**
* functions check is variable is type of name
*
* @param variable
*/
function typeOf(name, variable) {
return type(variable) === name;
}
function typeOfSimple(name, variable) {
return typeof variable === name;
}
['null', 'arrayBuffer', 'file', 'array', 'object']
.forEach(function(name) {
type[name] = typeOf.bind(null, name);
});
['string', 'undefined', 'boolean', 'number', 'function']
.forEach(function(name) {
type[name] = typeOfSimple.bind(null, name);
});
return type;
}
this.exec = exec;
/**
* function gets file extension
*
* @param pFileName
* @return Ext
*/
this.getExt = function(name) {
var ret = '',
dot,
isStr = Util.type.string(name);
if (isStr) {
dot = name.lastIndexOf('.');
if (~dot)
ret = name.substr(dot);
}
return ret;
};
/**
* get values from Object Array name properties
* or
* @pObj
*/
this.getNamesFromObjArray = function(arr) {
var ret = [];
if (!Array.isArray(arr))
throw(Error('arr should be array!'));
ret = arr.map(function(item) {
return item.name;
});
return ret;
};
/**
* find object by name in arrray
*
* @param array
* @param name
*/
this.findObjByNameInArr = function(array, name) {
var ret;
if (!Array.isArray(array))
throw(Error('array should be array!'));
if (typeof name !== 'string')
throw(Error('name should be string!'));
array.some(function(item) {
var is = item.name === name,
isArray = Util.type.array(item);
if (is)
ret = item;
else if (isArray)
item.some(function(item) {
is = item.name === name;
if (is)
ret = item.data;
return is;
});
return is;
});
return ret;
};
/**
* start timer
* @param name
*/
this.time = function(name) {
var console = Scope.console;
Util.exec.ifExist(console, 'time', [name]);
return this;
};
/**
* stop timer
* @param name
*/
this.timeEnd = function(name) {
var console = Scope.console;
Util.exec.ifExist(console, 'timeEnd', [name]);
return this;
};
}
})(this);