@valkyriestudios/utils 7.5.0 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +10 -57
  3. package/array/dedupe.js +25 -12
  4. package/array/isNotEmpty.js +1 -4
  5. package/array/join.js +8 -10
  6. package/array/mapFn.js +7 -9
  7. package/array/mapKey.js +5 -6
  8. package/array/mapPrimitive.js +5 -7
  9. package/array/shuffle.js +1 -4
  10. package/array/sort.js +16 -16
  11. package/caching/memoize.js +1 -1
  12. package/date/addUTC.js +4 -6
  13. package/date/diff.js +3 -4
  14. package/date/endOfUTC.js +23 -16
  15. package/date/is.js +1 -1
  16. package/date/startOfUTC.js +23 -16
  17. package/date/toUTC.js +1 -3
  18. package/date/toUnix.js +1 -3
  19. package/deep/define.js +1 -1
  20. package/deep/freeze.js +8 -12
  21. package/deep/get.js +16 -18
  22. package/deep/seal.js +8 -12
  23. package/deep/set.js +6 -21
  24. package/equal.js +7 -17
  25. package/hash/fnv1A.js +35 -27
  26. package/is.js +32 -35
  27. package/number/is.js +1 -4
  28. package/number/isAbove.js +1 -5
  29. package/number/isAboveOrEqual.js +1 -5
  30. package/number/isBelow.js +1 -5
  31. package/number/isBelowOrEqual.js +1 -5
  32. package/number/isBetween.js +1 -4
  33. package/number/isInteger.js +0 -3
  34. package/number/isIntegerAbove.js +1 -6
  35. package/number/isIntegerAboveOrEqual.js +1 -6
  36. package/number/isIntegerBelow.js +1 -6
  37. package/number/isIntegerBelowOrEqual.js +1 -6
  38. package/number/isIntegerBetween.js +1 -5
  39. package/number/isNumericalNaN.js +2 -1
  40. package/number/randomBetween.js +1 -4
  41. package/number/randomIntBetween.js +1 -4
  42. package/number/round.js +2 -6
  43. package/number/toPercentage.js +2 -3
  44. package/object/define.js +3 -5
  45. package/object/is.js +3 -1
  46. package/object/isNotEmpty.js +2 -4
  47. package/object/merge.js +7 -10
  48. package/object/pick.js +16 -12
  49. package/package.json +11 -15
  50. package/regexp/is.js +3 -1
  51. package/regexp/sanitize.js +2 -2
  52. package/src/array/dedupe.mjs +24 -0
  53. package/src/array/is.mjs +5 -0
  54. package/src/array/isNotEmpty.mjs +5 -0
  55. package/src/array/join.mjs +31 -0
  56. package/src/array/mapFn.mjs +34 -0
  57. package/src/array/mapKey.mjs +29 -0
  58. package/src/array/mapPrimitive.mjs +29 -0
  59. package/src/array/shuffle.mjs +14 -0
  60. package/src/array/sort.mjs +100 -0
  61. package/src/boolean/is.mjs +5 -0
  62. package/src/caching/memoize.mjs +24 -0
  63. package/src/date/addUTC.mjs +67 -0
  64. package/src/date/diff.mjs +46 -0
  65. package/src/date/endOfUTC.mjs +130 -0
  66. package/src/date/is.mjs +5 -0
  67. package/src/date/nowUnix.mjs +5 -0
  68. package/src/date/nowUnixMs.mjs +5 -0
  69. package/src/date/startOfUTC.mjs +129 -0
  70. package/src/date/toUTC.mjs +17 -0
  71. package/src/date/toUnix.mjs +9 -0
  72. package/src/deep/define.mjs +7 -0
  73. package/src/deep/freeze.mjs +22 -0
  74. package/src/deep/get.mjs +47 -0
  75. package/src/deep/seal.mjs +22 -0
  76. package/src/deep/set.mjs +41 -0
  77. package/src/equal.mjs +67 -0
  78. package/src/function/is.mjs +6 -0
  79. package/src/function/noop.mjs +5 -0
  80. package/src/function/noopresolve.mjs +6 -0
  81. package/src/function/noopreturn.mjs +6 -0
  82. package/src/function/sleep.mjs +12 -0
  83. package/src/hash/fnv1A.mjs +58 -0
  84. package/src/hash/guid.mjs +38 -0
  85. package/src/is.mjs +86 -0
  86. package/src/number/is.mjs +5 -0
  87. package/src/number/isAbove.mjs +6 -0
  88. package/src/number/isAboveOrEqual.mjs +6 -0
  89. package/src/number/isBelow.mjs +6 -0
  90. package/src/number/isBelowOrEqual.mjs +6 -0
  91. package/src/number/isBetween.mjs +13 -0
  92. package/src/number/isInteger.mjs +5 -0
  93. package/src/number/isIntegerAbove.mjs +6 -0
  94. package/src/number/isIntegerAboveOrEqual.mjs +6 -0
  95. package/src/number/isIntegerBelow.mjs +6 -0
  96. package/src/number/isIntegerBelowOrEqual.mjs +6 -0
  97. package/src/number/isIntegerBetween.mjs +13 -0
  98. package/src/number/isNumericalNaN.mjs +5 -0
  99. package/src/number/randomBetween.mjs +11 -0
  100. package/src/number/randomIntBetween.mjs +11 -0
  101. package/src/number/round.mjs +10 -0
  102. package/src/number/toPercentage.mjs +14 -0
  103. package/src/object/define.mjs +12 -0
  104. package/src/object/is.mjs +7 -0
  105. package/src/object/isNotEmpty.mjs +7 -0
  106. package/src/object/merge.mjs +27 -0
  107. package/src/object/pick.mjs +33 -0
  108. package/src/regexp/is.mjs +7 -0
  109. package/src/regexp/sanitize.mjs +12 -0
  110. package/src/string/humanizeBytes.mjs +29 -0
  111. package/src/string/humanizeNumber.mjs +84 -0
  112. package/src/string/is.mjs +5 -0
  113. package/src/string/isBetween.mjs +18 -0
  114. package/src/string/isNotEmpty.mjs +6 -0
  115. package/src/string/shorten.mjs +21 -0
  116. package/string/humanizeBytes.js +9 -10
  117. package/string/humanizeNumber.js +21 -22
  118. package/string/isBetween.js +2 -3
  119. package/string/isNotEmpty.js +2 -4
  120. package/string/shorten.js +3 -4
  121. package/object/defineFrozen.js +0 -13
  122. package/object/defineSealed.js +0 -13
  123. package/object/forValues.js +0 -18
  124. package/object/zip.js +0 -19
@@ -1,13 +1,8 @@
1
1
  'use strict';
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
3
  value: !0
5
4
  });
6
5
  exports["default"] = isIntegerAboveOrEqual;
7
- var _is = _interopRequireDefault(require("../number/is"));
8
- var _isInteger = _interopRequireDefault(require("../number/isInteger"));
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
6
  function isIntegerAboveOrEqual(val, ref) {
11
- if (!(0, _isInteger["default"])(val) || !(0, _is["default"])(ref)) return !1;
12
- return val >= ref;
7
+ return !Number.isInteger(val) || !Number.isFinite(ref) ? !1 : val >= ref;
13
8
  }
@@ -1,13 +1,8 @@
1
1
  'use strict';
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
3
  value: !0
5
4
  });
6
5
  exports["default"] = isIntegerBelow;
7
- var _is = _interopRequireDefault(require("../number/is"));
8
- var _isInteger = _interopRequireDefault(require("../number/isInteger"));
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
6
  function isIntegerBelow(val, ref) {
11
- if (!(0, _isInteger["default"])(val) || !(0, _is["default"])(ref)) return !1;
12
- return val < ref;
7
+ return !Number.isInteger(val) || !Number.isFinite(ref) ? !1 : val < ref;
13
8
  }
@@ -1,13 +1,8 @@
1
1
  'use strict';
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
3
  value: !0
5
4
  });
6
5
  exports["default"] = isIntegerBelowOrEqual;
7
- var _is = _interopRequireDefault(require("../number/is"));
8
- var _isInteger = _interopRequireDefault(require("../number/isInteger"));
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
6
  function isIntegerBelowOrEqual(val, ref) {
11
- if (!(0, _isInteger["default"])(val) || !(0, _is["default"])(ref)) return !1;
12
- return val <= ref;
7
+ return !Number.isInteger(val) || !Number.isFinite(ref) ? !1 : val <= ref;
13
8
  }
@@ -1,13 +1,9 @@
1
1
  'use strict';
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
3
  value: !0
5
4
  });
6
5
  exports["default"] = isIntegerBetween;
7
- var _is = _interopRequireDefault(require("../number/is"));
8
- var _isInteger = _interopRequireDefault(require("../number/isInteger"));
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
6
  function isIntegerBetween(val, min, max) {
11
- if (!(0, _isInteger["default"])(val) || !(0, _is["default"])(min) || !(0, _is["default"])(max) || min >= max) return !1;
7
+ if (!Number.isInteger(val) || !Number.isFinite(min) || !Number.isFinite(max) || min >= max) return !1;
12
8
  return val >= min && val <= max;
13
9
  }
@@ -1,8 +1,9 @@
1
1
  'use strict';
2
+
2
3
  Object.defineProperty(exports, "__esModule", {
3
4
  value: !0
4
5
  });
5
6
  exports["default"] = isNumericalNaN;
6
7
  function isNumericalNaN(val) {
7
- return Number.isNaN(val) || val === Infinity || val === NaN;
8
+ return Number.isNaN(val) || val === Infinity;
8
9
  }
@@ -1,14 +1,11 @@
1
1
  'use strict';
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
3
  value: !0
5
4
  });
6
5
  exports["default"] = randomBetween;
7
- var _is = _interopRequireDefault(require("./is"));
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
9
6
  function randomBetween() {
10
7
  var min = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
11
8
  var max = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;
12
- if (!(0, _is["default"])(min) || !(0, _is["default"])(max)) throw new TypeError('Min/Max should be numeric');
9
+ if (!Number.isFinite(min) || !Number.isFinite(max)) throw new TypeError('Min/Max should be numeric');
13
10
  return Math.random() * (max - min) + min;
14
11
  }
@@ -1,14 +1,11 @@
1
1
  'use strict';
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
3
  value: !0
5
4
  });
6
5
  exports["default"] = randomIntBetween;
7
- var _is = _interopRequireDefault(require("./is"));
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
9
6
  function randomIntBetween() {
10
7
  var min = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
11
8
  var max = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 10;
12
- if (!(0, _is["default"])(min) || !(0, _is["default"])(max)) throw new TypeError('Min/Max should be numeric');
9
+ if (!Number.isFinite(min) || !Number.isFinite(max)) throw new TypeError('Min/Max should be numeric');
13
10
  return Math.floor(Math.random() * (max - min) + min);
14
11
  }
package/number/round.js CHANGED
@@ -1,16 +1,12 @@
1
1
  'use strict';
2
-
3
2
  Object.defineProperty(exports, "__esModule", {
4
3
  value: !0
5
4
  });
6
5
  exports["default"] = round;
7
- var _is = _interopRequireDefault(require("./is"));
8
- var _isIntegerAbove = _interopRequireDefault(require("./isIntegerAbove"));
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
6
  function round(val) {
11
7
  var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
12
- if (!(0, _is["default"])(val)) throw new TypeError('Value should be numeric');
13
- var exp = Math.pow(10, (0, _isIntegerAbove["default"])(precision, 0) ? precision : 0);
8
+ if (!Number.isFinite(val)) throw new TypeError('Value should be numeric');
9
+ var exp = Math.pow(10, Number.isInteger(precision) && precision > 0 ? precision : 0);
14
10
  var num = val * exp * (1 + Number.EPSILON);
15
11
  return Math.round(num) / exp;
16
12
  }
@@ -4,13 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  });
6
6
  exports["default"] = toPercentage;
7
- var _is = _interopRequireDefault(require("./is"));
8
- var _round = _interopRequireDefault(require("./round"));
7
+ var _round = _interopRequireDefault(require("./round.js"));
9
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
9
  function toPercentage(val) {
11
10
  var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
12
11
  var min = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
13
12
  var max = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 1;
14
- if (!(0, _is["default"])(val) || !(0, _is["default"])(min) || !(0, _is["default"])(max)) throw new TypeError('Value should be numeric');
13
+ if (!Number.isFinite(val) || !Number.isFinite(min) || !Number.isFinite(max)) throw new TypeError('value/min/max should be numeric');
15
14
  return (0, _round["default"])((val - min) / (max - min) * 100, precision);
16
15
  }
package/object/define.js CHANGED
@@ -4,11 +4,9 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  });
6
6
  exports["default"] = define;
7
- var _is = _interopRequireDefault(require("./is"));
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
9
- function define() {
10
- var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
7
+ var _is = require("./is.js");
8
+ function define(props) {
11
9
  var obj = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
12
- if (!(0, _is["default"])(props) || !(0, _is["default"])(obj)) throw new TypeError('Please pass an object as the value for props and obj');
10
+ if (Object.prototype.toString.call(props) !== _is.PROTO_OBJ || Object.prototype.toString.call(obj) !== _is.PROTO_OBJ) throw new TypeError('Please pass an object as the value for props and obj');
13
11
  return Object.defineProperties(obj, props);
14
12
  }
package/object/is.js CHANGED
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  });
6
+ exports.PROTO_OBJ = void 0;
6
7
  exports["default"] = isObject;
8
+ var PROTO_OBJ = exports.PROTO_OBJ = '[object Object]';
7
9
  function isObject(val) {
8
- return val !== null && Object.prototype.toString.call(val) === '[object Object]';
10
+ return Object.prototype.toString.call(val) === PROTO_OBJ;
9
11
  }
@@ -4,9 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  });
6
6
  exports["default"] = isNotEmptyObject;
7
- var _is = _interopRequireDefault(require("./is"));
8
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
7
+ var _is = require("./is.js");
9
8
  function isNotEmptyObject(val) {
10
- if (!(0, _is["default"])(val)) return !1;
11
- return Object.keys(val).length !== 0;
9
+ return Object.prototype.toString.call(val) === _is.PROTO_OBJ && Object.keys(val).length > 0;
12
10
  }
package/object/merge.js CHANGED
@@ -4,18 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  });
6
6
  exports["default"] = void 0;
7
- var _is = _interopRequireDefault(require("../array/is"));
8
- var _is2 = _interopRequireDefault(require("./is"));
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
- var merge = function merge() {
11
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
12
- var obj = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
13
- if (!(0, _is2["default"])(target)) throw new TypeError('Please pass an object to merge');
7
+ var _is = require("./is.js");
8
+ var merge = function merge(target) {
9
+ var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
10
+ if (Object.prototype.toString.call(target) !== _is.PROTO_OBJ || Object.prototype.toString.call(source) !== _is.PROTO_OBJ) throw new TypeError('Please pass a target and object to merge');
14
11
  return Object.keys(target).reduce(function (acc, key) {
15
- if ((0, _is2["default"])(target[key]) && !(0, _is["default"])(target[key])) {
16
- acc[key] = merge(target[key], obj[key] || {});
12
+ if (Object.prototype.toString.call(target[key]) === _is.PROTO_OBJ && !Array.isArray(target[key])) {
13
+ acc[key] = merge(target[key], source[key] || {});
17
14
  } else {
18
- acc[key] = obj.hasOwnProperty(key) ? obj[key] : target[key];
15
+ acc[key] = source.hasOwnProperty(key) ? source[key] : target[key];
19
16
  }
20
17
  return acc;
21
18
  }, {});
package/object/pick.js CHANGED
@@ -4,29 +4,33 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  });
6
6
  exports["default"] = pick;
7
- var _get = _interopRequireDefault(require("../deep/get"));
8
- var _set = _interopRequireDefault(require("../deep/set"));
9
- var _is = _interopRequireDefault(require("../array/is"));
10
- var _isNotEmpty = _interopRequireDefault(require("../string/isNotEmpty"));
11
- var _is2 = _interopRequireDefault(require("./is"));
7
+ var _get = _interopRequireDefault(require("../deep/get.js"));
8
+ var _set = _interopRequireDefault(require("../deep/set.js"));
9
+ var _isNotEmpty = _interopRequireDefault(require("../string/isNotEmpty.js"));
10
+ var _is = require("./is.js");
12
11
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
13
12
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: !0 }; return { done: !1, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = !0, didErr = !1, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = !0; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
14
13
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
15
14
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
16
- function pick() {
17
- var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
18
- var keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
19
- if (!(0, _is2["default"])(obj)) throw new TypeError('Please pass an object to pick as the value for obj');
20
- if (!(0, _is["default"])(keys)) throw new TypeError('Please pass an array as the value for keys');
15
+ function pick(obj, keys) {
16
+ if (Object.prototype.toString.call(obj) !== _is.PROTO_OBJ || !Array.isArray(keys) || keys.length === 0) throw new TypeError('Please pass an object to pick from and a keys array');
21
17
  var map = {};
18
+ var key_deep = !1;
19
+ var val;
22
20
  var _iterator = _createForOfIteratorHelper(keys),
23
21
  _step;
24
22
  try {
25
23
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
26
24
  var key = _step.value;
27
25
  if (!(0, _isNotEmpty["default"])(key)) continue;
28
- var val = (0, _get["default"])(obj, key.trim());
29
- if (val !== undefined) (0, _set["default"])(map, key.trim(), val);
26
+ key_deep = key.match(/(\.|\[)/g);
27
+ val = key_deep ? (0, _get["default"])(obj, key.trim()) : obj[key.trim()];
28
+ if (val === undefined) continue;
29
+ if (key_deep) {
30
+ (0, _set["default"])(map, key.trim(), val);
31
+ } else {
32
+ map[key.trim()] = val;
33
+ }
30
34
  }
31
35
  } catch (err) {
32
36
  _iterator.e(err);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@valkyriestudios/utils",
3
- "version": "7.5.0",
3
+ "version": "8.1.0",
4
4
  "description": "A collection of single-function utilities for common tasks",
5
5
  "main": "index.js",
6
6
  "author": {
@@ -17,10 +17,13 @@
17
17
  ],
18
18
  "license": "MIT",
19
19
  "scripts": {
20
- "test": "nyc --reporter=lcov --reporter=text-summary mocha --colors --require @babel/register ./test/**/*.test.js",
21
- "test_ci": "nyc --reporter=lcov mocha --colors --require @babel/register ./test/**/*.test.js",
22
- "lint": "./node_modules/.bin/eslint ./src",
23
- "build": "npx babel src --out-dir ./ && npm run lint",
20
+ "test": "node --test ./test/src",
21
+ "test:only": "node --test --test-only ./test/src",
22
+ "test:coverage": "c8 node --test ./test/src",
23
+ "lint": "npm run lint:src && npm run lint:test",
24
+ "lint:src": "./node_modules/.bin/eslint --ext .js,.mjs ./src",
25
+ "lint:test": "./node_modules/.bin/eslint --ext .js,.mjs ./test",
26
+ "build": "npm run lint && npm run test:coverage && rm -rf ./dist && mkdir ./dist && npx babel src --out-dir ./dist && sh ./adjust_esm_to_cjs.sh && mv -f ./dist/* ./ && rm -rf ./dist",
24
27
  "codecov": "codecov"
25
28
  },
26
29
  "repository": {
@@ -32,20 +35,13 @@
32
35
  },
33
36
  "homepage": "https://github.com/ValkyrieStudios/utils#readme",
34
37
  "devDependencies": {
35
- "@babel/cli": "^7.23.0",
38
+ "@babel/cli": "^7.23.4",
36
39
  "@babel/core": "^7.23.2",
37
40
  "@babel/preset-env": "^7.23.2",
38
41
  "@babel/register": "^7.22.15",
39
- "babel-plugin-check-es2015-constants": "^6.22.0",
40
- "babel-plugin-transform-member-expression-literals": "^6.9.4",
41
42
  "babel-plugin-transform-minify-booleans": "^6.9.4",
42
- "babel-plugin-transform-property-literals": "^6.9.4",
43
43
  "babel-plugin-transform-remove-console": "^6.9.4",
44
- "chai": "^4.3.10",
45
- "chai-as-promised": "^7.1.1",
46
- "chai-spies": "^1.0.0",
47
- "eslint": "^8.52.0",
48
- "mocha": "^10.2.0",
49
- "nyc": "^15.1.0"
44
+ "c8": "^8.0.1",
45
+ "eslint": "^8.52.0"
50
46
  }
51
47
  }
package/regexp/is.js CHANGED
@@ -3,7 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  });
6
+ exports.PROTO_RGX = void 0;
6
7
  exports["default"] = isRegExp;
8
+ var PROTO_RGX = exports.PROTO_RGX = '[object RegExp]';
7
9
  function isRegExp(val) {
8
- return Object.prototype.toString.call(val) === '[object RegExp]';
10
+ return Object.prototype.toString.call(val) === PROTO_RGX;
9
11
  }
@@ -1,10 +1,10 @@
1
- "use strict";
1
+ 'use strict';
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: !0
5
5
  });
6
6
  exports["default"] = sanitizeRegExp;
7
- var _isNotEmpty = _interopRequireDefault(require("../string/isNotEmpty"));
7
+ var _isNotEmpty = _interopRequireDefault(require("../string/isNotEmpty.js"));
8
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
9
9
  function sanitizeRegExp(val) {
10
10
  if (!(0, _isNotEmpty["default"])(val)) return !1;
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ import fnv1A from '../hash/fnv1A.mjs';
4
+
5
+ export default function dedupe (val) {
6
+ if (!Array.isArray(val) || val.length === 0) return [];
7
+
8
+ const map = new Map();
9
+ const acc = [];
10
+ let hash;
11
+ for (const item of val) {
12
+ // Calculate hash for item and continue if already seen
13
+ hash = fnv1A(item);
14
+ if (map.has(hash)) continue;
15
+
16
+ // Set seen hash to true
17
+ map.set(hash, true);
18
+
19
+ // Push into accumulator
20
+ acc.push(item);
21
+ }
22
+
23
+ return acc;
24
+ }
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ export default function isArray (val) {
4
+ return Array.isArray(val);
5
+ }
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ export default function isNotEmptyArray (val) {
4
+ return Array.isArray(val) && val.length !== 0;
5
+ }
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ import isNotEmptyString from '../string/isNotEmpty.mjs';
4
+ import isNotEmptyObject from '../object/isNotEmpty.mjs';
5
+ import round from '../number/round.mjs';
6
+
7
+ // Join an array of values while autofiltering any non-string/non-number elements
8
+ //
9
+ // @param array arr Array of values to join
10
+ // @param object options (default={}) Override options
11
+ export default function join (arr, options = {}) {
12
+ if (!Array.isArray(arr) || arr.length === 0) return '';
13
+
14
+ const OPTS = Object.assign({
15
+ delim : ' ', // Delimiter to join with
16
+ trim : true, // Trim after joining
17
+ valtrim : true, // Automatically trim string values
18
+ valround : false, // Automatically round numbers
19
+ }, isNotEmptyObject(options) ? options : {});
20
+
21
+ const filtered = [];
22
+ for (const el of arr) {
23
+ if (isNotEmptyString(el)) {
24
+ filtered.push(OPTS.valtrim === true ? el.trim() : el);
25
+ } else if (Number.isFinite(el)) {
26
+ filtered.push(Number.isFinite(OPTS.valround) ? round(el, OPTS.valround) : el);
27
+ }
28
+ }
29
+
30
+ return OPTS.trim === true ? filtered.join(OPTS.delim).trim() : filtered.join(OPTS.delim);
31
+ }
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ import isFunction from '../function/is.mjs';
4
+ import isNotEmptyString from '../string/isNotEmpty.mjs';
5
+ import {PROTO_OBJ} from '../object/is.mjs';
6
+
7
+ export default function mapFn (arr, fn, opts = {}) {
8
+ if (
9
+ (!Array.isArray(arr) || arr.length === 0) ||
10
+ !isFunction(fn)
11
+ ) return {};
12
+
13
+ const OPTS = Object.assign({
14
+ merge: false,
15
+ }, Object.prototype.toString.call(opts) === PROTO_OBJ ? opts : {});
16
+
17
+ const map = {};
18
+ let hash = false;
19
+ for (const el of arr) {
20
+ if (Object.prototype.toString.call(el) !== PROTO_OBJ) continue;
21
+
22
+ // Get hash
23
+ hash = fn(el);
24
+ if (!Number.isFinite(hash) && !isNotEmptyString(hash)) continue;
25
+
26
+ if (OPTS.merge === true && map.hasOwnProperty(hash)) {
27
+ map[hash] = Object.assign(map[hash], el);
28
+ } else {
29
+ map[hash] = el;
30
+ }
31
+ }
32
+
33
+ return map;
34
+ }
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ import isNotEmptyString from '../string/isNotEmpty.mjs';
4
+ import {PROTO_OBJ} from '../object/is.mjs';
5
+
6
+ export default function mapKey (arr, key, opts = {}) {
7
+ if (
8
+ (!Array.isArray(arr) || arr.length === 0) ||
9
+ !isNotEmptyString(key)
10
+ ) return {};
11
+
12
+ const OPTS = Object.assign({
13
+ merge: false,
14
+ }, Object.prototype.toString.call(opts) === PROTO_OBJ ? opts : {});
15
+
16
+ const map = {};
17
+ for (const el of arr) {
18
+ if (
19
+ Object.prototype.toString.call(el) !== PROTO_OBJ ||
20
+ !el.hasOwnProperty(key)) continue;
21
+ if (OPTS.merge === true && map.hasOwnProperty(el[key])) {
22
+ map[el[key]] = Object.assign(map[el[key]], el);
23
+ } else {
24
+ map[el[key]] = el;
25
+ }
26
+ }
27
+
28
+ return map;
29
+ }
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ import isNotEmptyString from '../string/isNotEmpty.mjs';
4
+ import isNotEmptyObject from '../object/isNotEmpty.mjs';
5
+
6
+ export default function mapPrimitive (arr, opts = {}) {
7
+ if (!Array.isArray(arr) || arr.length === 0) return {};
8
+
9
+ const OPTS = Object.assign({
10
+ valtrim: false,
11
+ keyround: false,
12
+ valround: false,
13
+ }, isNotEmptyObject(opts) ? opts : {});
14
+
15
+ const map = {};
16
+ for (const el of arr) {
17
+ if (Number.isFinite(el)) {
18
+ if (OPTS.keyround === true) {
19
+ map[Math.round(el)] = OPTS.valround ? Math.round(el) : el;
20
+ } else {
21
+ map[el] = OPTS.valround ? Math.round(el) : el;
22
+ }
23
+ } else if (isNotEmptyString(el)) {
24
+ map[el.trim()] = OPTS.valtrim ? el.trim() : el;
25
+ }
26
+ }
27
+
28
+ return map;
29
+ }
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ // Fisher - Yates shuffle O(n)
4
+ // https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
5
+ //
6
+ // @param array arr Array to shuffle
7
+ export default function shuffle (arr) {
8
+ if (!Array.isArray(arr) || arr.length === 0) return;
9
+
10
+ for (let i = arr.length - 1; i > 0; i--) {
11
+ const j = Math.floor(Math.random() * (i + 1)); // Random index from 0 to i
12
+ [arr[i], arr[j]] = [arr[j], arr[i]]; // Swap elements
13
+ }
14
+ }
@@ -0,0 +1,100 @@
1
+ 'use strict';
2
+
3
+ import isBoolean from '../boolean/is.mjs';
4
+ import isNotEmptyObject from '../object/isNotEmpty.mjs';
5
+ import {PROTO_OBJ} from '../object/is.mjs';
6
+ import isNotEmptyString from '../string/isNotEmpty.mjs';
7
+ import isFunction from '../function/is.mjs';
8
+
9
+ function partition (arr, start_ix, end_ix) {
10
+ const pivot_val = arr[Math.floor((start_ix + end_ix) / 2)].t;
11
+
12
+ while (start_ix <= end_ix) {
13
+ while (arr[start_ix].t < pivot_val) {
14
+ start_ix++;
15
+ }
16
+
17
+ while (arr[end_ix].t > pivot_val) {
18
+ end_ix--;
19
+ }
20
+
21
+ if (start_ix <= end_ix) {
22
+ const temp = arr[start_ix];
23
+ arr[start_ix] = arr[end_ix];
24
+ arr[end_ix] = temp;
25
+
26
+ start_ix++;
27
+ end_ix--;
28
+ }
29
+ }
30
+
31
+ return start_ix;
32
+ }
33
+
34
+ function quickSort (arr, start_ix = 0, end_ix = arr.length - 1) {
35
+ if (start_ix < end_ix) {
36
+ const ix = partition(arr, start_ix, end_ix);
37
+
38
+ quickSort(arr, start_ix, ix - 1);
39
+ quickSort(arr, ix, end_ix);
40
+ }
41
+
42
+ return arr;
43
+ }
44
+
45
+ export default function sort (arr, by, dir = 'asc', options = {}) {
46
+ if (!Array.isArray(arr) || arr.length === 0) return [];
47
+
48
+ // Check by
49
+ if (!isNotEmptyString(by) && !isFunction(by)) throw new Error('Sort by should be either a string or a function');
50
+
51
+ // Check dir
52
+ if (dir !== 'asc' && dir !== 'desc') throw new Error('Direction should be either asc or desc');
53
+
54
+ const has_opts = Object.prototype.toString.call(options) === PROTO_OBJ;
55
+
56
+ const OPTS = {
57
+ filter_fn : has_opts && isFunction(options.filter_fn) ? options.filter_fn : isNotEmptyObject,
58
+ nokey_hide : has_opts && isBoolean(options.nokey_hide) ? options.nokey_hide : false,
59
+ nokey_atend : has_opts && isBoolean(options.nokey_atend) ? options.nokey_atend : true,
60
+ };
61
+
62
+ // Prepare for sort
63
+ const prepared_arr = [];
64
+ const nokey_arr = [];
65
+ if (isNotEmptyString(by)) {
66
+ for (const el of arr) {
67
+ if (!OPTS.filter_fn(el)) continue;
68
+
69
+ if (!el.hasOwnProperty(by) || el[by] === undefined) {
70
+ nokey_arr.push(el);
71
+ } else {
72
+ prepared_arr.push({t: el[by], el});
73
+ }
74
+ }
75
+ } else {
76
+ let key;
77
+ for (const el of arr) {
78
+ if (!OPTS.filter_fn(el)) continue;
79
+
80
+ key = by(el);
81
+ if (key === undefined) {
82
+ nokey_arr.push(el);
83
+ } else {
84
+ prepared_arr.push({t: by(el), el});
85
+ }
86
+ }
87
+ }
88
+
89
+ // Sort
90
+ quickSort(prepared_arr);
91
+ if (dir === 'desc') prepared_arr.reverse();
92
+
93
+ if (OPTS.nokey_hide) {
94
+ return prepared_arr.map(obj => obj.el);
95
+ } else if (OPTS.nokey_atend) {
96
+ return [...prepared_arr.map(obj => obj.el), ...nokey_arr];
97
+ } else {
98
+ return [...nokey_arr, ...prepared_arr.map(obj => obj.el)];
99
+ }
100
+ }
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ export default function isBoolean (val) {
4
+ return val === true || val === false || typeof val === 'boolean' || val instanceof Boolean;
5
+ }