@valkyriestudios/utils 12.0.0 → 12.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.
package/array/dedupe.js CHANGED
@@ -1,19 +1,13 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const fnv1A_1 = require("../hash/fnv1A");
4
3
  function dedupe(val) {
5
- if (!Array.isArray(val) || !val.length)
4
+ if (!Array.isArray(val))
6
5
  return [];
7
6
  const set = new Set();
8
- const acc = [];
9
- let hash;
10
7
  for (const item of val) {
11
- hash = (0, fnv1A_1.default)(item);
12
- if (set.has(hash))
13
- continue;
14
- set.add(hash);
15
- acc.push(item);
8
+ if (!set.has(item))
9
+ set.add(item);
16
10
  }
17
- return acc;
11
+ return [...set];
18
12
  }
19
13
  exports.default = dedupe;
package/array/join.d.ts CHANGED
@@ -27,8 +27,8 @@ interface joinOptions {
27
27
  /**
28
28
  * Join an array of values while autofiltering any non-string/non-number elements
29
29
  *
30
- * @param val - Array of values to join
31
- * @param opts - Join options
30
+ * @param {unknown[]} val - Array of values to join
31
+ * @param {joinOptions?} opts - Join options
32
32
  *
33
33
  * @returns Joined array as string
34
34
  */
package/array/join.js CHANGED
@@ -1,24 +1,32 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const round_1 = require("../number/round");
4
- function join(val, opts = {}) {
4
+ function join(val, opts) {
5
5
  if (!Array.isArray(val) || !val.length)
6
6
  return '';
7
- const OPTS = {
8
- delim: ' ',
9
- trim: true,
10
- valtrim: true,
11
- ...Object.prototype.toString.call(opts) === '[object Object]' ? opts : {},
12
- };
7
+ let DELIM = ' ';
8
+ let TRIM = true;
9
+ let VALTRIM = true;
10
+ let VALROUND = false;
11
+ if (opts && Object.prototype.toString.call(opts) === '[object Object]') {
12
+ if (typeof opts.delim === 'string')
13
+ DELIM = opts.delim;
14
+ if (opts.trim === false)
15
+ TRIM = opts.trim;
16
+ if (opts.valtrim === false)
17
+ VALTRIM = opts.valtrim;
18
+ if (Number.isInteger(opts.valround) && opts.valround >= 0)
19
+ VALROUND = opts.valround;
20
+ }
13
21
  const filtered = [];
14
22
  for (const el of val) {
15
23
  if (typeof el === 'string' && el.trim().length) {
16
- filtered.push(OPTS.valtrim === true ? el.trim() : el);
24
+ filtered.push(VALTRIM ? el.trim() : el);
17
25
  }
18
26
  else if (Number.isFinite(el)) {
19
- filtered.push(Number.isFinite(OPTS.valround) ? (0, round_1.default)(el, OPTS.valround) : el);
27
+ filtered.push(VALROUND !== false ? (0, round_1.default)(el, VALROUND) : el);
20
28
  }
21
29
  }
22
- return OPTS.trim === true ? filtered.join(OPTS.delim).trim() : filtered.join(OPTS.delim);
30
+ return TRIM ? filtered.join(DELIM).trim() : filtered.join(DELIM);
23
31
  }
24
32
  exports.default = join;
package/array/mapFn.d.ts CHANGED
@@ -12,11 +12,10 @@ interface mapOptions {
12
12
  */
13
13
  merge?: boolean;
14
14
  }
15
- interface kvMap {
16
- [key: string]: {
17
- [key: string]: any;
18
- };
19
- }
15
+ type mapFn = (entry: {
16
+ [key: string]: any;
17
+ }) => (string | number | boolean);
18
+ type mapReturn = Record<string, Record<string, any>>;
20
19
  /**
21
20
  * Map an object array into a kv-object through a function that generates a key. Returning a non-string,
22
21
  * non-numeric value from the function (eg: false) will filter out the object.
@@ -26,15 +25,11 @@ interface kvMap {
26
25
  * Output:
27
26
  * {12: {uid: 12, name: 'Peter'}, 15: {uid: 15, name: 'Jonas'}}
28
27
  *
29
- * @param val - Array to map
30
- * @param fn - Handler function which is run for each of the objects and should return a string or number
31
- * @param opts - Options object to override built-in defaults
28
+ * @param {Record<string, any>[]} val - Array to map
29
+ * @param {mapFn} fn - Handler function which is run for each of the objects and should return a string or number
30
+ * @param {mapOptions?} opts - Options object to override built-in defaults
32
31
  *
33
- * @returns KV-Map object
32
+ * @returns {mapReturn} KV-Map object
34
33
  */
35
- export default function mapFn(arr: {
36
- [key: string]: any;
37
- }[], fn: (entry: {
38
- [key: string]: any;
39
- }) => (string | number | boolean), opts?: mapOptions): kvMap;
34
+ export default function mapFn(arr: Record<string, any>[], fn: mapFn, opts?: mapOptions): mapReturn;
40
35
  export {};
package/array/mapFn.js CHANGED
@@ -1,13 +1,14 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- function mapFn(arr, fn, opts = {}) {
3
+ function mapFn(arr, fn, opts) {
4
4
  if ((!Array.isArray(arr) || !arr.length) ||
5
5
  typeof fn !== 'function')
6
6
  return {};
7
- const OPTS = {
8
- merge: false,
9
- ...Object.prototype.toString.call(opts) === '[object Object]' ? opts : {},
10
- };
7
+ let MERGE = false;
8
+ if (opts && Object.prototype.toString.call(opts) === '[object Object]') {
9
+ if (opts.merge === true)
10
+ MERGE = true;
11
+ }
11
12
  const map = {};
12
13
  let hash = false;
13
14
  for (const el of arr) {
@@ -17,12 +18,7 @@ function mapFn(arr, fn, opts = {}) {
17
18
  if (!Number.isFinite(hash) && !(typeof hash === 'string' && hash.trim().length))
18
19
  continue;
19
20
  hash = `${hash}`;
20
- if (OPTS.merge === true && map.hasOwnProperty(hash)) {
21
- map[hash] = { ...map[hash], ...el };
22
- }
23
- else {
24
- map[hash] = el;
25
- }
21
+ map[hash] = MERGE && map.hasOwnProperty(hash) ? { ...map[hash], ...el } : el;
26
22
  }
27
23
  return map;
28
24
  }
package/array/mapKey.d.ts CHANGED
@@ -12,11 +12,7 @@ interface mapOptions {
12
12
  */
13
13
  merge?: boolean;
14
14
  }
15
- interface kvMap {
16
- [key: string]: {
17
- [key: string]: any;
18
- };
19
- }
15
+ type kvMap = Record<string, Record<string, any>>;
20
16
  /**
21
17
  * Map an object array into a kv-object by passing a common key that exists on the objects. Objects for
22
18
  * which the key doesn't exist will be filtered out automatically
@@ -26,13 +22,11 @@ interface kvMap {
26
22
  * Output:
27
23
  * {12: {uid: 12, name: 'Peter'}, 15: {uid: 15, name: 'Jonas'}}
28
24
  *
29
- * @param val - Array to map
30
- * @param key - Key to map by
31
- * @param opts - Options object to override built-in defaults
25
+ * @param {Record<string,any>[]} val - Array to map
26
+ * @param {string} key - Key to map by
27
+ * @param {mapOptions?} opts - Options object to override built-in defaults
32
28
  *
33
- * @returns KV-Map object
29
+ * @returns {kvMap} KV-Map object
34
30
  */
35
- export default function mapKey(arr: {
36
- [key: string]: any;
37
- }[], key: string, opts?: mapOptions): kvMap;
31
+ export default function mapKey(arr: Record<string, any>[], key: string, opts?: mapOptions): kvMap;
38
32
  export {};
package/array/mapKey.js CHANGED
@@ -1,27 +1,23 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- function mapKey(arr, key, opts = {}) {
3
+ function mapKey(arr, key, opts) {
4
4
  if ((!Array.isArray(arr) || !arr.length) ||
5
5
  typeof key !== 'string')
6
6
  return {};
7
7
  const key_s = key.trim();
8
8
  if (!key_s.length)
9
9
  return {};
10
- const OPTS = {
11
- merge: false,
12
- ...Object.prototype.toString.call(opts) === '[object Object]' ? opts : {},
13
- };
10
+ let MERGE = false;
11
+ if (opts && Object.prototype.toString.call(opts) === '[object Object]') {
12
+ if (opts.merge === true)
13
+ MERGE = true;
14
+ }
14
15
  const map = {};
15
16
  for (const el of arr) {
16
17
  if (Object.prototype.toString.call(el) !== '[object Object]' ||
17
18
  !Object.prototype.hasOwnProperty.call(el, key_s))
18
19
  continue;
19
- if (OPTS.merge === true && map.hasOwnProperty(el[key_s])) {
20
- map[el[key_s]] = { ...map[el[key_s]], ...el };
21
- }
22
- else {
23
- map[el[key_s]] = el;
24
- }
20
+ map[el[key_s]] = MERGE && map.hasOwnProperty(el[key_s]) ? { ...map[el[key_s]], ...el } : el;
25
21
  }
26
22
  return map;
27
23
  }
@@ -19,9 +19,7 @@ interface mapOptions {
19
19
  */
20
20
  keyround?: boolean;
21
21
  }
22
- interface mapReturn {
23
- [key: string]: string | number;
24
- }
22
+ type mapReturn = Record<string, string | number>;
25
23
  /**
26
24
  * Map an array of primitive values (numbers/strings) into a kv-object
27
25
  * non-numeric and non-string values will be filtered out
@@ -31,10 +29,10 @@ interface mapReturn {
31
29
  * Output:
32
30
  * {hello: 'hello', foo: 'foo', bar: 'bar'}
33
31
  *
34
- * @param val - Array to map
35
- * @param opts - Options object to override built-in defaults
32
+ * @param {unknown[]} val - Array to map
33
+ * @param {mapOptions?} opts - Options object to override built-in defaults
36
34
  *
37
- * @returns KV-Map object
35
+ * @returns {mapReturn} KV-Map object
38
36
  */
39
37
  export default function mapPrimitive(arr: unknown[], opts?: mapOptions): mapReturn;
40
38
  export {};
@@ -1,26 +1,35 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const round_1 = require("../number/round");
4
- function mapPrimitive(arr, opts = {}) {
4
+ function mapPrimitive(arr, opts) {
5
5
  if (!Array.isArray(arr) || !arr.length)
6
6
  return {};
7
- const OPTS = {
8
- valtrim: false,
9
- valround: false,
10
- keyround: false,
11
- ...Object.prototype.toString.call(opts) === '[object Object]' ? opts : {},
12
- };
7
+ let VALTRIM = false;
8
+ let VALROUND = false;
9
+ let KEYROUND = false;
10
+ if (opts && Object.prototype.toString.call(opts) === '[object Object]') {
11
+ if (opts.valtrim === true)
12
+ VALTRIM = true;
13
+ if (opts.valround === true ||
14
+ (Number.isInteger(opts.valround) && opts.valround >= 0))
15
+ VALROUND = opts.valround;
16
+ if (opts.keyround === true)
17
+ KEYROUND = true;
18
+ }
13
19
  const map = {};
14
20
  for (const el of arr) {
15
- if (typeof el === 'string' && el.trim().length) {
16
- map[el.trim()] = OPTS.valtrim ? el.trim() : el;
21
+ if (typeof el === 'string') {
22
+ const trimmed = el.trim();
23
+ if (!trimmed.length)
24
+ continue;
25
+ map[trimmed] = VALTRIM ? trimmed : el;
17
26
  }
18
27
  else if (typeof el === 'number' && Number.isFinite(el)) {
19
- map[`${OPTS.keyround === true ? Math.round(el) : el}`] = OPTS.valround === false
28
+ map[`${KEYROUND ? Math.round(el) : el}`] = VALROUND === false
20
29
  ? el
21
- : OPTS.valround === true
30
+ : VALROUND === true
22
31
  ? Math.round(el)
23
- : (0, round_1.default)(el, OPTS.valround);
32
+ : (0, round_1.default)(el, VALROUND);
24
33
  }
25
34
  }
26
35
  return map;
package/array/shuffle.js CHANGED
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  function shuffle(arr) {
4
- if (!Array.isArray(arr) || !arr.length)
4
+ if (!Array.isArray(arr))
5
5
  return;
6
6
  for (let i = arr.length - 1; i > 0; i--) {
7
7
  const j = Math.floor(Math.random() * (i + 1));
package/array/sort.js CHANGED
@@ -1,6 +1,5 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const is_1 = require("../boolean/is");
4
3
  const isNotEmpty_1 = require("../object/isNotEmpty");
5
4
  function partition(arr, start_ix, end_ix) {
6
5
  const pivot_val = arr[Math.floor((start_ix + end_ix) / 2)].t;
@@ -29,19 +28,24 @@ function quickSort(arr, start_ix = 0, end_ix = arr.length - 1) {
29
28
  }
30
29
  return arr;
31
30
  }
32
- function sort(arr, by, dir = 'asc', opts = {}) {
31
+ function sort(arr, by, dir = 'asc', opts) {
33
32
  if (!Array.isArray(arr) || !arr.length)
34
33
  return [];
35
34
  if (dir !== 'asc' && dir !== 'desc')
36
35
  throw new Error('Direction should be either asc or desc');
37
- const has_opts = Object.prototype.toString.call(opts) === '[object Object]';
38
- const OPTS = {
39
- filter_fn: has_opts && typeof opts.filter_fn === 'function'
40
- ? el => (0, isNotEmpty_1.default)(el) && opts.filter_fn(el)
41
- : isNotEmpty_1.default,
42
- nokey_hide: has_opts && (0, is_1.default)(opts.nokey_hide) ? opts.nokey_hide : false,
43
- nokey_atend: has_opts && (0, is_1.default)(opts.nokey_atend) ? opts.nokey_atend : true,
44
- };
36
+ let NOKEY_HIDE = false;
37
+ let NOKEY_AT_END = true;
38
+ let FILTER_FN = isNotEmpty_1.default;
39
+ if (opts && Object.prototype.toString.call(opts) === '[object Object]') {
40
+ if (opts.nokey_hide === true)
41
+ NOKEY_HIDE = true;
42
+ if (opts.nokey_atend === false)
43
+ NOKEY_AT_END = false;
44
+ if (typeof opts.filter_fn === 'function') {
45
+ const fn = opts.filter_fn;
46
+ FILTER_FN = el => (0, isNotEmpty_1.default)(el) && fn(el);
47
+ }
48
+ }
45
49
  const prepared_arr = [];
46
50
  const nokey_arr = [];
47
51
  if (typeof by === 'string') {
@@ -49,7 +53,7 @@ function sort(arr, by, dir = 'asc', opts = {}) {
49
53
  if (!by_s.length)
50
54
  throw new Error('Sort by as string should contain content');
51
55
  for (const el of arr) {
52
- if (!OPTS.filter_fn(el))
56
+ if (!FILTER_FN(el))
53
57
  continue;
54
58
  if (!Object.prototype.hasOwnProperty.call(el, by_s) || el[by_s] === undefined) {
55
59
  nokey_arr.push(el);
@@ -62,7 +66,7 @@ function sort(arr, by, dir = 'asc', opts = {}) {
62
66
  else if (typeof by === 'function') {
63
67
  let key;
64
68
  for (const el of arr) {
65
- if (!OPTS.filter_fn(el))
69
+ if (!FILTER_FN(el))
66
70
  continue;
67
71
  key = by(el);
68
72
  if (key === undefined) {
@@ -80,11 +84,11 @@ function sort(arr, by, dir = 'asc', opts = {}) {
80
84
  if (dir === 'desc')
81
85
  prepared_arr.reverse();
82
86
  const result = [];
83
- if (OPTS.nokey_hide) {
87
+ if (NOKEY_HIDE) {
84
88
  for (const obj of prepared_arr)
85
89
  result.push(obj.el);
86
90
  }
87
- else if (OPTS.nokey_atend) {
91
+ else if (NOKEY_AT_END) {
88
92
  for (const obj of prepared_arr)
89
93
  result.push(obj.el);
90
94
  for (const el of nokey_arr)
package/date/format.js CHANGED
@@ -51,7 +51,7 @@ function runIntl(loc, token, props, val) {
51
51
  }
52
52
  const Tokens = [
53
53
  ['YYYY', d => d.getFullYear()],
54
- ['Q', d => Math.floor((d.getMonth() + 3) / 3)],
54
+ ['Q', d => ((d.getMonth() + 3) / 3) | 0],
55
55
  ['MMMM', (d, loc) => runIntl(loc, 'MMMM', { month: 'long' }, d)],
56
56
  ['MMM', (d, loc) => runIntl(loc, 'MMM', { month: 'short' }, d)],
57
57
  ['MM', d => `${d.getMonth() + 1}`.padStart(2, '0')],
package/deep/set.js CHANGED
@@ -1,12 +1,13 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const RGX_MALICIOUS = /__proto__|constructor|prototype/;
3
4
  function deepSet(obj, path, value, define = false) {
4
5
  if (Object.prototype.toString.call(obj) !== '[object Object]' &&
5
6
  !Array.isArray(obj))
6
7
  throw new TypeError('Deepset is only supported for objects');
7
8
  if (typeof path !== 'string')
8
9
  throw new TypeError('No path was given');
9
- if (/__proto__|constructor|prototype/.test(path))
10
+ if (RGX_MALICIOUS.test(path))
10
11
  throw new TypeError('Malicious path provided');
11
12
  const path_s = path.trim();
12
13
  if (!path_s.length)
@@ -16,7 +17,8 @@ function deepSet(obj, path, value, define = false) {
16
17
  .replace(/(\.){2,}/g, '.')
17
18
  .replace(/(^\.|\.$|\])/g, '')
18
19
  .split('.');
19
- for (let i = 0; i < parts.length - 1; i++) {
20
+ const last_part_ix = parts.length - 1;
21
+ for (let i = 0; i < last_part_ix; i++) {
20
22
  if (parts[i] === '')
21
23
  continue;
22
24
  if (Array.isArray(obj)) {
@@ -36,16 +38,16 @@ function deepSet(obj, path, value, define = false) {
36
38
  if (!Array.isArray(obj) && Object.prototype.toString.call(obj) !== '[object Object]')
37
39
  return false;
38
40
  if (define) {
39
- Object.defineProperty(obj, parts[parts.length - 1], value);
41
+ Object.defineProperty(obj, parts[last_part_ix], value);
40
42
  }
41
43
  else if (Array.isArray(obj)) {
42
- const idx = parseInt(parts[parts.length - 1]);
44
+ const idx = parseInt(parts[last_part_ix]);
43
45
  if (!Number.isInteger(idx) || idx < 0)
44
46
  throw new TypeError('Invalid path provided');
45
47
  obj[idx] = value;
46
48
  }
47
49
  else {
48
- obj[parts[parts.length - 1]] = value;
50
+ obj[parts[last_part_ix]] = value;
49
51
  }
50
52
  return true;
51
53
  }
package/hash/guid.js CHANGED
@@ -1,33 +1,33 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const HEXMAP = [];
3
+ const HEX = [];
4
4
  for (let i = 0; i < 256; i++) {
5
- HEXMAP[i] = (i < 16 ? '0' : '') + i.toString(16);
5
+ HEX[i] = (i < 16 ? '0' : '') + i.toString(16);
6
6
  }
7
7
  function guid() {
8
8
  const d0 = (Math.random() * 0xffffffff) | 0;
9
9
  const d1 = (Math.random() * 0xffffffff) | 0;
10
10
  const d2 = (Math.random() * 0xffffffff) | 0;
11
11
  const d3 = (Math.random() * 0xffffffff) | 0;
12
- return HEXMAP[d0 & 0xff] +
13
- HEXMAP[(d0 >> 8) & 0xff] +
14
- HEXMAP[(d0 >> 16) & 0xff] +
15
- HEXMAP[(d0 >> 24) & 0xff] +
12
+ return HEX[d0 & 0xff] +
13
+ HEX[(d0 >> 8) & 0xff] +
14
+ HEX[(d0 >> 16) & 0xff] +
15
+ HEX[(d0 >> 24) & 0xff] +
16
16
  '-' +
17
- HEXMAP[d1 & 0xff] +
18
- HEXMAP[(d1 >> 8) & 0xff] +
17
+ HEX[d1 & 0xff] +
18
+ HEX[(d1 >> 8) & 0xff] +
19
19
  '-' +
20
- HEXMAP[((d1 >> 16) & 0x0f) | 0x40] +
21
- HEXMAP[(d1 >> 24) & 0xff] +
20
+ HEX[((d1 >> 16) & 0x0f) | 0x40] +
21
+ HEX[(d1 >> 24) & 0xff] +
22
22
  '-' +
23
- HEXMAP[(d2 & 0x3f) | 0x80] +
24
- HEXMAP[(d2 >> 8) & 0xff] +
23
+ HEX[(d2 & 0x3f) | 0x80] +
24
+ HEX[(d2 >> 8) & 0xff] +
25
25
  '-' +
26
- HEXMAP[(d2 >> 16) & 0xff] +
27
- HEXMAP[(d2 >> 24) & 0xff] +
28
- HEXMAP[d3 & 0xff] +
29
- HEXMAP[(d3 >> 8) & 0xff] +
30
- HEXMAP[(d3 >> 16) & 0xff] +
31
- HEXMAP[(d3 >> 24) & 0xff];
26
+ HEX[(d2 >> 16) & 0xff] +
27
+ HEX[(d2 >> 24) & 0xff] +
28
+ HEX[d3 & 0xff] +
29
+ HEX[(d3 >> 8) & 0xff] +
30
+ HEX[(d3 >> 16) & 0xff] +
31
+ HEX[(d3 >> 24) & 0xff];
32
32
  }
33
33
  exports.default = guid;
package/index.d.ts CHANGED
@@ -156,9 +156,6 @@ declare module "is" {
156
156
  }>;
157
157
  export default Is;
158
158
  }
159
- declare module "hash/fnv1A" {
160
- export default function fnv1A(data: unknown, offset?: number): number;
161
- }
162
159
  declare module "array/dedupe" {
163
160
  export default function dedupe<T>(val: T[]): T[];
164
161
  }
@@ -178,29 +175,18 @@ declare module "array/mapFn" {
178
175
  interface mapOptions {
179
176
  merge?: boolean;
180
177
  }
181
- interface kvMap {
182
- [key: string]: {
183
- [key: string]: any;
184
- };
185
- }
186
- export default function mapFn(arr: {
187
- [key: string]: any;
188
- }[], fn: (entry: {
178
+ type mapFn = (entry: {
189
179
  [key: string]: any;
190
- }) => (string | number | boolean), opts?: mapOptions): kvMap;
180
+ }) => (string | number | boolean);
181
+ type mapReturn = Record<string, Record<string, any>>;
182
+ export default function mapFn(arr: Record<string, any>[], fn: mapFn, opts?: mapOptions): mapReturn;
191
183
  }
192
184
  declare module "array/mapKey" {
193
185
  interface mapOptions {
194
186
  merge?: boolean;
195
187
  }
196
- interface kvMap {
197
- [key: string]: {
198
- [key: string]: any;
199
- };
200
- }
201
- export default function mapKey(arr: {
202
- [key: string]: any;
203
- }[], key: string, opts?: mapOptions): kvMap;
188
+ type kvMap = Record<string, Record<string, any>>;
189
+ export default function mapKey(arr: Record<string, any>[], key: string, opts?: mapOptions): kvMap;
204
190
  }
205
191
  declare module "array/mapPrimitive" {
206
192
  interface mapOptions {
@@ -208,9 +194,7 @@ declare module "array/mapPrimitive" {
208
194
  valround?: boolean | number;
209
195
  keyround?: boolean;
210
196
  }
211
- interface mapReturn {
212
- [key: string]: string | number;
213
- }
197
+ type mapReturn = Record<string, string | number>;
214
198
  export default function mapPrimitive(arr: unknown[], opts?: mapOptions): mapReturn;
215
199
  }
216
200
  declare module "array/shuffle" {
@@ -306,6 +290,9 @@ declare module "function/noopreturn" {
306
290
  declare module "function/sleep" {
307
291
  export default function sleep(ms?: number): Promise<void>;
308
292
  }
293
+ declare module "hash/fnv1A" {
294
+ export default function fnv1A(data: unknown, offset?: number): number;
295
+ }
309
296
  declare module "hash/guid" {
310
297
  export default function guid(): string;
311
298
  }
@@ -356,7 +343,7 @@ declare module "string/humanizeNumber" {
356
343
  divider?: number;
357
344
  real?: boolean;
358
345
  }
359
- export default function humanizeNumber(val: number | string, options?: humanizeNumberOptions): string;
346
+ export default function humanizeNumber(val: number | string, options?: humanizeNumberOptions | false): string;
360
347
  }
361
348
  declare module "string/humanizeBytes" {
362
349
  interface humanizeBytesOptions {
package/object/pick.js CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const get_1 = require("../deep/get");
4
4
  const set_1 = require("../deep/set");
5
+ const RGX_DEEP = /(\.|\[)/;
5
6
  function pick(obj, keys) {
6
7
  if (Object.prototype.toString.call(obj) !== '[object Object]' ||
7
8
  !Array.isArray(keys) ||
@@ -16,7 +17,7 @@ function pick(obj, keys) {
16
17
  sanitized = key.trim();
17
18
  if (!sanitized.length)
18
19
  continue;
19
- if (/(\.|\[)/g.test(sanitized)) {
20
+ if (RGX_DEEP.test(sanitized)) {
20
21
  val = (0, get_1.default)(obj, sanitized);
21
22
  if (val === undefined)
22
23
  continue;
package/package.json CHANGED
@@ -1 +1 @@
1
- { "name": "@valkyriestudios/utils", "version": "12.0.0", "description": "A collection of single-function utilities for common tasks", "author": { "name": "Peter Vermeulen", "email": "contact@valkyriestudios.be", "url": "www.valkyriestudios.be" }, "keywords": [ "utility", "library", "javascript", "js", "node", "bun" ], "license": "MIT", "repository": { "type": "git", "url": "git+https://github.com/ValkyrieStudios/utils.git" }, "bugs": { "url": "https://github.com/ValkyrieStudios/utils/issues" }, "homepage": "https://github.com/ValkyrieStudios/utils#readme", "types": "index.d.ts" }
1
+ { "name": "@valkyriestudios/utils", "version": "12.1.0", "description": "A collection of single-function utilities for common tasks", "author": { "name": "Peter Vermeulen", "email": "contact@valkyriestudios.be", "url": "www.valkyriestudios.be" }, "keywords": [ "utility", "library", "javascript", "js", "node", "bun" ], "license": "MIT", "repository": { "type": "git", "url": "git+https://github.com/ValkyrieStudios/utils.git" }, "bugs": { "url": "https://github.com/ValkyrieStudios/utils/issues" }, "homepage": "https://github.com/ValkyrieStudios/utils#readme", "types": "index.d.ts" }
@@ -48,5 +48,5 @@ interface humanizeNumberOptions {
48
48
  *
49
49
  * @returns Humanized number as string
50
50
  */
51
- export default function humanizeNumber(val: number | string, options?: humanizeNumberOptions): string;
51
+ export default function humanizeNumber(val: number | string, options?: humanizeNumberOptions | false): string;
52
52
  export {};
@@ -1,57 +1,56 @@
1
1
  'use strict';
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const is_1 = require("../boolean/is");
4
- const is_2 = require("../string/is");
5
3
  const round_1 = require("../number/round");
6
- function humanizeNumber(val, options = {}) {
7
- const has_opts = Object.prototype.toString.call(options) === '[object Object]';
8
- const OPTS = {
9
- delim: has_opts && typeof options.delim === 'string'
10
- ? options.delim
11
- : ',',
12
- separator: has_opts && typeof options.separator === 'string' && options.separator.trim().length
13
- ? options.separator
14
- : '.',
15
- precision: has_opts && Number.isInteger(options.precision) && options.precision >= 0
16
- ? options.precision
17
- : 2,
18
- units: has_opts && ((Array.isArray(options.units) && options.units.length) || options.units === false)
19
- ? options.units ? options.units.filter(is_2.default) : false
20
- : ['', 'k', 'm', 'b', 't', 'q'],
21
- divider: has_opts && Number.isInteger(options.divider) && options.divider > 1
22
- ? options.divider
23
- : 1000,
24
- real: has_opts && (0, is_1.default)(options.real)
25
- ? options.real
26
- : false,
27
- };
28
- let normalized;
29
- if (OPTS.real) {
30
- normalized = typeof val === 'string' ? parseInt(val.trim(), 10) : Number.isFinite(val) ? Math.round(val) : 0;
4
+ const DEFAULT_UNITS = ['', 'k', 'm', 'b', 't', 'q'];
5
+ function humanizeNumber(val, options = false) {
6
+ let DELIM = ',';
7
+ let SEPARATOR = '.';
8
+ let PRECISION = 2;
9
+ let UNITS = DEFAULT_UNITS;
10
+ let DIVIDER = 1000;
11
+ let REAL = false;
12
+ if (options && Object.prototype.toString.call(options) === '[object Object]') {
13
+ if (typeof options.delim === 'string')
14
+ DELIM = options.delim;
15
+ if (typeof options.separator === 'string' && options.separator.trim().length)
16
+ SEPARATOR = options.separator;
17
+ if (Number.isInteger(options.precision) && options.precision >= 0)
18
+ PRECISION = options.precision;
19
+ if (Array.isArray(options.units) && options.units.length) {
20
+ UNITS = options.units;
21
+ }
22
+ else if (options.units === false) {
23
+ UNITS = false;
24
+ }
25
+ if (Number.isInteger(options.divider) && options.divider > 1) {
26
+ DIVIDER = options.divider;
27
+ }
28
+ if (options.real === true)
29
+ REAL = true;
31
30
  }
32
- else {
33
- normalized = typeof val === 'string' ? parseFloat(val) : Number.isFinite(val) ? val : 0;
31
+ let normalized = 0;
32
+ if (typeof val === 'string') {
33
+ normalized = REAL ? parseInt(val.trim(), 10) : parseFloat(val);
34
34
  }
35
- if (!Number.isFinite(normalized) || normalized === 0) {
36
- return `0${Array.isArray(OPTS.units) && OPTS.units.length ? OPTS.units[0] : ''}`;
35
+ else if (Number.isFinite(val)) {
36
+ normalized = REAL ? Math.round(val) : val;
37
37
  }
38
+ if (!Number.isFinite(normalized) || normalized === 0)
39
+ return UNITS ? `0${UNITS[0]}` : '0';
38
40
  const sign = normalized < 0 ? '-' : '';
39
41
  normalized = Math.abs(normalized);
40
- let postfix = '';
41
- if (Array.isArray(OPTS.units) && OPTS.units.length) {
42
- let unit_ix = 0;
43
- for (unit_ix; normalized >= OPTS.divider && unit_ix < OPTS.units.length - 1; unit_ix++) {
44
- normalized /= OPTS.divider;
42
+ let unit_ix = 0;
43
+ if (UNITS) {
44
+ for (unit_ix; normalized >= DIVIDER && unit_ix < UNITS.length - 1; unit_ix++) {
45
+ normalized /= DIVIDER;
45
46
  }
46
- postfix = OPTS.units[unit_ix];
47
47
  }
48
- normalized = (0, round_1.default)(normalized, OPTS.precision);
49
- const humanized = `${normalized}`.split('.');
48
+ const humanized = `${(0, round_1.default)(normalized, PRECISION)}`.split('.', 2);
50
49
  humanized[0] = humanized[0].split('').reverse().map((char, ix, original) => {
51
50
  if (ix > 0 && ix < original.length && ix % 3 === 0)
52
- return char + OPTS.delim;
51
+ return char + DELIM;
53
52
  return char;
54
53
  }).reverse().join('');
55
- return `${sign}${humanized.join(OPTS.separator)}${postfix}`;
54
+ return `${sign}${humanized.join(SEPARATOR)}${UNITS ? UNITS[unit_ix] : ''}`;
56
55
  }
57
56
  exports.default = humanizeNumber;
package/string/shorten.js CHANGED
@@ -3,9 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  function shorten(val, length, postfix = '...') {
4
4
  if (typeof val !== 'string')
5
5
  return '';
6
- if (typeof postfix !== 'string' || !Number.isFinite(length) || length <= 0)
6
+ if (typeof postfix !== 'string' || !Number.isInteger(length) || length <= 0)
7
7
  return val;
8
8
  const sanitized = val.trim();
9
- return sanitized.length <= length ? sanitized : `${sanitized.substr(0, length)}${postfix}`;
9
+ return sanitized.length <= length ? sanitized : `${sanitized.substring(0, length)}${postfix}`;
10
10
  }
11
11
  exports.default = shorten;