nhb-toolbox 4.20.50 → 4.20.54

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/CHANGELOG.md CHANGED
@@ -6,6 +6,16 @@ All notable changes to the package will be documented here.
6
6
 
7
7
  ---
8
8
 
9
+ ## [4.20.54] - 2025-10-02
10
+
11
+ - **Added** new utility `extractObjectKeys` to _extract keys of an object_ with _proper typing_.
12
+ - **Updated** `isObjectWithKeys`: _now properly typed_.
13
+
14
+ ## [4.20.52] - 2025-09-26
15
+
16
+ - **Added** new `Chronos` _plugin_ `greetingPlugin` for accessing `getGreeting` method in `Chronos` instances.
17
+ - **Fixed** some _docs and internal type related issues_ in `convertObjectValues` utility.
18
+
9
19
  ## [4.20.50] - 2025-09-25
10
20
 
11
21
  - **Fixed** _return type_ of `convertObjectValues` utility to correctly reflect the _transformed object structure_ and `keys` option is now _more strict_: **only accepts keys which values are string and/or number** and **the array cannot be left empty**.
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.greetingPlugin = void 0;
4
+ const greet_1 = require("../greet");
5
+ const greetingPlugin = (ChronosClass) => {
6
+ ChronosClass.prototype.getGreeting = function (configs) {
7
+ const currentTime = this.formatStrict('HH:mm');
8
+ return (0, greet_1.getGreeting)({ currentTime, ...configs });
9
+ };
10
+ };
11
+ exports.greetingPlugin = greetingPlugin;
package/dist/cjs/index.js CHANGED
@@ -4,9 +4,9 @@ exports.sumDigits = exports.roundToDecimal = exports.roundNumber = exports.rever
4
4
  exports.convertNumberToCurrency = exports.clampNumber = exports.cardinalToOrdinal = exports.isPrimeNumber = exports.isPrime = exports.getPrimeNumbers = exports.findPrimeNumbers = exports.wordToNumber = exports.wordsToNumber = exports.toRomanNumeral = exports.toRoman = exports.numericToRoman = exports.numberToWordsOrdinal = exports.numberToWords = exports.numberToRoman = exports.integerToRoman = exports.convertWordToNumber = exports.convertWordsToNumber = exports.convertToRomanNumerals = exports.convertNumberToWordsOrdinal = exports.convertNumberToWords = exports.cardinalWordsToOrdinal = 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 = void 0;
5
5
  exports.chronus = exports.chronosts = exports.chronosjs = exports.chronos = exports.INTERNALS = exports.Chronus = exports.Chronos = exports.isValidUTCOffSet = exports.isValidUTC = exports.isValidTimeString = exports.isValidTime = exports.isLeapYear = exports.isDateLike = exports.greet = exports.getGreeting = exports.generateGreeting = exports.extractSolidColorValues = exports.extractAlphaColorValues = exports.Colour = exports.Color = exports.convertRgbToRgba = exports.convertRgbToHsl = exports.convertRgbToHex = exports.convertRgbaToHsla = exports.convertRgbaToHex8 = exports.convertHslToRgb = exports.convertHslToHex = exports.convertHslaToRgba = exports.convertHslaToHex8 = exports.convertHexToRgb = exports.convertHexToHsl = exports.convertHex8ToRgba = exports.convertHex8ToHsla = exports.convertColorCode = exports.generateRandomHSLColor = exports.generateRandomColorInHexRGB = 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 = void 0;
6
6
  exports.rotateArray = exports.removeDuplicatesFromArray = exports.removeDuplicates = exports.moveArrayElement = exports.groupArrayByProperty = exports.getMissingElements = exports.getDuplicatesFromArray = exports.getDuplicates = exports.findMissingElements = exports.extractMissingElements = exports.extractDuplicatesFromArray = exports.extractDuplicates = exports.createOptionsArray = exports.sortAnArray = 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.getTimeStringFromUTC = exports.getTimeFromMinutes = exports.getMinutesFromUTC = exports.getHourMinutesFromMinutes = exports.getCurrentTime = exports.getCurrentDateTime = exports.formatUTCOffset = exports.extractTotalMinutesFromTime = exports.extractTimeStringFromUTC = exports.extractTimeFromUTC = exports.extractMinutesFromUTC = exports.extractHourMinute = exports.convertMinutesToUTCOffset = exports.convertMinutesToTime = exports.convertMinutesToHourMinutes = exports.chronusts = exports.chronusjs = void 0;
7
- exports.getQueryStringAsObject = exports.getQueryParams = exports.generateQueryParams = exports.formatQueryParams = exports.createQueryParams = exports.removeObjectFields = 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.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.naturalSortForString = exports.naturalSort = exports.compareSorter = exports.compareNaturally = exports.splitArrayByProperty = exports.splitArray = void 0;
8
- 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 = exports.isFalsy = exports.isBoolean = exports.isBigInt = exports.Paginator = exports.throttleAction = exports.parsePrimitivesDeep = exports.parseJsonDeep = exports.parseJSON = exports.joinArrayElements = exports.isDeepEqual = exports.getStaticMethodsCount = exports.getStaticMethodNames = exports.getInstanceMethodsCount = exports.getInstanceMethodNames = exports.getClassDetails = 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.parseQueryString = void 0;
9
- exports.isValidURL = exports.isValidEmail = exports.isUUID = exports.isURL = exports.isPhoneNumber = exports.isNumericString = exports.isNodeEnvironment = exports.isNodeENV = exports.isNode = exports.isIPAddress = exports.isExpectedNodeENV = exports.isEnvironment = exports.isEmailArray = exports.isEmail = exports.isDateString = exports.isBrowser = 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 = void 0;
7
+ exports.generateQueryParams = exports.formatQueryParams = exports.createQueryParams = exports.removeObjectFields = 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.extractKeys = exports.extractObjectKeys = 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.naturalSortForString = exports.naturalSort = exports.compareSorter = exports.compareNaturally = exports.splitArrayByProperty = exports.splitArray = void 0;
8
+ 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 = exports.isFalsy = exports.isBoolean = exports.isBigInt = exports.Paginator = exports.throttleAction = exports.parsePrimitivesDeep = exports.parseJsonDeep = exports.parseJSON = exports.joinArrayElements = exports.isDeepEqual = exports.getStaticMethodsCount = exports.getStaticMethodNames = exports.getInstanceMethodsCount = exports.getInstanceMethodNames = exports.getClassDetails = 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.parseQueryString = exports.getQueryStringAsObject = exports.getQueryParams = void 0;
9
+ exports.isValidURL = exports.isValidEmail = exports.isUUID = exports.isURL = exports.isPhoneNumber = exports.isNumericString = exports.isNodeEnvironment = exports.isNodeENV = exports.isNode = exports.isIPAddress = exports.isExpectedNodeENV = exports.isEnvironment = exports.isEmailArray = exports.isEmail = exports.isDateString = exports.isBrowser = 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 = void 0;
10
10
  var basics_1 = require("./string/basics");
11
11
  Object.defineProperty(exports, "capitalizeString", { enumerable: true, get: function () { return basics_1.capitalizeString; } });
12
12
  Object.defineProperty(exports, "generateRandomID", { enumerable: true, get: function () { return basics_1.generateRandomID; } });
@@ -267,6 +267,8 @@ Object.defineProperty(exports, "isValidFormData", { enumerable: true, get: funct
267
267
  var basics_4 = require("./object/basics");
268
268
  Object.defineProperty(exports, "cloneObject", { enumerable: true, get: function () { return basics_4.cloneObject; } });
269
269
  Object.defineProperty(exports, "countObjectFields", { enumerable: true, get: function () { return basics_4.countObjectFields; } });
270
+ Object.defineProperty(exports, "extractObjectKeys", { enumerable: true, get: function () { return basics_4.extractObjectKeys; } });
271
+ Object.defineProperty(exports, "extractKeys", { enumerable: true, get: function () { return basics_4.extractObjectKeys; } });
270
272
  var objectify_1 = require("./object/objectify");
271
273
  Object.defineProperty(exports, "extractNewFields", { enumerable: true, get: function () { return objectify_1.extractNewFields; } });
272
274
  Object.defineProperty(exports, "extractUpdatedAndNewFields", { enumerable: true, get: function () { return objectify_1.extractUpdatedAndNewFields; } });
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.countObjectFields = exports.cloneObject = void 0;
4
+ exports.extractObjectKeys = extractObjectKeys;
5
+ const non_primitives_1 = require("../guards/non-primitives");
4
6
  const cloneObject = (obj) => {
5
7
  return JSON.parse(JSON.stringify(obj));
6
8
  };
@@ -11,3 +13,6 @@ const countObjectFields = (obj) => {
11
13
  return 0;
12
14
  };
13
15
  exports.countObjectFields = countObjectFields;
16
+ function extractObjectKeys(obj) {
17
+ return (0, non_primitives_1.isNotEmptyObject)(obj) ? Object.keys(obj) : [];
18
+ }
@@ -46,7 +46,7 @@ function convertObjectValues(data, options) {
46
46
  return newObj;
47
47
  };
48
48
  if (Array.isArray(data)) {
49
- return data?.map((d) => _convertValue(d));
49
+ return data?.map(_convertValue);
50
50
  }
51
51
  return _convertValue(data);
52
52
  }
@@ -181,7 +181,7 @@ export declare class Chronos {
181
181
  * @param locales A locale string, array of locale strings, Intl.Locale object, or array of Intl.Locale objects that contain one or more language or locale tags. If you include more than one locale string, list them in descending order of priority so that the first entry is the preferred locale. If you omit this parameter, the default locale of the JavaScript runtime is used.
182
182
  * @param options An object that contains one or more properties that specify comparison options.
183
183
  */
184
- toLocaleString(locale?: LocaleCode | Intl.Locale | (LocaleCode | Intl.Locale)[], options?: Intl.DateTimeFormatOptions): string;
184
+ toLocaleString(locale?: LocaleCode | Intl.Locale | Array<LocaleCode | Intl.Locale>, options?: Intl.DateTimeFormatOptions): string;
185
185
  /** @instance Returns the time value in milliseconds since midnight, January 1, 1970 UTC. */
186
186
  getTimeStamp(): number;
187
187
  /**
@@ -0,0 +1,18 @@
1
+ import type { GreetingConfigs } from '../types';
2
+ type MainChronos = typeof import('../Chronos').Chronos;
3
+ declare module '../Chronos' {
4
+ interface Chronos {
5
+ /**
6
+ * @instance Returns a greeting message based on current instance of `Chronos` time or provided time in the `configs`.
7
+ *
8
+ * @remarks This method internally uses {@link https://toolbox.nazmul-nhb.dev/docs/utilities/date/getGreeting getGreeting} function.
9
+ *
10
+ * @param configs - Configuration options for greeting times and messages.
11
+ * @returns The appropriate greeting message.
12
+ */
13
+ getGreeting(configs?: GreetingConfigs): string;
14
+ }
15
+ }
16
+ /** * Plugin to inject `getGreeting` method */
17
+ export declare const greetingPlugin: (ChronosClass: MainChronos) => void;
18
+ export {};
@@ -1,5 +1,5 @@
1
1
  import type { GenericObject } from '../object/types';
2
- import type { AsyncFunction, GenericFn } from '../types/index';
2
+ import type { AsyncFunction, GenericFn, ValidArray } from '../types/index';
3
3
  /**
4
4
  * * Type guard to check if a value is an array.
5
5
  * @param value - The value to check.
@@ -27,10 +27,10 @@ export declare function isNotEmptyObject(value: unknown): value is GenericObject
27
27
  /**
28
28
  * * Type guard to check if a value is an object with specific keys.
29
29
  * @param value - The value to check.
30
- * @param keys - The set of keys the object should contain.
30
+ * @param keys - The list of keys the object should contain.
31
31
  * @returns `true` if the value is an object with the specified keys, otherwise `false`.
32
32
  */
33
- export declare function isObjectWithKeys<T extends Record<string, unknown>>(value: unknown, keys: (keyof T)[]): value is T;
33
+ export declare function isObjectWithKeys<Key extends string>(value: unknown, keys: ValidArray<Key>): value is Record<Key, unknown>;
34
34
  /**
35
35
  * * Type guard to check if a value is an empty object.
36
36
  * @param value - The value to check.
@@ -51,7 +51,7 @@ export { naturalSort as compareNaturally, naturalSort as compareSorter, naturalS
51
51
  export { createControlledFormData as convertIntoFormData, createControlledFormData, createControlledFormData as createFormData, } from './form/convert';
52
52
  export { parseFormData, serializeForm } from './form/transform';
53
53
  export { isCustomFile, isCustomFileArray, isFileArray, isFileList, isFileOrBlob, isFileUpload, isOriginFileObj, isValidFormData, } from './form/guards';
54
- export { cloneObject, countObjectFields } from './object/basics';
54
+ export { cloneObject, countObjectFields, extractObjectKeys, extractObjectKeys as extractKeys, } from './object/basics';
55
55
  export { extractNewFields, extractUpdatedAndNewFields, extractUpdatedFields, flattenObjectDotNotation, flattenObjectKeyValue, mergeAndFlattenObjects, mergeObjects, parseJsonToObject, } from './object/objectify';
56
56
  export { parseObjectValues, parseObjectValues as parseStringifiedObjectValues, sanitizeData, } from './object/sanitize';
57
57
  export { convertObjectValues, deleteFields, deleteFields as deleteObjectFields, deleteFields as omitFields, deleteFields as omitObjectFields, pickFields, pickObjectFieldsByCondition as pickFieldsByCondition, pickFields as pickObjectFields, pickObjectFieldsByCondition, remapFields, remapFields as remapObjectFields, deleteFields as removeFields, deleteFields as removeObjectFields, } from './object/convert';
@@ -13,3 +13,14 @@ export declare const cloneObject: <T extends GenericObject>(obj: T) => T;
13
13
  * @returns Number of fields in the object.
14
14
  */
15
15
  export declare const countObjectFields: <T extends GenericObject>(obj: T) => number;
16
+ /**
17
+ * * Extracts the keys of an object with proper typing.
18
+ *
19
+ * @remarks
20
+ * - Internally uses `Object.keys(...)`.
21
+ * - Returns an empty array (`[]`) for an empty object or a non-object value.
22
+ *
23
+ * @param obj The object from which to extract the keys.
24
+ * @returns An array of keys from the specified object.
25
+ */
26
+ export declare function extractObjectKeys<T extends GenericObject>(obj: T): Array<keyof T>;
@@ -107,6 +107,7 @@ export interface SanitizeOptions<T> {
107
107
  */
108
108
  requiredKeys?: '*' | DotNotationKey<T>[];
109
109
  }
110
+ /** Options for `convertObjectValues` utility */
110
111
  export interface ConvertObjectOptions<T extends GenericObject, Key extends NumericDotKey<T>, C extends 'string' | 'number'> {
111
112
  /** Array of keys (properties) to convert to `number` or `string` */
112
113
  keys: ValidArray<Key>;
@@ -283,9 +283,10 @@ export type OneOf<T, U> = (T & Without<U, T>) | (U & Without<T, U>);
283
283
  * @template T - The type to test.
284
284
  *
285
285
  * @example
286
- * type A = IsStrictObject<{}>; // true
286
+ * type A = IsStrictObject<{}>; // false
287
287
  * type B = IsStrictObject<() => void>; // false
288
288
  * type C = IsStrictObject<string>; // false
289
+ * type D = IsStrictObject<{name: string}>; // true
289
290
  */
290
291
  export type IsStrictObject<T> = T extends object ? T extends AdvancedTypes ? false : T extends Array<unknown> ? false : true : false;
291
292
  /**
@@ -0,0 +1,7 @@
1
+ import { getGreeting } from '../greet.js';
2
+ export const greetingPlugin = (ChronosClass) => {
3
+ ChronosClass.prototype.getGreeting = function (configs) {
4
+ const currentTime = this.formatStrict('HH:mm');
5
+ return getGreeting({ currentTime, ...configs });
6
+ };
7
+ };
package/dist/esm/index.js CHANGED
@@ -36,7 +36,7 @@ export { naturalSort as compareNaturally, naturalSort as compareSorter, naturalS
36
36
  export { createControlledFormData as convertIntoFormData, createControlledFormData, createControlledFormData as createFormData, } from './form/convert.js';
37
37
  export { parseFormData, serializeForm } from './form/transform.js';
38
38
  export { isCustomFile, isCustomFileArray, isFileArray, isFileList, isFileOrBlob, isFileUpload, isOriginFileObj, isValidFormData, } from './form/guards.js';
39
- export { cloneObject, countObjectFields } from './object/basics.js';
39
+ export { cloneObject, countObjectFields, extractObjectKeys, extractObjectKeys as extractKeys, } from './object/basics.js';
40
40
  export { extractNewFields, extractUpdatedAndNewFields, extractUpdatedFields, flattenObjectDotNotation, flattenObjectKeyValue, mergeAndFlattenObjects, mergeObjects, parseJsonToObject, } from './object/objectify.js';
41
41
  export { parseObjectValues, parseObjectValues as parseStringifiedObjectValues, sanitizeData, } from './object/sanitize.js';
42
42
  export { convertObjectValues, deleteFields, deleteFields as deleteObjectFields, deleteFields as omitFields, deleteFields as omitObjectFields, pickFields, pickObjectFieldsByCondition as pickFieldsByCondition, pickFields as pickObjectFields, pickObjectFieldsByCondition, remapFields, remapFields as remapObjectFields, deleteFields as removeFields, deleteFields as removeObjectFields, } from './object/convert.js';
@@ -1,3 +1,4 @@
1
+ import { isNotEmptyObject } from '../guards/non-primitives.js';
1
2
  export const cloneObject = (obj) => {
2
3
  return JSON.parse(JSON.stringify(obj));
3
4
  };
@@ -6,3 +7,6 @@ export const countObjectFields = (obj) => {
6
7
  return Object.keys(obj)?.length;
7
8
  return 0;
8
9
  };
10
+ export function extractObjectKeys(obj) {
11
+ return isNotEmptyObject(obj) ? Object.keys(obj) : [];
12
+ }
@@ -39,7 +39,7 @@ export function convertObjectValues(data, options) {
39
39
  return newObj;
40
40
  };
41
41
  if (Array.isArray(data)) {
42
- return data?.map((d) => _convertValue(d));
42
+ return data?.map(_convertValue);
43
43
  }
44
44
  return _convertValue(data);
45
45
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nhb-toolbox",
3
- "version": "4.20.50",
3
+ "version": "4.20.54",
4
4
  "description": "A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
@@ -40,21 +40,21 @@
40
40
  "devDependencies": {
41
41
  "@eslint/js": "^9.36.0",
42
42
  "@types/jest": "^30.0.0",
43
- "@types/node": "^24.5.2",
44
- "@typescript-eslint/eslint-plugin": "^8.44.0",
45
- "@typescript-eslint/parser": "^8.44.0",
43
+ "@types/node": "^24.6.1",
44
+ "@typescript-eslint/eslint-plugin": "^8.45.0",
45
+ "@typescript-eslint/parser": "^8.45.0",
46
46
  "eslint": "^9.36.0",
47
47
  "eslint-config-prettier": "^10.1.8",
48
48
  "eslint-plugin-prettier": "^5.5.4",
49
49
  "globals": "^16.4.0",
50
50
  "husky": "^9.1.7",
51
- "jest": "^30.1.3",
52
- "lint-staged": "^16.2.0",
53
- "nhb-scripts": "^1.8.80",
51
+ "jest": "^30.2.0",
52
+ "lint-staged": "^16.2.3",
53
+ "nhb-scripts": "^1.8.81",
54
54
  "prettier": "^3.6.2",
55
55
  "ts-jest": "^29.4.4",
56
- "typescript": "^5.9.2",
57
- "typescript-eslint": "^8.44.0"
56
+ "typescript": "^5.9.3",
57
+ "typescript-eslint": "^8.45.0"
58
58
  },
59
59
  "keywords": [
60
60
  "toolbox",
@@ -187,6 +187,11 @@
187
187
  "import": "./dist/esm/date/plugins/fromNowPlugin.js",
188
188
  "require": "./dist/cjs/date/plugins/fromNowPlugin.js"
189
189
  },
190
+ "./plugins/greetingPlugin": {
191
+ "types": "./dist/dts/date/plugins/greetingPlugin.d.ts",
192
+ "import": "./dist/esm/date/plugins/greetingPlugin.js",
193
+ "require": "./dist/cjs/date/plugins/greetingPlugin.js"
194
+ },
190
195
  "./plugins/palindromePlugin": {
191
196
  "types": "./dist/dts/date/plugins/palindromePlugin.d.ts",
192
197
  "import": "./dist/esm/date/plugins/palindromePlugin.js",
@@ -269,6 +274,9 @@
269
274
  "plugins/fromNowPlugin": [
270
275
  "dist/dts/date/plugins/fromNowPlugin.d.ts"
271
276
  ],
277
+ "plugins/greetingPlugin": [
278
+ "dist/dts/date/plugins/greetingPlugin.d.ts"
279
+ ],
272
280
  "plugins/palindromePlugin": [
273
281
  "dist/dts/date/plugins/palindromePlugin.d.ts"
274
282
  ],