nhb-toolbox 4.29.1 → 4.29.20

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 (50) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/cjs/array/Finder.js +16 -20
  3. package/dist/cjs/array/sort.js +4 -4
  4. package/dist/cjs/colors/Color.js +2 -3
  5. package/dist/cjs/colors/convert.js +2 -2
  6. package/dist/cjs/colors/helpers.js +1 -7
  7. package/dist/cjs/colors/initials.js +5 -3
  8. package/dist/cjs/colors/utils.js +34 -7
  9. package/dist/cjs/date/chronos-fn.js +4 -2
  10. package/dist/cjs/date/guards.js +13 -15
  11. package/dist/cjs/date/utils.js +40 -4
  12. package/dist/cjs/dom/query.js +5 -8
  13. package/dist/cjs/form/convert.js +2 -2
  14. package/dist/cjs/form/guards.js +2 -1
  15. package/dist/cjs/form/transform.js +4 -3
  16. package/dist/cjs/index.js +11 -6
  17. package/dist/cjs/number/basics.js +8 -5
  18. package/dist/cjs/number/guards.js +10 -2
  19. package/dist/cjs/pluralizer/Pluralizer.js +3 -3
  20. package/dist/cjs/string/convert.js +2 -1
  21. package/dist/cjs/utils/index.js +1 -1
  22. package/dist/dts/colors/helpers.d.ts +0 -8
  23. package/dist/dts/colors/utils.d.ts +64 -3
  24. package/dist/dts/converter/Converter.d.ts +1 -1
  25. package/dist/dts/date/utils.d.ts +21 -2
  26. package/dist/dts/index.d.ts +2 -2
  27. package/dist/dts/number/guards.d.ts +5 -4
  28. package/dist/esm/array/Finder.js +16 -20
  29. package/dist/esm/array/sort.js +4 -4
  30. package/dist/esm/colors/Color.js +3 -4
  31. package/dist/esm/colors/convert.js +4 -4
  32. package/dist/esm/colors/helpers.js +0 -5
  33. package/dist/esm/colors/initials.js +6 -4
  34. package/dist/esm/colors/utils.js +31 -5
  35. package/dist/esm/converter/Converter.js +1 -1
  36. package/dist/esm/date/chronos-fn.js +4 -2
  37. package/dist/esm/date/guards.js +14 -16
  38. package/dist/esm/date/plugins/timeZonePlugin.js +1 -1
  39. package/dist/esm/date/utils.js +39 -4
  40. package/dist/esm/dom/query.js +5 -8
  41. package/dist/esm/form/convert.js +3 -3
  42. package/dist/esm/form/guards.js +2 -1
  43. package/dist/esm/form/transform.js +4 -3
  44. package/dist/esm/index.js +2 -2
  45. package/dist/esm/number/basics.js +9 -6
  46. package/dist/esm/number/guards.js +10 -2
  47. package/dist/esm/pluralizer/Pluralizer.js +4 -4
  48. package/dist/esm/string/convert.js +2 -1
  49. package/dist/esm/utils/index.js +1 -1
  50. package/package.json +3 -3
package/CHANGELOG.md CHANGED
@@ -4,6 +4,16 @@
4
4
 
5
5
  All notable changes to the package will be documented here.
6
6
 
7
+ ## [4.29.20] - 2026-04-03
8
+
9
+ - **Updated** `isEven` and `isOdd` utilities to accept *numeric string* and return `false` for `NaN` and *non-integer* values.
10
+ - **Replaced** manual type checks with *type guards* internally for better *type safety* and *code readability*.
11
+
12
+ ## [4.29.10] - 2026-03-27
13
+
14
+ - **Added** new *color utlities* `applyOpacityToHex` and `percentToHex` for working with *hex colors* and *opacity*.
15
+ - **Added** new *date utility* `formatDateRelative` to format a date as a relative time string (e.g., `"5m ago"`, `"2h from now"`, etc.) with an optional *custom format* for dates older than a week.
16
+
7
17
  ## [4.29.1] - 2026-03-27
8
18
 
9
19
  - **Updated** `getLevenshteinDistance` utility to be more *efficient* by using a *single-dimensional array* instead of a *matrix* for storing intermediate distances.
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Finder = void 0;
4
+ const non_primitives_1 = require("../guards/non-primitives");
5
+ const primitives_1 = require("../guards/primitives");
4
6
  class Finder {
5
7
  static #DEFAULT_TTL = 1000 * 60 * 5;
6
8
  #cachedResult = new Map();
@@ -9,7 +11,7 @@ class Finder {
9
11
  #items;
10
12
  constructor(data, ttl = Finder.#DEFAULT_TTL) {
11
13
  this.#ttl = ttl;
12
- this.#items = typeof data === 'function' ? data() : data;
14
+ this.#items = (0, non_primitives_1.isFunction)(data) ? data() : data;
13
15
  }
14
16
  clearCache(key) {
15
17
  if (key) {
@@ -21,14 +23,14 @@ class Finder {
21
23
  }
22
24
  findAll(matcher, keySelector, options) {
23
25
  const { fuzzy = false, needSorting = true, cacheKey = 'finder-cache', forceBinary = false, caseInsensitive = true, data, } = options ?? {};
24
- const source = typeof data === 'function' ? data() : (data ?? this.#items);
26
+ const source = (0, non_primitives_1.isFunction)(data) ? data() : (data ?? this.#items);
25
27
  if (!source?.length)
26
28
  return [];
27
29
  const rawGetKey = typeof keySelector === 'function'
28
30
  ? keySelector
29
31
  : (item) => item[keySelector];
30
32
  const getKey = Finder.#createMemoizedKeyGetter(rawGetKey);
31
- const normalizedMatcher = caseInsensitive && typeof matcher === 'string' ? matcher.toLowerCase() : matcher;
33
+ const normalizedMatcher = caseInsensitive && (0, primitives_1.isString)(matcher) ? matcher.toLowerCase() : matcher;
32
34
  if (cacheKey) {
33
35
  const entry = this.#cachedResult.get(cacheKey);
34
36
  if (entry && Date.now() - entry.timestamp < this.#ttl) {
@@ -42,7 +44,7 @@ class Finder {
42
44
  if (source.length < 100 && !forceBinary) {
43
45
  results = source.filter((item) => {
44
46
  const key = getKey(item);
45
- const value = caseInsensitive && typeof key === 'string' ? key.toLowerCase() : key;
47
+ const value = caseInsensitive && (0, primitives_1.isString)(key) ? key.toLowerCase() : key;
46
48
  return value === normalizedMatcher;
47
49
  });
48
50
  }
@@ -51,22 +53,18 @@ class Finder {
51
53
  const firstMatch = this.binarySearch(sorted, normalizedMatcher, getKey, caseInsensitive);
52
54
  if (firstMatch) {
53
55
  const baseKey = getKey(firstMatch);
54
- const base = caseInsensitive && typeof baseKey === 'string'
55
- ? baseKey.toLowerCase()
56
- : baseKey;
56
+ const base = caseInsensitive && (0, primitives_1.isString)(baseKey) ? baseKey.toLowerCase() : baseKey;
57
57
  results = sorted.filter((item) => {
58
58
  const key = getKey(item);
59
- const value = caseInsensitive && typeof key === 'string' ? key.toLowerCase() : key;
59
+ const value = caseInsensitive && (0, primitives_1.isString)(key) ? key.toLowerCase() : key;
60
60
  return value === base;
61
61
  });
62
62
  }
63
63
  }
64
- if (!results.length && fuzzy && typeof normalizedMatcher === 'string') {
64
+ if (!results.length && fuzzy && (0, primitives_1.isString)(normalizedMatcher)) {
65
65
  results = source.filter((item) => {
66
66
  const rawKey = getKey(item);
67
- const key = caseInsensitive && typeof rawKey === 'string'
68
- ? rawKey.toLowerCase()
69
- : String(rawKey);
67
+ const key = caseInsensitive && (0, primitives_1.isString)(rawKey) ? rawKey.toLowerCase() : String(rawKey);
70
68
  return this.#match(key, normalizedMatcher);
71
69
  });
72
70
  }
@@ -80,14 +78,14 @@ class Finder {
80
78
  }
81
79
  findOne(matcher, keySelector, options) {
82
80
  const { fuzzy = false, needSorting = true, cacheKey = 'finder-cache', forceBinary = false, caseInsensitive = true, data, } = options ?? {};
83
- const source = typeof data === 'function' ? data() : (data ?? this.#items);
81
+ const source = (0, non_primitives_1.isFunction)(data) ? data() : (data ?? this.#items);
84
82
  if (!source?.length)
85
83
  return undefined;
86
84
  const rawGetKey = typeof keySelector === 'function'
87
85
  ? keySelector
88
86
  : (item) => item[keySelector];
89
87
  const getKey = Finder.#createMemoizedKeyGetter(rawGetKey);
90
- const normalizedMatcher = caseInsensitive && typeof matcher === 'string' ? matcher.toLowerCase() : matcher;
88
+ const normalizedMatcher = caseInsensitive && (0, primitives_1.isString)(matcher) ? matcher.toLowerCase() : matcher;
91
89
  if (cacheKey) {
92
90
  const entry = this.#cachedResult.get(cacheKey);
93
91
  if (entry && Date.now() - entry.timestamp < this.#ttl) {
@@ -101,14 +99,14 @@ class Finder {
101
99
  if (source?.length < 100 && !forceBinary) {
102
100
  result = source?.find((item) => {
103
101
  const key = getKey(item);
104
- const value = caseInsensitive && typeof key === 'string' ? key.toLowerCase() : key;
102
+ const value = caseInsensitive && (0, primitives_1.isString)(key) ? key.toLowerCase() : key;
105
103
  return value === normalizedMatcher;
106
104
  });
107
105
  }
108
106
  else {
109
107
  result = this.binarySearch(needSorting ? this.#sortAndCache(source, getKey, cacheKey) : source, normalizedMatcher, getKey, caseInsensitive);
110
108
  }
111
- if (!result && fuzzy && typeof normalizedMatcher === 'string') {
109
+ if (!result && fuzzy && (0, primitives_1.isString)(normalizedMatcher)) {
112
110
  return this.fuzzySearch(source, normalizedMatcher, getKey, caseInsensitive);
113
111
  }
114
112
  if (cacheKey && result) {
@@ -132,7 +130,7 @@ class Finder {
132
130
  while (min <= max) {
133
131
  const mid = Math.floor((min + max) / 2);
134
132
  const midKey = keySelector(sorted[mid]);
135
- const key = caseInsensitive && typeof midKey === 'string' ? midKey.toLowerCase() : midKey;
133
+ const key = caseInsensitive && (0, primitives_1.isString)(midKey) ? midKey.toLowerCase() : midKey;
136
134
  if (key === matcher)
137
135
  return sorted[mid];
138
136
  if (key < matcher)
@@ -145,9 +143,7 @@ class Finder {
145
143
  fuzzySearch(array, matcher, keySelector, caseInsensitive) {
146
144
  for (const item of array) {
147
145
  const rawKey = keySelector(item);
148
- const key = caseInsensitive && typeof rawKey === 'string'
149
- ? rawKey.toLowerCase()
150
- : String(rawKey);
146
+ const key = caseInsensitive && (0, primitives_1.isString)(rawKey) ? rawKey.toLowerCase() : String(rawKey);
151
147
  if (this.#match(key, matcher))
152
148
  return item;
153
149
  }
@@ -36,18 +36,18 @@ function naturalSort(a, b, options) {
36
36
  for (let i = 0; i < Math.min(aChunks?.length, bChunks?.length); i++) {
37
37
  let aChunk = aChunks[i];
38
38
  let bChunk = bChunks[i];
39
- if (caseInsensitive && typeof aChunk === 'string' && typeof bChunk === 'string') {
39
+ if (caseInsensitive && (0, primitives_1.isString)(aChunk) && (0, primitives_1.isString)(bChunk)) {
40
40
  aChunk = aChunk?.toLowerCase();
41
41
  bChunk = bChunk?.toLowerCase();
42
42
  }
43
43
  if (typeof aChunk !== typeof bChunk) {
44
- return typeof aChunk === 'string' ? 1 : -1;
44
+ return (0, primitives_1.isString)(aChunk) ? 1 : -1;
45
45
  }
46
46
  if (aChunk !== bChunk) {
47
- if (typeof aChunk === 'number' && typeof bChunk === 'number') {
47
+ if ((0, primitives_1.isNumber)(aChunk) && (0, primitives_1.isNumber)(bChunk)) {
48
48
  return aChunk - bChunk;
49
49
  }
50
- if (typeof aChunk === 'string' && typeof bChunk === 'string') {
50
+ if ((0, primitives_1.isString)(aChunk) && (0, primitives_1.isString)(bChunk)) {
51
51
  if (localeAware) {
52
52
  const cmp = aChunk.localeCompare(bChunk, undefined, {
53
53
  sensitivity: caseInsensitive ? 'accent' : 'variant',
@@ -6,7 +6,6 @@ const primitives_1 = require("../guards/primitives");
6
6
  const convert_1 = require("./convert");
7
7
  const css_colors_1 = require("./css-colors");
8
8
  const guards_1 = require("./guards");
9
- const helpers_1 = require("./helpers");
10
9
  const random_1 = require("./random");
11
10
  const utils_1 = require("./utils");
12
11
  class Color {
@@ -70,7 +69,7 @@ class Color {
70
69
  yield this.hsla;
71
70
  }
72
71
  #hex6ToHex8(hex) {
73
- return `${hex.toUpperCase()}${(0, helpers_1._percentToHex)(100)}`;
72
+ return `${hex.toUpperCase()}${(0, utils_1.percentToHex)(100)}`;
74
73
  }
75
74
  #rgbToRGBA(rgb) {
76
75
  const [r, g, b] = (0, utils_1.extractSolidColorValues)(rgb);
@@ -81,7 +80,7 @@ class Color {
81
80
  return `hsla(${h}, ${s}%, ${l}%, 1)`;
82
81
  }
83
82
  applyOpacity(opacity) {
84
- const hex8 = `${this.hex.slice(0, 7)}${(0, helpers_1._percentToHex)(opacity)}`.toUpperCase();
83
+ const hex8 = `${this.hex.slice(0, 7)}${(0, utils_1.percentToHex)(opacity)}`.toUpperCase();
85
84
  return new _a(hex8);
86
85
  }
87
86
  applyDarkness(percent) {
@@ -113,7 +113,7 @@ const convertRgbaToHex8 = (r, g, b, a = 1) => {
113
113
  newAlpha = 1;
114
114
  console.warn(`Alpha value must be between 0-1, ${a} converted to 1!`);
115
115
  }
116
- const alphaHex = (0, helpers_1._percentToHex)(Math.round(newAlpha * 100));
116
+ const alphaHex = (0, utils_1.percentToHex)(Math.round(newAlpha * 100));
117
117
  const hex = (0, exports.convertRgbToHex)(r, g, b);
118
118
  return `${hex}${alphaHex}`;
119
119
  };
@@ -155,7 +155,7 @@ const convertHslaToHex8 = (h, s, l, a = 1) => {
155
155
  newAlpha = 1;
156
156
  console.warn(`Alpha value must be between 0-1, ${a} converted to 1!`);
157
157
  }
158
- const alphaHex = (0, helpers_1._percentToHex)(Math.round(newAlpha * 100));
158
+ const alphaHex = (0, utils_1.percentToHex)(Math.round(newAlpha * 100));
159
159
  const hex = (0, exports.convertHslToHex)(h, s, l);
160
160
  return `${hex}${alphaHex}`;
161
161
  };
@@ -1,16 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports._isSimilarToLast = exports._generateRandomHSL = exports._applyOpacity = exports._percentToHex = void 0;
3
+ exports._isSimilarToLast = exports._generateRandomHSL = exports._applyOpacity = void 0;
4
4
  exports._isValidAlpha = _isValidAlpha;
5
5
  exports._isValidRGBComponent = _isValidRGBComponent;
6
6
  exports._isValidHue = _isValidHue;
7
7
  exports._isValidPercentage = _isValidPercentage;
8
- const _percentToHex = (percent) => {
9
- const validOpacity = Math.min(100, Math.max(0, percent));
10
- const alpha = Math.round((validOpacity / 100) * 255);
11
- return alpha.toString(16).padStart(2, '0').toUpperCase();
12
- };
13
- exports._percentToHex = _percentToHex;
14
8
  const _applyOpacity = (color, opacity) => {
15
9
  return color?.slice(0, 7).concat(opacity);
16
10
  };
@@ -1,16 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getColorForInitial = getColorForInitial;
4
+ const primitives_1 = require("../guards/primitives");
4
5
  const constants_1 = require("./constants");
5
6
  const helpers_1 = require("./helpers");
7
+ const utils_1 = require("./utils");
6
8
  function getColorForInitial(input = '', opacity = 100) {
7
9
  let initial;
8
- const hexOpacity = (0, helpers_1._percentToHex)(opacity);
10
+ const hexOpacity = (0, utils_1.percentToHex)(opacity);
9
11
  const NUMBERS = '0123456789';
10
12
  const DEFAULT = '#010514';
11
13
  if (!input)
12
14
  return (0, helpers_1._applyOpacity)(DEFAULT, hexOpacity);
13
- if (typeof input === 'string') {
15
+ if ((0, primitives_1.isString)(input)) {
14
16
  initial = input[0];
15
17
  if (NUMBERS.includes(initial)) {
16
18
  return (0, helpers_1._applyOpacity)(constants_1.NUMBER_COLOR_PALETTE[parseInt(initial, 10)], hexOpacity);
@@ -22,7 +24,7 @@ function getColorForInitial(input = '', opacity = 100) {
22
24
  }
23
25
  return (0, helpers_1._applyOpacity)(DEFAULT, hexOpacity);
24
26
  }
25
- else if (typeof input === 'number' && !isNaN(input)) {
27
+ else if ((0, primitives_1.isNumber)(input)) {
26
28
  initial = input.toString()[0];
27
29
  if (NUMBERS.includes(initial)) {
28
30
  return (0, helpers_1._applyOpacity)(constants_1.NUMBER_COLOR_PALETTE[parseInt(initial, 10)], hexOpacity);
@@ -1,18 +1,45 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.extractAlphaColorValues = exports.extractSolidColorValues = void 0;
3
+ exports.extractSolidColorValues = extractSolidColorValues;
4
+ exports.extractAlphaColorValues = extractAlphaColorValues;
5
+ exports.percentToHex = percentToHex;
6
+ exports.applyOpacityToHex = applyOpacityToHex;
7
+ const primitives_1 = require("../guards/primitives");
4
8
  const guards_1 = require("./guards");
5
- const extractSolidColorValues = (color) => {
9
+ const helpers_1 = require("./helpers");
10
+ function extractSolidColorValues(color) {
6
11
  if ((0, guards_1.isHSL)(color) || (0, guards_1.isRGB)(color)) {
7
12
  return (color?.trim()?.match(/[\d.]+%?/g) || [])?.map((value) => parseFloat(value));
8
13
  }
9
14
  return [0, 0, 0];
10
- };
11
- exports.extractSolidColorValues = extractSolidColorValues;
12
- const extractAlphaColorValues = (color) => {
15
+ }
16
+ function extractAlphaColorValues(color) {
13
17
  if ((0, guards_1.isHSLA)(color) || (0, guards_1.isRGBA)(color)) {
14
18
  return (color?.trim()?.match(/[\d.]+%?/g) || [])?.map((value) => parseFloat(value));
15
19
  }
16
20
  return [0, 0, 0, 0];
17
- };
18
- exports.extractAlphaColorValues = extractAlphaColorValues;
21
+ }
22
+ function percentToHex(percent) {
23
+ const validOpacity = Math.min(100, Math.max(0, percent));
24
+ const alpha = Math.round((validOpacity / 100) * 255);
25
+ return alpha.toString(16).padStart(2, '0').toUpperCase();
26
+ }
27
+ function applyOpacityToHex(color, opacity) {
28
+ if ((0, guards_1.isHex6)(color) || (0, guards_1.isHex8)(color)) {
29
+ const upperColor = color.toUpperCase();
30
+ if ((0, primitives_1.isNumber)(opacity)) {
31
+ return (0, helpers_1._applyOpacity)(upperColor, percentToHex(opacity));
32
+ }
33
+ else if ((0, primitives_1.isNonEmptyString)(opacity) && /^[0-9A-Fa-f]{2}$/.test(opacity)) {
34
+ return (0, helpers_1._applyOpacity)(upperColor, opacity.toUpperCase());
35
+ }
36
+ else {
37
+ return (0, helpers_1._applyOpacity)(upperColor, percentToHex(100));
38
+ }
39
+ }
40
+ else {
41
+ throw new TypeError('Invalid color value!', {
42
+ cause: 'Value must be a hex color string in the format #RRGGBB or #RRGGBBAA.',
43
+ });
44
+ }
45
+ }
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.chronusts = exports.chronusjs = exports.chronus = exports.chronosts = exports.chronosjs = exports.chronos = void 0;
4
+ const non_primitives_1 = require("../guards/non-primitives");
5
+ const primitives_1 = require("../guards/primitives");
4
6
  const Chronos_1 = require("./Chronos");
5
7
  const $chronos = (valueOrYear, month, date, hours, minutes, seconds, ms) => {
6
- if (typeof valueOrYear === 'number' && typeof month === 'number') {
8
+ if ((0, primitives_1.isNumber)(valueOrYear) && (0, primitives_1.isNumber)(month)) {
7
9
  return new Chronos_1.Chronos(valueOrYear, month, date ?? 1, hours ?? 0, minutes ?? 0, seconds ?? 0, ms ?? 0);
8
10
  }
9
11
  else {
@@ -15,7 +17,7 @@ function _isChronosStaticKey(prop) {
15
17
  prop !== 'prototype' &&
16
18
  prop !== 'name' &&
17
19
  prop !== 'length' &&
18
- typeof Chronos_1.Chronos[prop] === 'function');
20
+ (0, non_primitives_1.isFunction)(Chronos_1.Chronos[prop]));
19
21
  }
20
22
  exports.chronos = new Proxy($chronos, {
21
23
  get(target, prop, receiver) {
@@ -7,6 +7,7 @@ exports.isNativeTimeZoneId = isNativeTimeZoneId;
7
7
  exports.isLeapYear = isLeapYear;
8
8
  exports.isDateLike = isDateLike;
9
9
  exports.isTimeWithUnit = isTimeWithUnit;
10
+ const non_primitives_1 = require("../guards/non-primitives");
10
11
  const primitives_1 = require("../guards/primitives");
11
12
  const specials_1 = require("../guards/specials");
12
13
  const utilities_1 = require("../number/utilities");
@@ -37,27 +38,24 @@ function isLeapYear(year) {
37
38
  function isDateLike(value) {
38
39
  if (value instanceof Date)
39
40
  return true;
40
- if (value && typeof value === 'object') {
41
- const v = value;
42
- if (typeof v.format === 'function' &&
43
- typeof v.toJSON === 'function' &&
44
- typeof v.toISOString === 'function') {
41
+ if ((0, non_primitives_1.isObject)(value)) {
42
+ if ((0, non_primitives_1.isFunction)(value.format) &&
43
+ (0, non_primitives_1.isFunction)(value.toJSON) &&
44
+ (0, non_primitives_1.isFunction)(value.toISOString)) {
45
45
  return true;
46
46
  }
47
- if (typeof v.toISO === 'function' &&
48
- typeof v.toFormat === 'function' &&
49
- typeof v.isValid === 'boolean') {
47
+ if ((0, non_primitives_1.isFunction)(value.toISO) && (0, non_primitives_1.isFunction)(value.toFormat) && (0, primitives_1.isBoolean)(value.isValid)) {
50
48
  return true;
51
49
  }
52
- if (typeof v.plus === 'function' &&
53
- typeof v.minus === 'function' &&
54
- typeof v.equals === 'function' &&
55
- typeof v.getClass === 'function') {
50
+ if ((0, non_primitives_1.isFunction)(value.plus) &&
51
+ (0, non_primitives_1.isFunction)(value.minus) &&
52
+ (0, non_primitives_1.isFunction)(value.equals) &&
53
+ (0, non_primitives_1.isFunction)(value.getClass)) {
56
54
  return true;
57
55
  }
58
- if (typeof v.toJSON === 'function' &&
59
- typeof v.toString === 'function' &&
60
- ['PlainDate', 'ZonedDateTime', 'Instant'].includes(v.constructor?.name ?? '')) {
56
+ if ((0, non_primitives_1.isFunction)(value.toJSON) &&
57
+ (0, non_primitives_1.isFunction)(value.toString) &&
58
+ ['PlainDate', 'ZonedDateTime', 'Instant'].includes(value.constructor?.name ?? '')) {
61
59
  return true;
62
60
  }
63
61
  }
@@ -12,8 +12,11 @@ exports.getTimeZoneDetails = getTimeZoneDetails;
12
12
  exports.getTimeZoneIds = getTimeZoneIds;
13
13
  exports.formatDate = formatDate;
14
14
  exports.formatTimePart = formatTimePart;
15
+ exports.formatDateRelative = formatDateRelative;
15
16
  exports.getTimestamp = getTimestamp;
16
17
  const non_primitives_1 = require("../guards/non-primitives");
18
+ const primitives_1 = require("../guards/primitives");
19
+ const utilities_1 = require("../number/utilities");
17
20
  const guards_1 = require("./guards");
18
21
  const helpers_1 = require("./helpers");
19
22
  const timezone_1 = require("./timezone");
@@ -37,13 +40,24 @@ function extractMinutesFromUTC(utc) {
37
40
  return getTotalMinutes(extractTimeFromUTC(utc));
38
41
  }
39
42
  function convertMinutesToTime(minutes) {
40
- const numMIn = Math.abs(typeof minutes === 'number' ? minutes : Number(minutes));
43
+ const parsed = (0, utilities_1.normalizeNumber)(minutes);
44
+ if ((0, primitives_1.isUndefined)(parsed)) {
45
+ throw new TypeError(`Invalid numeric input!`, {
46
+ cause: `${minutes} cannot be converted to a number.`,
47
+ });
48
+ }
49
+ const numMIn = Math.abs(parsed);
41
50
  return `${String(Math.floor(numMIn / 60))}:${String(numMIn % 60).padStart(2, '0')}`;
42
51
  }
43
52
  function formatUTCOffset(minutes) {
44
- const numMIn = typeof minutes === 'number' ? minutes : Number(minutes);
45
- const sign = numMIn < 0 ? '-' : '+';
46
- const abs = Math.abs(numMIn);
53
+ const parsed = (0, utilities_1.normalizeNumber)(minutes);
54
+ if ((0, primitives_1.isUndefined)(parsed)) {
55
+ throw new TypeError(`Invalid numeric input!`, {
56
+ cause: `${minutes} cannot be converted to a number.`,
57
+ });
58
+ }
59
+ const sign = parsed < 0 ? '-' : '+';
60
+ const abs = Math.abs(parsed);
47
61
  const hours = String(Math.floor(abs / 60)).padStart(2, '0');
48
62
  const mins = String(abs % 60).padStart(2, '0');
49
63
  return `UTC${sign}${hours}:${mins}`;
@@ -92,6 +106,28 @@ function formatTimePart(time, format) {
92
106
  const timeWithDate = `${formatDate({ format: 'YYYY-MM-DD' })}T${(0, helpers_1._normalizeOffset)(time)}`;
93
107
  return formatDate({ date: timeWithDate, format: format || 'hh:mm:ss a' });
94
108
  }
109
+ function formatDateRelative(date, format) {
110
+ const $date = (0, helpers_1._dateArgsToDate)(date);
111
+ if (isNaN($date.getTime())) {
112
+ return 'Invalid Date!';
113
+ }
114
+ const now = Date.now();
115
+ const then = $date.getTime();
116
+ const diff = Math.abs(now - then);
117
+ const minutes = Math.floor(diff / 60000);
118
+ const hours = Math.floor(diff / 3600000);
119
+ const days = Math.floor(diff / 86400000);
120
+ const suffix = then < now ? 'ago' : 'from now';
121
+ if (minutes < 1)
122
+ return 'Just now';
123
+ if (minutes < 60)
124
+ return `${minutes}m ${suffix}`;
125
+ if (hours < 24)
126
+ return `${hours}h ${suffix}`;
127
+ if (days < 7)
128
+ return `${days}d ${suffix}`;
129
+ return formatDate({ date, format: format || 'mmm D, yyyy hh:mm a' });
130
+ }
95
131
  function getTimestamp(args, format) {
96
132
  let $value;
97
133
  let $format;
@@ -5,22 +5,19 @@ exports.getQueryParams = getQueryParams;
5
5
  exports.updateQueryParam = updateQueryParam;
6
6
  exports.parseQueryString = parseQueryString;
7
7
  exports.parseQueryStringLiteral = parseQueryStringLiteral;
8
+ const primitives_1 = require("../guards/primitives");
8
9
  const objectify_1 = require("../object/objectify");
9
10
  const sanitize_1 = require("../object/sanitize");
10
11
  const index_1 = require("../utils/index");
11
12
  function generateQueryParams(params = {}) {
12
13
  const flattenedParams = (0, objectify_1.flattenObjectKeyValue)(params);
13
14
  const queryParams = Object.entries(flattenedParams)
14
- ?.filter(([_, value]) => value !== undefined &&
15
- value !== null &&
16
- !(typeof value === 'string' && value?.trim() === ''))
15
+ ?.filter(([_, value]) => value != null && !((0, primitives_1.isString)(value) && value?.trim() === ''))
17
16
  ?.flatMap(([key, value]) => Array.isArray(value)
18
17
  ? value
19
- ?.filter((v) => v !== undefined &&
20
- v !== null &&
21
- !(typeof v === 'string' && v.trim() === ''))
22
- ?.map((v) => `${encodeURIComponent(key)}=${encodeURIComponent(typeof v === 'boolean' ? String(v) : String(v))}`)
23
- : `${encodeURIComponent(key)}=${encodeURIComponent(typeof value === 'boolean' ? String(value) : String(value))}`)
18
+ ?.filter((v) => v != null && !((0, primitives_1.isString)(v) && v.trim() === ''))
19
+ ?.map((v) => `${encodeURIComponent(key)}=${encodeURIComponent(String(v))}`)
20
+ : `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`)
24
21
  .join('&');
25
22
  return queryParams ? `?${queryParams}` : '';
26
23
  }
@@ -70,7 +70,7 @@ const createControlledFormData = (data, configs) => {
70
70
  }
71
71
  }
72
72
  else {
73
- if (typeof value === 'string') {
73
+ if ((0, primitives_1.isString)(value)) {
74
74
  if ((0, primitives_1.isNonEmptyString)(value)) {
75
75
  let cleanString = value;
76
76
  if (configs?.trimStrings) {
@@ -175,7 +175,7 @@ const createControlledFormData = (data, configs) => {
175
175
  else {
176
176
  const isNotNullish = value != null && value !== '';
177
177
  if (isNotNullish || _isRequiredKey(key)) {
178
- if (typeof value === 'string' && _shouldLowercaseValue(key)) {
178
+ if ((0, primitives_1.isString)(value) && _shouldLowercaseValue(key)) {
179
179
  formData.append(transformedKey, value?.toLowerCase());
180
180
  }
181
181
  else {
@@ -8,6 +8,7 @@ exports.isFileArray = isFileArray;
8
8
  exports.isFileList = isFileList;
9
9
  exports.isFileOrBlob = isFileOrBlob;
10
10
  exports.isFileUpload = isFileUpload;
11
+ const primitives_1 = require("../guards/primitives");
11
12
  function isValidFormData(value) {
12
13
  if (!(value instanceof FormData))
13
14
  return false;
@@ -25,7 +26,7 @@ function isOriginFileObj(value) {
25
26
  return false;
26
27
  }
27
28
  const obj = value;
28
- return typeof obj.uid === 'string';
29
+ return (0, primitives_1.isString)(obj.uid);
29
30
  }
30
31
  function isCustomFile(value) {
31
32
  if (typeof value !== 'object' || value === null || Array.isArray(value)) {
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.serializeForm = serializeForm;
4
4
  exports.parseFormData = parseFormData;
5
5
  const query_1 = require("../dom/query");
6
+ const primitives_1 = require("../guards/primitives");
6
7
  const sanitize_1 = require("../object/sanitize");
7
8
  function serializeForm(form, toQueryString = false) {
8
9
  const formData = new FormData(form);
@@ -25,11 +26,11 @@ function serializeForm(form, toQueryString = false) {
25
26
  }
26
27
  function parseFormData(data, parsePrimitives = true) {
27
28
  const parsed = {};
28
- if (typeof data === 'string') {
29
+ if ((0, primitives_1.isString)(data)) {
29
30
  const params = new URLSearchParams(data);
30
31
  params?.forEach((value, key) => {
31
32
  const existing = parsed[key];
32
- if (typeof existing === 'string') {
33
+ if ((0, primitives_1.isString)(existing)) {
33
34
  parsed[key] = [existing, value];
34
35
  }
35
36
  else if (Array.isArray(existing)) {
@@ -55,7 +56,7 @@ function parseFormData(data, parsePrimitives = true) {
55
56
  }
56
57
  }
57
58
  else {
58
- if (typeof existing === 'string') {
59
+ if ((0, primitives_1.isString)(existing)) {
59
60
  parsed[key] = [existing, value];
60
61
  }
61
62
  else if (Array.isArray(existing)) {
package/dist/cjs/index.js CHANGED
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.calculateLCD = exports.calculateHCF = exports.calculateGCD = exports.calculateFactorial = exports.calculateAverage = exports.verbalizer = exports.Verbalizer = exports.pluralizer = exports.Pluralizer = exports.VolumeConverter = exports.TimeConverter = exports.TemperatureConverter = exports.MassConverter = exports.LengthConverter = exports.DataConverter = exports.converter = exports.Converter = exports.AreaConverter = exports.wordCount = exports.parseNumbersFromText = exports.levenshteinDistance = exports.getLevenshteinDistance = exports.extractNumbersFromString = exports.extractNumbers = exports.countWordsInString = exports.countWords = exports.getCharacterDifferences = exports.computeTextDiff = exports.slugifyString = exports.reverseString = exports.replaceAllInString = exports.normalizeString = exports.maskString = exports.formatWithPlural = exports.formatUnitWithPlural = exports.formatNumberWithPluralUnit = exports.extractURLs = exports.extractEmails = exports.convertStringCase = exports.capitalizeString = exports.isSnakeCase = exports.isPascalCase = exports.isPalindrome = exports.isKebabCase = exports.isEmojiOnly = exports.isCamelCase = exports.generateAnagrams = exports.truncateString = exports.trimString = exports.generateRandomID = void 0;
4
4
  exports.convertNumberToWordsOrdinal = exports.convertNumberToWords = exports.cardinalWordsToOrdinal = exports.banglaToDigit = exports.arabicToRoman = exports.isPerfectSquare = exports.isPartOfFibonacciSeries = exports.isPartOfFibonacci = exports.isOddNumber = exports.isOdd = exports.isNumberInvalid = exports.isMultiple = exports.isInvalidNumber = exports.isFibonacci = exports.isEvenNumber = exports.isEven = exports.areNumbersInvalid = exports.areInvalidNumbers = exports.getNthFibonacci = exports.getMemoizedFibonacciSeries = exports.getMemoizedFibonacci = exports.getFibonacciSeriesMemo = exports.getFibonacciSeries = exports.getFibonacciNumbers = exports.getFibonacci = exports.generateFibonacci = exports.fibonacciGenerator = exports.calculatePercentage = exports.UnitConverter = exports.Unit = exports.Currency = exports.sumOfNumbers = exports.sumNumbers = exports.sumDigits = exports.roundToDecimal = exports.roundNumber = exports.reverseNumber = exports.getSumOfNumbers = exports.getRandomNumber = exports.getRandomInt = exports.getFactors = exports.getFactorial = exports.getDivisors = exports.getAverageOfNumbers = exports.getAverage = exports.factorsOf = exports.factorial = exports.convertToFixed = exports.convertToDecimal = exports.calculateLCM = void 0;
5
5
  exports.convertHexToHsl = exports.convertHex8ToRgba = exports.convertHex8ToHsla = exports.convertColorCode = exports.getRandomHSL = exports.getRandomColor = exports.generateRandomHSLColor = exports.generateRandomHSL = exports.generateRandomColorInHexRGB = exports.generateRandomColor = exports.getColorForInitial = exports.getNumbersInRange = exports.roundToNearestInterval = exports.roundToNearest = exports.roundNumberToNearestInterval = exports.numberToOrdinal = exports.normalizeNumber = exports.getRandomFloat = exports.getRandomDecimal = exports.getOrdinalNumber = exports.getOrdinal = exports.formatCurrency = exports.convertToOrdinal = exports.convertNumberToOrdinal = exports.convertNumberToCurrency = exports.clampNumber = exports.cardinalToOrdinal = exports.isPrimeNumber = exports.isPrime = exports.getPrimeNumbers = exports.findPrimeNumbers = exports.wordToNumber = exports.wordsToNumber = exports.toRomanNumeral = exports.toRoman = exports.romanToNumeric = exports.romanToInteger = exports.romanToArabic = exports.numericToRoman = exports.numberToWordsOrdinal = exports.numberToWords = exports.numberToRoman = exports.integerToRoman = exports.digitToBangla = exports.convertWordToNumber = exports.convertWordsToNumber = exports.convertToRomanNumerals = exports.convertRomanToNumeric = exports.convertRomanToInteger = exports.convertRomanToArabic = void 0;
6
- exports.convertMinutesToUTCOffset = exports.convertMinutesToTime = exports.convertMinutesToHourMinutes = exports.chronusts = exports.chronusjs = exports.chronus = exports.chronosts = exports.chronosjs = exports.chronos = exports.INTERNALS = exports.Chronus = exports.Chronos = exports.Bongabdo = exports.BnCalendar = exports.BanglaCalendar = exports.isValidUTCOffset = exports.isValidUTCOffSet = exports.isValidUTC = exports.isValidTimeZoneId = exports.isValidTimeString = exports.isValidTime = exports.isTimeWithUnit = exports.isNativeTimeZoneId = exports.isLeapYear = exports.isDateLike = exports.parseMSec = exports.parseMs = exports.greet = exports.getGreeting = exports.generateGreeting = exports.extractSolidColorValues = exports.extractAlphaColorValues = exports.Colour = exports.Color = exports.isRGBA = exports.isRGB = exports.isHSLA = exports.isHSL = exports.isHex8 = exports.isHex6 = exports.convertRgbToRgba = exports.convertRgbToHsl = exports.convertRgbToHex = exports.convertRgbaToHsla = exports.convertRgbaToHex8 = exports.convertHslToRgb = exports.convertHslToHex = exports.convertHslaToRgba = exports.convertHslaToHex8 = exports.convertHexToRgb = void 0;
7
- exports.getDuplicatesFromArray = exports.getDuplicates = exports.findMissingElements = exports.extractMissingElements = exports.extractDuplicatesFromArray = exports.extractDuplicates = exports.createOptionsArray = exports.sortAnArray = exports.naturalSortForString = exports.naturalSort = exports.compareSorter = exports.compareNaturally = exports.Finder = exports.totalDeltaByField = exports.sumFieldDifference = exports.sumByField = exports.groupAndSumByField = exports.groupAndAvgByField = exports.groupAndAverageByField = exports.avgByField = exports.averageByField = exports.shuffleArray = exports.isValidEmptyArray = exports.isInvalidOrEmptyArray = exports.getLastArrayElement = exports.flattenArray = exports.filterArrayOfObjects = exports.minutesToUTCOffset = exports.getTotalMinutesFromUTC = exports.getTotalMinutesFromTime = exports.getTotalMinutes = exports.getTimeZoneIds = exports.getTimeZoneDetails = exports.getTimeStringFromUTC = exports.getTimeFromMinutes = exports.getNativeTimeZoneId = exports.getMinutesFromUTC = exports.getHourMinutesFromMinutes = exports.getTimestamp = exports.getCurrentTime = exports.getCurrentDateTime = exports.formatUTCOffset = exports.formatTimePart = exports.formatDateTime = exports.formatDate = exports.extractTotalMinutesFromTime = exports.extractTimeStringFromUTC = exports.extractTimeFromUTC = exports.extractMinutesFromUTC = exports.extractHourMinute = void 0;
8
- exports.removeFields = exports.remapObjectFields = exports.remapFields = exports.pickObjectFieldsByCondition = exports.pickObjectFields = exports.pickFieldsByCondition = exports.pickFields = exports.omitObjectFields = exports.omitFields = exports.deleteObjectFields = exports.deleteFields = exports.convertObjectValues = exports.sanitizeData = exports.parseStringifiedObjectValues = exports.parseObjectValues = exports.parseJsonToObject = exports.mergeObjects = exports.mergeAndFlattenObjects = exports.flattenObjectKeyValue = exports.flattenObjectDotNotation = exports.extractUpdatedFields = exports.extractUpdatedAndNewFields = exports.extractNewFields = exports.extractObjectKeysDeep = exports.extractObjectKeys = exports.extractKeysDeep = exports.extractKeys = exports.countObjectFields = exports.cloneObject = exports.isValidFormData = exports.isOriginFileObj = exports.isFileUpload = exports.isFileOrBlob = exports.isFileList = exports.isFileArray = exports.isCustomFileArray = exports.isCustomFile = exports.serializeForm = exports.parseFormData = exports.createFormData = exports.createControlledFormData = exports.convertIntoFormData = exports.splitArrayByProperty = exports.splitArray = exports.rotateArray = exports.removeDuplicatesFromArray = exports.removeDuplicates = exports.moveArrayElement = exports.groupArrayByProperty = exports.getMissingElements = void 0;
9
- exports.isNumber = exports.isNull = exports.isNormalPrimitive = exports.isNonEmptyString = exports.isInteger = exports.isFalsy = exports.isBoolean = exports.isBigInt = exports.Paginator = exports.throttleAction = exports.stripJsonEdgeGarbage = exports.stableStringify = exports.parsePrimitivesDeep = exports.parseJsonDeep = exports.parseJSON = exports.joinArrayElements = exports.isDeepEqual = exports.getStaticMethodsCount = exports.getStaticMethodNames = exports.getStaticGetterNames = exports.getInstanceMethodsCount = exports.getInstanceMethodNames = exports.getInstanceGetterNames = exports.getClassDetails = exports.definePrototypeMethod = exports.deepParsePrimitives = exports.debounceAction = exports.countStaticMethods = exports.countInstanceMethods = exports.convertArrayToString = exports.saveToSessionStorage = exports.saveToLocalStorage = exports.removeFromSessionStorage = exports.removeFromLocalStorage = exports.getFromSessionStorage = exports.getFromLocalStorage = exports.toggleFullScreen = exports.smoothScrollTo = exports.copyToClipboard = exports.updateQueryParam = exports.queryStringToObject = exports.parseQueryStringLiteral = exports.parseQueryString = exports.literalQueryStringToObject = exports.getQueryStringAsObject = exports.getQueryParams = exports.generateQueryParams = exports.formatQueryParams = exports.createQueryParams = exports.removeObjectFields = void 0;
10
- exports.isNumericString = exports.isNodeEnvironment = exports.isNodeENV = exports.isNode = exports.isIPAddress = exports.isHexString = exports.isExpectedNodeENV = exports.isEnvironment = exports.isEmailArray = exports.isEmail = exports.isDateString = exports.isBrowser = exports.isBinaryString = exports.isBase64 = exports.httpStatus = exports.HttpStatus = exports.isValidSet = exports.isValidObject = exports.isValidMap = exports.isValidJSON = exports.isValidArray = exports.isSet = exports.isReturningPromise = exports.isRegularExpression = exports.isRegExp = exports.isPromise = exports.isObjectWithKeys = exports.isObjectEmpty = exports.isObject = exports.isNotEmptyObject = exports.isMethodDescriptor = exports.isMethod = exports.isMap = exports.isJSONObject = exports.isJSON = exports.isFunction = exports.isError = exports.isEmptyObjectGuard = exports.isEmptyObject = exports.isDate = exports.isArrayWithLength = exports.isArrayOfType = exports.isArray = exports.doesReturnPromise = exports.isUndefined = exports.isTruthy = exports.isSymbol = exports.isString = exports.isPrimitive = exports.isPositiveInteger = void 0;
11
- exports.isValidURL = exports.isValidEmail = exports.isUUID = exports.isURL = exports.isPhoneNumber = void 0;
6
+ exports.convertMinutesToHourMinutes = exports.chronusts = exports.chronusjs = exports.chronus = exports.chronosts = exports.chronosjs = exports.chronos = exports.INTERNALS = exports.Chronus = exports.Chronos = exports.Bongabdo = exports.BnCalendar = exports.BanglaCalendar = exports.isValidUTCOffset = exports.isValidUTCOffSet = exports.isValidUTC = exports.isValidTimeZoneId = exports.isValidTimeString = exports.isValidTime = exports.isTimeWithUnit = exports.isNativeTimeZoneId = exports.isLeapYear = exports.isDateLike = exports.parseMSec = exports.parseMs = exports.greet = exports.getGreeting = exports.generateGreeting = exports.percentToHex = exports.extractSolidColorValues = exports.extractAlphaColorValues = exports.applyOpacityToHex = exports.Colour = exports.Color = exports.isRGBA = exports.isRGB = exports.isHSLA = exports.isHSL = exports.isHex8 = exports.isHex6 = exports.convertRgbToRgba = exports.convertRgbToHsl = exports.convertRgbToHex = exports.convertRgbaToHsla = exports.convertRgbaToHex8 = exports.convertHslToRgb = exports.convertHslToHex = exports.convertHslaToRgba = exports.convertHslaToHex8 = exports.convertHexToRgb = void 0;
7
+ exports.extractDuplicates = exports.createOptionsArray = exports.sortAnArray = exports.naturalSortForString = exports.naturalSort = exports.compareSorter = exports.compareNaturally = exports.Finder = exports.totalDeltaByField = exports.sumFieldDifference = exports.sumByField = exports.groupAndSumByField = exports.groupAndAvgByField = exports.groupAndAverageByField = exports.avgByField = exports.averageByField = exports.shuffleArray = exports.isValidEmptyArray = exports.isInvalidOrEmptyArray = exports.getLastArrayElement = exports.flattenArray = exports.filterArrayOfObjects = exports.minutesToUTCOffset = exports.getTotalMinutesFromUTC = exports.getTotalMinutesFromTime = exports.getTotalMinutes = exports.getTimeZoneIds = exports.getTimeZoneDetails = exports.getTimeStringFromUTC = exports.getTimeFromMinutes = exports.getNativeTimeZoneId = exports.getMinutesFromUTC = exports.getHourMinutesFromMinutes = exports.getTimestamp = exports.getCurrentTime = exports.getCurrentDateTime = exports.formatUTCOffset = exports.formatTimePart = exports.formatRelativeTime = exports.formatRelativeDate = exports.formatDateRelative = exports.formatDateTime = exports.formatDate = exports.extractTotalMinutesFromTime = exports.extractTimeStringFromUTC = exports.extractTimeFromUTC = exports.extractMinutesFromUTC = exports.extractHourMinute = exports.convertMinutesToUTCOffset = exports.convertMinutesToTime = void 0;
8
+ exports.pickFieldsByCondition = exports.pickFields = exports.omitObjectFields = exports.omitFields = exports.deleteObjectFields = exports.deleteFields = exports.convertObjectValues = exports.sanitizeData = exports.parseStringifiedObjectValues = exports.parseObjectValues = exports.parseJsonToObject = exports.mergeObjects = exports.mergeAndFlattenObjects = exports.flattenObjectKeyValue = exports.flattenObjectDotNotation = exports.extractUpdatedFields = exports.extractUpdatedAndNewFields = exports.extractNewFields = exports.extractObjectKeysDeep = exports.extractObjectKeys = exports.extractKeysDeep = exports.extractKeys = exports.countObjectFields = exports.cloneObject = exports.isValidFormData = exports.isOriginFileObj = exports.isFileUpload = exports.isFileOrBlob = exports.isFileList = exports.isFileArray = exports.isCustomFileArray = exports.isCustomFile = exports.serializeForm = exports.parseFormData = exports.createFormData = exports.createControlledFormData = exports.convertIntoFormData = exports.splitArrayByProperty = exports.splitArray = exports.rotateArray = exports.removeDuplicatesFromArray = exports.removeDuplicates = exports.moveArrayElement = exports.groupArrayByProperty = exports.getMissingElements = exports.getDuplicatesFromArray = exports.getDuplicates = exports.findMissingElements = exports.extractMissingElements = exports.extractDuplicatesFromArray = void 0;
9
+ exports.isFalsy = exports.isBoolean = exports.isBigInt = exports.Paginator = exports.throttleAction = exports.stripJsonEdgeGarbage = exports.stableStringify = exports.parsePrimitivesDeep = exports.parseJsonDeep = exports.parseJSON = exports.joinArrayElements = exports.isDeepEqual = exports.getStaticMethodsCount = exports.getStaticMethodNames = exports.getStaticGetterNames = exports.getInstanceMethodsCount = exports.getInstanceMethodNames = exports.getInstanceGetterNames = exports.getClassDetails = exports.definePrototypeMethod = exports.deepParsePrimitives = exports.debounceAction = exports.countStaticMethods = exports.countInstanceMethods = exports.convertArrayToString = exports.saveToSessionStorage = exports.saveToLocalStorage = exports.removeFromSessionStorage = exports.removeFromLocalStorage = exports.getFromSessionStorage = exports.getFromLocalStorage = exports.toggleFullScreen = exports.smoothScrollTo = exports.copyToClipboard = exports.updateQueryParam = exports.queryStringToObject = exports.parseQueryStringLiteral = exports.parseQueryString = exports.literalQueryStringToObject = exports.getQueryStringAsObject = exports.getQueryParams = exports.generateQueryParams = exports.formatQueryParams = exports.createQueryParams = exports.removeObjectFields = exports.removeFields = exports.remapObjectFields = exports.remapFields = exports.pickObjectFieldsByCondition = exports.pickObjectFields = void 0;
10
+ exports.isHexString = exports.isExpectedNodeENV = exports.isEnvironment = exports.isEmailArray = exports.isEmail = exports.isDateString = exports.isBrowser = exports.isBinaryString = exports.isBase64 = exports.httpStatus = exports.HttpStatus = exports.isValidSet = exports.isValidObject = exports.isValidMap = exports.isValidJSON = exports.isValidArray = exports.isSet = exports.isReturningPromise = exports.isRegularExpression = exports.isRegExp = exports.isPromise = exports.isObjectWithKeys = exports.isObjectEmpty = exports.isObject = exports.isNotEmptyObject = exports.isMethodDescriptor = exports.isMethod = exports.isMap = exports.isJSONObject = exports.isJSON = exports.isFunction = exports.isError = exports.isEmptyObjectGuard = exports.isEmptyObject = exports.isDate = exports.isArrayWithLength = exports.isArrayOfType = exports.isArray = exports.doesReturnPromise = exports.isUndefined = exports.isTruthy = exports.isSymbol = exports.isString = exports.isPrimitive = exports.isPositiveInteger = exports.isNumber = exports.isNull = exports.isNormalPrimitive = exports.isNonEmptyString = exports.isInteger = void 0;
11
+ exports.isValidURL = exports.isValidEmail = exports.isUUID = exports.isURL = exports.isPhoneNumber = exports.isNumericString = exports.isNodeEnvironment = exports.isNodeENV = exports.isNode = exports.isIPAddress = void 0;
12
12
  var basics_1 = require("./string/basics");
13
13
  Object.defineProperty(exports, "generateRandomID", { enumerable: true, get: function () { return basics_1.generateRandomID; } });
14
14
  Object.defineProperty(exports, "trimString", { enumerable: true, get: function () { return basics_1.trimString; } });
@@ -203,8 +203,10 @@ var Color_1 = require("./colors/Color");
203
203
  Object.defineProperty(exports, "Color", { enumerable: true, get: function () { return Color_1.Color; } });
204
204
  Object.defineProperty(exports, "Colour", { enumerable: true, get: function () { return Color_1.Colour; } });
205
205
  var utils_1 = require("./colors/utils");
206
+ Object.defineProperty(exports, "applyOpacityToHex", { enumerable: true, get: function () { return utils_1.applyOpacityToHex; } });
206
207
  Object.defineProperty(exports, "extractAlphaColorValues", { enumerable: true, get: function () { return utils_1.extractAlphaColorValues; } });
207
208
  Object.defineProperty(exports, "extractSolidColorValues", { enumerable: true, get: function () { return utils_1.extractSolidColorValues; } });
209
+ Object.defineProperty(exports, "percentToHex", { enumerable: true, get: function () { return utils_1.percentToHex; } });
208
210
  var greet_1 = require("./date/greet");
209
211
  Object.defineProperty(exports, "generateGreeting", { enumerable: true, get: function () { return greet_1.getGreeting; } });
210
212
  Object.defineProperty(exports, "getGreeting", { enumerable: true, get: function () { return greet_1.getGreeting; } });
@@ -250,6 +252,9 @@ Object.defineProperty(exports, "extractTimeStringFromUTC", { enumerable: true, g
250
252
  Object.defineProperty(exports, "extractTotalMinutesFromTime", { enumerable: true, get: function () { return utils_2.getTotalMinutes; } });
251
253
  Object.defineProperty(exports, "formatDate", { enumerable: true, get: function () { return utils_2.formatDate; } });
252
254
  Object.defineProperty(exports, "formatDateTime", { enumerable: true, get: function () { return utils_2.formatDate; } });
255
+ Object.defineProperty(exports, "formatDateRelative", { enumerable: true, get: function () { return utils_2.formatDateRelative; } });
256
+ Object.defineProperty(exports, "formatRelativeDate", { enumerable: true, get: function () { return utils_2.formatDateRelative; } });
257
+ Object.defineProperty(exports, "formatRelativeTime", { enumerable: true, get: function () { return utils_2.formatDateRelative; } });
253
258
  Object.defineProperty(exports, "formatTimePart", { enumerable: true, get: function () { return utils_2.formatTimePart; } });
254
259
  Object.defineProperty(exports, "formatUTCOffset", { enumerable: true, get: function () { return utils_2.formatUTCOffset; } });
255
260
  Object.defineProperty(exports, "getCurrentDateTime", { enumerable: true, get: function () { return utils_2.getCurrentDateTime; } });