nhb-toolbox 4.20.84 → 4.20.86

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,9 +6,13 @@ All notable changes to the package will be documented here.
6
6
 
7
7
  ---
8
8
 
9
+ ## [4.20.86] - 2025-10-08
10
+
11
+ - **Added** new _number utility_ `getFactors` and its alias to calculate _factors_ of a given number (_integer_).
12
+
9
13
  ## [4.20.84] - 2025-10-07
10
14
 
11
- - **Added** new _number utility_ `factorial` and its alias to calculate factorial of a given number.
15
+ - **Added** new _number utility_ `factorial` and its alias to calculate _factorial_ of a given number (_integer_).
12
16
 
13
17
  ## [4.20.80] - 2025-10-07
14
18
 
package/dist/cjs/index.js CHANGED
@@ -1,12 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sumDigits = exports.roundToDecimal = exports.roundNumber = exports.reverseNumber = exports.getSumOfNumbers = exports.getRandomNumber = exports.getRandomInt = exports.getAverageOfNumbers = exports.getAverage = exports.convertToFixed = exports.convertToDecimal = exports.calculateLCM = exports.calculateLCD = exports.calculateHCF = exports.calculateGCD = exports.calculateAverage = exports.verbalizer = exports.Verbalizer = exports.pluralizer = exports.Pluralizer = exports.wordCount = exports.parseNumbersFromText = exports.levenshteinDistance = exports.getLevenshteinDistance = exports.extractNumbersFromString = exports.extractNumbers = exports.countWordsInString = exports.countWords = exports.slugifyString = exports.reverseString = exports.replaceAllInString = exports.normalizeString = exports.maskString = exports.formatWithPlural = exports.formatUnitWithPlural = exports.formatNumberWithPluralUnit = exports.extractURLs = exports.extractEmails = exports.convertStringCase = exports.isSnakeCase = exports.isPascalCase = exports.isPalindrome = exports.isKebabCase = exports.isEmojiOnly = exports.isCamelCase = exports.generateAnagrams = exports.truncateString = exports.trimString = exports.generateRandomID = exports.capitalizeString = void 0;
4
- 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.getFactorial = exports.calculateFactorial = exports.factorial = exports.sumOfNumbers = exports.sumNumbers = void 0;
5
- 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 = exports.convertNumberToCurrency = exports.clampNumber = exports.cardinalToOrdinal = void 0;
6
- 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 = exports.chronus = exports.chronosts = exports.chronosjs = void 0;
7
- 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.extractKeysDeep = exports.extractObjectKeysDeep = 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 = exports.rotateArray = exports.removeDuplicatesFromArray = exports.removeDuplicates = void 0;
8
- 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.literalQueryStringToObject = exports.parseQueryStringLiteral = exports.queryStringToObject = exports.parseQueryString = exports.getQueryStringAsObject = exports.getQueryParams = exports.generateQueryParams = exports.formatQueryParams = exports.createQueryParams = exports.removeObjectFields = exports.removeFields = 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 = exports.isDate = exports.isArrayWithLength = exports.isArrayOfType = exports.isArray = exports.doesReturnPromise = exports.isUndefined = exports.isTruthy = void 0;
4
+ 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.getDivisors = exports.factorsOf = exports.getFactors = exports.getFactorial = exports.calculateFactorial = exports.factorial = exports.sumOfNumbers = exports.sumNumbers = void 0;
5
+ 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 = exports.convertNumberToCurrency = exports.clampNumber = exports.cardinalToOrdinal = exports.isPrimeNumber = exports.isPrime = exports.getPrimeNumbers = void 0;
6
+ 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 = exports.chronus = exports.chronosts = exports.chronosjs = exports.chronos = exports.INTERNALS = exports.Chronus = void 0;
7
+ 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.extractKeysDeep = exports.extractObjectKeysDeep = 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 = exports.rotateArray = exports.removeDuplicatesFromArray = exports.removeDuplicates = exports.moveArrayElement = exports.groupArrayByProperty = exports.getMissingElements = void 0;
8
+ 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.literalQueryStringToObject = exports.parseQueryStringLiteral = exports.queryStringToObject = exports.parseQueryString = exports.getQueryStringAsObject = exports.getQueryParams = exports.generateQueryParams = exports.formatQueryParams = exports.createQueryParams = exports.removeObjectFields = exports.removeFields = exports.remapObjectFields = exports.remapFields = exports.pickObjectFieldsByCondition = void 0;
9
+ 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 = exports.isDate = exports.isArrayWithLength = exports.isArrayOfType = exports.isArray = exports.doesReturnPromise = exports.isUndefined = exports.isTruthy = exports.isSymbol = exports.isString = exports.isPrimitive = void 0;
10
+ exports.isValidURL = exports.isValidEmail = void 0;
10
11
  var basics_1 = require("./string/basics");
11
12
  Object.defineProperty(exports, "capitalizeString", { enumerable: true, get: function () { return basics_1.capitalizeString; } });
12
13
  Object.defineProperty(exports, "generateRandomID", { enumerable: true, get: function () { return basics_1.generateRandomID; } });
@@ -71,6 +72,9 @@ Object.defineProperty(exports, "sumOfNumbers", { enumerable: true, get: function
71
72
  Object.defineProperty(exports, "factorial", { enumerable: true, get: function () { return basics_2.factorial; } });
72
73
  Object.defineProperty(exports, "calculateFactorial", { enumerable: true, get: function () { return basics_2.factorial; } });
73
74
  Object.defineProperty(exports, "getFactorial", { enumerable: true, get: function () { return basics_2.factorial; } });
75
+ Object.defineProperty(exports, "getFactors", { enumerable: true, get: function () { return basics_2.getFactors; } });
76
+ Object.defineProperty(exports, "factorsOf", { enumerable: true, get: function () { return basics_2.getFactors; } });
77
+ Object.defineProperty(exports, "getDivisors", { enumerable: true, get: function () { return basics_2.getFactors; } });
74
78
  var Currency_1 = require("./number/Currency");
75
79
  Object.defineProperty(exports, "Currency", { enumerable: true, get: function () { return Currency_1.Currency; } });
76
80
  var Unit_1 = require("./number/Unit");
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.calculateLCM = exports.calculateHCF = exports.convertToDecimal = exports.getRandomNumber = void 0;
4
4
  exports.factorial = factorial;
5
+ exports.getFactors = getFactors;
5
6
  exports.sumDigits = sumDigits;
6
7
  exports.sumNumbers = sumNumbers;
7
8
  exports.reverseNumber = reverseNumber;
@@ -70,9 +71,9 @@ const calculateLCM = (...numbers) => {
70
71
  return lcm;
71
72
  };
72
73
  exports.calculateLCM = calculateLCM;
73
- function factorial(number) {
74
- const num = (0, utilities_1.normalizeNumber)(number);
75
- if (!(0, primitives_1.isNumber)(num) || num < 0) {
74
+ function factorial(int) {
75
+ const num = (0, utilities_1.normalizeNumber)(int);
76
+ if (!(0, primitives_1.isNumber)(num) || num < 0 || !Number.isInteger(num)) {
76
77
  return undefined;
77
78
  }
78
79
  else if (num === 0 || num === 1) {
@@ -82,6 +83,22 @@ function factorial(number) {
82
83
  return num * (factorial(num - 1) ?? 1);
83
84
  }
84
85
  }
86
+ function getFactors(int) {
87
+ const num = (0, utilities_1.normalizeNumber)(int);
88
+ if (!(0, primitives_1.isNumber)(num) || num <= 0 || !Number.isInteger(num))
89
+ return [];
90
+ if (num === 1)
91
+ return [1];
92
+ const factors = new Set([1, num]);
93
+ const sqrt = Math.floor(Math.sqrt(num));
94
+ for (let i = 2; i <= sqrt; i++) {
95
+ if (num % i === 0) {
96
+ factors.add(i);
97
+ factors.add(num / i);
98
+ }
99
+ }
100
+ return [...factors].sort((a, b) => a - b);
101
+ }
85
102
  function sumDigits(num) {
86
103
  return Math.abs(Number(num))
87
104
  .toString()
@@ -21,7 +21,7 @@ export { extractEmails, extractURLs, formatUnitWithPlural as formatNumberWithPlu
21
21
  export { countWords, countWords as countWordsInString, extractNumbersFromString as extractNumbers, extractNumbersFromString, getLevenshteinDistance, getLevenshteinDistance as levenshteinDistance, extractNumbersFromString as parseNumbersFromText, countWords as wordCount, } from './string/utilities';
22
22
  export { Pluralizer, pluralizer } from './pluralize/Pluralizer';
23
23
  export { Verbalizer, verbalizer } from './verbalizer/Verbalizer';
24
- export { getAverage as calculateAverage, calculateHCF as calculateGCD, calculateHCF, calculateLCM as calculateLCD, calculateLCM, convertToDecimal, convertToDecimal as convertToFixed, getAverage, getAverage as getAverageOfNumbers, getRandomNumber as getRandomInt, getRandomNumber, sumNumbers as getSumOfNumbers, reverseNumber, roundNumber, roundNumber as roundToDecimal, sumDigits, sumNumbers, sumNumbers as sumOfNumbers, factorial, factorial as calculateFactorial, factorial as getFactorial, } from './number/basics';
24
+ export { getAverage as calculateAverage, calculateHCF as calculateGCD, calculateHCF, calculateLCM as calculateLCD, calculateLCM, convertToDecimal, convertToDecimal as convertToFixed, getAverage, getAverage as getAverageOfNumbers, getRandomNumber as getRandomInt, getRandomNumber, sumNumbers as getSumOfNumbers, reverseNumber, roundNumber, roundNumber as roundToDecimal, sumDigits, sumNumbers, sumNumbers as sumOfNumbers, factorial, factorial as calculateFactorial, factorial as getFactorial, getFactors, getFactors as factorsOf, getFactors as getDivisors, } from './number/basics';
25
25
  export { Currency } from './number/Currency';
26
26
  export { Unit, Unit as UnitConverter } from './number/Unit';
27
27
  export { calculatePercentage } from './number/percent';
@@ -32,13 +32,12 @@ export declare const calculateHCF: (...numbers: Numeric[]) => number;
32
32
  */
33
33
  export declare const calculateLCM: (...numbers: Numeric[]) => number;
34
34
  /**
35
- * * Computes the factorial of a non-negative numeric value recursively.
35
+ * * Computes the factorial of a non-negative numeric value (integer).
36
36
  *
37
37
  * @remarks
38
- * - Returns `undefined` if the input is negative, not numeric, or `undefined`.
39
- * - Factorial of `0` and `1` is `1`.
38
+ * - Returns `undefined` if the input is negative, not numeric, non-integer, or `undefined`.
40
39
  *
41
- * @param number - A numeric input value whose factorial should be calculated.
40
+ * @param int - A numeric input value (integer) whose factorial should be calculated.
42
41
  *
43
42
  * @returns The factorial result as a number if valid, otherwise `undefined`.
44
43
  *
@@ -48,14 +47,36 @@ export declare const calculateLCM: (...numbers: Numeric[]) => number;
48
47
  * factorial(0); // → 1
49
48
  * factorial(-3); // → undefined
50
49
  * factorial(undefined); // → undefined
50
+ * factorial(5.5); // → undefined
51
51
  * ```
52
52
  *
53
53
  * @notes
54
+ * - Factorial of `0` and `1` is `1`.
54
55
  * - Uses recursive approach internally.
55
56
  * - Input is normalized via `normalizeNumber` before computation.
56
57
  * - May return large values quickly due to factorial growth rate.
57
58
  */
58
- export declare function factorial(number: Numeric | undefined): number | undefined;
59
+ export declare function factorial(int: Numeric | undefined): number | undefined;
60
+ /**
61
+ * * Efficiently computes all positive integer factors (divisors) of a number.
62
+ *
63
+ * @param int - Numeric value to find factors for. Non-integer or negative values return an empty array.
64
+ *
65
+ * @returns An array of positive factors in ascending order.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * getFactors(12); // → [1, 2, 3, 4, 6, 12]
70
+ * getFactors(7); // → [1, 7]
71
+ * getFactors(-4); // → []
72
+ * getFactors(undefined); // → []
73
+ * ```
74
+ *
75
+ * @notes
76
+ * - Uses the square root method for better performance (`O(√n)`).
77
+ * - Returns an empty array for invalid, negative, or non-integer input.
78
+ */
79
+ export declare function getFactors(int: Numeric | undefined): number[];
59
80
  /**
60
81
  * * Sums up all digits of a number.
61
82
  *
package/dist/esm/index.js CHANGED
@@ -6,7 +6,7 @@ export { extractEmails, extractURLs, formatUnitWithPlural as formatNumberWithPlu
6
6
  export { countWords, countWords as countWordsInString, extractNumbersFromString as extractNumbers, extractNumbersFromString, getLevenshteinDistance, getLevenshteinDistance as levenshteinDistance, extractNumbersFromString as parseNumbersFromText, countWords as wordCount, } from './string/utilities.js';
7
7
  export { Pluralizer, pluralizer } from './pluralize/Pluralizer.js';
8
8
  export { Verbalizer, verbalizer } from './verbalizer/Verbalizer.js';
9
- export { getAverage as calculateAverage, calculateHCF as calculateGCD, calculateHCF, calculateLCM as calculateLCD, calculateLCM, convertToDecimal, convertToDecimal as convertToFixed, getAverage, getAverage as getAverageOfNumbers, getRandomNumber as getRandomInt, getRandomNumber, sumNumbers as getSumOfNumbers, reverseNumber, roundNumber, roundNumber as roundToDecimal, sumDigits, sumNumbers, sumNumbers as sumOfNumbers, factorial, factorial as calculateFactorial, factorial as getFactorial, } from './number/basics.js';
9
+ export { getAverage as calculateAverage, calculateHCF as calculateGCD, calculateHCF, calculateLCM as calculateLCD, calculateLCM, convertToDecimal, convertToDecimal as convertToFixed, getAverage, getAverage as getAverageOfNumbers, getRandomNumber as getRandomInt, getRandomNumber, sumNumbers as getSumOfNumbers, reverseNumber, roundNumber, roundNumber as roundToDecimal, sumDigits, sumNumbers, sumNumbers as sumOfNumbers, factorial, factorial as calculateFactorial, factorial as getFactorial, getFactors, getFactors as factorsOf, getFactors as getDivisors, } from './number/basics.js';
10
10
  export { Currency } from './number/Currency.js';
11
11
  export { Unit, Unit as UnitConverter } from './number/Unit.js';
12
12
  export { calculatePercentage } from './number/percent.js';
@@ -57,9 +57,9 @@ export const calculateLCM = (...numbers) => {
57
57
  }
58
58
  return lcm;
59
59
  };
60
- export function factorial(number) {
61
- const num = normalizeNumber(number);
62
- if (!isNumber(num) || num < 0) {
60
+ export function factorial(int) {
61
+ const num = normalizeNumber(int);
62
+ if (!isNumber(num) || num < 0 || !Number.isInteger(num)) {
63
63
  return undefined;
64
64
  }
65
65
  else if (num === 0 || num === 1) {
@@ -69,6 +69,22 @@ export function factorial(number) {
69
69
  return num * (factorial(num - 1) ?? 1);
70
70
  }
71
71
  }
72
+ export function getFactors(int) {
73
+ const num = normalizeNumber(int);
74
+ if (!isNumber(num) || num <= 0 || !Number.isInteger(num))
75
+ return [];
76
+ if (num === 1)
77
+ return [1];
78
+ const factors = new Set([1, num]);
79
+ const sqrt = Math.floor(Math.sqrt(num));
80
+ for (let i = 2; i <= sqrt; i++) {
81
+ if (num % i === 0) {
82
+ factors.add(i);
83
+ factors.add(num / i);
84
+ }
85
+ }
86
+ return [...factors].sort((a, b) => a - b);
87
+ }
72
88
  export function sumDigits(num) {
73
89
  return Math.abs(Number(num))
74
90
  .toString()
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nhb-toolbox",
3
- "version": "4.20.84",
3
+ "version": "4.20.86",
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",