nhb-toolbox 4.20.52 → 4.20.56

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,15 @@ All notable changes to the package will be documented here.
6
6
 
7
7
  ---
8
8
 
9
+ ## [4.20.56] - 2025-10-02
10
+
11
+ - **Updated** `isDeepEqual` utility: Now it accepts _arguments of unknown types_.
12
+
13
+ ## [4.20.54] - 2025-10-02
14
+
15
+ - **Added** new utility `extractObjectKeys` to _extract keys of an object_ with _proper typing_.
16
+ - **Updated** `isObjectWithKeys`: _now properly typed_.
17
+
9
18
  ## [4.20.52] - 2025-09-26
10
19
 
11
20
  - **Added** new `Chronos` _plugin_ `greetingPlugin` for accessing `getGreeting` method in `Chronos` instances.
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
+ }
@@ -24,17 +24,17 @@ const isDeepEqual = (a, b) => {
24
24
  return false;
25
25
  if (a === null || b === null)
26
26
  return a === b;
27
- if (Array.isArray(a) && Array.isArray(b)) {
27
+ if ((0, non_primitives_1.isArray)(a) && (0, non_primitives_1.isArray)(b)) {
28
28
  if (a?.length !== b?.length)
29
29
  return false;
30
- return a?.every((element, index) => (0, exports.isDeepEqual)(element, b[index]));
30
+ return a?.every((element, index) => (0, exports.isDeepEqual)(element, b?.[index]));
31
31
  }
32
- if (typeof a === 'object' && typeof b === 'object') {
32
+ if ((0, non_primitives_1.isObject)(a) && (0, non_primitives_1.isObject)(b)) {
33
33
  const aKeys = Object.keys(a);
34
34
  const bKeys = Object.keys(b);
35
35
  if (aKeys?.length !== bKeys?.length)
36
36
  return false;
37
- return aKeys?.every((key) => (0, exports.isDeepEqual)(a[key], b[key]));
37
+ return aKeys?.every((key) => (0, exports.isDeepEqual)(a?.[key], b?.[key]));
38
38
  }
39
39
  return false;
40
40
  };
@@ -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>;
@@ -8,7 +8,7 @@ import type { ArrayOfObjectsToStringOptions, ArrayOfPrimitivesToStringOptions }
8
8
  * @param b Second value to compare.
9
9
  * @returns Whether the values are deeply equal.
10
10
  */
11
- export declare const isDeepEqual: <T>(a: T, b: T) => boolean;
11
+ export declare const isDeepEqual: (a: unknown, b: unknown) => boolean;
12
12
  /**
13
13
  * * Converts an array of objects to a string using a specific property (supports nested path to primitive values) and separator.
14
14
  *
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
+ }
@@ -1,6 +1,6 @@
1
1
  import { _resolveNestedKey } from '../array/helpers.js';
2
2
  import { sortAnArray } from '../array/sort.js';
3
- import { isArrayOfType, isMethodDescriptor, isNotEmptyObject, isObject, isValidArray, } from '../guards/non-primitives.js';
3
+ import { isArray, isArrayOfType, isMethodDescriptor, isNotEmptyObject, isObject, isValidArray, } from '../guards/non-primitives.js';
4
4
  import { isPrimitive, isString } from '../guards/primitives.js';
5
5
  import { isNumericString } from '../guards/specials.js';
6
6
  export const isDeepEqual = (a, b) => {
@@ -10,17 +10,17 @@ export const isDeepEqual = (a, b) => {
10
10
  return false;
11
11
  if (a === null || b === null)
12
12
  return a === b;
13
- if (Array.isArray(a) && Array.isArray(b)) {
13
+ if (isArray(a) && isArray(b)) {
14
14
  if (a?.length !== b?.length)
15
15
  return false;
16
- return a?.every((element, index) => isDeepEqual(element, b[index]));
16
+ return a?.every((element, index) => isDeepEqual(element, b?.[index]));
17
17
  }
18
- if (typeof a === 'object' && typeof b === 'object') {
18
+ if (isObject(a) && isObject(b)) {
19
19
  const aKeys = Object.keys(a);
20
20
  const bKeys = Object.keys(b);
21
21
  if (aKeys?.length !== bKeys?.length)
22
22
  return false;
23
- return aKeys?.every((key) => isDeepEqual(a[key], b[key]));
23
+ return aKeys?.every((key) => isDeepEqual(a?.[key], b?.[key]));
24
24
  }
25
25
  return false;
26
26
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nhb-toolbox",
3
- "version": "4.20.52",
3
+ "version": "4.20.56",
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",