@fileverse-dev/formulajs 4.4.19 → 4.4.20-mod-2

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/lib/esm/index.mjs CHANGED
@@ -1276,7 +1276,7 @@ function SORT(inputArray, sortIndex = 1, isAscending, sortByColumn = false) {
1276
1276
  if (!sortColumnIndex || sortColumnIndex < 1) return value;
1277
1277
  sortColumnIndex = sortColumnIndex - 1;
1278
1278
 
1279
- const sortDirection = isAscending.toLowerCase() === 'false' ? -1 : 1;
1279
+ const sortDirection = isAscending?.toLowerCase() === 'false' ? -1 : 1;
1280
1280
  const parsedSortDirection = parseNumber(sortDirection);
1281
1281
  if (parsedSortDirection !== 1 && parsedSortDirection !== -1) return value;
1282
1282
 
@@ -1439,6 +1439,404 @@ function VLOOKUP(lookup_value, table_array, col_index_num, range_lookup) {
1439
1439
  return result
1440
1440
  }
1441
1441
 
1442
+ function XLOOKUP(search_key, lookup_range, result_range, missing_value, isCol,match_mode, search_mode) {
1443
+ // Error constants
1444
+ const ERROR_NA = '#N/A';
1445
+ const ERROR_REF = '#REF!';
1446
+ const ERROR_VALUE = '#VALUE!';
1447
+ const ERROR_NUM = '#NUM!';
1448
+
1449
+ console.log('XLOOKUP parameters:', { search_key, lookup_range, result_range, missing_value, match_mode, search_mode, isCol });
1450
+
1451
+ // Validate required parameters
1452
+ if (search_key === undefined || search_key === null) {
1453
+ console.log('Error: search_key is required');
1454
+ return ERROR_VALUE
1455
+ }
1456
+
1457
+ if (!lookup_range || !result_range) {
1458
+ console.log('Error: lookup_range and result_range are required');
1459
+ return ERROR_REF
1460
+ }
1461
+
1462
+ // Validate and normalize lookup_range (must be singular row or column)
1463
+ let lookup_array = normalizeLookupRange(lookup_range);
1464
+ if (!lookup_array) {
1465
+ console.log('Error: lookup_range must be a singular row or column');
1466
+ return ERROR_REF
1467
+ }
1468
+
1469
+ // Validate and normalize result_range
1470
+ let result_array = normalizeResultRange(result_range);
1471
+ if (!result_array) {
1472
+ console.log('Error: Invalid result_range');
1473
+ return ERROR_REF
1474
+ }
1475
+
1476
+ // Validate that lookup and result ranges have compatible dimensions
1477
+ // Exception: if result_range is a single row, it can be returned regardless of lookup_range length
1478
+ result_array.length === 1;
1479
+
1480
+ // if (!isSingleResultRow && lookup_array.length !== result_array.length) {
1481
+ // console.log('Error: lookup_range and result_range must have the same number of rows/entries (unless result_range is a single row)')
1482
+ // return ERROR_REF
1483
+ // }
1484
+
1485
+ // Set default parameter values
1486
+ missing_value = missing_value !== undefined ? missing_value : ERROR_NA;
1487
+ match_mode = match_mode !== undefined ? match_mode : 0;
1488
+ search_mode = search_mode !== undefined ? search_mode : 1;
1489
+ isCol = isCol !== undefined ? isCol : false;
1490
+
1491
+ // Validate match_mode
1492
+ if (![0, 1, -1, 2].includes(match_mode)) {
1493
+ console.log('Error: match_mode must be 0, 1, -1, or 2');
1494
+ return ERROR_NUM
1495
+ }
1496
+
1497
+ // Validate search_mode
1498
+ if (![1, -1, 2, -2].includes(search_mode)) {
1499
+ console.log('Error: search_mode must be 1, -1, 2, or -2');
1500
+ return ERROR_NUM
1501
+ }
1502
+
1503
+ // Validate binary search requirements
1504
+ if (Math.abs(search_mode) === 2 && match_mode === 2) {
1505
+ console.log('Error: Binary search (search_mode ±2) cannot be used with wildcard matching (match_mode 2)');
1506
+ return ERROR_VALUE
1507
+ }
1508
+
1509
+ console.log('Normalized arrays:', { lookup_array, result_array });
1510
+
1511
+ return performLookup(search_key, lookup_array, result_array, missing_value, match_mode, search_mode, isCol)
1512
+ }
1513
+
1514
+ function normalizeLookupRange(lookup_range) {
1515
+ if (!Array.isArray(lookup_range)) {
1516
+ return null
1517
+ }
1518
+
1519
+ // If it's a 1D array, it's already a column
1520
+ if (!Array.isArray(lookup_range[0])) {
1521
+ return lookup_range
1522
+ }
1523
+
1524
+ // If it's a 2D array, check if it's a single row or single column
1525
+ const rows = lookup_range.length;
1526
+ const cols = lookup_range[0].length;
1527
+
1528
+ if (rows === 1) {
1529
+ // Single row - extract as array
1530
+ return lookup_range[0]
1531
+ } else if (cols === 1) {
1532
+ // Single column - extract first element of each row
1533
+ return lookup_range.map(row => row[0])
1534
+ } else {
1535
+ // Multiple rows and columns - not allowed
1536
+ return null
1537
+ }
1538
+ }
1539
+
1540
+ function normalizeResultRange(result_range) {
1541
+ if (!Array.isArray(result_range)) {
1542
+ return null
1543
+ }
1544
+
1545
+ // If it's a 1D array, convert to 2D single column for consistency
1546
+ if (!Array.isArray(result_range[0])) {
1547
+ return result_range.map(value => [value])
1548
+ }
1549
+
1550
+ // If it's already 2D, return as is
1551
+ return result_range
1552
+ }
1553
+
1554
+ function performLookup(search_key, lookup_array, result_array, missing_value, match_mode, search_mode, isCol) {
1555
+
1556
+ console.log('performLookup called with:', { search_key, lookup_array, result_array, missing_value, match_mode, search_mode, isCol });
1557
+
1558
+ let foundIndex = -1;
1559
+
1560
+ // Handle different match modes
1561
+ switch (match_mode) {
1562
+ case 0: // Exact match
1563
+ foundIndex = findExactMatch(search_key, lookup_array, search_mode);
1564
+ break
1565
+ case 1: // Exact match or next larger
1566
+ foundIndex = findExactOrNextLarger(search_key, lookup_array, search_mode);
1567
+ break
1568
+ case -1: // Exact match or next smaller
1569
+ foundIndex = findExactOrNextSmaller(search_key, lookup_array, search_mode);
1570
+ break
1571
+ case 2: // Wildcard match
1572
+ foundIndex = findWildcardMatch(search_key, lookup_array, search_mode);
1573
+ break
1574
+ }
1575
+
1576
+ if (foundIndex === -1) {
1577
+ // No match found
1578
+ if (result_array[0].length > 1) {
1579
+ // Multiple columns
1580
+ const errorArray = new Array(result_array[0].length).fill(missing_value);
1581
+ if (isCol) {
1582
+ // Return as column format: [["error"], ["error"], ...]
1583
+ return errorArray.map(val => [val])
1584
+ } else {
1585
+ // Return as row format: ["error", "error", ...]
1586
+ return errorArray
1587
+ }
1588
+ } else {
1589
+ // Single column - return single missing value (isCol doesn't affect single values)
1590
+ return missing_value
1591
+ }
1592
+ }
1593
+
1594
+ // Return the result
1595
+ if (result_array[0].length === 1) {
1596
+ // Single column result - isCol doesn't affect single values
1597
+ return result_array[foundIndex][0]
1598
+ } else {
1599
+ // Multiple column result
1600
+ if (isCol) {
1601
+ // Return as column format: [["val1"], ["val2"], ["val3"]]
1602
+ return result_array[foundIndex].map(val => [val])
1603
+ } else {
1604
+ // Return as row format: ["val1", "val2", "val3"]
1605
+ return result_array[foundIndex]
1606
+ }
1607
+ }
1608
+ }
1609
+
1610
+ function findExactMatch(search_key, lookup_array, search_mode) {
1611
+ const processedSearchKey = typeof search_key === 'string' ? search_key.toLowerCase().trim() : search_key;
1612
+
1613
+ if (Math.abs(search_mode) === 2) {
1614
+ // Binary search
1615
+ return binarySearchExact(processedSearchKey, lookup_array, search_mode > 0)
1616
+ } else {
1617
+ // Linear search
1618
+ const indices = getSearchIndices(lookup_array.length, search_mode);
1619
+
1620
+ for (const i of indices) {
1621
+ const value = lookup_array[i];
1622
+ const processedValue = typeof value === 'string' ? value.toLowerCase().trim() : value;
1623
+
1624
+ if (processedValue === processedSearchKey) {
1625
+ console.log(`Exact match found at index ${i}:`, value);
1626
+ return i
1627
+ }
1628
+ }
1629
+ }
1630
+
1631
+ return -1
1632
+ }
1633
+
1634
+ function findExactOrNextLarger(search_key, lookup_array, search_mode) {
1635
+ const isNumber = typeof search_key === 'number';
1636
+ const processedSearchKey = typeof search_key === 'string' ? search_key.toLowerCase().trim() : search_key;
1637
+
1638
+ if (Math.abs(search_mode) === 2) {
1639
+ // Binary search for exact or next larger
1640
+ return binarySearchNextLarger(processedSearchKey, lookup_array, search_mode > 0)
1641
+ }
1642
+
1643
+ const indices = getSearchIndices(lookup_array.length, search_mode);
1644
+ let bestIndex = -1;
1645
+
1646
+ for (const i of indices) {
1647
+ const value = lookup_array[i];
1648
+ const processedValue = typeof value === 'string' ? value.toLowerCase().trim() : value;
1649
+
1650
+ // Exact match
1651
+ if (processedValue === processedSearchKey) {
1652
+ return i
1653
+ }
1654
+
1655
+ // Next larger value
1656
+ if (isNumber && typeof value === 'number' && value > search_key) {
1657
+ if (bestIndex === -1 || value < lookup_array[bestIndex]) {
1658
+ bestIndex = i;
1659
+ }
1660
+ } else if (!isNumber && typeof value === 'string' && processedValue > processedSearchKey) {
1661
+ if (bestIndex === -1 || processedValue < (typeof lookup_array[bestIndex] === 'string' ? lookup_array[bestIndex].toLowerCase().trim() : lookup_array[bestIndex])) {
1662
+ bestIndex = i;
1663
+ }
1664
+ }
1665
+ }
1666
+
1667
+ return bestIndex
1668
+ }
1669
+
1670
+ function findExactOrNextSmaller(search_key, lookup_array, search_mode) {
1671
+ const isNumber = typeof search_key === 'number';
1672
+ const processedSearchKey = typeof search_key === 'string' ? search_key.toLowerCase().trim() : search_key;
1673
+
1674
+ if (Math.abs(search_mode) === 2) {
1675
+ // Binary search for exact or next smaller
1676
+ return binarySearchNextSmaller(processedSearchKey, lookup_array, search_mode > 0)
1677
+ }
1678
+
1679
+ const indices = getSearchIndices(lookup_array.length, search_mode);
1680
+ let bestIndex = -1;
1681
+
1682
+ for (const i of indices) {
1683
+ const value = lookup_array[i];
1684
+ const processedValue = typeof value === 'string' ? value.toLowerCase().trim() : value;
1685
+
1686
+ // Exact match
1687
+ if (processedValue === processedSearchKey) {
1688
+ return i
1689
+ }
1690
+
1691
+ // Next smaller value
1692
+ if (isNumber && typeof value === 'number' && value < search_key) {
1693
+ if (bestIndex === -1 || value > lookup_array[bestIndex]) {
1694
+ bestIndex = i;
1695
+ }
1696
+ } else if (!isNumber && typeof value === 'string' && processedValue < processedSearchKey) {
1697
+ if (bestIndex === -1 || processedValue > (typeof lookup_array[bestIndex] === 'string' ? lookup_array[bestIndex].toLowerCase().trim() : lookup_array[bestIndex])) {
1698
+ bestIndex = i;
1699
+ }
1700
+ }
1701
+ }
1702
+
1703
+ return bestIndex
1704
+ }
1705
+
1706
+ function findWildcardMatch(search_key, lookup_array, search_mode) {
1707
+ if (typeof search_key !== 'string') {
1708
+ return -1 // Wildcard only works with strings
1709
+ }
1710
+
1711
+ // Convert wildcard pattern to regex
1712
+ const pattern = search_key
1713
+ .toLowerCase()
1714
+ .replace(/\*/g, '.*') // * matches any sequence of characters
1715
+ .replace(/\?/g, '.') // ? matches any single character
1716
+ .replace(/[.*+?^${}()|[\]\\]/g, '\\$&') // Escape other regex chars
1717
+ .replace(/\\\.\*/g, '.*') // Restore our wildcards
1718
+ .replace(/\\\./g, '.');
1719
+
1720
+ const regex = new RegExp(`^${pattern}$`, 'i');
1721
+
1722
+ const indices = getSearchIndices(lookup_array.length, search_mode);
1723
+
1724
+ for (const i of indices) {
1725
+ const value = lookup_array[i];
1726
+ if (typeof value === 'string' && regex.test(value)) {
1727
+ console.log(`Wildcard match found at index ${i}:`, value);
1728
+ return i
1729
+ }
1730
+ }
1731
+
1732
+ return -1
1733
+ }
1734
+
1735
+ function getSearchIndices(length, search_mode) {
1736
+ if (search_mode === -1) {
1737
+ // Last to first
1738
+ return Array.from({ length }, (_, i) => length - 1 - i)
1739
+ } else {
1740
+ // First to last (default)
1741
+ return Array.from({ length }, (_, i) => i)
1742
+ }
1743
+ }
1744
+
1745
+ function binarySearchExact(search_key, lookup_array, ascending) {
1746
+ let left = 0;
1747
+ let right = lookup_array.length - 1;
1748
+
1749
+ while (left <= right) {
1750
+ const mid = Math.floor((left + right) / 2);
1751
+ const midValue = lookup_array[mid];
1752
+ const processedMidValue = typeof midValue === 'string' ? midValue.toLowerCase().trim() : midValue;
1753
+
1754
+ if (processedMidValue === search_key) {
1755
+ return mid
1756
+ }
1757
+
1758
+ const comparison = ascending ?
1759
+ (processedMidValue < search_key) :
1760
+ (processedMidValue > search_key);
1761
+
1762
+ if (comparison) {
1763
+ left = mid + 1;
1764
+ } else {
1765
+ right = mid - 1;
1766
+ }
1767
+ }
1768
+
1769
+ return -1
1770
+ }
1771
+
1772
+ function binarySearchNextLarger(search_key, lookup_array, ascending) {
1773
+ let left = 0;
1774
+ let right = lookup_array.length - 1;
1775
+ let result = -1;
1776
+
1777
+ while (left <= right) {
1778
+ const mid = Math.floor((left + right) / 2);
1779
+ const midValue = lookup_array[mid];
1780
+ const processedMidValue = typeof midValue === 'string' ? midValue.toLowerCase().trim() : midValue;
1781
+
1782
+ if (processedMidValue === search_key) {
1783
+ return mid // Exact match
1784
+ }
1785
+
1786
+ if (ascending) {
1787
+ if (processedMidValue > search_key) {
1788
+ result = mid;
1789
+ right = mid - 1;
1790
+ } else {
1791
+ left = mid + 1;
1792
+ }
1793
+ } else {
1794
+ if (processedMidValue < search_key) {
1795
+ result = mid;
1796
+ left = mid + 1;
1797
+ } else {
1798
+ right = mid - 1;
1799
+ }
1800
+ }
1801
+ }
1802
+
1803
+ return result
1804
+ }
1805
+
1806
+ function binarySearchNextSmaller(search_key, lookup_array, ascending) {
1807
+ let left = 0;
1808
+ let right = lookup_array.length - 1;
1809
+ let result = -1;
1810
+
1811
+ while (left <= right) {
1812
+ const mid = Math.floor((left + right) / 2);
1813
+ const midValue = lookup_array[mid];
1814
+ const processedMidValue = typeof midValue === 'string' ? midValue.toLowerCase().trim() : midValue;
1815
+
1816
+ if (processedMidValue === search_key) {
1817
+ return mid // Exact match
1818
+ }
1819
+
1820
+ if (ascending) {
1821
+ if (processedMidValue < search_key) {
1822
+ result = mid;
1823
+ left = mid + 1;
1824
+ } else {
1825
+ right = mid - 1;
1826
+ }
1827
+ } else {
1828
+ if (processedMidValue > search_key) {
1829
+ result = mid;
1830
+ right = mid - 1;
1831
+ } else {
1832
+ left = mid + 1;
1833
+ }
1834
+ }
1835
+ }
1836
+
1837
+ return result
1838
+ }
1839
+
1442
1840
  /**
1443
1841
  * Returns the character specified by the code number.
1444
1842
  *
@@ -18825,4 +19223,4 @@ function MYANIMELIST() {
18825
19223
 
18826
19224
  const utils = { errors, symbols, date };
18827
19225
 
18828
- export { AAVE, ABS, ACCRINT, ACOS, ACOSH, ACOT, ACOTH, AGGREGATE, AND, ARABIC, ARTEMIS, ASIN, ASINH, ATAN, ATAN2, ATANH, AVEDEV, AVERAGE, AVERAGEA, AVERAGEIF, AVERAGEIFS, BASE, BESSELI, BESSELJ, BESSELK, BESSELY, BETA, BETADIST, BETAINV, BIN2DEC, BIN2HEX, BIN2OCT, BINOM, BINOMDIST, BITAND, BITLSHIFT, BITOR, BITRSHIFT, BITXOR, BLOCKSCOUT, CEILING, CEILINGMATH, CEILINGPRECISE, CHAR, CHIDIST, CHIDISTRT, CHIINV, CHIINVRT, CHISQ, CHITEST, CHOOSE, CLEAN, CODE, COINGECKO, COLUMN, COLUMNS, COMBIN, COMBINA, COMPLEX, CONCAT, CONCATENATE, CONFIDENCE, CONVERT, CORREL, COS, COSH, COT, COTH, COUNT, COUNTA, COUNTBLANK, COUNTIF, COUNTIFS, COUPDAYS, COVAR, COVARIANCE, COVARIANCEP, COVARIANCES, CRITBINOM, CSC, CSCH, CUMIPMT, CUMPRINC, DATE, DATEDIF, DATEVALUE, DAVERAGE, DAY, DAYS, DAYS360, DB, DCOUNT, DCOUNTA, DDB, DEC2BIN, DEC2HEX, DEC2OCT, DECIMAL, DEFILLAMA, DEGREES, DELTA, DEVSQ, DGET, DISC, DMAX, DMIN, DOLLAR, DOLLARDE, DOLLARFR, DPRODUCT, DSTDEV, DSTDEVP, DSUM, DUNE, DVAR, DVARP, EDATE, EFFECT, EOA, EOMONTH, ERF, ERFC, ERFCPRECISE, ERFPRECISE, ERROR, ETHERSCAN, EVEN, EXACT, EXP, EXPON, EXPONDIST, F, FACT, FACTDOUBLE, FALSE, FARCASTER, FDIST, FDISTRT, FIND, FINV, FINVRT, FIREFLY, FISHER, FISHERINV, FIXED, FLOOR, FLOORMATH, FLOORPRECISE, FLVURL, FORECAST, FREQUENCY, FTEST, FV, FVSCHEDULE, GAMMA, GAMMADIST, GAMMAINV, GAMMALN, GAMMALNPRECISE, GAUSS, GCD, GEOMEAN, GESTEP, GNOSIS, GROWTH, HARMEAN, HEX2BIN, HEX2DEC, HEX2OCT, HLOOKUP, HOUR, HYPGEOM, HYPGEOMDIST, IF, IFERROR, IFNA, IFS, IMABS, IMAGINARY, IMARGUMENT, IMCONJUGATE, IMCOS, IMCOSH, IMCOT, IMCSC, IMCSCH, IMDIV, IMEXP, IMLN, IMLOG10, IMLOG2, IMPOWER, IMPRODUCT, IMREAL, IMSEC, IMSECH, IMSIN, IMSINH, IMSQRT, IMSUB, IMSUM, IMTAN, INDEX, INT, INTERCEPT, IPMT, IRR, ISBLANK, ISDATE, ISERR, ISERROR, ISEVEN, ISLOGICAL, ISNA, ISNONTEXT, ISNUMBER, ISO, ISODD, ISOWEEKNUM, ISPMT, ISTEXT, KURT, LARGE, LCM, LEFT, LEN, LENS, LINEST, LN, LOG, LOG10, LOGEST, LOGINV, LOGNORM, LOGNORMDIST, LOGNORMINV, LOOKUP, LOWER, MATCH, MAX, MAXA, MAXIFS, MEDIAN, MEERKAT, MID, MIN, MINA, MINIFS, MINUS$1 as MINUS, MINUTE, MIRR, MMULT, MOD, MODE, MODEMULT, MODESNGL, MONTH, MROUND, MULTINOMIAL, MUNIT, MYANIMELIST, N, NA, NEGBINOM, NEGBINOMDIST, NETWORKDAYS, NETWORKDAYSINTL, NETWORKDAYS_INTL, NEYNAR, NOMINAL, NORM, NORMDIST, NORMINV, NORMSDIST, NORMSINV, NOT, NOW, NPER, NPV, NUMBERVALUE, OCT2BIN, OCT2DEC, OCT2HEX, ODD, OR, PDURATION, PEARSON, PERCENTILE, PERCENTILEEXC, PERCENTILEINC, PERCENTRANK, PERCENTRANKEXC, PERCENTRANKINC, PERMUT, PERMUTATIONA, PHI, PI, PMT, PNL, POISSON, POISSONDIST, POLYMARKET, POWER, PPMT, PRICEDISC, PRIVACYPOOL, PROB, PRODUCT, PROPER, PV, QUARTILE, QUARTILEEXC, QUARTILEINC, QUOTIENT, RADIANS, RAND, RANDBETWEEN, RANK, RANKAVG, RANKEQ, RATE, REPLACE, REPT, RIGHT, ROMAN, ROTKI, ROUND, ROUNDDOWN, ROUNDUP, ROW, ROWS, RRI, RSQ, SAFE, SEARCH, SEC, SECH, SECOND, SERIESSUM, SIGN, SIN, SINH, SKEW, SKEWP, SLN, SLOPE, SMALL, SMARTCONTRACT, SORT, SQRT, SQRTPI, STANDARDIZE, STDEV, STDEVA, STDEVP, STDEVPA, STDEVS, STEYX, SUBSTITUTE, SUBTOTAL, SUM, SUMIF, SUMIFS, SUMPRODUCT, SUMSQ, SUMX2MY2, SUMX2PY2, SUMXMY2, SWITCH, SYD, T, TALLY, TAN, TANH, TBILLEQ, TBILLPRICE, TBILLYIELD, TDIST, TDISTRT, TEXT, TEXTJOIN, TIME, TIMEVALUE, TINV, TODAY, TRANSPOSE, TREND, TRIM, TRIMMEAN, TRUE, TRUNC, TTEST, TYPE, UNICHAR, UNICODE, UNIQUE, UNISWAP, UPPER, VALUE, VAR, VARA, VARP, VARPA, VARS, VLOOKUP, WEEKDAY, WEEKNUM, WEIBULL, WEIBULLDIST, WORKDAY, WORKDAYINTL, WORKDAY_INTL, XIRR, XNPV, XOR, YEAR, YEARFRAC, Z, ZTEST, utils };
19226
+ export { AAVE, ABS, ACCRINT, ACOS, ACOSH, ACOT, ACOTH, AGGREGATE, AND, ARABIC, ARTEMIS, ASIN, ASINH, ATAN, ATAN2, ATANH, AVEDEV, AVERAGE, AVERAGEA, AVERAGEIF, AVERAGEIFS, BASE, BESSELI, BESSELJ, BESSELK, BESSELY, BETA, BETADIST, BETAINV, BIN2DEC, BIN2HEX, BIN2OCT, BINOM, BINOMDIST, BITAND, BITLSHIFT, BITOR, BITRSHIFT, BITXOR, BLOCKSCOUT, CEILING, CEILINGMATH, CEILINGPRECISE, CHAR, CHIDIST, CHIDISTRT, CHIINV, CHIINVRT, CHISQ, CHITEST, CHOOSE, CLEAN, CODE, COINGECKO, COLUMN, COLUMNS, COMBIN, COMBINA, COMPLEX, CONCAT, CONCATENATE, CONFIDENCE, CONVERT, CORREL, COS, COSH, COT, COTH, COUNT, COUNTA, COUNTBLANK, COUNTIF, COUNTIFS, COUPDAYS, COVAR, COVARIANCE, COVARIANCEP, COVARIANCES, CRITBINOM, CSC, CSCH, CUMIPMT, CUMPRINC, DATE, DATEDIF, DATEVALUE, DAVERAGE, DAY, DAYS, DAYS360, DB, DCOUNT, DCOUNTA, DDB, DEC2BIN, DEC2HEX, DEC2OCT, DECIMAL, DEFILLAMA, DEGREES, DELTA, DEVSQ, DGET, DISC, DMAX, DMIN, DOLLAR, DOLLARDE, DOLLARFR, DPRODUCT, DSTDEV, DSTDEVP, DSUM, DUNE, DVAR, DVARP, EDATE, EFFECT, EOA, EOMONTH, ERF, ERFC, ERFCPRECISE, ERFPRECISE, ERROR, ETHERSCAN, EVEN, EXACT, EXP, EXPON, EXPONDIST, F, FACT, FACTDOUBLE, FALSE, FARCASTER, FDIST, FDISTRT, FIND, FINV, FINVRT, FIREFLY, FISHER, FISHERINV, FIXED, FLOOR, FLOORMATH, FLOORPRECISE, FLVURL, FORECAST, FREQUENCY, FTEST, FV, FVSCHEDULE, GAMMA, GAMMADIST, GAMMAINV, GAMMALN, GAMMALNPRECISE, GAUSS, GCD, GEOMEAN, GESTEP, GNOSIS, GROWTH, HARMEAN, HEX2BIN, HEX2DEC, HEX2OCT, HLOOKUP, HOUR, HYPGEOM, HYPGEOMDIST, IF, IFERROR, IFNA, IFS, IMABS, IMAGINARY, IMARGUMENT, IMCONJUGATE, IMCOS, IMCOSH, IMCOT, IMCSC, IMCSCH, IMDIV, IMEXP, IMLN, IMLOG10, IMLOG2, IMPOWER, IMPRODUCT, IMREAL, IMSEC, IMSECH, IMSIN, IMSINH, IMSQRT, IMSUB, IMSUM, IMTAN, INDEX, INT, INTERCEPT, IPMT, IRR, ISBLANK, ISDATE, ISERR, ISERROR, ISEVEN, ISLOGICAL, ISNA, ISNONTEXT, ISNUMBER, ISO, ISODD, ISOWEEKNUM, ISPMT, ISTEXT, KURT, LARGE, LCM, LEFT, LEN, LENS, LINEST, LN, LOG, LOG10, LOGEST, LOGINV, LOGNORM, LOGNORMDIST, LOGNORMINV, LOOKUP, LOWER, MATCH, MAX, MAXA, MAXIFS, MEDIAN, MEERKAT, MID, MIN, MINA, MINIFS, MINUS$1 as MINUS, MINUTE, MIRR, MMULT, MOD, MODE, MODEMULT, MODESNGL, MONTH, MROUND, MULTINOMIAL, MUNIT, MYANIMELIST, N, NA, NEGBINOM, NEGBINOMDIST, NETWORKDAYS, NETWORKDAYSINTL, NETWORKDAYS_INTL, NEYNAR, NOMINAL, NORM, NORMDIST, NORMINV, NORMSDIST, NORMSINV, NOT, NOW, NPER, NPV, NUMBERVALUE, OCT2BIN, OCT2DEC, OCT2HEX, ODD, OR, PDURATION, PEARSON, PERCENTILE, PERCENTILEEXC, PERCENTILEINC, PERCENTRANK, PERCENTRANKEXC, PERCENTRANKINC, PERMUT, PERMUTATIONA, PHI, PI, PMT, PNL, POISSON, POISSONDIST, POLYMARKET, POWER, PPMT, PRICEDISC, PRIVACYPOOL, PROB, PRODUCT, PROPER, PV, QUARTILE, QUARTILEEXC, QUARTILEINC, QUOTIENT, RADIANS, RAND, RANDBETWEEN, RANK, RANKAVG, RANKEQ, RATE, REPLACE, REPT, RIGHT, ROMAN, ROTKI, ROUND, ROUNDDOWN, ROUNDUP, ROW, ROWS, RRI, RSQ, SAFE, SEARCH, SEC, SECH, SECOND, SERIESSUM, SIGN, SIN, SINH, SKEW, SKEWP, SLN, SLOPE, SMALL, SMARTCONTRACT, SORT, SQRT, SQRTPI, STANDARDIZE, STDEV, STDEVA, STDEVP, STDEVPA, STDEVS, STEYX, SUBSTITUTE, SUBTOTAL, SUM, SUMIF, SUMIFS, SUMPRODUCT, SUMSQ, SUMX2MY2, SUMX2PY2, SUMXMY2, SWITCH, SYD, T, TALLY, TAN, TANH, TBILLEQ, TBILLPRICE, TBILLYIELD, TDIST, TDISTRT, TEXT, TEXTJOIN, TIME, TIMEVALUE, TINV, TODAY, TRANSPOSE, TREND, TRIM, TRIMMEAN, TRUE, TRUNC, TTEST, TYPE, UNICHAR, UNICODE, UNIQUE, UNISWAP, UPPER, VALUE, VAR, VARA, VARP, VARPA, VARS, VLOOKUP, WEEKDAY, WEEKNUM, WEIBULL, WEIBULLDIST, WORKDAY, WORKDAYINTL, WORKDAY_INTL, XIRR, XLOOKUP, XNPV, XOR, YEAR, YEARFRAC, Z, ZTEST, utils };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fileverse-dev/formulajs",
3
- "version": "4.4.19",
3
+ "version": "4.4.20-mod-2",
4
4
  "description": "JavaScript implementation of most Microsoft Excel formula functions",
5
5
  "author": "Formulajs",
6
6
  "publishConfig": {
@@ -4522,6 +4522,7 @@ export function WORKDAY_INTL(start_date: any, days: any, weekend: any, holidays:
4522
4522
  * @returns
4523
4523
  */
4524
4524
  export function XIRR(values: any, dates: any, guess: any): any;
4525
+ export function XLOOKUP(search_key: any, lookup_range: any, result_range: any, missing_value: any, isCol: any, match_mode: any, search_mode: any): any;
4525
4526
  /**
4526
4527
  * Returns the net present value for a schedule of cash flows that is not necessarily periodic.
4527
4528
  *
@@ -4522,6 +4522,7 @@ export function WORKDAY_INTL(start_date: any, days: any, weekend: any, holidays:
4522
4522
  * @returns
4523
4523
  */
4524
4524
  export function XIRR(values: any, dates: any, guess: any): any;
4525
+ export function XLOOKUP(search_key: any, lookup_range: any, result_range: any, missing_value: any, isCol: any, match_mode: any, search_mode: any): any;
4525
4526
  /**
4526
4527
  * Returns the net present value for a schedule of cash flows that is not necessarily periodic.
4527
4528
  *