diff --git a/config.js b/config.js index 38c8cacf1..75dbd628a 100644 --- a/config.js +++ b/config.js @@ -12,6 +12,11 @@ module.exports = { assetPath: `assets`, pagePath: `src/docs/pages`, staticPartsPath: `src/static-parts`, + distPath: `dist`, // General information language: `js`, + // Module information + moduleName: `_30s`, + rollupInputFile: `imports.temp.js`, + testModuleFile: `test/_30s.js`, }; diff --git a/dist/_30s.es5.js b/dist/_30s.es5.js index b66594b56..56abd10d5 100644 --- a/dist/_30s.es5.js +++ b/dist/_30s.es5.js @@ -1,7 +1,7 @@ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global._30s = {}))); + (factory((global[''] = global[''] || {}, global['']['/_30s'] = {}))); }(this, (function (exports) { 'use strict'; function _typeof(obj) { @@ -33,20 +33,35 @@ return obj; } - function _objectSpread(target) { + function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + if (enumerableOnly) symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + keys.push.apply(keys, symbols); + } + + return keys; + } + + function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; - var ownKeys = Object.keys(source); - if (typeof Object.getOwnPropertySymbols === 'function') { - ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { - return Object.getOwnPropertyDescriptor(source, sym).enumerable; - })); + if (i % 2) { + ownKeys(source, true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(source).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); } - - ownKeys.forEach(function (key) { - _defineProperty(target, key, source[key]); - }); } return target; @@ -118,54 +133,6 @@ var crypto = typeof require !== "undefined" && require('crypto'); - var CSVToArray = function CSVToArray(data) { - var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ','; - var omitFirstRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - return data.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0).split('\n').map(function (v) { - return v.split(delimiter); - }); - }; - var CSVToJSON = function CSVToJSON(data) { - var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ','; - var titles = data.slice(0, data.indexOf('\n')).split(delimiter); - return data.slice(data.indexOf('\n') + 1).split('\n').map(function (v) { - var values = v.split(delimiter); - return titles.reduce(function (obj, title, index) { - return obj[title] = values[index], obj; - }, {}); - }); - }; - var JSONToFile = function JSONToFile(obj, filename) { - return fs.writeFile("".concat(filename, ".json"), JSON.stringify(obj, null, 2)); - }; - var JSONtoCSV = function JSONtoCSV(arr, columns) { - var delimiter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ','; - return [columns.join(delimiter)].concat(_toConsumableArray(arr.map(function (obj) { - return columns.reduce(function (acc, key) { - return "".concat(acc).concat(!acc.length ? '' : delimiter, "\"").concat(!obj[key] ? '' : obj[key], "\""); - }, ''); - }))).join('\n'); - }; - var RGBToHex = function RGBToHex(r, g, b) { - return ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); - }; - var URLJoin = function URLJoin() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - return args.join('/').replace(/[\/]+/g, '/').replace(/^(.+):\//, '$1://').replace(/^file:/, 'file:/').replace(/\/(\?|&|#[^!])/g, '$1').replace(/\?/g, '&').replace('&', '?'); - }; - var UUIDGeneratorBrowser = function UUIDGeneratorBrowser() { - return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) { - return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16); - }); - }; - var UUIDGeneratorNode = function UUIDGeneratorNode() { - return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) { - return (c ^ crypto.randomBytes(1)[0] & 15 >> c / 4).toString(16); - }); - }; var all = function all(arr) { var fn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Boolean; return arr.every(fn); @@ -200,8 +167,8 @@ }; var ary = function ary(fn, n) { return function () { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; } return fn.apply(void 0, _toConsumableArray(args.slice(0, n))); @@ -212,8 +179,8 @@ }; var attempt = function attempt(fn) { try { - for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { - args[_key3 - 1] = arguments[_key3]; + for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + args[_key2 - 1] = arguments[_key2]; } return fn.apply(void 0, args); @@ -222,8 +189,8 @@ } }; var average = function average() { - for (var _len4 = arguments.length, nums = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - nums[_key4] = arguments[_key4]; + for (var _len3 = arguments.length, nums = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + nums[_key3] = arguments[_key3]; } return nums.reduce(function (acc, val) { @@ -248,21 +215,21 @@ }, [[], []]); }; var bind = function bind(fn, context) { - for (var _len5 = arguments.length, boundArgs = new Array(_len5 > 2 ? _len5 - 2 : 0), _key5 = 2; _key5 < _len5; _key5++) { - boundArgs[_key5 - 2] = arguments[_key5]; + for (var _len4 = arguments.length, boundArgs = new Array(_len4 > 2 ? _len4 - 2 : 0), _key4 = 2; _key4 < _len4; _key4++) { + boundArgs[_key4 - 2] = arguments[_key4]; } return function () { - for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) { - args[_key6] = arguments[_key6]; + for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { + args[_key5] = arguments[_key5]; } - return fn.apply(context, boundArgs.concat(args)); + return fn.apply(context, [].concat(boundArgs, args)); }; }; var bindAll = function bindAll(obj) { - for (var _len7 = arguments.length, fns = new Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) { - fns[_key7 - 1] = arguments[_key7]; + for (var _len6 = arguments.length, fns = new Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) { + fns[_key6 - 1] = arguments[_key6]; } return fns.forEach(function (fn) { @@ -272,16 +239,16 @@ }); }; var bindKey = function bindKey(context, fn) { - for (var _len8 = arguments.length, boundArgs = new Array(_len8 > 2 ? _len8 - 2 : 0), _key8 = 2; _key8 < _len8; _key8++) { - boundArgs[_key8 - 2] = arguments[_key8]; + for (var _len7 = arguments.length, boundArgs = new Array(_len7 > 2 ? _len7 - 2 : 0), _key7 = 2; _key7 < _len7; _key7++) { + boundArgs[_key7 - 2] = arguments[_key7]; } return function () { - for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) { - args[_key9] = arguments[_key9]; + for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) { + args[_key8] = arguments[_key8]; } - return context[fn].apply(context, boundArgs.concat(args)); + return context[fn].apply(context, [].concat(boundArgs, args)); }; }; var binomialCoefficient = function binomialCoefficient(n, k) { @@ -308,8 +275,8 @@ return new Blob([str]).size; }; var call = function call(key) { - for (var _len10 = arguments.length, args = new Array(_len10 > 1 ? _len10 - 1 : 0), _key10 = 1; _key10 < _len10; _key10++) { - args[_key10 - 1] = arguments[_key10]; + for (var _len9 = arguments.length, args = new Array(_len9 > 1 ? _len9 - 1 : 0), _key9 = 1; _key9 < _len9; _key9++) { + args[_key9 - 1] = arguments[_key9]; } return function (context) { @@ -325,8 +292,8 @@ return first.toUpperCase() + (lowerRest ? rest.join('').toLowerCase() : rest.join('')); }; var capitalizeEveryWord = function capitalizeEveryWord(str) { - return str.replace(/\b[a-z]/g, function (char) { - return char.toUpperCase(); + return str.replace(/\b[a-z]/g, function (_char) { + return _char.toUpperCase(); }); }; var castArray = function castArray(val) { @@ -362,8 +329,8 @@ return new RegExp(regExp.source, regExp.flags); }; var coalesce = function coalesce() { - for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) { - args[_key11] = arguments[_key11]; + for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) { + args[_key10] = arguments[_key10]; } return args.find(function (_) { @@ -372,8 +339,8 @@ }; var coalesceFactory = function coalesceFactory(valid) { return function () { - for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) { - args[_key12] = arguments[_key12]; + for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) { + args[_key11] = arguments[_key11]; } return args.find(valid); @@ -381,16 +348,16 @@ }; var collectInto = function collectInto(fn) { return function () { - for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) { - args[_key13] = arguments[_key13]; + for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) { + args[_key12] = arguments[_key12]; } return fn(args); }; }; var colorize = function colorize() { - for (var _len14 = arguments.length, args = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) { - args[_key14] = arguments[_key14]; + for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) { + args[_key13] = arguments[_key13]; } return { @@ -419,8 +386,8 @@ return str.replace(/\s{2,}/g, ' '); }; var compose = function compose() { - for (var _len15 = arguments.length, fns = new Array(_len15), _key15 = 0; _key15 < _len15; _key15++) { - fns[_key15] = arguments[_key15]; + for (var _len14 = arguments.length, fns = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) { + fns[_key14] = arguments[_key14]; } return fns.reduce(function (f, g) { @@ -430,8 +397,8 @@ }); }; var composeRight = function composeRight() { - for (var _len16 = arguments.length, fns = new Array(_len16), _key16 = 0; _key16 < _len16; _key16++) { - fns[_key16] = arguments[_key16]; + for (var _len15 = arguments.length, fns = new Array(_len15), _key15 = 0; _key15 < _len15; _key15++) { + fns[_key15] = arguments[_key15]; } return fns.reduce(function (f, g) { @@ -442,8 +409,8 @@ }; var converge = function converge(converger, fns) { return function () { - for (var _len17 = arguments.length, args = new Array(_len17), _key17 = 0; _key17 < _len17; _key17++) { - args[_key17] = arguments[_key17]; + for (var _len16 = arguments.length, args = new Array(_len16), _key16 = 0; _key16 < _len16; _key16++) { + args[_key16] = arguments[_key16]; } return converger.apply(void 0, _toConsumableArray(fns.map(function (fn) { @@ -476,11 +443,6 @@ return acc; }, {}); }; - var countOccurrences = function countOccurrences(arr, val) { - return arr.reduce(function (a, v) { - return v === val ? a + 1 : a; - }, 0); - }; var counter = function counter(selector, start, end) { var step = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1; var duration = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 2000; @@ -496,6 +458,11 @@ return timer; }; + var countOccurrences = function countOccurrences(arr, val) { + return arr.reduce(function (a, v) { + return v === val ? a + 1 : a; + }, 0); + }; var createDirIfNotExists = function createDirIfNotExists(dir) { return !fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined; }; @@ -525,14 +492,31 @@ } }; }; + var CSVToArray = function CSVToArray(data) { + var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ','; + var omitFirstRow = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + return data.slice(omitFirstRow ? data.indexOf('\n') + 1 : 0).split('\n').map(function (v) { + return v.split(delimiter); + }); + }; + var CSVToJSON = function CSVToJSON(data) { + var delimiter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ','; + var titles = data.slice(0, data.indexOf('\n')).split(delimiter); + return data.slice(data.indexOf('\n') + 1).split('\n').map(function (v) { + var values = v.split(delimiter); + return titles.reduce(function (obj, title, index) { + return obj[title] = values[index], obj; + }, {}); + }); + }; var currentURL = function currentURL() { return window.location.href; }; var curry = function curry(fn) { var arity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : fn.length; - for (var _len18 = arguments.length, args = new Array(_len18 > 2 ? _len18 - 2 : 0), _key18 = 2; _key18 < _len18; _key18++) { - args[_key18 - 2] = arguments[_key18]; + for (var _len17 = arguments.length, args = new Array(_len17 > 2 ? _len17 - 2 : 0), _key17 = 2; _key17 < _len17; _key17++) { + args[_key17 - 2] = arguments[_key17]; } return arity <= args.length ? fn.apply(void 0, args) : curry.bind.apply(curry, [null, fn, arity].concat(args)); @@ -546,8 +530,8 @@ return function () { var _this = this; - for (var _len19 = arguments.length, args = new Array(_len19), _key19 = 0; _key19 < _len19; _key19++) { - args[_key19] = arguments[_key19]; + for (var _len18 = arguments.length, args = new Array(_len18), _key18 = 0; _key18 < _len18; _key18++) { + args[_key18] = arguments[_key18]; } clearTimeout(timeoutId); @@ -598,15 +582,15 @@ }, {}) : obj; }; var defaults = function defaults(obj) { - for (var _len20 = arguments.length, defs = new Array(_len20 > 1 ? _len20 - 1 : 0), _key20 = 1; _key20 < _len20; _key20++) { - defs[_key20 - 1] = arguments[_key20]; + for (var _len19 = arguments.length, defs = new Array(_len19 > 1 ? _len19 - 1 : 0), _key19 = 1; _key19 < _len19; _key19++) { + defs[_key19 - 1] = arguments[_key19]; } return Object.assign.apply(Object, [{}, obj].concat(_toConsumableArray(defs.reverse()), [obj])); }; var defer = function defer(fn) { - for (var _len21 = arguments.length, args = new Array(_len21 > 1 ? _len21 - 1 : 0), _key21 = 1; _key21 < _len21; _key21++) { - args[_key21 - 1] = arguments[_key21]; + for (var _len20 = arguments.length, args = new Array(_len20 > 1 ? _len20 - 1 : 0), _key20 = 1; _key20 < _len20; _key20++) { + args[_key20 - 1] = arguments[_key20]; } return setTimeout.apply(void 0, [fn, 1].concat(args)); @@ -615,8 +599,8 @@ return deg * Math.PI / 180.0; }; var delay = function delay(fn, wait) { - for (var _len22 = arguments.length, args = new Array(_len22 > 2 ? _len22 - 2 : 0), _key22 = 2; _key22 < _len22; _key22++) { - args[_key22 - 2] = arguments[_key22]; + for (var _len21 = arguments.length, args = new Array(_len21 > 2 ? _len21 - 2 : 0), _key21 = 2; _key21 < _len21; _key21++) { + args[_key21 - 2] = arguments[_key21]; } return setTimeout.apply(void 0, [fn, wait].concat(args)); @@ -838,8 +822,8 @@ }; var flip = function flip(fn) { return function (first) { - for (var _len23 = arguments.length, rest = new Array(_len23 > 1 ? _len23 - 1 : 0), _key23 = 1; _key23 < _len23; _key23++) { - rest[_key23 - 1] = arguments[_key23]; + for (var _len22 = arguments.length, rest = new Array(_len22 > 1 ? _len22 - 1 : 0), _key22 = 1; _key22 < _len22; _key22++) { + rest[_key22 - 1] = arguments[_key22]; } return fn.apply(void 0, rest.concat([first])); @@ -848,25 +832,6 @@ var forEachRight = function forEachRight(arr, callback) { return arr.slice(0).reverse().forEach(callback); }; - var forOwn = function forOwn(obj, fn) { - return Object.keys(obj).forEach(function (key) { - return fn(obj[key], key, obj); - }); - }; - var forOwnRight = function forOwnRight(obj, fn) { - return Object.keys(obj).reverse().forEach(function (key) { - return fn(obj[key], key, obj); - }); - }; - var formToObject = function formToObject(form) { - return Array.from(new FormData(form)).reduce(function (acc, _ref10) { - var _ref11 = _slicedToArray(_ref10, 2), - key = _ref11[0], - value = _ref11[1]; - - return _objectSpread({}, acc, _defineProperty({}, key, value)); - }, {}); - }; var formatDuration = function formatDuration(ms) { if (ms < 0) ms = -ms; var time = { @@ -878,14 +843,33 @@ }; return Object.entries(time).filter(function (val) { return val[1] !== 0; - }).map(function (_ref12) { - var _ref13 = _slicedToArray(_ref12, 2), - key = _ref13[0], - val = _ref13[1]; + }).map(function (_ref10) { + var _ref11 = _slicedToArray(_ref10, 2), + key = _ref11[0], + val = _ref11[1]; return "".concat(val, " ").concat(key).concat(val !== 1 ? 's' : ''); }).join(', '); }; + var formToObject = function formToObject(form) { + return Array.from(new FormData(form)).reduce(function (acc, _ref12) { + var _ref13 = _slicedToArray(_ref12, 2), + key = _ref13[0], + value = _ref13[1]; + + return _objectSpread2({}, acc, _defineProperty({}, key, value)); + }, {}); + }; + var forOwn = function forOwn(obj, fn) { + return Object.keys(obj).forEach(function (key) { + return fn(obj[key], key, obj); + }); + }; + var forOwnRight = function forOwnRight(obj, fn) { + return Object.keys(obj).reverse().forEach(function (key) { + return fn(obj[key], key, obj); + }); + }; var fromCamelCase = function fromCamelCase(str) { var separator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '_'; return str.replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2').replace(/([A-Z]+)([A-Z][a-z\d]+)/g, '$1' + separator + '$2').toLowerCase(); @@ -895,7 +879,7 @@ }; var functions = function functions(obj) { var inherited = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; - return (inherited ? _toConsumableArray(Object.keys(obj)).concat(_toConsumableArray(Object.keys(Object.getPrototypeOf(obj)))) : Object.keys(obj)).filter(function (key) { + return (inherited ? [].concat(_toConsumableArray(Object.keys(obj)), _toConsumableArray(Object.keys(Object.getPrototypeOf(obj)))) : Object.keys(obj)).filter(function (key) { return typeof obj[key] === 'function'; }); }; @@ -904,11 +888,11 @@ return !y ? x : gcd(y, x % y); }; - for (var _len24 = arguments.length, arr = new Array(_len24), _key24 = 0; _key24 < _len24; _key24++) { - arr[_key24] = arguments[_key24]; + for (var _len23 = arguments.length, arr = new Array(_len23), _key23 = 0; _key23 < _len23; _key23++) { + arr[_key23] = arguments[_key23]; } - return arr.concat().reduce(function (a, b) { + return [].concat(arr).reduce(function (a, b) { return _gcd(a, b); }); }; @@ -922,11 +906,11 @@ }); }; var get = function get(from) { - for (var _len25 = arguments.length, selectors = new Array(_len25 > 1 ? _len25 - 1 : 0), _key25 = 1; _key25 < _len25; _key25++) { - selectors[_key25 - 1] = arguments[_key25]; + for (var _len24 = arguments.length, selectors = new Array(_len24 > 1 ? _len24 - 1 : 0), _key24 = 1; _key24 < _len24; _key24++) { + selectors[_key24 - 1] = arguments[_key24]; } - return selectors.concat().map(function (s) { + return [].concat(selectors).map(function (s) { return s.replace(/\[([^\[\]]*)\]/g, '.$1.').split('.').filter(function (t) { return t !== ''; }).reduce(function (prev, cur) { @@ -985,8 +969,8 @@ return el.classList.contains(className); }; var hasFlags = function hasFlags() { - for (var _len26 = arguments.length, flags = new Array(_len26), _key26 = 0; _key26 < _len26; _key26++) { - flags[_key26] = arguments[_key26]; + for (var _len25 = arguments.length, flags = new Array(_len25), _key25 = 0; _key25 < _len25; _key25++) { + flags[_key25] = arguments[_key25]; } return flags.every(function (flag) { @@ -1025,11 +1009,11 @@ return 'rgb' + (alpha ? 'a' : '') + '(' + (h >>> (alpha ? 24 : 16)) + ', ' + ((h & (alpha ? 0x00ff0000 : 0x00ff00)) >>> (alpha ? 16 : 8)) + ', ' + ((h & (alpha ? 0x0000ff00 : 0x0000ff)) >>> (alpha ? 8 : 0)) + (alpha ? ", ".concat(h & 0x000000ff) : '') + ')'; }; var hide = function hide() { - for (var _len27 = arguments.length, el = new Array(_len27), _key27 = 0; _key27 < _len27; _key27++) { - el[_key27] = arguments[_key27]; + for (var _len26 = arguments.length, el = new Array(_len26), _key26 = 0; _key26 < _len26; _key26++) { + el[_key26] = arguments[_key26]; } - return el.concat().forEach(function (e) { + return [].concat(el).forEach(function (e) { return e.style.display = 'none'; }); }; @@ -1077,24 +1061,13 @@ return 1000 * iterations / (performance.now() - before); }; - var inRange = function inRange(n, start) { - var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; - - if (end && start > end) { - var _ref14 = [start, end]; - end = _ref14[0]; - start = _ref14[1]; - } - - return end == null ? n >= 0 && n < start : n >= start && n < end; - }; var indentString = function indentString(str, count) { var indent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ' '; return str.replace(/^/gm, indent.repeat(count)); }; var indexOfAll = function indexOfAll(arr, val) { return arr.reduce(function (acc, el, i) { - return el === val ? _toConsumableArray(acc).concat([i]) : acc; + return el === val ? [].concat(_toConsumableArray(acc), [i]) : acc; }, []); }; var initial = function initial(arr) { @@ -1133,8 +1106,8 @@ return Array(n).fill(val); }; var initializeNDArray = function initializeNDArray(val) { - for (var _len28 = arguments.length, args = new Array(_len28 > 1 ? _len28 - 1 : 0), _key28 = 1; _key28 < _len28; _key28++) { - args[_key28 - 1] = arguments[_key28]; + for (var _len27 = arguments.length, args = new Array(_len27 > 1 ? _len27 - 1 : 0), _key27 = 1; _key27 < _len27; _key27++) { + args[_key27 - 1] = arguments[_key27]; } return args.length === 0 ? val : Array.from({ @@ -1143,6 +1116,17 @@ return initializeNDArray.apply(void 0, [val].concat(_toConsumableArray(args.slice(1)))); }); }; + var inRange = function inRange(n, start) { + var end = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; + + if (end && start > end) { + var _ref14 = [start, end]; + end = _ref14[0]; + start = _ref14[1]; + } + + return end == null ? n >= 0 && n < start : n >= start && n < end; + }; var insertAfter = function insertAfter(el, htmlString) { return el.insertAdjacentHTML('afterend', htmlString); }; @@ -1287,8 +1271,8 @@ _iteratorError = err; } finally { try { - if (!_iteratorNormalCompletion && _iterator.return != null) { - _iterator.return(); + if (!_iteratorNormalCompletion && _iterator["return"] != null) { + _iterator["return"](); } } finally { if (_didIteratorError) { @@ -1341,6 +1325,17 @@ return i === arr.length - 2 ? acc + val + end : i === arr.length - 1 ? acc + val : acc + val + separator; }, ''); }; + var JSONtoCSV = function JSONtoCSV(arr, columns) { + var delimiter = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ','; + return [columns.join(delimiter)].concat(_toConsumableArray(arr.map(function (obj) { + return columns.reduce(function (acc, key) { + return "".concat(acc).concat(!acc.length ? '' : delimiter, "\"").concat(!obj[key] ? '' : obj[key], "\""); + }, ''); + }))).join('\n'); + }; + var JSONToFile = function JSONToFile(obj, filename) { + return fs.writeFile("".concat(filename, ".json"), JSON.stringify(obj, null, 2)); + }; var last = function last(arr) { return arr[arr.length - 1]; }; @@ -1353,17 +1348,17 @@ return x * y / gcd(x, y); }; - for (var _len29 = arguments.length, arr = new Array(_len29), _key29 = 0; _key29 < _len29; _key29++) { - arr[_key29] = arguments[_key29]; + for (var _len28 = arguments.length, arr = new Array(_len28), _key28 = 0; _key28 < _len28; _key28++) { + arr[_key28] = arguments[_key28]; } - return arr.concat().reduce(function (a, b) { + return [].concat(arr).reduce(function (a, b) { return _lcm(a, b); }); }; var longestItem = function longestItem() { - for (var _len30 = arguments.length, vals = new Array(_len30), _key30 = 0; _key30 < _len30; _key30++) { - vals[_key30] = arguments[_key30]; + for (var _len29 = arguments.length, vals = new Array(_len29), _key29 = 0; _key29 < _len29; _key29++) { + vals[_key29] = arguments[_key29]; } return vals.reduce(function (a, x) { @@ -1462,11 +1457,11 @@ return cached; }; var merge = function merge() { - for (var _len31 = arguments.length, objs = new Array(_len31), _key31 = 0; _key31 < _len31; _key31++) { - objs[_key31] = arguments[_key31]; + for (var _len30 = arguments.length, objs = new Array(_len30), _key30 = 0; _key30 < _len30; _key30++) { + objs[_key30] = arguments[_key30]; } - return objs.concat().reduce(function (acc, obj) { + return [].concat(objs).reduce(function (acc, obj) { return Object.keys(obj).reduce(function (a, k) { acc[k] = acc.hasOwnProperty(k) ? [].concat(acc[k]).concat(obj[k]) : obj[k]; return acc; @@ -1522,7 +1517,7 @@ return items.filter(function (item) { return item[link] === id; }).map(function (item) { - return _objectSpread({}, item, { + return _objectSpread2({}, item, { children: nest(items, item.id) }); }); @@ -1536,8 +1531,8 @@ }; var nthArg = function nthArg(n) { return function () { - for (var _len32 = arguments.length, args = new Array(_len32), _key32 = 0; _key32 < _len32; _key32++) { - args[_key32] = arguments[_key32]; + for (var _len31 = arguments.length, args = new Array(_len31), _key31 = 0; _key31 < _len31; _key31++) { + args[_key31] = arguments[_key31]; } return args.slice(n)[0]; @@ -1582,7 +1577,7 @@ return el.removeEventListener(evt, fn, opts); }; var offset = function offset(arr, _offset) { - return _toConsumableArray(arr.slice(_offset)).concat(_toConsumableArray(arr.slice(0, _offset))); + return [].concat(_toConsumableArray(arr.slice(_offset)), _toConsumableArray(arr.slice(0, _offset))); }; var omit = function omit(obj, arr) { return Object.keys(obj).filter(function (k) { @@ -1608,6 +1603,19 @@ el.addEventListener(evt, opts.target ? delegatorFn : fn, opts.options || false); if (opts.target) return delegatorFn; }; + var once = function once(fn) { + var called = false; + return function () { + if (called) return; + called = true; + + for (var _len32 = arguments.length, args = new Array(_len32), _key32 = 0; _key32 < _len32; _key32++) { + args[_key32] = arguments[_key32]; + } + + return fn.apply(this, args); + }; + }; var onUserInputChange = function onUserInputChange(callback) { var type = 'mouse', lastTime = 0; @@ -1623,19 +1631,6 @@ type = 'touch', callback(type), document.addEventListener('mousemove', mousemoveHandler); }); }; - var once = function once(fn) { - var called = false; - return function () { - if (called) return; - called = true; - - for (var _len33 = arguments.length, args = new Array(_len33), _key33 = 0; _key33 < _len33; _key33++) { - args[_key33] = arguments[_key33]; - } - - return fn.apply(this, args); - }; - }; var orderBy = function orderBy(arr, props, orders) { return _toConsumableArray(arr).sort(function (a, b) { return props.reduce(function (acc, prop, i) { @@ -1653,13 +1648,13 @@ }); }; var over = function over() { - for (var _len34 = arguments.length, fns = new Array(_len34), _key34 = 0; _key34 < _len34; _key34++) { - fns[_key34] = arguments[_key34]; + for (var _len33 = arguments.length, fns = new Array(_len33), _key33 = 0; _key33 < _len33; _key33++) { + fns[_key33] = arguments[_key33]; } return function () { - for (var _len35 = arguments.length, args = new Array(_len35), _key35 = 0; _key35 < _len35; _key35++) { - args[_key35] = arguments[_key35]; + for (var _len34 = arguments.length, args = new Array(_len34), _key34 = 0; _key34 < _len34; _key34++) { + args[_key34] = arguments[_key34]; } return fns.map(function (fn) { @@ -1669,8 +1664,8 @@ }; var overArgs = function overArgs(fn, transforms) { return function () { - for (var _len36 = arguments.length, args = new Array(_len36), _key36 = 0; _key36 < _len36; _key36++) { - args[_key36] = arguments[_key36]; + for (var _len35 = arguments.length, args = new Array(_len35), _key35 = 0; _key35 < _len35; _key35++) { + args[_key35] = arguments[_key35]; } return fn.apply(void 0, _toConsumableArray(args.map(function (val, i) { @@ -1679,8 +1674,9 @@ }; }; var pad = function pad(str, length) { - var char = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ' '; - return str.padStart((str.length + length) / 2, char).padEnd(length, char); + var _char2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ' '; + + return str.padStart((str.length + length) / 2, _char2).padEnd(length, _char2); }; var palindrome = function palindrome(str) { var s = str.toLowerCase().replace(/[\W_]/g, ''); @@ -1695,26 +1691,26 @@ }, {}); }; var partial = function partial(fn) { - for (var _len37 = arguments.length, partials = new Array(_len37 > 1 ? _len37 - 1 : 0), _key37 = 1; _key37 < _len37; _key37++) { - partials[_key37 - 1] = arguments[_key37]; + for (var _len36 = arguments.length, partials = new Array(_len36 > 1 ? _len36 - 1 : 0), _key36 = 1; _key36 < _len36; _key36++) { + partials[_key36 - 1] = arguments[_key36]; } return function () { - for (var _len38 = arguments.length, args = new Array(_len38), _key38 = 0; _key38 < _len38; _key38++) { - args[_key38] = arguments[_key38]; + for (var _len37 = arguments.length, args = new Array(_len37), _key37 = 0; _key37 < _len37; _key37++) { + args[_key37] = arguments[_key37]; } return fn.apply(void 0, partials.concat(args)); }; }; var partialRight = function partialRight(fn) { - for (var _len39 = arguments.length, partials = new Array(_len39 > 1 ? _len39 - 1 : 0), _key39 = 1; _key39 < _len39; _key39++) { - partials[_key39 - 1] = arguments[_key39]; + for (var _len38 = arguments.length, partials = new Array(_len38 > 1 ? _len38 - 1 : 0), _key38 = 1; _key38 < _len38; _key38++) { + partials[_key38 - 1] = arguments[_key38]; } return function () { - for (var _len40 = arguments.length, args = new Array(_len40), _key40 = 0; _key40 < _len40; _key40++) { - args[_key40] = arguments[_key40]; + for (var _len39 = arguments.length, args = new Array(_len39), _key39 = 0; _key39 < _len39; _key39++) { + args[_key39] = arguments[_key39]; } return fn.apply(void 0, args.concat(partials)); @@ -1734,7 +1730,7 @@ var permutations = function permutations(arr) { if (arr.length <= 2) return arr.length === 2 ? [arr, [arr[1], arr[0]]] : arr; return arr.reduce(function (acc, item, i) { - return acc.concat(permutations(_toConsumableArray(arr.slice(0, i)).concat(_toConsumableArray(arr.slice(i + 1)))).map(function (val) { + return acc.concat(permutations([].concat(_toConsumableArray(arr.slice(0, i)), _toConsumableArray(arr.slice(i + 1)))).map(function (val) { return [item].concat(_toConsumableArray(val)); })); }, []); @@ -1752,8 +1748,8 @@ }, {}); }; var pipeAsyncFunctions = function pipeAsyncFunctions() { - for (var _len41 = arguments.length, fns = new Array(_len41), _key41 = 0; _key41 < _len41; _key41++) { - fns[_key41] = arguments[_key41]; + for (var _len40 = arguments.length, fns = new Array(_len40), _key40 = 0; _key40 < _len40; _key40++) { + fns[_key40] = arguments[_key40]; } return function (arg) { @@ -1763,8 +1759,8 @@ }; }; var pipeFunctions = function pipeFunctions() { - for (var _len42 = arguments.length, fns = new Array(_len42), _key42 = 0; _key42 < _len42; _key42++) { - fns[_key42] = arguments[_key42]; + for (var _len41 = arguments.length, fns = new Array(_len41), _key41 = 0; _key41 < _len41; _key41++) { + fns[_key41] = arguments[_key41]; } return fns.reduce(function (f, g) { @@ -1831,8 +1827,8 @@ }; var promisify = function promisify(func) { return function () { - for (var _len43 = arguments.length, args = new Array(_len43), _key43 = 0; _key43 < _len43; _key43++) { - args[_key43] = arguments[_key43]; + for (var _len42 = arguments.length, args = new Array(_len42), _key42 = 0; _key42 < _len42; _key42++) { + args[_key42] = arguments[_key42]; } return new Promise(function (resolve, reject) { @@ -1843,8 +1839,8 @@ }; }; var pull = function pull(arr) { - for (var _len44 = arguments.length, args = new Array(_len44 > 1 ? _len44 - 1 : 0), _key44 = 1; _key44 < _len44; _key44++) { - args[_key44 - 1] = arguments[_key44]; + for (var _len43 = arguments.length, args = new Array(_len43 > 1 ? _len43 - 1 : 0), _key43 = 1; _key43 < _len43; _key43++) { + args[_key43 - 1] = arguments[_key43]; } var argState = Array.isArray(args[0]) ? args[0] : args; @@ -1884,8 +1880,8 @@ return removed; }; var pullBy = function pullBy(arr) { - for (var _len45 = arguments.length, args = new Array(_len45 > 1 ? _len45 - 1 : 0), _key45 = 1; _key45 < _len45; _key45++) { - args[_key45 - 1] = arguments[_key45]; + for (var _len44 = arguments.length, args = new Array(_len44 > 1 ? _len44 - 1 : 0), _key44 = 1; _key44 < _len44; _key44++) { + args[_key44 - 1] = arguments[_key44]; } var length = args.length; @@ -1928,8 +1924,8 @@ }; var rearg = function rearg(fn, indexes) { return function () { - for (var _len46 = arguments.length, args = new Array(_len46), _key46 = 0; _key46 < _len46; _key46++) { - args[_key46] = arguments[_key46]; + for (var _len45 = arguments.length, args = new Array(_len45), _key45 = 0; _key45 < _len45; _key45++) { + args[_key45] = arguments[_key45]; } return fn.apply(void 0, _toConsumableArray(indexes.map(function (i) { @@ -1969,6 +1965,14 @@ var asLink = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; return asLink ? window.location.href = url : window.location.replace(url); }; + var reducedFilter = function reducedFilter(data, keys, fn) { + return data.filter(fn).map(function (el) { + return keys.reduce(function (acc, key) { + acc[key] = el[key]; + return acc; + }, {}); + }); + }; var reduceSuccessive = function reduceSuccessive(arr, fn, acc) { return arr.reduce(function (res, val, i, arr) { return res.push(fn(res.slice(-1)[0], val, i, arr)), res; @@ -1982,14 +1986,6 @@ return comparator(a, b) >= 0 ? b : a; }); }; - var reducedFilter = function reducedFilter(data, keys, fn) { - return data.filter(fn).map(function (el) { - return keys.reduce(function (acc, key) { - acc[key] = el[key]; - return acc; - }, {}); - }); - }; var reject = function reject(pred, array) { return array.filter(function () { return !pred.apply(void 0, arguments); @@ -2006,12 +2002,15 @@ }; var renameKeys = function renameKeys(keysMap, obj) { return Object.keys(obj).reduce(function (acc, key) { - return _objectSpread({}, acc, _defineProperty({}, keysMap[key] || key, obj[key])); + return _objectSpread2({}, acc, {}, _defineProperty({}, keysMap[key] || key, obj[key])); }, {}); }; var reverseString = function reverseString(str) { return _toConsumableArray(str).reverse().join(''); }; + var RGBToHex = function RGBToHex(r, g, b) { + return ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); + }; var round = function round(n) { var decimals = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; return Number("".concat(Math.round("".concat(n, "e").concat(decimals)), "e-").concat(decimals)); @@ -2087,18 +2086,18 @@ var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; var delCount = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; - for (var _len47 = arguments.length, elements = new Array(_len47 > 3 ? _len47 - 3 : 0), _key47 = 3; _key47 < _len47; _key47++) { - elements[_key47 - 3] = arguments[_key47]; + for (var _len46 = arguments.length, elements = new Array(_len46 > 3 ? _len46 - 3 : 0), _key46 = 3; _key46 < _len46; _key46++) { + elements[_key46 - 3] = arguments[_key46]; } return arr.slice(0, index).concat(elements).concat(arr.slice(index + delCount)); }; var show = function show() { - for (var _len48 = arguments.length, el = new Array(_len48), _key48 = 0; _key48 < _len48; _key48++) { - el[_key48] = arguments[_key48]; + for (var _len47 = arguments.length, el = new Array(_len47), _key47 = 0; _key47 < _len47; _key47++) { + el[_key47] = arguments[_key47]; } - return el.concat().forEach(function (e) { + return [].concat(el).forEach(function (e) { return e.style.display = ''; }); }; @@ -2214,11 +2213,11 @@ return str.replace(/<[^>]*>/g, ''); }; var sum = function sum() { - for (var _len49 = arguments.length, arr = new Array(_len49), _key49 = 0; _key49 < _len49; _key49++) { - arr[_key49] = arguments[_key49]; + for (var _len48 = arguments.length, arr = new Array(_len48), _key48 = 0; _key48 < _len48; _key48++) { + arr[_key48] = arguments[_key48]; } - return arr.concat().reduce(function (acc, val) { + return [].concat(arr).reduce(function (acc, val) { return acc + val; }, 0); }; @@ -2241,9 +2240,9 @@ var symmetricDifference = function symmetricDifference(a, b) { var sA = new Set(a), sB = new Set(b); - return _toConsumableArray(a.filter(function (x) { + return [].concat(_toConsumableArray(a.filter(function (x) { return !sB.has(x); - })).concat(_toConsumableArray(b.filter(function (x) { + })), _toConsumableArray(b.filter(function (x) { return !sA.has(x); }))); }; @@ -2254,18 +2253,18 @@ sB = new Set(b.map(function (v) { return fn(v); })); - return _toConsumableArray(a.filter(function (x) { + return [].concat(_toConsumableArray(a.filter(function (x) { return !sB.has(fn(x)); - })).concat(_toConsumableArray(b.filter(function (x) { + })), _toConsumableArray(b.filter(function (x) { return !sA.has(fn(x)); }))); }; var symmetricDifferenceWith = function symmetricDifferenceWith(arr, val, comp) { - return _toConsumableArray(arr.filter(function (a) { + return [].concat(_toConsumableArray(arr.filter(function (a) { return val.findIndex(function (b) { return comp(a, b); }) === -1; - })).concat(_toConsumableArray(val.filter(function (a) { + })), _toConsumableArray(val.filter(function (a) { return arr.findIndex(function (b) { return comp(a, b); }) === -1; @@ -2305,8 +2304,8 @@ _iteratorError2 = err; } finally { try { - if (!_iteratorNormalCompletion2 && _iterator2.return != null) { - _iterator2.return(); + if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) { + _iterator2["return"](); } } finally { if (_didIteratorError2) { @@ -2338,18 +2337,18 @@ } }; }; - var timeTaken = function timeTaken(callback) { - console.time('timeTaken'); - var r = callback(); - console.timeEnd('timeTaken'); - return r; - }; var times = function times(n, fn) { var context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined; var i = 0; while (fn.call(context, i) !== false && ++i < n) {} }; + var timeTaken = function timeTaken(callback) { + console.time('timeTaken'); + var r = callback(); + console.timeEnd('timeTaken'); + return r; + }; var toCamelCase = function toCamelCase(str) { var s = str && str.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g).map(function (x) { return x.slice(0, 1).toUpperCase() + x.slice(1).toLowerCase(); @@ -2366,6 +2365,9 @@ var toDecimalMark = function toDecimalMark(num) { return num.toLocaleString('en-US'); }; + var toggleClass = function toggleClass(el, className) { + return el.classList.toggle(className); + }; var toHash = function toHash(object, key) { return Array.prototype.reduce.call(object, function (acc, data, index) { return acc[!key ? index : data[key]] = data, acc; @@ -2376,13 +2378,19 @@ return x.toLowerCase(); }).join('-'); }; + var tomorrow = function tomorrow() { + var t = new Date(); + t.setDate(t.getDate() + 1); + return t.toISOString().split('T')[0]; + }; var toOrdinalSuffix = function toOrdinalSuffix(num) { - var int = parseInt(num), - digits = [int % 10, int % 100], + var _int = parseInt(num), + digits = [_int % 10, _int % 100], ordinals = ['st', 'nd', 'rd', 'th'], oPattern = [1, 2, 3, 4], tPattern = [11, 12, 13, 14, 15, 16, 17, 18, 19]; - return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? int + ordinals[digits[0] - 1] : int + ordinals[3]; + + return oPattern.includes(digits[0]) && !tPattern.includes(digits[1]) ? _int + ordinals[digits[0] - 1] : _int + ordinals[3]; }; var toSafeInteger = function toSafeInteger(num) { return Math.round(Math.max(Math.min(num, Number.MAX_SAFE_INTEGER), Number.MIN_SAFE_INTEGER)); @@ -2397,14 +2405,6 @@ return x.charAt(0).toUpperCase() + x.slice(1); }).join(' '); }; - var toggleClass = function toggleClass(el, className) { - return el.classList.toggle(className); - }; - var tomorrow = function tomorrow() { - var t = new Date(); - t.setDate(t.getDate() + 1); - return t.toISOString().split('T')[0]; - }; var transform = function transform(obj, fn, acc) { return Object.keys(obj).reduce(function (a, k) { return fn(a, obj[k], k, obj); @@ -2439,8 +2439,8 @@ }; }; - for (var _len50 = arguments.length, args = new Array(_len50), _key50 = 0; _key50 < _len50; _key50++) { - args[_key50] = arguments[_key50]; + for (var _len49 = arguments.length, args = new Array(_len49), _key49 = 0; _key49 < _len49; _key49++) { + args[_key49] = arguments[_key49]; } if (n > args.length) throw new RangeError('Arguments too few!'); @@ -2481,16 +2481,16 @@ return result; }; var union = function union(a, b) { - return Array.from(new Set(_toConsumableArray(a).concat(_toConsumableArray(b)))); + return Array.from(new Set([].concat(_toConsumableArray(a), _toConsumableArray(b)))); }; var unionBy = function unionBy(a, b, fn) { var s = new Set(a.map(fn)); - return Array.from(new Set(_toConsumableArray(a).concat(_toConsumableArray(b.filter(function (x) { + return Array.from(new Set([].concat(_toConsumableArray(a), _toConsumableArray(b.filter(function (x) { return !s.has(fn(x)); }))))); }; var unionWith = function unionWith(a, b, comp) { - return Array.from(new Set(_toConsumableArray(a).concat(_toConsumableArray(b.filter(function (x) { + return Array.from(new Set([].concat(_toConsumableArray(a), _toConsumableArray(b.filter(function (x) { return a.findIndex(function (y) { return comp(x, y); }) === -1; @@ -2516,9 +2516,9 @@ }, []); }; var uniqueSymmetricDifference = function uniqueSymmetricDifference(a, b) { - return _toConsumableArray(new Set(_toConsumableArray(a.filter(function (v) { + return _toConsumableArray(new Set([].concat(_toConsumableArray(a.filter(function (v) { return !b.includes(v); - })).concat(_toConsumableArray(b.filter(function (v) { + })), _toConsumableArray(b.filter(function (v) { return !a.includes(v); }))))); }; @@ -2553,6 +2553,23 @@ return fn.apply(void 0, _toConsumableArray(val)); }); }; + var URLJoin = function URLJoin() { + for (var _len50 = arguments.length, args = new Array(_len50), _key50 = 0; _key50 < _len50; _key50++) { + args[_key50] = arguments[_key50]; + } + + return args.join('/').replace(/[\/]+/g, '/').replace(/^(.+):\//, '$1://').replace(/^file:/, 'file:/').replace(/\/(\?|&|#[^!])/g, '$1').replace(/\?/g, '&').replace('&', '?'); + }; + var UUIDGeneratorBrowser = function UUIDGeneratorBrowser() { + return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) { + return (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16); + }); + }; + var UUIDGeneratorNode = function UUIDGeneratorNode() { + return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, function (c) { + return (c ^ crypto.randomBytes(1)[0] & 15 >> c / 4).toString(16); + }); + }; var validateNumber = function validateNumber(n) { return !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n; }; @@ -2642,15 +2659,240 @@ }); }); }; + var binarySearch = function binarySearch(arr, val) { + var start = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0; + var end = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : arr.length - 1; + if (start > end) return -1; + var mid = Math.floor((start + end) / 2); + if (arr[mid] > val) return binarySearch(arr, val, start, mid - 1); + if (arr[mid] < val) return binarySearch(arr, val, mid + 1, end); + return mid; + }; + var celsiusToFahrenheit = function celsiusToFahrenheit(degrees) { + return 1.8 * degrees + 32; + }; + var cleanObj = function cleanObj(obj) { + var keysToKeep = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; + var childIndicator = arguments.length > 2 ? arguments[2] : undefined; + Object.keys(obj).forEach(function (key) { + if (key === childIndicator) { + cleanObj(obj[key], keysToKeep, childIndicator); + } else if (!keysToKeep.includes(key)) { + delete obj[key]; + } + }); + return obj; + }; + var collatz = function collatz(n) { + return n % 2 === 0 ? n / 2 : 3 * n + 1; + }; + var countVowels = function countVowels(str) { + return (str.match(/[aeiou]/gi) || []).length; + }; + var factors = function factors(num) { + var primes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var isPrime = function isPrime(num) { + var boundary = Math.floor(Math.sqrt(num)); + + for (var i = 2; i <= boundary; i++) { + if (num % i === 0) return false; + } + + return num >= 2; + }; + + var isNeg = num < 0; + num = isNeg ? -num : num; + var array = Array.from({ + length: num - 1 + }).map(function (val, i) { + return num % (i + 2) === 0 ? i + 2 : false; + }).filter(function (val) { + return val; + }); + if (isNeg) array = array.reduce(function (acc, val) { + acc.push(val); + acc.push(-val); + return acc; + }, []); + return primes ? array.filter(isPrime) : array; + }; + var fahrenheitToCelsius = function fahrenheitToCelsius(degrees) { + return (degrees - 32) * 5 / 9; + }; + var fibonacciCountUntilNum = function fibonacciCountUntilNum(num) { + return Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); + }; + var fibonacciUntilNum = function fibonacciUntilNum(num) { + var n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); + return Array.from({ + length: n + }).reduce(function (acc, val, i) { + return acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i); + }, []); + }; + var heronArea = function heronArea(side_a, side_b, side_c) { + var p = (side_a + side_b + side_c) / 2; + return Math.sqrt(p * (p - side_a) * (p - side_b) * (p - side_c)); + }; + var howManyTimes = function howManyTimes(num, divisor) { + if (divisor === 1 || divisor === -1) return Infinity; + if (divisor === 0) return 0; + var i = 0; + + while (Number.isInteger(num / divisor)) { + i++; + num = num / divisor; + } + + return i; + }; + var httpDelete = function httpDelete(url, callback) { + var err = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : console.error; + var request = new XMLHttpRequest(); + request.open('DELETE', url, true); + + request.onload = function () { + return callback(request); + }; + + request.onerror = function () { + return err(request); + }; + + request.send(); + }; + var httpPut = function httpPut(url, data, callback) { + var err = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : console.error; + var request = new XMLHttpRequest(); + request.open("PUT", url, true); + request.setRequestHeader('Content-type', 'application/json; charset=utf-8'); + + request.onload = function () { + return callback(request); + }; + + request.onerror = function () { + return err(request); + }; + + request.send(data); + }; + var isArmstrongNumber = function isArmstrongNumber(digits) { + return function (arr) { + return arr.reduce(function (a, d) { + return a + Math.pow(parseInt(d), arr.length); + }, 0) == digits; + }((digits + '').split('')); + }; + var isSimilar = function isSimilar(pattern, str) { + return _toConsumableArray(str).reduce(function (matchIndex, _char3) { + return _char3.toLowerCase() === (pattern[matchIndex] || '').toLowerCase() ? matchIndex + 1 : matchIndex; + }, 0) === pattern.length; + }; + var JSONToDate = function JSONToDate(arr) { + var dt = new Date(parseInt(arr.toString().substr(6))); + return "".concat(dt.getDate(), "/").concat(dt.getMonth() + 1, "/").concat(dt.getFullYear()); + }; + var kmphToMph = function kmphToMph(kmph) { + return 0.621371192 * kmph; + }; + var levenshteinDistance = function levenshteinDistance(string1, string2) { + if (string1.length === 0) return string2.length; + if (string2.length === 0) return string1.length; + var matrix = Array(string2.length + 1).fill(0).map(function (x, i) { + return [i]; + }); + matrix[0] = Array(string1.length + 1).fill(0).map(function (x, i) { + return i; + }); + + for (var i = 1; i <= string2.length; i++) { + for (var j = 1; j <= string1.length; j++) { + if (string2[i - 1] === string1[j - 1]) { + matrix[i][j] = matrix[i - 1][j - 1]; + } else { + matrix[i][j] = Math.min(matrix[i - 1][j - 1] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j] + 1); + } + } + } + + return matrix[string2.length][string1.length]; + }; + var mphToKmph = function mphToKmph(mph) { + return 1.6093440006146922 * mph; + }; + var pipeLog = function pipeLog(data) { + return console.log(data) || data; + }; + var quickSort = function quickSort(_ref31, desc) { + var _ref32 = _toArray(_ref31), + n = _ref32[0], + nums = _ref32.slice(1); + + return isNaN(n) ? [] : [].concat(_toConsumableArray(quickSort(nums.filter(function (v) { + return desc ? v > n : v <= n; + }), desc)), [n], _toConsumableArray(quickSort(nums.filter(function (v) { + return !desc ? v > n : v <= n; + }), desc))); + }; + var removeVowels = function removeVowels(str) { + var repl = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + return str.replace(/[aeiou]/gi, repl); + }; + var solveRPN = function solveRPN(rpn) { + var OPERATORS = { + '*': function _(a, b) { + return a * b; + }, + '+': function _(a, b) { + return a + b; + }, + '-': function _(a, b) { + return a - b; + }, + '/': function _(a, b) { + return a / b; + }, + '**': function _(a, b) { + return Math.pow(a, b); + } + }; + var _ref33 = [[], rpn.replace(/\^/g, '**').split(/\s+/g).filter(function (el) { + return !/\s+/.test(el) && el !== ''; + })], + stack = _ref33[0], + solve = _ref33[1]; + solve.forEach(function (symbol) { + if (!isNaN(parseFloat(symbol)) && isFinite(symbol)) { + stack.push(symbol); + } else if (Object.keys(OPERATORS).includes(symbol)) { + var _ref34 = [stack.pop(), stack.pop()], + a = _ref34[0], + b = _ref34[1]; + stack.push(OPERATORS[symbol](parseFloat(b), parseFloat(a))); + } else { + throw "".concat(symbol, " is not a recognized symbol"); + } + }); + if (stack.length === 1) return stack.pop();else throw "".concat(rpn, " is not a proper RPN. Please check it and try again"); + }; + var speechSynthesis = function speechSynthesis(message) { + var msg = new SpeechSynthesisUtterance(message); + msg.voice = window.speechSynthesis.getVoices()[0]; + window.speechSynthesis.speak(msg); + }; + var squareSum = function squareSum() { + for (var _len55 = arguments.length, args = new Array(_len55), _key55 = 0; _key55 < _len55; _key55++) { + args[_key55] = arguments[_key55]; + } + + return args.reduce(function (squareSum, number) { + return squareSum + Math.pow(number, 2); + }, 0); + }; - exports.CSVToArray = CSVToArray; - exports.CSVToJSON = CSVToJSON; - exports.JSONToFile = JSONToFile; - exports.JSONtoCSV = JSONtoCSV; - exports.RGBToHex = RGBToHex; - exports.URLJoin = URLJoin; - exports.UUIDGeneratorBrowser = UUIDGeneratorBrowser; - exports.UUIDGeneratorNode = UUIDGeneratorNode; exports.all = all; exports.allEqual = allEqual; exports.any = any; @@ -2691,11 +2933,13 @@ exports.converge = converge; exports.copyToClipboard = copyToClipboard; exports.countBy = countBy; - exports.countOccurrences = countOccurrences; exports.counter = counter; + exports.countOccurrences = countOccurrences; exports.createDirIfNotExists = createDirIfNotExists; exports.createElement = createElement; exports.createEventHub = createEventHub; + exports.CSVToArray = CSVToArray; + exports.CSVToJSON = CSVToJSON; exports.currentURL = currentURL; exports.curry = curry; exports.dayOfYear = dayOfYear; @@ -2742,10 +2986,10 @@ exports.flattenObject = flattenObject; exports.flip = flip; exports.forEachRight = forEachRight; + exports.formatDuration = formatDuration; + exports.formToObject = formToObject; exports.forOwn = forOwn; exports.forOwnRight = forOwnRight; - exports.formToObject = formToObject; - exports.formatDuration = formatDuration; exports.fromCamelCase = fromCamelCase; exports.functionName = functionName; exports.functions = functions; @@ -2773,7 +3017,6 @@ exports.httpPost = httpPost; exports.httpsRedirect = httpsRedirect; exports.hz = hz; - exports.inRange = inRange; exports.indentString = indentString; exports.indexOfAll = indexOfAll; exports.initial = initial; @@ -2782,6 +3025,7 @@ exports.initializeArrayWithRangeRight = initializeArrayWithRangeRight; exports.initializeArrayWithValues = initializeArrayWithValues; exports.initializeNDArray = initializeNDArray; + exports.inRange = inRange; exports.insertAfter = insertAfter; exports.insertBefore = insertBefore; exports.intersection = intersection; @@ -2827,6 +3071,8 @@ exports.isWeekend = isWeekend; exports.isWritableStream = isWritableStream; exports.join = join; + exports.JSONtoCSV = JSONtoCSV; + exports.JSONToFile = JSONToFile; exports.last = last; exports.lcm = lcm; exports.longestItem = longestItem; @@ -2865,8 +3111,8 @@ exports.omit = omit; exports.omitBy = omitBy; exports.on = on; - exports.onUserInputChange = onUserInputChange; exports.once = once; + exports.onUserInputChange = onUserInputChange; exports.orderBy = orderBy; exports.over = over; exports.overArgs = overArgs; @@ -2901,14 +3147,15 @@ exports.rearg = rearg; exports.recordAnimationFrames = recordAnimationFrames; exports.redirect = redirect; + exports.reducedFilter = reducedFilter; exports.reduceSuccessive = reduceSuccessive; exports.reduceWhich = reduceWhich; - exports.reducedFilter = reducedFilter; exports.reject = reject; exports.remove = remove; exports.removeNonASCII = removeNonASCII; exports.renameKeys = renameKeys; exports.reverseString = reverseString; + exports.RGBToHex = RGBToHex; exports.round = round; exports.runAsync = runAsync; exports.runPromisesInSeries = runPromisesInSeries; @@ -2950,19 +3197,19 @@ exports.takeRightWhile = takeRightWhile; exports.takeWhile = takeWhile; exports.throttle = throttle; - exports.timeTaken = timeTaken; exports.times = times; + exports.timeTaken = timeTaken; exports.toCamelCase = toCamelCase; exports.toCurrency = toCurrency; exports.toDecimalMark = toDecimalMark; + exports.toggleClass = toggleClass; exports.toHash = toHash; exports.toKebabCase = toKebabCase; + exports.tomorrow = tomorrow; exports.toOrdinalSuffix = toOrdinalSuffix; exports.toSafeInteger = toSafeInteger; exports.toSnakeCase = toSnakeCase; exports.toTitleCase = toTitleCase; - exports.toggleClass = toggleClass; - exports.tomorrow = tomorrow; exports.transform = transform; exports.triggerEvent = triggerEvent; exports.truncateString = truncateString; @@ -2982,6 +3229,9 @@ exports.untildify = untildify; exports.unzip = unzip; exports.unzipWith = unzipWith; + exports.URLJoin = URLJoin; + exports.UUIDGeneratorBrowser = UUIDGeneratorBrowser; + exports.UUIDGeneratorNode = UUIDGeneratorNode; exports.validateNumber = validateNumber; exports.vectorDistance = vectorDistance; exports.when = when; @@ -2993,6 +3243,31 @@ exports.zip = zip; exports.zipObject = zipObject; exports.zipWith = zipWith; + exports.binarySearch = binarySearch; + exports.celsiusToFahrenheit = celsiusToFahrenheit; + exports.cleanObj = cleanObj; + exports.collatz = collatz; + exports.countVowels = countVowels; + exports.factors = factors; + exports.fahrenheitToCelsius = fahrenheitToCelsius; + exports.fibonacciCountUntilNum = fibonacciCountUntilNum; + exports.fibonacciUntilNum = fibonacciUntilNum; + exports.heronArea = heronArea; + exports.howManyTimes = howManyTimes; + exports.httpDelete = httpDelete; + exports.httpPut = httpPut; + exports.isArmstrongNumber = isArmstrongNumber; + exports.isSimilar = isSimilar; + exports.JSONToDate = JSONToDate; + exports.kmphToMph = kmphToMph; + exports.levenshteinDistance = levenshteinDistance; + exports.mphToKmph = mphToKmph; + exports.pipeLog = pipeLog; + exports.quickSort = quickSort; + exports.removeVowels = removeVowels; + exports.solveRPN = solveRPN; + exports.speechSynthesis = speechSynthesis; + exports.squareSum = squareSum; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/dist/_30s.es5.min.js b/dist/_30s.es5.min.js index 890ba5bd8..58919e3d3 100644 --- a/dist/_30s.es5.min.js +++ b/dist/_30s.es5.min.js @@ -1 +1 @@ -(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?t(exports):'function'==typeof define&&define.amd?define(['exports'],t):t(e._30s={})})(this,function(e){'use strict';function t(e){return t='function'==typeof Symbol&&'symbol'==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&'function'==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?'symbol':typeof e},t(e)}function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e){for(var t=1;t>e/4).toString(16)})},e.UUIDGeneratorNode=function(){return'10000000-1000-4000-8000-100000000000'.replace(/[018]/g,function(e){return(e^x.randomBytes(1)[0]&15>>e/4).toString(16)})},e.all=function(e){var t=1'.concat(e,'')}).join('')}()},e.ary=function(e,t){return function(){for(var n=arguments.length,i=Array(n),r=0;rt||t>e)return 0;if(0===t||t===e)return 1;if(1===t||t===e-1)return e;e-t=(document.documentElement.scrollHeight||document.documentElement.clientHeight)},e.btoa=function(e){return Buffer.from(e,'binary').toString('base64')},e.byteSize=function(e){return new Blob([e]).size},e.call=function(e){for(var t=arguments.length,n=Array(1(n-t)*i?-i:i,o=setInterval(function(){a+=l,document.querySelector(e).innerHTML=a,a>=n&&(document.querySelector(e).innerHTML=n),a>=n&&clearInterval(o)},j(k(r/(n-t))));return o},e.createDirIfNotExists=function(e){return S.existsSync(e)?void 0:S.mkdirSync(e)},e.createElement=function(e){var t=document.createElement('div');return t.innerHTML=e,t.firstElementChild},e.createEventHub=function(){return{hub:Object.create(null),emit:function(e,t){(this.hub[e]||[]).forEach(function(e){return e(t)})},on:function(e,t){this.hub[e]||(this.hub[e]=[]),this.hub[e].push(t)},off:function(e,t){var n=(this.hub[e]||[]).findIndex(function(e){return e===t});-1'"]/g,function(e){return{"&":'&',"<":'<',">":'>',"'":''','"':'"'}[e]||e})},e.escapeRegExp=function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,'\\$&')},e.everyNth=function(e,t){return e.filter(function(n,e){return e%t==t-1})},e.extendHex=function(e){return'#'+e.slice(e.startsWith('#')?1:0).split('').map(function(e){return e+e}).join('')},e.factorial=function e(t){return 0>t?function(){throw new TypeError('Negative numbers are not allowed!')}():1>=t?1:t*e(t-1)},e.fibonacci=function(e){return Array.from({length:e}).reduce(function(e,t,n){return e.concat(1e&&(e=-e);var t={day:k(e/864e5),hour:k(e/36e5)%24,minute:k(e/6e4)%60,second:k(e/1e3)%60,millisecond:k(e)%1e3};return Object.entries(t).filter(function(e){return 0!==e[1]}).map(function(e){var t=r(e,2),n=t[0],i=t[1];return''.concat(i,' ').concat(n).concat(1===i?'':'s')}).join(', ')},e.fromCamelCase=function(e){var t=1e?e%12+'am':e%12+'pm'},e.getScrollPosition=function(){var e=0>>(t?24:16))+', '+((n&(t?16711680:65280))>>>(t?16:8))+', '+((n&(t?65280:255))>>>(t?8:0))+(t?', '.concat(255&n):'')+')'},e.hide=function(){for(var e=arguments.length,t=Array(e),n=0;nn){var i=[t,n];n=i[0],t=i[1]}return null==n?0<=e&&e=t&&et},e.isAnagram=function(e,t){var n=function(e){return e.toLowerCase().replace(/[^a-z0-9]/gi,'').split('').sort().join('')};return n(e)===n(t)},e.isArrayLike=function(e){return null!=e&&'function'==typeof e[Symbol.iterator]},e.isBeforeDate=function(e,t){return ee.length?t:e})},e.lowercaseKeys=function(e){return Object.keys(e).reduce(function(t,n){return t[n.toLowerCase()]=e[n],t},{})},e.luhnCheck=function(e){var t=(e+'').split('').reverse().map(function(e){return parseInt(e)}),n=t.splice(0,1)[0],i=t.reduce(function(e,t,n){return 0==n%2?e+2*t%9||9:e+t},0);return i+=n,0==i%10},e.mapKeys=function(e,t){return Object.keys(e).reduce(function(n,i){return n[t(e[i],i,e)]=e[i],n},{})},e.mapNumRange=function(e,t,n,i,r){return(e-t)*(r-i)/(n-t)+i},e.mapObject=function(e,t){return function(n){return n=[e,e.map(t)],n[0].reduce(function(e,t,i){return e[t]=n[1][i],e},{})}()},e.mapString=function(e,t){return e.split('').map(function(n,r){return t(n,r,e)}).join('')},e.mapValues=function(e,t){return Object.keys(e).reduce(function(n,i){return n[i]=t(e[i],i,e),n},{})},e.mask=function(e){var t=1r-n&&(t='mouse',e(t),document.removeEventListener('mousemove',i)),n=r};document.addEventListener('touchstart',function(){'touch'==t||(t='touch',e(t),document.addEventListener('mousemove',i))})},e.once=function(e){var t=!1;return function(){if(!t){t=!0;for(var n=arguments.length,i=Array(n),r=0;rd?1:sj(e))return e+(i?' ':'')+r[0];var a=m(k(Math.log10(0>e?-e:e)/3),r.length-1),l=+((0>e?-e:e)/u(1e3,a)).toPrecision(t);return(0>e?'-':'')+l+(i?' ':'')+r[a]},e.primes=function(e){var t=Array.from({length:e-1}).map(function(e,t){return t+2}),n=k(g(e)),i=Array.from({length:n-1}).map(function(e,t){return t+2});return i.forEach(function(e){return t=t.filter(function(t){return 0!=t%e||t===e})}),t},e.promisify=function(e){return function(){for(var t=arguments.length,n=Array(t),i=0;ie[e.length-1],i=e.findIndex(function(e){return n?t>=e:t<=e});return-1===i?e.length:i},e.sortedIndexBy=function(e,t,n){var i=n(e[0])>n(e[e.length-1]),r=n(t),a=e.findIndex(function(e){return i?r>=n(e):r<=n(e)});return-1===a?e.length:a},e.sortedLastIndex=function(e,t){var n=e[0]>e[e.length-1],i=e.reverse().findIndex(function(e){return n?t<=e:t>=e});return-1===i?0:e.length-i},e.sortedLastIndexBy=function(e,t,n){var i=n(e[0])>n(e[e.length-1]),r=n(t),a=e.map(n).reverse().findIndex(function(e){return i?r<=e:r>=e});return-1===a?0:e.length-a},e.splitLines=function(e){return e.split(/\r?\n/)},e.spreadOver=function(e){return function(t){return e.apply(void 0,o(t))}},e.stableSort=function(e,t){return e.map(function(e,t){return{item:e,index:t}}).sort(function(e,n){return t(e.item,n.item)||e.index-n.index}).map(function(e){var t=e.item;return t})},e.standardDeviation=function(e){var t=!!(1=t.length?2===t.length?[t,t[1]+t[0]]:[t]:t.split('').reduce(function(n,r,a){return n.concat(e(t.slice(0,a)+t.slice(a+1)).map(function(e){return r+e}))},[])},e.stripHTMLTags=function(e){return e.replace(/<[^>]*>/g,'')},e.sum=function(){for(var e=arguments.length,t=Array(e),n=0;n=t&&(e.apply(a,l),r=Date.now())},_(t-(Date.now()-r),0))):(e.apply(a,l),r=Date.now(),n=!0)}},e.timeTaken=function(e){console.time('timeTaken');var t=e();return console.timeEnd('timeTaken'),t},e.times=function(e,t){for(var n=2t?e.slice(0,3r.length)throw new RangeError('Arguments too few!');return n(e)(r.slice(0,t))}},e.unescapeHTML=function(e){return e.replace(/&|<|>|'|"/g,function(e){return{"&":'&',"<":'<',">":'>',"'":'\'',""":'"'}[e]||e})},e.unflattenObject=function(e){return Object.keys(e).reduce(function(t,n){if(-1!==n.indexOf('.')){var r=n.split('.');Object.assign(t,JSON.parse('{'+r.map(function(e,t){return t===r.length-1?'"'.concat(e,'":'):'"'.concat(e,'":{')}).join('')+e[n]+'}'.repeat(r.length)))}else t[n]=e[n];return t},{})},e.unfold=function(e,t){for(var n=[],i=[null,t];i=e(i[1]);)n.push(i[0]);return n},e.union=function(e,t){return Array.from(new Set(o(e).concat(o(t))))},e.unionBy=function(e,t,n){var i=new Set(e.map(n));return Array.from(new Set(o(e).concat(o(t.filter(function(e){return!i.has(n(e))})))))},e.unionWith=function(e,t,n){return Array.from(new Set(o(e).concat(o(t.filter(function(t){return-1===e.findIndex(function(e){return n(t,e)})})))))},e.uniqueElements=function(e){return o(new Set(e))},e.uniqueElementsBy=function(e,t){return e.reduce(function(e,n){return e.some(function(e){return t(n,e)})||e.push(n),e},[])},e.uniqueElementsByRight=function(e,t){return e.reduceRight(function(e,n){return e.some(function(e){return t(n,e)})||e.push(n),e},[])},e.uniqueSymmetricDifference=function(e,t){return o(new Set(o(e.filter(function(e){return!t.includes(e)})).concat(o(t.filter(function(t){return!e.includes(t)})))))},e.untildify=function(e){return e.replace(/^~($|\/|\\)/,''.concat(require('os').homedir(),'$1'))},e.unzip=function(e){return e.reduce(function(e,t){return t.forEach(function(t,n){return e[n].push(t)}),e},Array.from({length:_.apply(Math,o(e.map(function(e){return e.length})))}).map(function(){return[]}))},e.unzipWith=function(e,t){return e.reduce(function(e,t){return t.forEach(function(t,n){return e[n].push(t)}),e},Array.from({length:_.apply(Math,o(e.map(function(e){return e.length})))}).map(function(){return[]})).map(function(e){return t.apply(void 0,o(e))})},e.validateNumber=function(e){return!isNaN(parseFloat(e))&&isFinite(e)&&+e==e},e.vectorDistance=function(){for(var e=arguments.length,t=Array(e),n=0;n'.concat(e,'')}).join('')}()},e.ary=function(e,t){return function(){for(var n=arguments.length,i=Array(n),r=0;rt||t>e)return 0;if(0===t||t===e)return 1;if(1===t||t===e-1)return e;e-t=(document.documentElement.scrollHeight||document.documentElement.clientHeight)},e.btoa=function(e){return Buffer.from(e,'binary').toString('base64')},e.byteSize=function(e){return new Blob([e]).size},e.call=function(e){for(var t=arguments.length,n=Array(1(n-t)*i?-i:i,o=setInterval(function(){l+=a,document.querySelector(e).innerHTML=l,l>=n&&(document.querySelector(e).innerHTML=n),l>=n&&clearInterval(o)},j(b(r/(n-t))));return o},e.countOccurrences=function(e,t){return e.reduce(function(e,n){return n===t?e+1:e},0)},e.createDirIfNotExists=function(e){return C.existsSync(e)?void 0:C.mkdirSync(e)},e.createElement=function(e){var t=document.createElement('div');return t.innerHTML=e,t.firstElementChild},e.createEventHub=function(){return{hub:Object.create(null),emit:function(e,t){(this.hub[e]||[]).forEach(function(e){return e(t)})},on:function(e,t){this.hub[e]||(this.hub[e]=[]),this.hub[e].push(t)},off:function(e,t){var n=(this.hub[e]||[]).findIndex(function(e){return e===t});-1'"]/g,function(e){return{"&":'&',"<":'<',">":'>',"'":''','"':'"'}[e]||e})},e.escapeRegExp=function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,'\\$&')},e.everyNth=function(e,t){return e.filter(function(n,e){return e%t==t-1})},e.extendHex=function(e){return'#'+e.slice(e.startsWith('#')?1:0).split('').map(function(e){return e+e}).join('')},e.factorial=function e(t){return 0>t?function(){throw new TypeError('Negative numbers are not allowed!')}():1>=t?1:t*e(t-1)},e.fibonacci=function(e){return Array.from({length:e}).reduce(function(e,t,n){return e.concat(1e&&(e=-e);var t={day:b(e/864e5),hour:b(e/36e5)%24,minute:b(e/6e4)%60,second:b(e/1e3)%60,millisecond:b(e)%1e3};return Object.entries(t).filter(function(e){return 0!==e[1]}).map(function(e){var t=l(e,2),n=t[0],i=t[1];return''.concat(i,' ').concat(n).concat(1===i?'':'s')}).join(', ')},e.formToObject=function(e){return Array.from(new FormData(e)).reduce(function(e,t){var r=l(t,2),a=r[0],o=r[1];return i({},e,n({},a,o))},{})},e.forOwn=function(e,t){return Object.keys(e).forEach(function(n){return t(e[n],n,e)})},e.forOwnRight=function(e,t){return Object.keys(e).reverse().forEach(function(n){return t(e[n],n,e)})},e.fromCamelCase=function(e){var t=1e?e%12+'am':e%12+'pm'},e.getScrollPosition=function(){var e=0>>(t?24:16))+', '+((n&(t?16711680:65280))>>>(t?16:8))+', '+((n&(t?65280:255))>>>(t?8:0))+(t?', '.concat(255&n):'')+')'},e.hide=function(){for(var e=arguments.length,t=Array(e),n=0;nn){var i=[t,n];n=i[0],t=i[1]}return null==n?0<=e&&e=t&&et},e.isAnagram=function(e,t){var n=function(e){return e.toLowerCase().replace(/[^a-z0-9]/gi,'').split('').sort().join('')};return n(e)===n(t)},e.isArrayLike=function(e){return null!=e&&'function'==typeof e[Symbol.iterator]},e.isBeforeDate=function(e,t){return ee.length?t:e})},e.lowercaseKeys=function(e){return Object.keys(e).reduce(function(t,n){return t[n.toLowerCase()]=e[n],t},{})},e.luhnCheck=function(e){var t=(e+'').split('').reverse().map(function(e){return parseInt(e)}),n=t.splice(0,1)[0],i=t.reduce(function(e,t,n){return 0==n%2?e+2*t%9||9:e+t},0);return i+=n,0==i%10},e.mapKeys=function(e,t){return Object.keys(e).reduce(function(n,i){return n[t(e[i],i,e)]=e[i],n},{})},e.mapNumRange=function(e,t,n,i,r){return(e-t)*(r-i)/(n-t)+i},e.mapObject=function(e,t){return function(n){return n=[e,e.map(t)],n[0].reduce(function(e,t,i){return e[t]=n[1][i],e},{})}()},e.mapString=function(e,t){return e.split('').map(function(n,r){return t(n,r,e)}).join('')},e.mapValues=function(e,t){return Object.keys(e).reduce(function(n,i){return n[i]=t(e[i],i,e),n},{})},e.mask=function(e){var t=1r-n&&(t='mouse',e(t),document.removeEventListener('mousemove',i)),n=r};document.addEventListener('touchstart',function(){'touch'==t||(t='touch',e(t),document.addEventListener('mousemove',i))})},e.orderBy=function(e,t,n){return c(e).sort(function(e,r){return t.reduce(function(t,a,o){if(0===t){var i=n&&'desc'===n[o]?[r[a],e[a]]:[e[a],r[a]],c=l(i,2),s=c[0],d=c[1];t=s>d?1:sj(e))return e+(i?' ':'')+r[0];var l=_(b(Math.log10(0>e?-e:e)/3),r.length-1),a=+((0>e?-e:e)/m(1e3,l)).toPrecision(t);return(0>e?'-':'')+a+(i?' ':'')+r[l]},e.primes=function(e){var t=Array.from({length:e-1}).map(function(e,t){return t+2}),n=b(u(e)),i=Array.from({length:n-1}).map(function(e,t){return t+2});return i.forEach(function(e){return t=t.filter(function(t){return 0!=t%e||t===e})}),t},e.promisify=function(e){return function(){for(var t=arguments.length,n=Array(t),i=0;ie[e.length-1],i=e.findIndex(function(e){return n?t>=e:t<=e});return-1===i?e.length:i},e.sortedIndexBy=function(e,t,n){var i=n(e[0])>n(e[e.length-1]),r=n(t),l=e.findIndex(function(e){return i?r>=n(e):r<=n(e)});return-1===l?e.length:l},e.sortedLastIndex=function(e,t){var n=e[0]>e[e.length-1],i=e.reverse().findIndex(function(e){return n?t<=e:t>=e});return-1===i?0:e.length-i},e.sortedLastIndexBy=function(e,t,n){var i=n(e[0])>n(e[e.length-1]),r=n(t),l=e.map(n).reverse().findIndex(function(e){return i?r<=e:r>=e});return-1===l?0:e.length-l},e.splitLines=function(e){return e.split(/\r?\n/)},e.spreadOver=function(e){return function(t){return e.apply(void 0,c(t))}},e.stableSort=function(e,t){return e.map(function(e,t){return{item:e,index:t}}).sort(function(e,n){return t(e.item,n.item)||e.index-n.index}).map(function(e){var t=e.item;return t})},e.standardDeviation=function(e){var t=!!(1=t.length?2===t.length?[t,t[1]+t[0]]:[t]:t.split('').reduce(function(n,r,l){return n.concat(e(t.slice(0,l)+t.slice(l+1)).map(function(e){return r+e}))},[])},e.stripHTMLTags=function(e){return e.replace(/<[^>]*>/g,'')},e.sum=function(){for(var e=arguments.length,t=Array(e),n=0;n=t&&(e.apply(l,a),r=Date.now())},v(t-(Date.now()-r),0))):(e.apply(l,a),r=Date.now(),n=!0)}},e.times=function(e,t){for(var n=2t?e.slice(0,3r.length)throw new RangeError('Arguments too few!');return n(e)(r.slice(0,t))}},e.unescapeHTML=function(e){return e.replace(/&|<|>|'|"/g,function(e){return{"&":'&',"<":'<',">":'>',"'":'\'',""":'"'}[e]||e})},e.unflattenObject=function(e){return Object.keys(e).reduce(function(t,n){if(-1!==n.indexOf('.')){var r=n.split('.');Object.assign(t,JSON.parse('{'+r.map(function(e,t){return t===r.length-1?'"'.concat(e,'":'):'"'.concat(e,'":{')}).join('')+e[n]+'}'.repeat(r.length)))}else t[n]=e[n];return t},{})},e.unfold=function(e,t){for(var n=[],i=[null,t];i=e(i[1]);)n.push(i[0]);return n},e.union=function(e,t){return Array.from(new Set([].concat(c(e),c(t))))},e.unionBy=function(e,t,n){var i=new Set(e.map(n));return Array.from(new Set([].concat(c(e),c(t.filter(function(e){return!i.has(n(e))})))))},e.unionWith=function(e,t,n){return Array.from(new Set([].concat(c(e),c(t.filter(function(t){return-1===e.findIndex(function(e){return n(t,e)})})))))},e.uniqueElements=function(e){return c(new Set(e))},e.uniqueElementsBy=function(e,t){return e.reduce(function(e,n){return e.some(function(e){return t(n,e)})||e.push(n),e},[])},e.uniqueElementsByRight=function(e,t){return e.reduceRight(function(e,n){return e.some(function(e){return t(n,e)})||e.push(n),e},[])},e.uniqueSymmetricDifference=function(e,t){return c(new Set([].concat(c(e.filter(function(e){return!t.includes(e)})),c(t.filter(function(t){return!e.includes(t)})))))},e.untildify=function(e){return e.replace(/^~($|\/|\\)/,''.concat(require('os').homedir(),'$1'))},e.unzip=function(e){return e.reduce(function(e,t){return t.forEach(function(t,n){return e[n].push(t)}),e},Array.from({length:v.apply(Math,c(e.map(function(e){return e.length})))}).map(function(){return[]}))},e.unzipWith=function(e,t){return e.reduce(function(e,t){return t.forEach(function(t,n){return e[n].push(t)}),e},Array.from({length:v.apply(Math,c(e.map(function(e){return e.length})))}).map(function(){return[]})).map(function(e){return t.apply(void 0,c(e))})},e.URLJoin=function(){for(var e=arguments.length,t=Array(e),n=0;n>e/4).toString(16)})},e.UUIDGeneratorNode=function(){return'10000000-1000-4000-8000-100000000000'.replace(/[018]/g,function(e){return(e^w.randomBytes(1)[0]&15>>e/4).toString(16)})},e.validateNumber=function(e){return!isNaN(parseFloat(e))&&isFinite(e)&&+e==e},e.vectorDistance=function(){for(var e=arguments.length,t=Array(e),n=0;nr)return-1;var l=b((i+r)/2);return t[l]>n?e(t,n,i,l-1):t[l]e;e=i?-e:e;var r=Array.from({length:e-1}).map(function(t,n){return 0==e%(n+2)&&n+2}).filter(function(e){return e});return i&&(r=r.reduce(function(e,t){return e.push(t),e.push(-t),e},[])),t?r.filter(n):r},e.fahrenheitToCelsius=function(e){return 5*(e-32)/9},e.fibonacciCountUntilNum=function(e){return S(y(2.23606797749979*e+1/2)/0.48121182505960347)},e.fibonacciUntilNum=function(e){var t=S(y(2.23606797749979*e+1/2)/0.48121182505960347);return Array.from({length:t}).reduce(function(e,t,n){return e.concat(1l:e<=l}),i)),[l],c(e(n.filter(function(e){return i?e<=l:e>l}),i)))},e.removeVowels=function(e){var t=1 - data - .slice(omitFirstRow ? data.indexOf('\n') + 1 : 0) - .split('\n') - .map(v => v.split(delimiter)); -const CSVToJSON = (data, delimiter = ',') => { - const titles = data.slice(0, data.indexOf('\n')).split(delimiter); - return data - .slice(data.indexOf('\n') + 1) - .split('\n') - .map(v => { - const values = v.split(delimiter); - return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {}); - }); -}; -const JSONToFile = (obj, filename) => - fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)); -const JSONtoCSV = (arr, columns, delimiter = ',') => - [ - columns.join(delimiter), - ...arr.map(obj => - columns.reduce( - (acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`, - '' - ) - ) - ].join('\n'); -const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); -const URLJoin = (...args) => - args - .join('/') - .replace(/[\/]+/g, '/') - .replace(/^(.+):\//, '$1://') - .replace(/^file:/, 'file:/') - .replace(/\/(\?|&|#[^!])/g, '$1') - .replace(/\?/g, '&') - .replace('&', '?'); -const UUIDGeneratorBrowser = () => - ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => - (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) - ); -const UUIDGeneratorNode = () => - ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => - (c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16) - ); const all = (arr, fn = Boolean) => arr.every(fn); const allEqual = arr => arr.every(val => val === arr[0]); const any = (arr, fn = Boolean) => arr.some(fn); @@ -172,7 +127,6 @@ const countBy = (arr, fn) => acc[val] = (acc[val] || 0) + 1; return acc; }, {}); -const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0); const counter = (selector, start, end, step = 1, duration = 2000) => { let current = start, _step = (end - start) * step < 0 ? -step : step, @@ -184,6 +138,7 @@ const counter = (selector, start, end, step = 1, duration = 2000) => { }, Math.abs(Math.floor(duration / (end - start)))); return timer; }; +const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0); const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined); const createElement = str => { const el = document.createElement('div'); @@ -205,6 +160,21 @@ const createEventHub = () => ({ if (this.hub[event].length === 0) delete this.hub[event]; } }); +const CSVToArray = (data, delimiter = ',', omitFirstRow = false) => + data + .slice(omitFirstRow ? data.indexOf('\n') + 1 : 0) + .split('\n') + .map(v => v.split(delimiter)); +const CSVToJSON = (data, delimiter = ',') => { + const titles = data.slice(0, data.indexOf('\n')).split(delimiter); + return data + .slice(data.indexOf('\n') + 1) + .split('\n') + .map(v => { + const values = v.split(delimiter); + return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {}); + }); +}; const currentURL = () => window.location.href; const curry = (fn, arity = fn.length, ...args) => arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); @@ -384,19 +354,6 @@ const forEachRight = (arr, callback) => .slice(0) .reverse() .forEach(callback); -const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj)); -const forOwnRight = (obj, fn) => - Object.keys(obj) - .reverse() - .forEach(key => fn(obj[key], key, obj)); -const formToObject = form => - Array.from(new FormData(form)).reduce( - (acc, [key, value]) => ({ - ...acc, - [key]: value - }), - {} - ); const formatDuration = ms => { if (ms < 0) ms = -ms; const time = { @@ -411,6 +368,19 @@ const formatDuration = ms => { .map(([key, val]) => `${val} ${key}${val !== 1 ? 's' : ''}`) .join(', '); }; +const formToObject = form => + Array.from(new FormData(form)).reduce( + (acc, [key, value]) => ({ + ...acc, + [key]: value + }), + {} + ); +const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj)); +const forOwnRight = (obj, fn) => + Object.keys(obj) + .reverse() + .forEach(key => fn(obj[key], key, obj)); const fromCamelCase = (str, separator = '_') => str .replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2') @@ -539,10 +509,6 @@ const hz = (fn, iterations = 100) => { for (let i = 0; i < iterations; i++) fn(); return (1000 * iterations) / (performance.now() - before); }; -const inRange = (n, start, end = null) => { - if (end && start > end) [end, start] = [start, end]; - return end == null ? n >= 0 && n < start : n >= start && n < end; -}; const indentString = (str, count, indent = ' ') => str.replace(/^/gm, indent.repeat(count)); const indexOfAll = (arr, val) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), []); const initial = arr => arr.slice(0, -1); @@ -559,6 +525,10 @@ const initializeNDArray = (val, ...args) => args.length === 0 ? val : Array.from({ length: args[0] }).map(() => initializeNDArray(val, ...args.slice(1))); +const inRange = (n, start, end = null) => { + if (end && start > end) [end, start] = [start, end]; + return end == null ? n >= 0 && n < start : n >= start && n < end; +}; const insertAfter = (el, htmlString) => el.insertAdjacentHTML('afterend', htmlString); const insertBefore = (el, htmlString) => el.insertAdjacentHTML('beforebegin', htmlString); const intersection = (a, b) => { @@ -676,6 +646,18 @@ const join = (arr, separator = ',', end = separator) => : acc + val + separator, '' ); +const JSONtoCSV = (arr, columns, delimiter = ',') => + [ + columns.join(delimiter), + ...arr.map(obj => + columns.reduce( + (acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`, + '' + ) + ) + ].join('\n'); +const JSONToFile = (obj, filename) => + fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)); const last = arr => arr[arr.length - 1]; const lcm = (...arr) => { const gcd = (x, y) => (!y ? x : gcd(y, x % y)); @@ -810,6 +792,14 @@ const on = (el, evt, fn, opts = {}) => { el.addEventListener(evt, opts.target ? delegatorFn : fn, opts.options || false); if (opts.target) return delegatorFn; }; +const once = fn => { + let called = false; + return function(...args) { + if (called) return; + called = true; + return fn.apply(this, args); + }; +}; const onUserInputChange = callback => { let type = 'mouse', lastTime = 0; @@ -824,14 +814,6 @@ const onUserInputChange = callback => { (type = 'touch'), callback(type), document.addEventListener('mousemove', mousemoveHandler); }); }; -const once = fn => { - let called = false; - return function(...args) { - if (called) return; - called = true; - return fn.apply(this, args); - }; -}; const orderBy = (arr, props, orders) => [...arr].sort((a, b) => props.reduce((acc, prop, i) => { @@ -990,10 +972,6 @@ const recordAnimationFrames = (callback, autoStart = true) => { }; const redirect = (url, asLink = true) => asLink ? (window.location.href = url) : window.location.replace(url); -const reduceSuccessive = (arr, fn, acc) => - arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]); -const reduceWhich = (arr, comparator = (a, b) => a - b) => - arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a)); const reducedFilter = (data, keys, fn) => data.filter(fn).map(el => keys.reduce((acc, key) => { @@ -1001,6 +979,10 @@ const reducedFilter = (data, keys, fn) => return acc; }, {}) ); +const reduceSuccessive = (arr, fn, acc) => + arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]); +const reduceWhich = (arr, comparator = (a, b) => a - b) => + arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a)); const reject = (pred, array) => array.filter((...args) => !pred(...args)); const remove = (arr, func) => Array.isArray(arr) @@ -1019,6 +1001,7 @@ const renameKeys = (keysMap, obj) => {} ); const reverseString = str => [...str].reverse().join(''); +const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); const runAsync = fn => { const worker = new Worker( @@ -1195,16 +1178,16 @@ const throttle = (fn, wait) => { } }; }; +const times = (n, fn, context = undefined) => { + let i = 0; + while (fn.call(context, i) !== false && ++i < n) {} +}; const timeTaken = callback => { console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); return r; }; -const times = (n, fn, context = undefined) => { - let i = 0; - while (fn.call(context, i) !== false && ++i < n) {} -}; const toCamelCase = str => { let s = str && @@ -1217,6 +1200,7 @@ const toCamelCase = str => { const toCurrency = (n, curr, LanguageFormat = undefined) => Intl.NumberFormat(LanguageFormat, { style: 'currency', currency: curr }).format(n); const toDecimalMark = num => num.toLocaleString('en-US'); +const toggleClass = (el, className) => el.classList.toggle(className); const toHash = (object, key) => Array.prototype.reduce.call( object, @@ -1229,6 +1213,11 @@ const toKebabCase = str => .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('-'); +const tomorrow = () => { + let t = new Date(); + t.setDate(t.getDate() + 1); + return t.toISOString().split('T')[0]; +}; const toOrdinalSuffix = num => { const int = parseInt(num), digits = [int % 10, int % 100], @@ -1252,12 +1241,6 @@ const toTitleCase = str => .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.charAt(0).toUpperCase() + x.slice(1)) .join(' '); -const toggleClass = (el, className) => el.classList.toggle(className); -const tomorrow = () => { - let t = new Date(); - t.setDate(t.getDate() + 1); - return t.toISOString().split('T')[0]; -}; const transform = (obj, fn, acc) => Object.keys(obj).reduce((a, k) => fn(a, obj[k], k, obj), acc); const triggerEvent = (el, eventType, detail) => el.dispatchEvent(new CustomEvent(eventType, { detail })); @@ -1342,6 +1325,23 @@ const unzipWith = (arr, fn) => }).map(x => []) ) .map(val => fn(...val)); +const URLJoin = (...args) => + args + .join('/') + .replace(/[\/]+/g, '/') + .replace(/^(.+):\//, '$1://') + .replace(/^file:/, 'file:/') + .replace(/\/(\?|&|#[^!])/g, '$1') + .replace(/\?/g, '&') + .replace('&', '?'); +const UUIDGeneratorBrowser = () => + ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => + (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) + ); +const UUIDGeneratorNode = () => + ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => + (c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16) + ); const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n; const vectorDistance = (...coords) => { let pointLength = Math.trunc(coords.length / 2); @@ -1376,5 +1376,169 @@ const zipWith = (...array) => { (_, i) => (fn ? fn(...array.map(a => a[i])) : array.map(a => a[i])) ); }; +const binarySearch = (arr, val, start = 0, end = arr.length - 1) => { + if (start > end) return -1; + const mid = Math.floor((start + end) / 2); + if (arr[mid] > val) return binarySearch(arr, val, start, mid - 1); + if (arr[mid] < val) return binarySearch(arr, val, mid + 1, end); + return mid; +}; +const celsiusToFahrenheit = degrees => 1.8 * degrees + 32; +const cleanObj = (obj, keysToKeep = [], childIndicator) => { + Object.keys(obj).forEach(key => { + if (key === childIndicator) { + cleanObj(obj[key], keysToKeep, childIndicator); + } else if (!keysToKeep.includes(key)) { + delete obj[key]; + } + }); + return obj; +}; +const collatz = n => (n % 2 === 0 ? n / 2 : 3 * n + 1); +const countVowels = str => (str.match(/[aeiou]/gi) || []).length; +const factors = (num, primes = false) => { + const isPrime = num => { + const boundary = Math.floor(Math.sqrt(num)); + for (var i = 2; i <= boundary; i++) if (num % i === 0) return false; + return num >= 2; + }; + const isNeg = num < 0; + num = isNeg ? -num : num; + let array = Array.from({ length: num - 1 }) + .map((val, i) => (num % (i + 2) === 0 ? i + 2 : false)) + .filter(val => val); + if (isNeg) + array = array.reduce((acc, val) => { + acc.push(val); + acc.push(-val); + return acc; + }, []); + return primes ? array.filter(isPrime) : array; +}; +const fahrenheitToCelsius = degrees => (degrees - 32) * 5/9; +const fibonacciCountUntilNum = num => + Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); +const fibonacciUntilNum = num => { + let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); + return Array.from({ length: n }).reduce( + (acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), + [] + ); +}; +const heronArea = (side_a, side_b, side_c) => { + const p = (side_a + side_b + side_c) / 2; + return Math.sqrt(p * (p-side_a) * (p-side_b) * (p-side_c)) + }; +const howManyTimes = (num, divisor) => { + if (divisor === 1 || divisor === -1) return Infinity; + if (divisor === 0) return 0; + let i = 0; + while (Number.isInteger(num / divisor)) { + i++; + num = num / divisor; + } + return i; +}; +const httpDelete = (url, callback, err = console.error) => { + const request = new XMLHttpRequest(); + request.open('DELETE', url, true); + request.onload = () => callback(request); + request.onerror = () => err(request); + request.send(); +}; +const httpPut = (url, data, callback, err = console.error) => { + const request = new XMLHttpRequest(); + request.open("PUT", url, true); + request.setRequestHeader('Content-type','application/json; charset=utf-8'); + request.onload = () => callback(request); + request.onerror = () => err(request); + request.send(data); +}; +const isArmstrongNumber = digits => + (arr => arr.reduce((a, d) => a + parseInt(d) ** arr.length, 0) == digits)( + (digits + '').split('') + ); +const isSimilar = (pattern, str) => + [...str].reduce( + (matchIndex, char) => + char.toLowerCase() === (pattern[matchIndex] || '').toLowerCase() + ? matchIndex + 1 + : matchIndex, + 0 + ) === pattern.length; +const JSONToDate = arr => { + const dt = new Date(parseInt(arr.toString().substr(6))); + return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`; +}; +const kmphToMph = (kmph) => 0.621371192 * kmph; +const levenshteinDistance = (string1, string2) => { + if (string1.length === 0) return string2.length; + if (string2.length === 0) return string1.length; + let matrix = Array(string2.length + 1) + .fill(0) + .map((x, i) => [i]); + matrix[0] = Array(string1.length + 1) + .fill(0) + .map((x, i) => i); + for (let i = 1; i <= string2.length; i++) { + for (let j = 1; j <= string1.length; j++) { + if (string2[i - 1] === string1[j - 1]) { + matrix[i][j] = matrix[i - 1][j - 1]; + } else { + matrix[i][j] = Math.min( + matrix[i - 1][j - 1] + 1, + matrix[i][j - 1] + 1, + matrix[i - 1][j] + 1 + ); + } + } + } + return matrix[string2.length][string1.length]; +}; +const mphToKmph = (mph) => 1.6093440006146922 * mph; +const pipeLog = data => console.log(data) || data; +const quickSort = ([n, ...nums], desc) => + isNaN(n) + ? [] + : [ + ...quickSort(nums.filter(v => (desc ? v > n : v <= n)), desc), + n, + ...quickSort(nums.filter(v => (!desc ? v > n : v <= n)), desc) + ]; +const removeVowels = (str, repl = '') => str.replace(/[aeiou]/gi, repl); +const solveRPN = rpn => { + const OPERATORS = { + '*': (a, b) => a * b, + '+': (a, b) => a + b, + '-': (a, b) => a - b, + '/': (a, b) => a / b, + '**': (a, b) => a ** b + }; + const [stack, solve] = [ + [], + rpn + .replace(/\^/g, '**') + .split(/\s+/g) + .filter(el => !/\s+/.test(el) && el !== '') + ]; + solve.forEach(symbol => { + if (!isNaN(parseFloat(symbol)) && isFinite(symbol)) { + stack.push(symbol); + } else if (Object.keys(OPERATORS).includes(symbol)) { + const [a, b] = [stack.pop(), stack.pop()]; + stack.push(OPERATORS[symbol](parseFloat(b), parseFloat(a))); + } else { + throw `${symbol} is not a recognized symbol`; + } + }); + if (stack.length === 1) return stack.pop(); + else throw `${rpn} is not a proper RPN. Please check it and try again`; +}; +const speechSynthesis = message => { + const msg = new SpeechSynthesisUtterance(message); + msg.voice = window.speechSynthesis.getVoices()[0]; + window.speechSynthesis.speak(msg); +}; +const squareSum = (...args) => args.reduce((squareSum, number) => squareSum + Math.pow(number, 2), 0); -export { CSVToArray, CSVToJSON, JSONToFile, JSONtoCSV, RGBToHex, URLJoin, UUIDGeneratorBrowser, UUIDGeneratorNode, all, allEqual, any, approximatelyEqual, arrayToCSV, arrayToHtmlList, ary, atob, attempt, average, averageBy, bifurcate, bifurcateBy, bind, bindAll, bindKey, binomialCoefficient, bottomVisible, btoa, byteSize, call, capitalize, capitalizeEveryWord, castArray, chainAsync, checkProp, chunk, clampNumber, cloneRegExp, coalesce, coalesceFactory, collectInto, colorize, compact, compactWhitespace, compose, composeRight, converge, copyToClipboard, countBy, countOccurrences, counter, createDirIfNotExists, createElement, createEventHub, currentURL, curry, dayOfYear, debounce, decapitalize, deepClone, deepFlatten, deepFreeze, deepGet, deepMapKeys, defaults, defer, degreesToRads, delay, detectDeviceType, difference, differenceBy, differenceWith, dig, digitize, distance, drop, dropRight, dropRightWhile, dropWhile, elementContains, elementIsVisibleInViewport, elo, equals, escapeHTML, escapeRegExp, everyNth, extendHex, factorial, fibonacci, filterFalsy, filterNonUnique, filterNonUniqueBy, findKey, findLast, findLastIndex, findLastKey, flatten, flattenObject, flip, forEachRight, forOwn, forOwnRight, formToObject, formatDuration, fromCamelCase, functionName, functions, gcd, geometricProgression, get, getColonTimeFromDate, getDaysDiffBetweenDates, getImages, getMeridiemSuffixOfInteger, getScrollPosition, getStyle, getType, getURLParameters, groupBy, hammingDistance, hasClass, hasFlags, hashBrowser, hashNode, head, hexToRGB, hide, httpGet, httpPost, httpsRedirect, hz, inRange, indentString, indexOfAll, initial, initialize2DArray, initializeArrayWithRange, initializeArrayWithRangeRight, initializeArrayWithValues, initializeNDArray, insertAfter, insertBefore, intersection, intersectionBy, intersectionWith, invertKeyValues, is, isAbsoluteURL, isAfterDate, isAnagram, isArrayLike, isBeforeDate, isBoolean, isBrowser, isBrowserTabFocused, isDivisible, isDuplexStream, isEmpty, isEven, isFunction, isLowerCase, isNegativeZero, isNil, isNull, isNumber, isObject, isObjectLike, isPlainObject, isPrime, isPrimitive, isPromiseLike, isReadableStream, isSameDate, isSorted, isStream, isString, isSymbol, isTravisCI, isUndefined, isUpperCase, isValidJSON, isWeekday, isWeekend, isWritableStream, join, last, lcm, longestItem, lowercaseKeys, luhnCheck, mapKeys, mapNumRange, mapObject, mapString, mapValues, mask, matches, matchesWith, maxBy, maxDate, maxN, median, memoize, merge, midpoint, minBy, minDate, minN, mostPerformant, negate, nest, nodeListToArray, none, nthArg, nthElement, objectFromPairs, objectToPairs, observeMutations, off, offset, omit, omitBy, on, onUserInputChange, once, orderBy, over, overArgs, pad, palindrome, parseCookie, partial, partialRight, partition, percentile, permutations, pick, pickBy, pipeAsyncFunctions, pipeFunctions, pluralize, powerset, prefix, prettyBytes, primes, promisify, pull, pullAtIndex, pullAtValue, pullBy, radsToDegrees, randomHexColorCode, randomIntArrayInRange, randomIntegerInRange, randomNumberInRange, readFileLines, rearg, recordAnimationFrames, redirect, reduceSuccessive, reduceWhich, reducedFilter, reject, remove, removeNonASCII, renameKeys, reverseString, round, runAsync, runPromisesInSeries, sample, sampleSize, scrollToTop, sdbm, serializeCookie, serializeForm, setStyle, shallowClone, shank, show, shuffle, similarity, size, sleep, smoothScroll, sortCharactersInString, sortedIndex, sortedIndexBy, sortedLastIndex, sortedLastIndexBy, splitLines, spreadOver, stableSort, standardDeviation, stringPermutations, stripHTMLTags, sum, sumBy, sumPower, symmetricDifference, symmetricDifferenceBy, symmetricDifferenceWith, tail, take, takeRight, takeRightWhile, takeWhile, throttle, timeTaken, times, toCamelCase, toCurrency, toDecimalMark, toHash, toKebabCase, toOrdinalSuffix, toSafeInteger, toSnakeCase, toTitleCase, toggleClass, tomorrow, transform, triggerEvent, truncateString, truthCheckCollection, unary, uncurry, unescapeHTML, unflattenObject, unfold, union, unionBy, unionWith, uniqueElements, uniqueElementsBy, uniqueElementsByRight, uniqueSymmetricDifference, untildify, unzip, unzipWith, validateNumber, vectorDistance, when, without, words, xProd, yesNo, yesterday, zip, zipObject, zipWith }; +export { all, allEqual, any, approximatelyEqual, arrayToCSV, arrayToHtmlList, ary, atob, attempt, average, averageBy, bifurcate, bifurcateBy, bind, bindAll, bindKey, binomialCoefficient, bottomVisible, btoa, byteSize, call, capitalize, capitalizeEveryWord, castArray, chainAsync, checkProp, chunk, clampNumber, cloneRegExp, coalesce, coalesceFactory, collectInto, colorize, compact, compactWhitespace, compose, composeRight, converge, copyToClipboard, countBy, counter, countOccurrences, createDirIfNotExists, createElement, createEventHub, CSVToArray, CSVToJSON, currentURL, curry, dayOfYear, debounce, decapitalize, deepClone, deepFlatten, deepFreeze, deepGet, deepMapKeys, defaults, defer, degreesToRads, delay, detectDeviceType, difference, differenceBy, differenceWith, dig, digitize, distance, drop, dropRight, dropRightWhile, dropWhile, elementContains, elementIsVisibleInViewport, elo, equals, escapeHTML, escapeRegExp, everyNth, extendHex, factorial, fibonacci, filterFalsy, filterNonUnique, filterNonUniqueBy, findKey, findLast, findLastIndex, findLastKey, flatten, flattenObject, flip, forEachRight, formatDuration, formToObject, forOwn, forOwnRight, fromCamelCase, functionName, functions, gcd, geometricProgression, get, getColonTimeFromDate, getDaysDiffBetweenDates, getImages, getMeridiemSuffixOfInteger, getScrollPosition, getStyle, getType, getURLParameters, groupBy, hammingDistance, hasClass, hasFlags, hashBrowser, hashNode, head, hexToRGB, hide, httpGet, httpPost, httpsRedirect, hz, indentString, indexOfAll, initial, initialize2DArray, initializeArrayWithRange, initializeArrayWithRangeRight, initializeArrayWithValues, initializeNDArray, inRange, insertAfter, insertBefore, intersection, intersectionBy, intersectionWith, invertKeyValues, is, isAbsoluteURL, isAfterDate, isAnagram, isArrayLike, isBeforeDate, isBoolean, isBrowser, isBrowserTabFocused, isDivisible, isDuplexStream, isEmpty, isEven, isFunction, isLowerCase, isNegativeZero, isNil, isNull, isNumber, isObject, isObjectLike, isPlainObject, isPrime, isPrimitive, isPromiseLike, isReadableStream, isSameDate, isSorted, isStream, isString, isSymbol, isTravisCI, isUndefined, isUpperCase, isValidJSON, isWeekday, isWeekend, isWritableStream, join, JSONtoCSV, JSONToFile, last, lcm, longestItem, lowercaseKeys, luhnCheck, mapKeys, mapNumRange, mapObject, mapString, mapValues, mask, matches, matchesWith, maxBy, maxDate, maxN, median, memoize, merge, midpoint, minBy, minDate, minN, mostPerformant, negate, nest, nodeListToArray, none, nthArg, nthElement, objectFromPairs, objectToPairs, observeMutations, off, offset, omit, omitBy, on, once, onUserInputChange, orderBy, over, overArgs, pad, palindrome, parseCookie, partial, partialRight, partition, percentile, permutations, pick, pickBy, pipeAsyncFunctions, pipeFunctions, pluralize, powerset, prefix, prettyBytes, primes, promisify, pull, pullAtIndex, pullAtValue, pullBy, radsToDegrees, randomHexColorCode, randomIntArrayInRange, randomIntegerInRange, randomNumberInRange, readFileLines, rearg, recordAnimationFrames, redirect, reducedFilter, reduceSuccessive, reduceWhich, reject, remove, removeNonASCII, renameKeys, reverseString, RGBToHex, round, runAsync, runPromisesInSeries, sample, sampleSize, scrollToTop, sdbm, serializeCookie, serializeForm, setStyle, shallowClone, shank, show, shuffle, similarity, size, sleep, smoothScroll, sortCharactersInString, sortedIndex, sortedIndexBy, sortedLastIndex, sortedLastIndexBy, splitLines, spreadOver, stableSort, standardDeviation, stringPermutations, stripHTMLTags, sum, sumBy, sumPower, symmetricDifference, symmetricDifferenceBy, symmetricDifferenceWith, tail, take, takeRight, takeRightWhile, takeWhile, throttle, times, timeTaken, toCamelCase, toCurrency, toDecimalMark, toggleClass, toHash, toKebabCase, tomorrow, toOrdinalSuffix, toSafeInteger, toSnakeCase, toTitleCase, transform, triggerEvent, truncateString, truthCheckCollection, unary, uncurry, unescapeHTML, unflattenObject, unfold, union, unionBy, unionWith, uniqueElements, uniqueElementsBy, uniqueElementsByRight, uniqueSymmetricDifference, untildify, unzip, unzipWith, URLJoin, UUIDGeneratorBrowser, UUIDGeneratorNode, validateNumber, vectorDistance, when, without, words, xProd, yesNo, yesterday, zip, zipObject, zipWith, binarySearch, celsiusToFahrenheit, cleanObj, collatz, countVowels, factors, fahrenheitToCelsius, fibonacciCountUntilNum, fibonacciUntilNum, heronArea, howManyTimes, httpDelete, httpPut, isArmstrongNumber, isSimilar, JSONToDate, kmphToMph, levenshteinDistance, mphToKmph, pipeLog, quickSort, removeVowels, solveRPN, speechSynthesis, squareSum }; diff --git a/dist/_30s.js b/dist/_30s.js index 793a23abe..84d00fad8 100644 --- a/dist/_30s.js +++ b/dist/_30s.js @@ -1,57 +1,12 @@ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global._30s = {}))); + (factory((global[''] = global[''] || {}, global['']['/_30s'] = {}))); }(this, (function (exports) { 'use strict'; const fs = typeof require !== "undefined" && require('fs'); const crypto = typeof require !== "undefined" && require('crypto'); - const CSVToArray = (data, delimiter = ',', omitFirstRow = false) => - data - .slice(omitFirstRow ? data.indexOf('\n') + 1 : 0) - .split('\n') - .map(v => v.split(delimiter)); - const CSVToJSON = (data, delimiter = ',') => { - const titles = data.slice(0, data.indexOf('\n')).split(delimiter); - return data - .slice(data.indexOf('\n') + 1) - .split('\n') - .map(v => { - const values = v.split(delimiter); - return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {}); - }); - }; - const JSONToFile = (obj, filename) => - fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)); - const JSONtoCSV = (arr, columns, delimiter = ',') => - [ - columns.join(delimiter), - ...arr.map(obj => - columns.reduce( - (acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`, - '' - ) - ) - ].join('\n'); - const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); - const URLJoin = (...args) => - args - .join('/') - .replace(/[\/]+/g, '/') - .replace(/^(.+):\//, '$1://') - .replace(/^file:/, 'file:/') - .replace(/\/(\?|&|#[^!])/g, '$1') - .replace(/\?/g, '&') - .replace('&', '?'); - const UUIDGeneratorBrowser = () => - ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => - (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) - ); - const UUIDGeneratorNode = () => - ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => - (c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16) - ); const all = (arr, fn = Boolean) => arr.every(fn); const allEqual = arr => arr.every(val => val === arr[0]); const any = (arr, fn = Boolean) => arr.some(fn); @@ -178,7 +133,6 @@ acc[val] = (acc[val] || 0) + 1; return acc; }, {}); - const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0); const counter = (selector, start, end, step = 1, duration = 2000) => { let current = start, _step = (end - start) * step < 0 ? -step : step, @@ -190,6 +144,7 @@ }, Math.abs(Math.floor(duration / (end - start)))); return timer; }; + const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0); const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined); const createElement = str => { const el = document.createElement('div'); @@ -211,6 +166,21 @@ if (this.hub[event].length === 0) delete this.hub[event]; } }); + const CSVToArray = (data, delimiter = ',', omitFirstRow = false) => + data + .slice(omitFirstRow ? data.indexOf('\n') + 1 : 0) + .split('\n') + .map(v => v.split(delimiter)); + const CSVToJSON = (data, delimiter = ',') => { + const titles = data.slice(0, data.indexOf('\n')).split(delimiter); + return data + .slice(data.indexOf('\n') + 1) + .split('\n') + .map(v => { + const values = v.split(delimiter); + return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {}); + }); + }; const currentURL = () => window.location.href; const curry = (fn, arity = fn.length, ...args) => arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); @@ -390,19 +360,6 @@ .slice(0) .reverse() .forEach(callback); - const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj)); - const forOwnRight = (obj, fn) => - Object.keys(obj) - .reverse() - .forEach(key => fn(obj[key], key, obj)); - const formToObject = form => - Array.from(new FormData(form)).reduce( - (acc, [key, value]) => ({ - ...acc, - [key]: value - }), - {} - ); const formatDuration = ms => { if (ms < 0) ms = -ms; const time = { @@ -417,6 +374,19 @@ .map(([key, val]) => `${val} ${key}${val !== 1 ? 's' : ''}`) .join(', '); }; + const formToObject = form => + Array.from(new FormData(form)).reduce( + (acc, [key, value]) => ({ + ...acc, + [key]: value + }), + {} + ); + const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj)); + const forOwnRight = (obj, fn) => + Object.keys(obj) + .reverse() + .forEach(key => fn(obj[key], key, obj)); const fromCamelCase = (str, separator = '_') => str .replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2') @@ -545,10 +515,6 @@ for (let i = 0; i < iterations; i++) fn(); return (1000 * iterations) / (performance.now() - before); }; - const inRange = (n, start, end = null) => { - if (end && start > end) [end, start] = [start, end]; - return end == null ? n >= 0 && n < start : n >= start && n < end; - }; const indentString = (str, count, indent = ' ') => str.replace(/^/gm, indent.repeat(count)); const indexOfAll = (arr, val) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), []); const initial = arr => arr.slice(0, -1); @@ -565,6 +531,10 @@ args.length === 0 ? val : Array.from({ length: args[0] }).map(() => initializeNDArray(val, ...args.slice(1))); + const inRange = (n, start, end = null) => { + if (end && start > end) [end, start] = [start, end]; + return end == null ? n >= 0 && n < start : n >= start && n < end; + }; const insertAfter = (el, htmlString) => el.insertAdjacentHTML('afterend', htmlString); const insertBefore = (el, htmlString) => el.insertAdjacentHTML('beforebegin', htmlString); const intersection = (a, b) => { @@ -682,6 +652,18 @@ : acc + val + separator, '' ); + const JSONtoCSV = (arr, columns, delimiter = ',') => + [ + columns.join(delimiter), + ...arr.map(obj => + columns.reduce( + (acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`, + '' + ) + ) + ].join('\n'); + const JSONToFile = (obj, filename) => + fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)); const last = arr => arr[arr.length - 1]; const lcm = (...arr) => { const gcd = (x, y) => (!y ? x : gcd(y, x % y)); @@ -816,6 +798,14 @@ el.addEventListener(evt, opts.target ? delegatorFn : fn, opts.options || false); if (opts.target) return delegatorFn; }; + const once = fn => { + let called = false; + return function(...args) { + if (called) return; + called = true; + return fn.apply(this, args); + }; + }; const onUserInputChange = callback => { let type = 'mouse', lastTime = 0; @@ -830,14 +820,6 @@ (type = 'touch'), callback(type), document.addEventListener('mousemove', mousemoveHandler); }); }; - const once = fn => { - let called = false; - return function(...args) { - if (called) return; - called = true; - return fn.apply(this, args); - }; - }; const orderBy = (arr, props, orders) => [...arr].sort((a, b) => props.reduce((acc, prop, i) => { @@ -996,10 +978,6 @@ }; const redirect = (url, asLink = true) => asLink ? (window.location.href = url) : window.location.replace(url); - const reduceSuccessive = (arr, fn, acc) => - arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]); - const reduceWhich = (arr, comparator = (a, b) => a - b) => - arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a)); const reducedFilter = (data, keys, fn) => data.filter(fn).map(el => keys.reduce((acc, key) => { @@ -1007,6 +985,10 @@ return acc; }, {}) ); + const reduceSuccessive = (arr, fn, acc) => + arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]); + const reduceWhich = (arr, comparator = (a, b) => a - b) => + arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a)); const reject = (pred, array) => array.filter((...args) => !pred(...args)); const remove = (arr, func) => Array.isArray(arr) @@ -1025,6 +1007,7 @@ {} ); const reverseString = str => [...str].reverse().join(''); + const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); const runAsync = fn => { const worker = new Worker( @@ -1201,16 +1184,16 @@ } }; }; + const times = (n, fn, context = undefined) => { + let i = 0; + while (fn.call(context, i) !== false && ++i < n) {} + }; const timeTaken = callback => { console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); return r; }; - const times = (n, fn, context = undefined) => { - let i = 0; - while (fn.call(context, i) !== false && ++i < n) {} - }; const toCamelCase = str => { let s = str && @@ -1223,6 +1206,7 @@ const toCurrency = (n, curr, LanguageFormat = undefined) => Intl.NumberFormat(LanguageFormat, { style: 'currency', currency: curr }).format(n); const toDecimalMark = num => num.toLocaleString('en-US'); + const toggleClass = (el, className) => el.classList.toggle(className); const toHash = (object, key) => Array.prototype.reduce.call( object, @@ -1235,6 +1219,11 @@ .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('-'); + const tomorrow = () => { + let t = new Date(); + t.setDate(t.getDate() + 1); + return t.toISOString().split('T')[0]; + }; const toOrdinalSuffix = num => { const int = parseInt(num), digits = [int % 10, int % 100], @@ -1258,12 +1247,6 @@ .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.charAt(0).toUpperCase() + x.slice(1)) .join(' '); - const toggleClass = (el, className) => el.classList.toggle(className); - const tomorrow = () => { - let t = new Date(); - t.setDate(t.getDate() + 1); - return t.toISOString().split('T')[0]; - }; const transform = (obj, fn, acc) => Object.keys(obj).reduce((a, k) => fn(a, obj[k], k, obj), acc); const triggerEvent = (el, eventType, detail) => el.dispatchEvent(new CustomEvent(eventType, { detail })); @@ -1348,6 +1331,23 @@ }).map(x => []) ) .map(val => fn(...val)); + const URLJoin = (...args) => + args + .join('/') + .replace(/[\/]+/g, '/') + .replace(/^(.+):\//, '$1://') + .replace(/^file:/, 'file:/') + .replace(/\/(\?|&|#[^!])/g, '$1') + .replace(/\?/g, '&') + .replace('&', '?'); + const UUIDGeneratorBrowser = () => + ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => + (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) + ); + const UUIDGeneratorNode = () => + ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => + (c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16) + ); const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n; const vectorDistance = (...coords) => { let pointLength = Math.trunc(coords.length / 2); @@ -1382,15 +1382,171 @@ (_, i) => (fn ? fn(...array.map(a => a[i])) : array.map(a => a[i])) ); }; + const binarySearch = (arr, val, start = 0, end = arr.length - 1) => { + if (start > end) return -1; + const mid = Math.floor((start + end) / 2); + if (arr[mid] > val) return binarySearch(arr, val, start, mid - 1); + if (arr[mid] < val) return binarySearch(arr, val, mid + 1, end); + return mid; + }; + const celsiusToFahrenheit = degrees => 1.8 * degrees + 32; + const cleanObj = (obj, keysToKeep = [], childIndicator) => { + Object.keys(obj).forEach(key => { + if (key === childIndicator) { + cleanObj(obj[key], keysToKeep, childIndicator); + } else if (!keysToKeep.includes(key)) { + delete obj[key]; + } + }); + return obj; + }; + const collatz = n => (n % 2 === 0 ? n / 2 : 3 * n + 1); + const countVowels = str => (str.match(/[aeiou]/gi) || []).length; + const factors = (num, primes = false) => { + const isPrime = num => { + const boundary = Math.floor(Math.sqrt(num)); + for (var i = 2; i <= boundary; i++) if (num % i === 0) return false; + return num >= 2; + }; + const isNeg = num < 0; + num = isNeg ? -num : num; + let array = Array.from({ length: num - 1 }) + .map((val, i) => (num % (i + 2) === 0 ? i + 2 : false)) + .filter(val => val); + if (isNeg) + array = array.reduce((acc, val) => { + acc.push(val); + acc.push(-val); + return acc; + }, []); + return primes ? array.filter(isPrime) : array; + }; + const fahrenheitToCelsius = degrees => (degrees - 32) * 5/9; + const fibonacciCountUntilNum = num => + Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); + const fibonacciUntilNum = num => { + let n = Math.ceil(Math.log(num * Math.sqrt(5) + 1 / 2) / Math.log((Math.sqrt(5) + 1) / 2)); + return Array.from({ length: n }).reduce( + (acc, val, i) => acc.concat(i > 1 ? acc[i - 1] + acc[i - 2] : i), + [] + ); + }; + const heronArea = (side_a, side_b, side_c) => { + const p = (side_a + side_b + side_c) / 2; + return Math.sqrt(p * (p-side_a) * (p-side_b) * (p-side_c)) + }; + const howManyTimes = (num, divisor) => { + if (divisor === 1 || divisor === -1) return Infinity; + if (divisor === 0) return 0; + let i = 0; + while (Number.isInteger(num / divisor)) { + i++; + num = num / divisor; + } + return i; + }; + const httpDelete = (url, callback, err = console.error) => { + const request = new XMLHttpRequest(); + request.open('DELETE', url, true); + request.onload = () => callback(request); + request.onerror = () => err(request); + request.send(); + }; + const httpPut = (url, data, callback, err = console.error) => { + const request = new XMLHttpRequest(); + request.open("PUT", url, true); + request.setRequestHeader('Content-type','application/json; charset=utf-8'); + request.onload = () => callback(request); + request.onerror = () => err(request); + request.send(data); + }; + const isArmstrongNumber = digits => + (arr => arr.reduce((a, d) => a + parseInt(d) ** arr.length, 0) == digits)( + (digits + '').split('') + ); + const isSimilar = (pattern, str) => + [...str].reduce( + (matchIndex, char) => + char.toLowerCase() === (pattern[matchIndex] || '').toLowerCase() + ? matchIndex + 1 + : matchIndex, + 0 + ) === pattern.length; + const JSONToDate = arr => { + const dt = new Date(parseInt(arr.toString().substr(6))); + return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`; + }; + const kmphToMph = (kmph) => 0.621371192 * kmph; + const levenshteinDistance = (string1, string2) => { + if (string1.length === 0) return string2.length; + if (string2.length === 0) return string1.length; + let matrix = Array(string2.length + 1) + .fill(0) + .map((x, i) => [i]); + matrix[0] = Array(string1.length + 1) + .fill(0) + .map((x, i) => i); + for (let i = 1; i <= string2.length; i++) { + for (let j = 1; j <= string1.length; j++) { + if (string2[i - 1] === string1[j - 1]) { + matrix[i][j] = matrix[i - 1][j - 1]; + } else { + matrix[i][j] = Math.min( + matrix[i - 1][j - 1] + 1, + matrix[i][j - 1] + 1, + matrix[i - 1][j] + 1 + ); + } + } + } + return matrix[string2.length][string1.length]; + }; + const mphToKmph = (mph) => 1.6093440006146922 * mph; + const pipeLog = data => console.log(data) || data; + const quickSort = ([n, ...nums], desc) => + isNaN(n) + ? [] + : [ + ...quickSort(nums.filter(v => (desc ? v > n : v <= n)), desc), + n, + ...quickSort(nums.filter(v => (!desc ? v > n : v <= n)), desc) + ]; + const removeVowels = (str, repl = '') => str.replace(/[aeiou]/gi, repl); + const solveRPN = rpn => { + const OPERATORS = { + '*': (a, b) => a * b, + '+': (a, b) => a + b, + '-': (a, b) => a - b, + '/': (a, b) => a / b, + '**': (a, b) => a ** b + }; + const [stack, solve] = [ + [], + rpn + .replace(/\^/g, '**') + .split(/\s+/g) + .filter(el => !/\s+/.test(el) && el !== '') + ]; + solve.forEach(symbol => { + if (!isNaN(parseFloat(symbol)) && isFinite(symbol)) { + stack.push(symbol); + } else if (Object.keys(OPERATORS).includes(symbol)) { + const [a, b] = [stack.pop(), stack.pop()]; + stack.push(OPERATORS[symbol](parseFloat(b), parseFloat(a))); + } else { + throw `${symbol} is not a recognized symbol`; + } + }); + if (stack.length === 1) return stack.pop(); + else throw `${rpn} is not a proper RPN. Please check it and try again`; + }; + const speechSynthesis = message => { + const msg = new SpeechSynthesisUtterance(message); + msg.voice = window.speechSynthesis.getVoices()[0]; + window.speechSynthesis.speak(msg); + }; + const squareSum = (...args) => args.reduce((squareSum, number) => squareSum + Math.pow(number, 2), 0); - exports.CSVToArray = CSVToArray; - exports.CSVToJSON = CSVToJSON; - exports.JSONToFile = JSONToFile; - exports.JSONtoCSV = JSONtoCSV; - exports.RGBToHex = RGBToHex; - exports.URLJoin = URLJoin; - exports.UUIDGeneratorBrowser = UUIDGeneratorBrowser; - exports.UUIDGeneratorNode = UUIDGeneratorNode; exports.all = all; exports.allEqual = allEqual; exports.any = any; @@ -1431,11 +1587,13 @@ exports.converge = converge; exports.copyToClipboard = copyToClipboard; exports.countBy = countBy; - exports.countOccurrences = countOccurrences; exports.counter = counter; + exports.countOccurrences = countOccurrences; exports.createDirIfNotExists = createDirIfNotExists; exports.createElement = createElement; exports.createEventHub = createEventHub; + exports.CSVToArray = CSVToArray; + exports.CSVToJSON = CSVToJSON; exports.currentURL = currentURL; exports.curry = curry; exports.dayOfYear = dayOfYear; @@ -1482,10 +1640,10 @@ exports.flattenObject = flattenObject; exports.flip = flip; exports.forEachRight = forEachRight; + exports.formatDuration = formatDuration; + exports.formToObject = formToObject; exports.forOwn = forOwn; exports.forOwnRight = forOwnRight; - exports.formToObject = formToObject; - exports.formatDuration = formatDuration; exports.fromCamelCase = fromCamelCase; exports.functionName = functionName; exports.functions = functions; @@ -1513,7 +1671,6 @@ exports.httpPost = httpPost; exports.httpsRedirect = httpsRedirect; exports.hz = hz; - exports.inRange = inRange; exports.indentString = indentString; exports.indexOfAll = indexOfAll; exports.initial = initial; @@ -1522,6 +1679,7 @@ exports.initializeArrayWithRangeRight = initializeArrayWithRangeRight; exports.initializeArrayWithValues = initializeArrayWithValues; exports.initializeNDArray = initializeNDArray; + exports.inRange = inRange; exports.insertAfter = insertAfter; exports.insertBefore = insertBefore; exports.intersection = intersection; @@ -1567,6 +1725,8 @@ exports.isWeekend = isWeekend; exports.isWritableStream = isWritableStream; exports.join = join; + exports.JSONtoCSV = JSONtoCSV; + exports.JSONToFile = JSONToFile; exports.last = last; exports.lcm = lcm; exports.longestItem = longestItem; @@ -1605,8 +1765,8 @@ exports.omit = omit; exports.omitBy = omitBy; exports.on = on; - exports.onUserInputChange = onUserInputChange; exports.once = once; + exports.onUserInputChange = onUserInputChange; exports.orderBy = orderBy; exports.over = over; exports.overArgs = overArgs; @@ -1641,14 +1801,15 @@ exports.rearg = rearg; exports.recordAnimationFrames = recordAnimationFrames; exports.redirect = redirect; + exports.reducedFilter = reducedFilter; exports.reduceSuccessive = reduceSuccessive; exports.reduceWhich = reduceWhich; - exports.reducedFilter = reducedFilter; exports.reject = reject; exports.remove = remove; exports.removeNonASCII = removeNonASCII; exports.renameKeys = renameKeys; exports.reverseString = reverseString; + exports.RGBToHex = RGBToHex; exports.round = round; exports.runAsync = runAsync; exports.runPromisesInSeries = runPromisesInSeries; @@ -1690,19 +1851,19 @@ exports.takeRightWhile = takeRightWhile; exports.takeWhile = takeWhile; exports.throttle = throttle; - exports.timeTaken = timeTaken; exports.times = times; + exports.timeTaken = timeTaken; exports.toCamelCase = toCamelCase; exports.toCurrency = toCurrency; exports.toDecimalMark = toDecimalMark; + exports.toggleClass = toggleClass; exports.toHash = toHash; exports.toKebabCase = toKebabCase; + exports.tomorrow = tomorrow; exports.toOrdinalSuffix = toOrdinalSuffix; exports.toSafeInteger = toSafeInteger; exports.toSnakeCase = toSnakeCase; exports.toTitleCase = toTitleCase; - exports.toggleClass = toggleClass; - exports.tomorrow = tomorrow; exports.transform = transform; exports.triggerEvent = triggerEvent; exports.truncateString = truncateString; @@ -1722,6 +1883,9 @@ exports.untildify = untildify; exports.unzip = unzip; exports.unzipWith = unzipWith; + exports.URLJoin = URLJoin; + exports.UUIDGeneratorBrowser = UUIDGeneratorBrowser; + exports.UUIDGeneratorNode = UUIDGeneratorNode; exports.validateNumber = validateNumber; exports.vectorDistance = vectorDistance; exports.when = when; @@ -1733,6 +1897,31 @@ exports.zip = zip; exports.zipObject = zipObject; exports.zipWith = zipWith; + exports.binarySearch = binarySearch; + exports.celsiusToFahrenheit = celsiusToFahrenheit; + exports.cleanObj = cleanObj; + exports.collatz = collatz; + exports.countVowels = countVowels; + exports.factors = factors; + exports.fahrenheitToCelsius = fahrenheitToCelsius; + exports.fibonacciCountUntilNum = fibonacciCountUntilNum; + exports.fibonacciUntilNum = fibonacciUntilNum; + exports.heronArea = heronArea; + exports.howManyTimes = howManyTimes; + exports.httpDelete = httpDelete; + exports.httpPut = httpPut; + exports.isArmstrongNumber = isArmstrongNumber; + exports.isSimilar = isSimilar; + exports.JSONToDate = JSONToDate; + exports.kmphToMph = kmphToMph; + exports.levenshteinDistance = levenshteinDistance; + exports.mphToKmph = mphToKmph; + exports.pipeLog = pipeLog; + exports.quickSort = quickSort; + exports.removeVowels = removeVowels; + exports.solveRPN = solveRPN; + exports.speechSynthesis = speechSynthesis; + exports.squareSum = squareSum; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/package-lock.json b/package-lock.json index 223f3e1ef..c8f5a3d65 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,25 +14,145 @@ } }, "@babel/core": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.1.2.tgz", - "integrity": "sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.5.5.tgz", + "integrity": "sha512-i4qoSr2KTtce0DmkuuQBV4AuQgGPUcPXMr9L5MyYAtk06z068lQ10a4O009fe5OB/DfNV+h+qqT7ddNV8UnRjg==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.1.2", - "@babel/helpers": "^7.1.2", - "@babel/parser": "^7.1.2", - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.1.2", + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helpers": "^7.5.5", + "@babel/parser": "^7.5.5", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5", "convert-source-map": "^1.1.0", - "debug": "^3.1.0", - "json5": "^0.5.0", - "lodash": "^4.17.10", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } } }, "@babel/generator": { @@ -641,14 +761,127 @@ } }, "@babel/helpers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.1.2.tgz", - "integrity": "sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA==", + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.5.5.tgz", + "integrity": "sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==", "dev": true, "requires": { - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.1.2" + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.5.5", + "@babel/types": "^7.5.5" + }, + "dependencies": { + "@babel/generator": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.5.tgz", + "integrity": "sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==", + "dev": true, + "requires": { + "@babel/types": "^7.5.5", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", + "dev": true, + "requires": { + "@babel/types": "^7.4.4" + } + }, + "@babel/parser": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.5.tgz", + "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", + "dev": true + }, + "@babel/template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" + } + }, + "@babel/traverse": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.5.tgz", + "integrity": "sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.5.5", + "@babel/generator": "^7.5.5", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.5.5", + "@babel/types": "^7.5.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + } + } + }, + "@babel/types": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.5.tgz", + "integrity": "sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + } } }, "@babel/highlight": { diff --git a/package.json b/package.json index 4d11aa37e..8aea8b26d 100644 --- a/package.json +++ b/package.json @@ -34,12 +34,13 @@ "homepage": "https://30secondsofcode.org/", "dependencies": {}, "devDependencies": { - "@babel/core": "^7.1.2", + "@babel/core": "^7.5.5", "@babel/plugin-proposal-class-properties": "^7.5.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/preset-env": "^7.5.4", "@babel/preset-react": "^7.0.0", "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2", + "babel-plugin-transform-object-rest-spread": "^6.26.0", "codacy-coverage": "^3.2.0", "eslint": "^5.7.0", "front-matter": "^3.0.2", diff --git a/scripts/module.js b/scripts/module.js index ac7e92e36..c3f6440e6 100644 --- a/scripts/module.js +++ b/scripts/module.js @@ -9,35 +9,22 @@ const util = require('./util'); const { rollup } = require('rollup'); const babel = require('rollup-plugin-babel'); const minify = require('rollup-plugin-babel-minify'); +const config = require('../config'); -const MODULE_NAME = '_30s'; -const SNIPPETS_PATH = './snippets'; -const SNIPPETS_ARCHIVE_PATH = './snippets_archive'; -const DIST_PATH = './dist'; -const ROLLUP_INPUT_FILE = './imports.temp.js'; -const TEST_MODULE_FILE = './test/_30s.js'; +const MODULE_NAME = `./${config.moduleName}`; +const SNIPPETS_PATH = `./${config.snippetPath}`; +const SNIPPETS_ARCHIVE_PATH = `./${config.snippetArchivePath}`; +const DIST_PATH = `./${config.distPath}`; +const ROLLUP_INPUT_FILE = `./${config.rollupInputFile}`; +const TEST_MODULE_FILE = `./${config.testModuleFile}`; const CODE_RE = /```\s*js([\s\S]*?)```/; -/** - * Returns the raw markdown string. - */ -function getRawSnippetString(snippetPath, snippet) { - return fs.readFileSync(path.join(snippetPath, snippet), 'utf8'); -} - -/** - * Returns the JavaScript code from the raw markdown string. - */ -function getCode(rawSnippetString) { - return rawSnippetString.match(CODE_RE)[1].replace('\n', ''); -} - /** * Builds the UMD + ESM files to the ./dist directory. */ async function doRollup() { // Plugins - const es5 = babel({ presets: ['@babel/preset-env'] }); + const es5 = babel({ presets: ['@babel/preset-env'], plugins: ['transform-object-rest-spread'] }); const min = minify({ comments: false }); const output = format => file => ({ @@ -83,37 +70,27 @@ async function build() { fs.writeFileSync(ROLLUP_INPUT_FILE, ''); fs.writeFileSync(TEST_MODULE_FILE, ''); - // All the snippets that are Node.js-based and will break in a browser - // environment - const nodeSnippets = fs - .readFileSync('tag_database', 'utf8') - .split('\n') - .filter(v => v.search(/:.*node/g) !== -1) - .map(v => v.slice(0, v.indexOf(':'))); + // Synchronously read all snippets from snippets folder and sort them as necessary (case-insensitive) + snippets = util.readSnippets(SNIPPETS_PATH); + snippetsArray = Object.keys(snippets).reduce((acc, key) => { + acc.push(snippets[key]); + return acc; + }, []); + archivedSnippets = util.readSnippets(SNIPPETS_ARCHIVE_PATH); + archivedSnippetsArray = Object.keys(archivedSnippets).reduce((acc, key) => { + acc.push(archivedSnippets[key]); + return acc; + }, []); - const snippets = fs.readdirSync(SNIPPETS_PATH); - const archivedSnippets = fs - .readdirSync(SNIPPETS_ARCHIVE_PATH) - .filter(v => v !== 'README.md'); - - snippets.forEach(snippet => { - const rawSnippetString = getRawSnippetString(SNIPPETS_PATH, snippet); - const snippetName = snippet.replace('.md', ''); - let code = getCode(rawSnippetString); - if (nodeSnippets.includes(snippetName)) { + [...snippetsArray, ...archivedSnippetsArray].forEach(snippet => { + let code = `${snippet.attributes.codeBlocks.es6}\n`; + if(snippet.attributes.tags.includes('node')) { requires.push(code.match(/const.*=.*require\(([^\)]*)\);/g)); code = code.replace(/const.*=.*require\(([^\)]*)\);/g, ''); } esmExportString += `export ${code}`; cjsExportString += code; }); - archivedSnippets.forEach(snippet => { - const rawSnippetString = getRawSnippetString( - SNIPPETS_ARCHIVE_PATH, - snippet - ); - cjsExportString += getCode(rawSnippetString); - }); requires = [ ...new Set( @@ -130,8 +107,8 @@ async function build() { fs.writeFileSync(ROLLUP_INPUT_FILE, `${requires}\n\n${esmExportString}`); - const testExports = `module.exports = {${[...snippets, ...archivedSnippets] - .map(v => v.replace('.md', '')) + const testExports = `module.exports = {${[...snippetsArray, ...archivedSnippetsArray] + .map(v => v.id) .join(',')}}`; fs.writeFileSync( diff --git a/test/_30s.js b/test/_30s.js index 0ef0fca37..e59213996 100644 --- a/test/_30s.js +++ b/test/_30s.js @@ -1,53 +1,6 @@ const fs = typeof require !== "undefined" && require('fs'); const crypto = typeof require !== "undefined" && require('crypto'); -const CSVToArray = (data, delimiter = ',', omitFirstRow = false) => - data - .slice(omitFirstRow ? data.indexOf('\n') + 1 : 0) - .split('\n') - .map(v => v.split(delimiter)); -const CSVToJSON = (data, delimiter = ',') => { - const titles = data.slice(0, data.indexOf('\n')).split(delimiter); - return data - .slice(data.indexOf('\n') + 1) - .split('\n') - .map(v => { - const values = v.split(delimiter); - return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {}); - }); -}; - -const JSONToFile = (obj, filename) => - fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)); -const JSONtoCSV = (arr, columns, delimiter = ',') => - [ - columns.join(delimiter), - ...arr.map(obj => - columns.reduce( - (acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`, - '' - ) - ) - ].join('\n'); -const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); -const URLJoin = (...args) => - args - .join('/') - .replace(/[\/]+/g, '/') - .replace(/^(.+):\//, '$1://') - .replace(/^file:/, 'file:/') - .replace(/\/(\?|&|#[^!])/g, '$1') - .replace(/\?/g, '&') - .replace('&', '?'); -const UUIDGeneratorBrowser = () => - ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => - (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) - ); - -const UUIDGeneratorNode = () => - ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => - (c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16) - ); const all = (arr, fn = Boolean) => arr.every(fn); const allEqual = arr => arr.every(val => val === arr[0]); const any = (arr, fn = Boolean) => arr.some(fn); @@ -174,7 +127,6 @@ const countBy = (arr, fn) => acc[val] = (acc[val] || 0) + 1; return acc; }, {}); -const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0); const counter = (selector, start, end, step = 1, duration = 2000) => { let current = start, _step = (end - start) * step < 0 ? -step : step, @@ -186,6 +138,7 @@ const counter = (selector, start, end, step = 1, duration = 2000) => { }, Math.abs(Math.floor(duration / (end - start)))); return timer; }; +const countOccurrences = (arr, val) => arr.reduce((a, v) => (v === val ? a + 1 : a), 0); const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined); const createElement = str => { @@ -208,6 +161,21 @@ const createEventHub = () => ({ if (this.hub[event].length === 0) delete this.hub[event]; } }); +const CSVToArray = (data, delimiter = ',', omitFirstRow = false) => + data + .slice(omitFirstRow ? data.indexOf('\n') + 1 : 0) + .split('\n') + .map(v => v.split(delimiter)); +const CSVToJSON = (data, delimiter = ',') => { + const titles = data.slice(0, data.indexOf('\n')).split(delimiter); + return data + .slice(data.indexOf('\n') + 1) + .split('\n') + .map(v => { + const values = v.split(delimiter); + return titles.reduce((obj, title, index) => ((obj[title] = values[index]), obj), {}); + }); +}; const currentURL = () => window.location.href; const curry = (fn, arity = fn.length, ...args) => arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args); @@ -387,19 +355,6 @@ const forEachRight = (arr, callback) => .slice(0) .reverse() .forEach(callback); -const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj)); -const forOwnRight = (obj, fn) => - Object.keys(obj) - .reverse() - .forEach(key => fn(obj[key], key, obj)); -const formToObject = form => - Array.from(new FormData(form)).reduce( - (acc, [key, value]) => ({ - ...acc, - [key]: value - }), - {} - ); const formatDuration = ms => { if (ms < 0) ms = -ms; const time = { @@ -414,6 +369,19 @@ const formatDuration = ms => { .map(([key, val]) => `${val} ${key}${val !== 1 ? 's' : ''}`) .join(', '); }; +const formToObject = form => + Array.from(new FormData(form)).reduce( + (acc, [key, value]) => ({ + ...acc, + [key]: value + }), + {} + ); +const forOwn = (obj, fn) => Object.keys(obj).forEach(key => fn(obj[key], key, obj)); +const forOwnRight = (obj, fn) => + Object.keys(obj) + .reverse() + .forEach(key => fn(obj[key], key, obj)); const fromCamelCase = (str, separator = '_') => str .replace(/([a-z\d])([A-Z])/g, '$1' + separator + '$2') @@ -543,10 +511,6 @@ const hz = (fn, iterations = 100) => { for (let i = 0; i < iterations; i++) fn(); return (1000 * iterations) / (performance.now() - before); }; -const inRange = (n, start, end = null) => { - if (end && start > end) [end, start] = [start, end]; - return end == null ? n >= 0 && n < start : n >= start && n < end; -}; const indentString = (str, count, indent = ' ') => str.replace(/^/gm, indent.repeat(count)); const indexOfAll = (arr, val) => arr.reduce((acc, el, i) => (el === val ? [...acc, i] : acc), []); const initial = arr => arr.slice(0, -1); @@ -563,6 +527,10 @@ const initializeNDArray = (val, ...args) => args.length === 0 ? val : Array.from({ length: args[0] }).map(() => initializeNDArray(val, ...args.slice(1))); +const inRange = (n, start, end = null) => { + if (end && start > end) [end, start] = [start, end]; + return end == null ? n >= 0 && n < start : n >= start && n < end; +}; const insertAfter = (el, htmlString) => el.insertAdjacentHTML('afterend', htmlString); const insertBefore = (el, htmlString) => el.insertAdjacentHTML('beforebegin', htmlString); const intersection = (a, b) => { @@ -680,6 +648,19 @@ const join = (arr, separator = ',', end = separator) => : acc + val + separator, '' ); +const JSONtoCSV = (arr, columns, delimiter = ',') => + [ + columns.join(delimiter), + ...arr.map(obj => + columns.reduce( + (acc, key) => `${acc}${!acc.length ? '' : delimiter}"${!obj[key] ? '' : obj[key]}"`, + '' + ) + ) + ].join('\n'); + +const JSONToFile = (obj, filename) => + fs.writeFile(`${filename}.json`, JSON.stringify(obj, null, 2)); const last = arr => arr[arr.length - 1]; const lcm = (...arr) => { const gcd = (x, y) => (!y ? x : gcd(y, x % y)); @@ -814,6 +795,14 @@ const on = (el, evt, fn, opts = {}) => { el.addEventListener(evt, opts.target ? delegatorFn : fn, opts.options || false); if (opts.target) return delegatorFn; }; +const once = fn => { + let called = false; + return function(...args) { + if (called) return; + called = true; + return fn.apply(this, args); + }; +}; const onUserInputChange = callback => { let type = 'mouse', lastTime = 0; @@ -828,14 +817,6 @@ const onUserInputChange = callback => { (type = 'touch'), callback(type), document.addEventListener('mousemove', mousemoveHandler); }); }; -const once = fn => { - let called = false; - return function(...args) { - if (called) return; - called = true; - return fn.apply(this, args); - }; -}; const orderBy = (arr, props, orders) => [...arr].sort((a, b) => props.reduce((acc, prop, i) => { @@ -995,10 +976,6 @@ const recordAnimationFrames = (callback, autoStart = true) => { }; const redirect = (url, asLink = true) => asLink ? (window.location.href = url) : window.location.replace(url); -const reduceSuccessive = (arr, fn, acc) => - arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]); -const reduceWhich = (arr, comparator = (a, b) => a - b) => - arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a)); const reducedFilter = (data, keys, fn) => data.filter(fn).map(el => keys.reduce((acc, key) => { @@ -1006,6 +983,10 @@ const reducedFilter = (data, keys, fn) => return acc; }, {}) ); +const reduceSuccessive = (arr, fn, acc) => + arr.reduce((res, val, i, arr) => (res.push(fn(res.slice(-1)[0], val, i, arr)), res), [acc]); +const reduceWhich = (arr, comparator = (a, b) => a - b) => + arr.reduce((a, b) => (comparator(a, b) >= 0 ? b : a)); const reject = (pred, array) => array.filter((...args) => !pred(...args)); const remove = (arr, func) => Array.isArray(arr) @@ -1024,6 +1005,7 @@ const renameKeys = (keysMap, obj) => {} ); const reverseString = str => [...str].reverse().join(''); +const RGBToHex = (r, g, b) => ((r << 16) + (g << 8) + b).toString(16).padStart(6, '0'); const round = (n, decimals = 0) => Number(`${Math.round(`${n}e${decimals}`)}e-${decimals}`); const runAsync = fn => { const worker = new Worker( @@ -1200,16 +1182,16 @@ const throttle = (fn, wait) => { } }; }; +const times = (n, fn, context = undefined) => { + let i = 0; + while (fn.call(context, i) !== false && ++i < n) {} +}; const timeTaken = callback => { console.time('timeTaken'); const r = callback(); console.timeEnd('timeTaken'); return r; }; -const times = (n, fn, context = undefined) => { - let i = 0; - while (fn.call(context, i) !== false && ++i < n) {} -}; const toCamelCase = str => { let s = str && @@ -1222,6 +1204,7 @@ const toCamelCase = str => { const toCurrency = (n, curr, LanguageFormat = undefined) => Intl.NumberFormat(LanguageFormat, { style: 'currency', currency: curr }).format(n); const toDecimalMark = num => num.toLocaleString('en-US'); +const toggleClass = (el, className) => el.classList.toggle(className); const toHash = (object, key) => Array.prototype.reduce.call( object, @@ -1234,6 +1217,11 @@ const toKebabCase = str => .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.toLowerCase()) .join('-'); +const tomorrow = () => { + let t = new Date(); + t.setDate(t.getDate() + 1); + return t.toISOString().split('T')[0]; +}; const toOrdinalSuffix = num => { const int = parseInt(num), digits = [int % 10, int % 100], @@ -1257,12 +1245,6 @@ const toTitleCase = str => .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) .map(x => x.charAt(0).toUpperCase() + x.slice(1)) .join(' '); -const toggleClass = (el, className) => el.classList.toggle(className); -const tomorrow = () => { - let t = new Date(); - t.setDate(t.getDate() + 1); - return t.toISOString().split('T')[0]; -}; const transform = (obj, fn, acc) => Object.keys(obj).reduce((a, k) => fn(a, obj[k], k, obj), acc); const triggerEvent = (el, eventType, detail) => el.dispatchEvent(new CustomEvent(eventType, { detail })); @@ -1347,6 +1329,24 @@ const unzipWith = (arr, fn) => }).map(x => []) ) .map(val => fn(...val)); +const URLJoin = (...args) => + args + .join('/') + .replace(/[\/]+/g, '/') + .replace(/^(.+):\//, '$1://') + .replace(/^file:/, 'file:/') + .replace(/\/(\?|&|#[^!])/g, '$1') + .replace(/\?/g, '&') + .replace('&', '?'); +const UUIDGeneratorBrowser = () => + ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => + (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) + ); + +const UUIDGeneratorNode = () => + ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c => + (c ^ (crypto.randomBytes(1)[0] & (15 >> (c / 4)))).toString(16) + ); const validateNumber = n => !isNaN(parseFloat(n)) && isFinite(n) && Number(n) == n; const vectorDistance = (...coords) => { let pointLength = Math.trunc(coords.length / 2); @@ -1381,10 +1381,6 @@ const zipWith = (...array) => { (_, i) => (fn ? fn(...array.map(a => a[i])) : array.map(a => a[i])) ); }; -const JSONToDate = arr => { - const dt = new Date(parseInt(arr.toString().substr(6))); - return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`; -}; const binarySearch = (arr, val, start = 0, end = arr.length - 1) => { if (start > end) return -1; const mid = Math.floor((start + end) / 2); @@ -1475,6 +1471,10 @@ const isSimilar = (pattern, str) => : matchIndex, 0 ) === pattern.length; +const JSONToDate = arr => { + const dt = new Date(parseInt(arr.toString().substr(6))); + return `${dt.getDate()}/${dt.getMonth() + 1}/${dt.getFullYear()}`; +}; const kmphToMph = (kmph) => 0.621371192 * kmph; const levenshteinDistance = (string1, string2) => { if (string1.length === 0) return string2.length; @@ -1547,4 +1547,4 @@ const speechSynthesis = message => { const squareSum = (...args) => args.reduce((squareSum, number) => squareSum + Math.pow(number, 2), 0); -module.exports = {CSVToArray,CSVToJSON,JSONToFile,JSONtoCSV,RGBToHex,URLJoin,UUIDGeneratorBrowser,UUIDGeneratorNode,all,allEqual,any,approximatelyEqual,arrayToCSV,arrayToHtmlList,ary,atob,attempt,average,averageBy,bifurcate,bifurcateBy,bind,bindAll,bindKey,binomialCoefficient,bottomVisible,btoa,byteSize,call,capitalize,capitalizeEveryWord,castArray,chainAsync,checkProp,chunk,clampNumber,cloneRegExp,coalesce,coalesceFactory,collectInto,colorize,compact,compactWhitespace,compose,composeRight,converge,copyToClipboard,countBy,countOccurrences,counter,createDirIfNotExists,createElement,createEventHub,currentURL,curry,dayOfYear,debounce,decapitalize,deepClone,deepFlatten,deepFreeze,deepGet,deepMapKeys,defaults,defer,degreesToRads,delay,detectDeviceType,difference,differenceBy,differenceWith,dig,digitize,distance,drop,dropRight,dropRightWhile,dropWhile,elementContains,elementIsVisibleInViewport,elo,equals,escapeHTML,escapeRegExp,everyNth,extendHex,factorial,fibonacci,filterFalsy,filterNonUnique,filterNonUniqueBy,findKey,findLast,findLastIndex,findLastKey,flatten,flattenObject,flip,forEachRight,forOwn,forOwnRight,formToObject,formatDuration,fromCamelCase,functionName,functions,gcd,geometricProgression,get,getColonTimeFromDate,getDaysDiffBetweenDates,getImages,getMeridiemSuffixOfInteger,getScrollPosition,getStyle,getType,getURLParameters,groupBy,hammingDistance,hasClass,hasFlags,hashBrowser,hashNode,head,hexToRGB,hide,httpGet,httpPost,httpsRedirect,hz,inRange,indentString,indexOfAll,initial,initialize2DArray,initializeArrayWithRange,initializeArrayWithRangeRight,initializeArrayWithValues,initializeNDArray,insertAfter,insertBefore,intersection,intersectionBy,intersectionWith,invertKeyValues,is,isAbsoluteURL,isAfterDate,isAnagram,isArrayLike,isBeforeDate,isBoolean,isBrowser,isBrowserTabFocused,isDivisible,isDuplexStream,isEmpty,isEven,isFunction,isLowerCase,isNegativeZero,isNil,isNull,isNumber,isObject,isObjectLike,isPlainObject,isPrime,isPrimitive,isPromiseLike,isReadableStream,isSameDate,isSorted,isStream,isString,isSymbol,isTravisCI,isUndefined,isUpperCase,isValidJSON,isWeekday,isWeekend,isWritableStream,join,last,lcm,longestItem,lowercaseKeys,luhnCheck,mapKeys,mapNumRange,mapObject,mapString,mapValues,mask,matches,matchesWith,maxBy,maxDate,maxN,median,memoize,merge,midpoint,minBy,minDate,minN,mostPerformant,negate,nest,nodeListToArray,none,nthArg,nthElement,objectFromPairs,objectToPairs,observeMutations,off,offset,omit,omitBy,on,onUserInputChange,once,orderBy,over,overArgs,pad,palindrome,parseCookie,partial,partialRight,partition,percentile,permutations,pick,pickBy,pipeAsyncFunctions,pipeFunctions,pluralize,powerset,prefix,prettyBytes,primes,promisify,pull,pullAtIndex,pullAtValue,pullBy,radsToDegrees,randomHexColorCode,randomIntArrayInRange,randomIntegerInRange,randomNumberInRange,readFileLines,rearg,recordAnimationFrames,redirect,reduceSuccessive,reduceWhich,reducedFilter,reject,remove,removeNonASCII,renameKeys,reverseString,round,runAsync,runPromisesInSeries,sample,sampleSize,scrollToTop,sdbm,serializeCookie,serializeForm,setStyle,shallowClone,shank,show,shuffle,similarity,size,sleep,smoothScroll,sortCharactersInString,sortedIndex,sortedIndexBy,sortedLastIndex,sortedLastIndexBy,splitLines,spreadOver,stableSort,standardDeviation,stringPermutations,stripHTMLTags,sum,sumBy,sumPower,symmetricDifference,symmetricDifferenceBy,symmetricDifferenceWith,tail,take,takeRight,takeRightWhile,takeWhile,throttle,timeTaken,times,toCamelCase,toCurrency,toDecimalMark,toHash,toKebabCase,toOrdinalSuffix,toSafeInteger,toSnakeCase,toTitleCase,toggleClass,tomorrow,transform,triggerEvent,truncateString,truthCheckCollection,unary,uncurry,unescapeHTML,unflattenObject,unfold,union,unionBy,unionWith,uniqueElements,uniqueElementsBy,uniqueElementsByRight,uniqueSymmetricDifference,untildify,unzip,unzipWith,validateNumber,vectorDistance,when,without,words,xProd,yesNo,yesterday,zip,zipObject,zipWith,JSONToDate,binarySearch,celsiusToFahrenheit,cleanObj,collatz,countVowels,factors,fahrenheitToCelsius,fibonacciCountUntilNum,fibonacciUntilNum,heronArea,howManyTimes,httpDelete,httpPut,isArmstrongNumber,isSimilar,kmphToMph,levenshteinDistance,mphToKmph,pipeLog,quickSort,removeVowels,solveRPN,speechSynthesis,squareSum} \ No newline at end of file +module.exports = {all,allEqual,any,approximatelyEqual,arrayToCSV,arrayToHtmlList,ary,atob,attempt,average,averageBy,bifurcate,bifurcateBy,bind,bindAll,bindKey,binomialCoefficient,bottomVisible,btoa,byteSize,call,capitalize,capitalizeEveryWord,castArray,chainAsync,checkProp,chunk,clampNumber,cloneRegExp,coalesce,coalesceFactory,collectInto,colorize,compact,compactWhitespace,compose,composeRight,converge,copyToClipboard,countBy,counter,countOccurrences,createDirIfNotExists,createElement,createEventHub,CSVToArray,CSVToJSON,currentURL,curry,dayOfYear,debounce,decapitalize,deepClone,deepFlatten,deepFreeze,deepGet,deepMapKeys,defaults,defer,degreesToRads,delay,detectDeviceType,difference,differenceBy,differenceWith,dig,digitize,distance,drop,dropRight,dropRightWhile,dropWhile,elementContains,elementIsVisibleInViewport,elo,equals,escapeHTML,escapeRegExp,everyNth,extendHex,factorial,fibonacci,filterFalsy,filterNonUnique,filterNonUniqueBy,findKey,findLast,findLastIndex,findLastKey,flatten,flattenObject,flip,forEachRight,formatDuration,formToObject,forOwn,forOwnRight,fromCamelCase,functionName,functions,gcd,geometricProgression,get,getColonTimeFromDate,getDaysDiffBetweenDates,getImages,getMeridiemSuffixOfInteger,getScrollPosition,getStyle,getType,getURLParameters,groupBy,hammingDistance,hasClass,hasFlags,hashBrowser,hashNode,head,hexToRGB,hide,httpGet,httpPost,httpsRedirect,hz,indentString,indexOfAll,initial,initialize2DArray,initializeArrayWithRange,initializeArrayWithRangeRight,initializeArrayWithValues,initializeNDArray,inRange,insertAfter,insertBefore,intersection,intersectionBy,intersectionWith,invertKeyValues,is,isAbsoluteURL,isAfterDate,isAnagram,isArrayLike,isBeforeDate,isBoolean,isBrowser,isBrowserTabFocused,isDivisible,isDuplexStream,isEmpty,isEven,isFunction,isLowerCase,isNegativeZero,isNil,isNull,isNumber,isObject,isObjectLike,isPlainObject,isPrime,isPrimitive,isPromiseLike,isReadableStream,isSameDate,isSorted,isStream,isString,isSymbol,isTravisCI,isUndefined,isUpperCase,isValidJSON,isWeekday,isWeekend,isWritableStream,join,JSONtoCSV,JSONToFile,last,lcm,longestItem,lowercaseKeys,luhnCheck,mapKeys,mapNumRange,mapObject,mapString,mapValues,mask,matches,matchesWith,maxBy,maxDate,maxN,median,memoize,merge,midpoint,minBy,minDate,minN,mostPerformant,negate,nest,nodeListToArray,none,nthArg,nthElement,objectFromPairs,objectToPairs,observeMutations,off,offset,omit,omitBy,on,once,onUserInputChange,orderBy,over,overArgs,pad,palindrome,parseCookie,partial,partialRight,partition,percentile,permutations,pick,pickBy,pipeAsyncFunctions,pipeFunctions,pluralize,powerset,prefix,prettyBytes,primes,promisify,pull,pullAtIndex,pullAtValue,pullBy,radsToDegrees,randomHexColorCode,randomIntArrayInRange,randomIntegerInRange,randomNumberInRange,readFileLines,rearg,recordAnimationFrames,redirect,reducedFilter,reduceSuccessive,reduceWhich,reject,remove,removeNonASCII,renameKeys,reverseString,RGBToHex,round,runAsync,runPromisesInSeries,sample,sampleSize,scrollToTop,sdbm,serializeCookie,serializeForm,setStyle,shallowClone,shank,show,shuffle,similarity,size,sleep,smoothScroll,sortCharactersInString,sortedIndex,sortedIndexBy,sortedLastIndex,sortedLastIndexBy,splitLines,spreadOver,stableSort,standardDeviation,stringPermutations,stripHTMLTags,sum,sumBy,sumPower,symmetricDifference,symmetricDifferenceBy,symmetricDifferenceWith,tail,take,takeRight,takeRightWhile,takeWhile,throttle,times,timeTaken,toCamelCase,toCurrency,toDecimalMark,toggleClass,toHash,toKebabCase,tomorrow,toOrdinalSuffix,toSafeInteger,toSnakeCase,toTitleCase,transform,triggerEvent,truncateString,truthCheckCollection,unary,uncurry,unescapeHTML,unflattenObject,unfold,union,unionBy,unionWith,uniqueElements,uniqueElementsBy,uniqueElementsByRight,uniqueSymmetricDifference,untildify,unzip,unzipWith,URLJoin,UUIDGeneratorBrowser,UUIDGeneratorNode,validateNumber,vectorDistance,when,without,words,xProd,yesNo,yesterday,zip,zipObject,zipWith,binarySearch,celsiusToFahrenheit,cleanObj,collatz,countVowels,factors,fahrenheitToCelsius,fibonacciCountUntilNum,fibonacciUntilNum,heronArea,howManyTimes,httpDelete,httpPut,isArmstrongNumber,isSimilar,JSONToDate,kmphToMph,levenshteinDistance,mphToKmph,pipeLog,quickSort,removeVowels,solveRPN,speechSynthesis,squareSum} \ No newline at end of file