UNPKG

nosql

Version:

NoSQL embedded database for small Node.js projects (supports insert, update, remove, drop, views, binary files)

775 lines (660 loc) 24.2 kB
// Copyright 2012-2016 (c) Peter Širka <petersirka@gmail.com> // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the // "Software"), to deal in the Software without restriction, including // without limitation the rights to use, copy, modify, merge, publish, // distribute, sublicense, and/or sell copies of the Software, and to permit // persons to whom the Software is furnished to do so, subject to the // following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. const MONTHS = ['January', 'February', 'March', 'April', 'May', 'Juny', 'July', 'August', 'September', 'October', 'November', 'December']; const DAYS = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; const regexpTRIM = /^[\s]+|[\s]+$/g; const regexpDATEFORMAT = /yyyy|yy|M+|d+|HH|H|hh|h|mm|m|ss|s|a|ww|w/g; const regexpDiacritics = /[^\u0000-\u007e]/g; const regexpINTEGER = /(^\-|\s-)?[0-9]+/g; const DIACRITICSMAP = {}; const NODEVERSION = parseFloat(process.version.toString().replace('v', '').replace(/\./g, '')); var DIACRITICS=[{b:' ',c:'\u00a0'},{b:'0',c:'\u07c0'},{b:'A',c:'\u24b6\uff21\u00c0\u00c1\u00c2\u1ea6\u1ea4\u1eaa\u1ea8\u00c3\u0100\u0102\u1eb0\u1eae\u1eb4\u1eb2\u0226\u01e0\u00c4\u01de\u1ea2\u00c5\u01fa\u01cd\u0200\u0202\u1ea0\u1eac\u1eb6\u1e00\u0104\u023a\u2c6f'},{b:'AA',c:'\ua732'},{b:'AE',c:'\u00c6\u01fc\u01e2'},{b:'AO',c:'\ua734'},{b:'AU',c:'\ua736'},{b:'AV',c:'\ua738\ua73a'},{b:'AY',c:'\ua73c'},{b:'B',c:'\u24b7\uff22\u1e02\u1e04\u1e06\u0243\u0181'},{b:'C',c:'\u24b8\uff23\ua73e\u1e08\u0106C\u0108\u010a\u010c\u00c7\u0187\u023b'},{b:'D',c:'\u24b9\uff24\u1e0a\u010e\u1e0c\u1e10\u1e12\u1e0e\u0110\u018a\u0189\u1d05\ua779'},{b:'Dh',c:'\u00d0'},{b:'DZ',c:'\u01f1\u01c4'},{b:'Dz',c:'\u01f2\u01c5'},{b:'E',c:'\u025b\u24ba\uff25\u00c8\u00c9\u00ca\u1ec0\u1ebe\u1ec4\u1ec2\u1ebc\u0112\u1e14\u1e16\u0114\u0116\u00cb\u1eba\u011a\u0204\u0206\u1eb8\u1ec6\u0228\u1e1c\u0118\u1e18\u1e1a\u0190\u018e\u1d07'},{b:'F',c:'\ua77c\u24bb\uff26\u1e1e\u0191\ua77b'}, {b:'G',c:'\u24bc\uff27\u01f4\u011c\u1e20\u011e\u0120\u01e6\u0122\u01e4\u0193\ua7a0\ua77d\ua77e\u0262'},{b:'H',c:'\u24bd\uff28\u0124\u1e22\u1e26\u021e\u1e24\u1e28\u1e2a\u0126\u2c67\u2c75\ua78d'},{b:'I',c:'\u24be\uff29\u00cc\u00cd\u00ce\u0128\u012a\u012c\u0130\u00cf\u1e2e\u1ec8\u01cf\u0208\u020a\u1eca\u012e\u1e2c\u0197'},{b:'J',c:'\u24bf\uff2a\u0134\u0248\u0237'},{b:'K',c:'\u24c0\uff2b\u1e30\u01e8\u1e32\u0136\u1e34\u0198\u2c69\ua740\ua742\ua744\ua7a2'},{b:'L',c:'\u24c1\uff2c\u013f\u0139\u013d\u1e36\u1e38\u013b\u1e3c\u1e3a\u0141\u023d\u2c62\u2c60\ua748\ua746\ua780'}, {b:'LJ',c:'\u01c7'},{b:'Lj',c:'\u01c8'},{b:'M',c:'\u24c2\uff2d\u1e3e\u1e40\u1e42\u2c6e\u019c\u03fb'},{b:'N',c:'\ua7a4\u0220\u24c3\uff2e\u01f8\u0143\u00d1\u1e44\u0147\u1e46\u0145\u1e4a\u1e48\u019d\ua790\u1d0e'},{b:'NJ',c:'\u01ca'},{b:'Nj',c:'\u01cb'},{b:'O',c:'\u24c4\uff2f\u00d2\u00d3\u00d4\u1ed2\u1ed0\u1ed6\u1ed4\u00d5\u1e4c\u022c\u1e4e\u014c\u1e50\u1e52\u014e\u022e\u0230\u00d6\u022a\u1ece\u0150\u01d1\u020c\u020e\u01a0\u1edc\u1eda\u1ee0\u1ede\u1ee2\u1ecc\u1ed8\u01ea\u01ec\u00d8\u01fe\u0186\u019f\ua74a\ua74c'}, {b:'OE',c:'\u0152'},{b:'OI',c:'\u01a2'},{b:'OO',c:'\ua74e'},{b:'OU',c:'\u0222'},{b:'P',c:'\u24c5\uff30\u1e54\u1e56\u01a4\u2c63\ua750\ua752\ua754'},{b:'Q',c:'\u24c6\uff31\ua756\ua758\u024a'},{b:'R',c:'\u24c7\uff32\u0154\u1e58\u0158\u0210\u0212\u1e5a\u1e5c\u0156\u1e5e\u024c\u2c64\ua75a\ua7a6\ua782'},{b:'S',c:'\u24c8\uff33\u1e9e\u015a\u1e64\u015c\u1e60\u0160\u1e66\u1e62\u1e68\u0218\u015e\u2c7e\ua7a8\ua784'},{b:'T',c:'\u24c9\uff34\u1e6a\u0164\u1e6c\u021a\u0162\u1e70\u1e6e\u0166\u01ac\u01ae\u023e\ua786'}, {b:'Th',c:'\u00de'},{b:'TZ',c:'\ua728'},{b:'U',c:'\u24ca\uff35\u00d9\u00da\u00db\u0168\u1e78\u016a\u1e7a\u016c\u00dc\u01db\u01d7\u01d5\u01d9\u1ee6\u016e\u0170\u01d3\u0214\u0216\u01af\u1eea\u1ee8\u1eee\u1eec\u1ef0\u1ee4\u1e72\u0172\u1e76\u1e74\u0244'},{b:'V',c:'\u24cb\uff36\u1e7c\u1e7e\u01b2\ua75e\u0245'},{b:'VY',c:'\ua760'},{b:'W',c:'\u24cc\uff37\u1e80\u1e82\u0174\u1e86\u1e84\u1e88\u2c72'},{b:'X',c:'\u24cd\uff38\u1e8a\u1e8c'},{b:'Y',c:'\u24ce\uff39\u1ef2\u00dd\u0176\u1ef8\u0232\u1e8e\u0178\u1ef6\u1ef4\u01b3\u024e\u1efe'}, {b:'Z',c:'\u24cf\uff3a\u0179\u1e90\u017b\u017d\u1e92\u1e94\u01b5\u0224\u2c7f\u2c6b\ua762'},{b:'a',c:'\u24d0\uff41\u1e9a\u00e0\u00e1\u00e2\u1ea7\u1ea5\u1eab\u1ea9\u00e3\u0101\u0103\u1eb1\u1eaf\u1eb5\u1eb3\u0227\u01e1\u00e4\u01df\u1ea3\u00e5\u01fb\u01ce\u0201\u0203\u1ea1\u1ead\u1eb7\u1e01\u0105\u2c65\u0250\u0251'},{b:'aa',c:'\ua733'},{b:'ae',c:'\u00e6\u01fd\u01e3'},{b:'ao',c:'\ua735'},{b:'au',c:'\ua737'},{b:'av',c:'\ua739\ua73b'},{b:'ay',c:'\ua73d'}, {b:'b',c:'\u24d1\uff42\u1e03\u1e05\u1e07\u0180\u0183\u0253\u0182'},{b:'c',c:'\uff43\u24d2\u0107\u0109\u010b\u010d\u00e7\u1e09\u0188\u023c\ua73f\u2184'},{b:'d',c:'\u24d3\uff44\u1e0b\u010f\u1e0d\u1e11\u1e13\u1e0f\u0111\u018c\u0256\u0257\u018b\u13e7\u0501\ua7aa'},{b:'dh',c:'\u00f0'},{b:'dz',c:'\u01f3\u01c6'},{b:'e',c:'\u24d4\uff45\u00e8\u00e9\u00ea\u1ec1\u1ebf\u1ec5\u1ec3\u1ebd\u0113\u1e15\u1e17\u0115\u0117\u00eb\u1ebb\u011b\u0205\u0207\u1eb9\u1ec7\u0229\u1e1d\u0119\u1e19\u1e1b\u0247\u01dd'}, {b:'f',c:'\u24d5\uff46\u1e1f\u0192'},{b:'ff',c:'\ufb00'},{b:'fi',c:'\ufb01'},{b:'fl',c:'\ufb02'},{b:'ffi',c:'\ufb03'},{b:'ffl',c:'\ufb04'},{b:'g',c:'\u24d6\uff47\u01f5\u011d\u1e21\u011f\u0121\u01e7\u0123\u01e5\u0260\ua7a1\ua77f\u1d79'},{b:'h',c:'\u24d7\uff48\u0125\u1e23\u1e27\u021f\u1e25\u1e29\u1e2b\u1e96\u0127\u2c68\u2c76\u0265'},{b:'hv',c:'\u0195'},{b:'i',c:'\u24d8\uff49\u00ec\u00ed\u00ee\u0129\u012b\u012d\u00ef\u1e2f\u1ec9\u01d0\u0209\u020b\u1ecb\u012f\u1e2d\u0268\u0131'}, {b:'j',c:'\u24d9\uff4a\u0135\u01f0\u0249'},{b:'k',c:'\u24da\uff4b\u1e31\u01e9\u1e33\u0137\u1e35\u0199\u2c6a\ua741\ua743\ua745\ua7a3'},{b:'l',c:'\u24db\uff4c\u0140\u013a\u013e\u1e37\u1e39\u013c\u1e3d\u1e3b\u017f\u0142\u019a\u026b\u2c61\ua749\ua781\ua747\u026d'},{b:'lj',c:'\u01c9'},{b:'m',c:'\u24dc\uff4d\u1e3f\u1e41\u1e43\u0271\u026f'},{b:'n',c:'\u24dd\uff4e\u01f9\u0144\u00f1\u1e45\u0148\u1e47\u0146\u1e4b\u1e49\u019e\u0272\u0149\ua791\ua7a5\u043b\u0509'},{b:'nj', c:'\u01cc'},{b:'o',c:'\u24de\uff4f\u00f2\u00f3\u00f4\u1ed3\u1ed1\u1ed7\u1ed5\u00f5\u1e4d\u022d\u1e4f\u014d\u1e51\u1e53\u014f\u022f\u0231\u00f6\u022b\u1ecf\u0151\u01d2\u020d\u020f\u01a1\u1edd\u1edb\u1ee1\u1edf\u1ee3\u1ecd\u1ed9\u01eb\u01ed\u00f8\u01ff\ua74b\ua74d\u0275\u0254\u1d11'},{b:'oe',c:'\u0153'},{b:'oi',c:'\u01a3'},{b:'oo',c:'\ua74f'},{b:'ou',c:'\u0223'},{b:'p',c:'\u24df\uff50\u1e55\u1e57\u01a5\u1d7d\ua751\ua753\ua755\u03c1'},{b:'q',c:'\u24e0\uff51\u024b\ua757\ua759'}, {b:'r',c:'\u24e1\uff52\u0155\u1e59\u0159\u0211\u0213\u1e5b\u1e5d\u0157\u1e5f\u024d\u027d\ua75b\ua7a7\ua783'},{b:'s',c:'\u24e2\uff53\u015b\u1e65\u015d\u1e61\u0161\u1e67\u1e63\u1e69\u0219\u015f\u023f\ua7a9\ua785\u1e9b\u0282'},{b:'ss',c:'\u00df'},{b:'t',c:'\u24e3\uff54\u1e6b\u1e97\u0165\u1e6d\u021b\u0163\u1e71\u1e6f\u0167\u01ad\u0288\u2c66\ua787'},{b:'th',c:'\u00fe'},{b:'tz',c:'\ua729'},{b:'u',c:'\u24e4\uff55\u00f9\u00fa\u00fb\u0169\u1e79\u016b\u1e7b\u016d\u00fc\u01dc\u01d8\u01d6\u01da\u1ee7\u016f\u0171\u01d4\u0215\u0217\u01b0\u1eeb\u1ee9\u1eef\u1eed\u1ef1\u1ee5\u1e73\u0173\u1e77\u1e75\u0289'}, {b:'v',c:'\u24e5\uff56\u1e7d\u1e7f\u028b\ua75f\u028c'},{b:'vy',c:'\ua761'},{b:'w',c:'\u24e6\uff57\u1e81\u1e83\u0175\u1e87\u1e85\u1e98\u1e89\u2c73'},{b:'x',c:'\u24e7\uff58\u1e8b\u1e8d'},{b:'y',c:'\u24e8\uff59\u1ef3\u00fd\u0177\u1ef9\u0233\u1e8f\u00ff\u1ef7\u1e99\u1ef5\u01b4\u024f\u1eff'},{b:'z',c:'\u24e9\uff5a\u017a\u1e91\u017c\u017e\u1e93\u1e95\u01b6\u0225\u0240\u2c6c\ua763'}]; for (var i=0; i <DIACRITICS.length; i+=1) for (var chars=DIACRITICS[i].c,j=0;j<chars.length;j+=1) DIACRITICSMAP[chars[j]]=DIACRITICS[i].b; DIACRITICS = null; var CONTENTTYPES = { 'aac': 'audio/aac', 'ai': 'application/postscript', 'appcache': 'text/cache-manifest', 'avi': 'video/avi', 'bin': 'application/octet-stream', 'bmp': 'image/bmp', 'coffee': 'text/coffeescript', 'css': 'text/css', 'csv': 'text/csv', 'doc': 'application/msword', 'docx': 'application/msword', 'dtd': 'application/xml-dtd', 'eps': 'application/postscript', 'exe': 'application/octet-stream', 'geojson': 'application/json', 'gif': 'image/gif', 'gzip': 'application/x-gzip', 'htm': 'text/html', 'html': 'text/html', 'ico': 'image/x-icon', 'ics': 'text/calendar', 'ifb': 'text/calendar', 'jpe': 'image/jpeg', 'jpeg': 'image/jpeg', 'jpg': 'image/jpeg', 'js': 'text/javascript', 'json': 'application/json', 'jsx': 'text/jsx', 'less': 'text/css', 'm4a': 'audio/mp4a-latm', 'm4v': 'video/x-m4v', 'manifest': 'text/cache-manifest', 'md': 'text/x-markdown', 'mid': 'audio/midi', 'midi': 'audio/midi', 'mov': 'video/quicktime', 'mp3': 'audio/mpeg', 'mp4': 'video/mp4', 'mpe': 'video/mpeg', 'mpeg': 'video/mpeg', 'mpg': 'video/mpeg', 'mpga': 'audio/mpeg', 'mtl': 'text/plain', 'mv4': 'video/mv4', 'obj': 'text/plain', 'ogg': 'application/ogg', 'ogv': 'video/ogg', 'package': 'text/plain', 'pdf': 'application/pdf', 'png': 'image/png', 'ppt': 'application/vnd.ms-powerpoint', 'pptx': 'application/vnd.ms-powerpoint', 'ps': 'application/postscript', 'rar': 'application/x-rar-compressed', 'rtf': 'text/rtf', 'sass': 'text/css', 'scss': 'text/css', 'sh': 'application/x-sh', 'stl': 'application/sla', 'svg': 'image/svg+xml', 'swf': 'application/x-shockwave-flash', 'tar': 'application/x-tar', 'tif': 'image/tiff', 'tiff': 'image/tiff', 'txt': 'text/plain', 'wav': 'audio/x-wav', 'webm': 'video/webm', 'webp': 'image/webp', 'woff': 'application/font-woff', 'woff2': 'application/font-woff2', 'xht': 'application/xhtml+xml', 'xhtml': 'application/xhtml+xml', 'xls': 'application/vnd.ms-excel', 'xlsx': 'application/vnd.ms-excel', 'xml': 'application/xml', 'xpm': 'image/x-xpixmap', 'xsl': 'application/xml', 'xslt': 'application/xslt+xml', 'zip': 'application/zip' }; exports.getContentType = function(ext) { if (ext[0] === '.') ext = ext.substring(1); return CONTENTTYPES[ext.toLowerCase()] || 'application/octet-stream'; }; exports.getExtension = function(filename) { var index = filename.lastIndexOf('.'); return index !== -1 && filename.indexOf('/', index - 1) === -1 ? filename.substring(index + 1) : ''; }; exports.getName = function(path) { var l = path.length - 1; var c = path[l]; if (c === '/' || c === '\\') path = path.substring(0, l); var index = path.lastIndexOf('/'); if (index !== -1) return path.substring(index + 1); index = path.lastIndexOf('\\'); if (index !== -1) return path.substring(index + 1); return path; }; function rnd() { return Math.floor(Math.random() * 65536).toString(36); } exports.GUID = function(max) { max = max || 40; var str = ''; for (var i = 0; i < (max / 3) + 1; i++) str += rnd(); return str.substring(0, max); }; exports.streamer = function(beg, end, callback) { if (typeof(end) === 'function') { callback = end; end = undefined; } var indexer = 0; var buffer = exports.createBufferSize(0); beg = exports.createBuffer(beg, 'utf8'); if (end) end = exports.createBuffer(end, 'utf8'); if (!end) { var length = beg.length; return function(chunk) { if (!chunk) return; buffer = Buffer.concat([buffer, chunk]); var index = buffer.indexOf(beg); if (index === -1) return; while (index !== -1) { callback(buffer.toString('utf8', 0, index + length), indexer++); buffer = buffer.slice(index + length); index = buffer.indexOf(beg); if (index === -1) return; } }; } var blength = beg.length; var elength = end.length; var bi = -1; var ei = -1; var is = false; return function(chunk) { if (!chunk) return; buffer = Buffer.concat([buffer, chunk]); if (!is) { bi = buffer.indexOf(beg); if (bi === -1) return; is = true; } if (is) { ei = buffer.indexOf(end, bi + blength); if (ei === -1) return; } while (bi !== -1) { callback(buffer.toString('utf8', bi, ei + elength), indexer++); buffer = buffer.slice(ei + elength); is = false; bi = buffer.indexOf(beg); if (bi === -1) return; is = true; ei = buffer.indexOf(end, bi + blength); if (ei === -1) return; } }; }; if (!String.prototype.padLeft) { String.prototype.padLeft = function(max, c) { var self = this; var len = max - self.length; if (len < 0) return self; if (c === undefined) c = ' '; while (len--) self = c + self; return self; }; } if (!String.prototype.padRight) { String.prototype.padRight = function(max, c) { var self = this; var len = max - self.length; if (len < 0) return self; if (c === undefined) c = ' '; while (len--) self += c; return self; }; } String.prototype.parseDateExpiration = function() { var self = this; var arr = self.split(' '); var dt = new Date(); var length = arr.length; for (var i = 0; i < length; i += 2) { var num = arr[i].parseInt(); if (num === 0) continue; var type = arr[i + 1] || ''; if (type === '') continue; dt = dt.add(type, num); } return dt; }; Date.prototype.add = function(type, value) { var self = this; if (type.constructor === Number) return new Date(self.getTime() + (type - type%1)); if (value === undefined) { var arr = type.split(' '); type = arr[1]; value = (arr[0] || '').parseInt(); } var dt = new Date(self.getTime()); switch(type) { case 's': case 'ss': case 'sec': case 'second': case 'seconds': dt.setSeconds(dt.getSeconds() + value); return dt; case 'm': case 'mm': case 'minute': case 'min': case 'minutes': dt.setMinutes(dt.getMinutes() + value); return dt; case 'h': case 'hh': case 'hour': case 'hours': dt.setHours(dt.getHours() + value); return dt; case 'd': case 'dd': case 'day': case 'days': dt.setDate(dt.getDate() + value); return dt; case 'w': case 'ww': case 'week': case 'weeks': dt.setDate(dt.getDate() + (value * 7)); return dt; case 'M': case 'MM': case 'month': case 'months': dt.setMonth(dt.getMonth() + value); return dt; case 'y': case 'yyyy': case 'year': case 'years': dt.setFullYear(dt.getFullYear() + value); return dt; } return dt; }; Number.prototype.format = function(decimals, separator, separatorDecimal) { var self = this; var num = self.toString(); var dec = ''; var output = ''; var minus = num[0] === '-' ? '-' : ''; if (minus) num = num.substring(1); var index = num.indexOf('.'); if (typeof(decimals) === 'string') { var tmp = separator; separator = decimals; decimals = tmp; } if (separator === undefined) separator = ' '; if (index !== -1) { dec = num.substring(index + 1); num = num.substring(0, index); } index = -1; for (var i = num.length - 1; i >= 0; i--) { index++; if (index > 0 && index % 3 === 0) output = separator + output; output = num[i] + output; } if (decimals || dec.length) { if (dec.length > decimals) dec = dec.substring(0, decimals || 0); else dec = dec.padRight(decimals || 0, '0'); } if (dec.length && separatorDecimal === undefined) separatorDecimal = separator === '.' ? ',' : '.'; return minus + output + (dec.length ? separatorDecimal + dec : ''); }; Date.prototype.format = function(format) { var self = this; var half = false; if (format && format[0] === '!') { half = true; format = format.substring(1); } if (!format) return self.getFullYear() + '-' + (self.getMonth() + 1).toString().padLeft(2, '0') + '-' + self.getDate().toString().padLeft(2, '0') + 'T' + self.getHours().toString().padLeft(2, '0') + ':' + self.getMinutes().toString().padLeft(2, '0') + ':' + self.getSeconds().toString().padLeft(2, '0') + '.' + self.getMilliseconds().toString().padLeft(3, '0') + 'Z'; var h = self.getHours(); if (half) { if (h >= 12) h -= 12; } return format.replace(regexpDATEFORMAT, function(key) { switch (key) { case 'yyyy': return self.getFullYear(); case 'yy': return self.getFullYear().toString().substring(2); case 'MMM': var m = MONTHS[self.getMonth()]; return m.substring(0, 3); case 'MMMM': var m = MONTHS[self.getMonth()]; return m; case 'MM': return (self.getMonth() + 1).toString().padLeft(2, '0'); case 'M': return (self.getMonth() + 1); case 'ddd': var m = DAYS[self.getDay()]; return m.substring(0, 3); case 'dddd': var m = DAYS[self.getDay()]; return m; case 'dd': return self.getDate().toString().padLeft(2, '0'); case 'd': return self.getDate(); case 'HH': case 'hh': return h.toString().padLeft(2, '0'); case 'H': case 'h': return self.getHours(); case 'mm': return self.getMinutes().toString().padLeft(2, '0'); case 'm': return self.getMinutes(); case 'ss': return self.getSeconds().toString().padLeft(2, '0'); case 's': return self.getSeconds(); case 'w': case 'ww': var tmp = new Date(+self); tmp.setHours(0, 0, 0); tmp.setDate(tmp.getDate() + 4 - (tmp.getDay() || 7)); tmp = Math.ceil((((tmp - new Date(tmp.getFullYear(), 0, 1)) / 8.64e7) + 1) / 7); return key === 'ww' ? tmp.toString().padLeft(2, '0') : tmp; case 'a': var a = 'AM'; if (self.getHours() >= 12) a = 'PM'; return a; } }); }; String.prototype.parseInt = function(def) { var str = this.trim(); var num = +str; return isNaN(num) ? (def || 0) : num; }; if (!String.prototype.trim) { String.prototype.trim = function() { return this.replace(regexpTRIM, ''); }; } String.prototype.isJSONDate = function() { var l = this.length - 1; return l > 22 && l < 30 && this[l] === 'Z' && this[10] === 'T' && this[4] === '-' && this[13] === ':' && this[16] === ':'; }; Array.prototype.randomize = function() { for (var i = this.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = this[i]; this[i] = this[j]; this[j] = temp; } return this; }; Array.prototype.limit = function(max, fn, callback, index) { if (index === undefined) index = 0; var current = []; var self = this; var length = index + max; for (var i = index; i < length; i++) { var item = self[i]; if (item !== undefined) { current.push(item); continue; } if (!current.length) { callback && callback(); return self; } fn(current, () => callback && callback(), index, index + max); return self; } if (!current.length) { callback && callback(); return self; } fn(current, function() { if (length < self.length) { self.limit(max, fn, callback, length); return; } callback && callback(); }, index, index + max); return self; }; Array.prototype.quicksort = Array.prototype.orderBy = function(name, asc, maxlength) { var length = this.length; if (!length || length === 1) return this; if (typeof(name) === 'boolean') { asc = name; name = undefined; } if (maxlength === undefined) maxlength = 3; if (asc === undefined) asc = true; var self = this; var type = 0; var field = name ? self[0][name] : self[0]; switch (typeof(field)) { case 'string': if (field.isJSONDate()) type = 4; else type = 1; break; case 'number': type = 2; break; case 'boolean': type = 3; break; default: if (field instanceof Date) type = 4; else return self; break; } shellsort(self, function(a, b) { var va = name ? a[name] : a; var vb = name ? b[name] : b; // String if (type === 1) { if (va && vb) return asc ? va.substring(0, maxlength).removeDiacritics().localeCompare(vb.substring(0, maxlength).removeDiacritics()) : vb.substring(0, maxlength).removeDiacritics().localeCompare(va.substring(0, maxlength).removeDiacritics()); return 0; } else if (type === 2) { if (va > vb) return asc ? 1 : -1; else if (va < vb) return asc ? -1 : 1; return 0; } else if (type === 3) { if (va === true && vb === false) return asc ? 1 : -1; else if (va === false && vb === true) return asc ? -1 : 1; return 0; } else if (type === 4) { if (!va || !vb) return 0; if (!va.getTime) va = new Date(va); if (!vb.getTime) vb = new Date(vb); if (va.getTime() > vb.getTime()) return asc ? 1 : -1; else if (va.getTime() < vb.getTime()) return asc ? -1 : 1; return 0; } return 0; }); return self; }; String.prototype.removeDiacritics = function() { return this.replace(regexpDiacritics, c => DIACRITICSMAP[c] || c); }; String.prototype.startsWith = function(text, ignoreCase) { var self = this; var length = text.length; var tmp; if (ignoreCase === true) { tmp = self.substring(0, length); return tmp.length === length && tmp.toLowerCase() === text.toLowerCase(); } if (ignoreCase) tmp = self.substr(ignoreCase, length); else tmp = self.substring(0, length); return tmp.length === length && tmp === text; }; String.prototype.endsWith = function(text, ignoreCase) { var self = this; var length = text.length; var tmp; if (ignoreCase === true) { tmp = self.substring(self.length - length); return tmp.length === length && tmp.toLowerCase() === text.toLowerCase(); } if (ignoreCase) tmp = self.substr((self.length - ignoreCase) - length, length); else tmp = self.substring(self.length - length); return tmp.length === length && tmp === text; }; Array.prototype.wait = function(onItem, callback, thread) { var self = this; var init = false; // INIT if (!onItem.$index) { onItem.$pending = 0; onItem.$index = 0; init = true; if (typeof(callback) === 'number') { var tmp = thread; thread = callback; callback = tmp; } } if (thread === undefined) thread = 1; var item = thread === true ? self.shift() : self[onItem.$index]; onItem.$index++; if (item === undefined) { if (onItem.$pending) return self; callback && callback(); onItem.$index = 0; return self; } onItem.$pending++; onItem.call(self, item, function() { setImmediate(function() { onItem.$pending--; self.wait(onItem, callback, thread); }); }); if (!init || thread === true) return self; for (var i = 1; i < thread; i++) self.wait(onItem, callback, 0); return self; }; String.prototype.parseInt2 = function(def) { var num = this.match(regexpINTEGER); return num ? +num : def || 0; }; String.prototype.hash = function() { return string_hash(this); }; function string_hash(s) { var hash = 0, i, char; if (s.length === 0) return hash; var l = s.length; for (i = 0; i < l; i++) { char = s.charCodeAt(i); hash = ((hash << 5) - hash) + char; hash |= 0; // Convert to 32bit integer } return hash; } // ============================================= // SHELL SORT IMPLEMENTATION OF ALGORITHM // ============================================= function _shellInsertionSort(list, length, gapSize, fn) { var temp, i, j; for (i = gapSize; i < length; i += gapSize ) { j = i; while(j > 0 && fn(list[j - gapSize], list[j]) === 1) { temp = list[j]; list[j] = list[j - gapSize]; list[j - gapSize] = temp; j -= gapSize; } } } function shellsort(arr, fn) { var length = arr.length; var gapSize = Math.floor(length / 2); while(gapSize) { _shellInsertionSort(arr, length, gapSize, fn); gapSize = Math.floor(gapSize / 2); } return arr; } if (NODEVERSION > 699) { exports.createBufferSize = (size) => Buffer.alloc(size || 0); exports.createBuffer = (val, type) => Buffer.from(val || '', type); } else { exports.createBufferSize = (size) => new Buffer(size || 0); exports.createBuffer = (val, type) => new Buffer(val || '', type); }