@fileverse-dev/formulajs 4.4.11-mod-19-patch-2 → 4.4.11-mod-19-patch-3

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/cjs/index.cjs CHANGED
@@ -572,7 +572,28 @@ function parseDate(date) {
572
572
  }
573
573
  }
574
574
 
575
- // Fallback for other string formats
575
+ // Handle time-only string (HH:MM[:SS])
576
+ if (/^\d{1,2}:\d{2}(:\d{2})?$/.test(date)) {
577
+ const [h, m, s = '0'] = date.split(':').map(Number);
578
+ const now = new Date();
579
+ now.setHours(h, m, s, 0);
580
+ return now
581
+ }
582
+
583
+ // Handle AM/PM time format (e.g., "2:15 PM")
584
+ const ampmMatch = /^(\d{1,2}):(\d{2})\s*(AM|PM)$/i.exec(date);
585
+ if (ampmMatch) {
586
+ let [, hour, minute, meridian] = ampmMatch;
587
+ hour = parseInt(hour);
588
+ minute = parseInt(minute);
589
+ if (meridian.toUpperCase() === 'PM' && hour !== 12) hour += 12;
590
+ if (meridian.toUpperCase() === 'AM' && hour === 12) hour = 0;
591
+ const now = new Date();
592
+ now.setHours(hour, minute, 0, 0);
593
+ return now
594
+ }
595
+
596
+ // Fallback for other date strings
576
597
  const parsed = new Date(date);
577
598
  if (!isNaN(parsed)) {
578
599
  return parsed
@@ -582,6 +603,8 @@ function parseDate(date) {
582
603
  return value
583
604
  }
584
605
 
606
+
607
+
585
608
  function parseDateArray(arr) {
586
609
  let len = arr.length;
587
610
  let parsed;
@@ -5205,76 +5228,6 @@ Z.TEST = (array, x, sigma) => {
5205
5228
  return 1 - NORM.S.DIST((AVERAGE(array) - x) / (sigma / Math.sqrt(n)), true)
5206
5229
  };
5207
5230
 
5208
- function PNL() {
5209
- const [A, B] = argsToArray(arguments);
5210
-
5211
- const toNumberOrThrow = (val) => {
5212
- const num = Number(val);
5213
- if (isNaN(num)) throw new Error(`Invalid number value: ${val}`);
5214
- return num;
5215
- };
5216
-
5217
- // Single numbers
5218
- if (typeof A === "number" && typeof B === "number") {
5219
- return A - B;
5220
- }
5221
-
5222
- // 1D arrays
5223
- if (Array.isArray(A) && Array.isArray(B) && typeof A[0] !== "object") {
5224
- const maxLen = Math.max(A.length, B.length);
5225
- let total = 0;
5226
- for (let i = 0; i < maxLen; i++) {
5227
- const aVal = i < A.length ? toNumberOrThrow(A[i]) : 0;
5228
- const bVal = i < B.length ? toNumberOrThrow(B[i]) : 0;
5229
- total += aVal - bVal;
5230
- }
5231
- return total;
5232
- }
5233
-
5234
- // 2D arrays
5235
- if (Array.isArray(A[0]) && typeof A[0][0] !== "object") {
5236
- let total = 0;
5237
- const maxRows = Math.max(A.length, B.length);
5238
- for (let i = 0; i < maxRows; i++) {
5239
- const rowA = A[i] || [];
5240
- const rowB = B[i] || [];
5241
- const maxCols = Math.max(rowA.length, rowB.length);
5242
- for (let j = 0; j < maxCols; j++) {
5243
- const aVal = j < rowA.length ? toNumberOrThrow(rowA[j]) : 0;
5244
- const bVal = j < rowB.length ? toNumberOrThrow(rowB[j]) : 0;
5245
- total += aVal - bVal;
5246
- }
5247
- }
5248
- return total;
5249
- }
5250
-
5251
- // 3D arrays
5252
- if (Array.isArray(A[0][0])) {
5253
- let total = 0;
5254
- const maxX = Math.max(A.length, B.length);
5255
- for (let i = 0; i < maxX; i++) {
5256
- const matA = A[i] || [];
5257
- const matB = B[i] || [];
5258
- const maxY = Math.max(matA.length, matB.length);
5259
- for (let j = 0; j < maxY; j++) {
5260
- const rowA = matA[j] || [];
5261
- const rowB = matB[j] || [];
5262
- const maxZ = Math.max(rowA.length, rowB.length);
5263
- for (let k = 0; k < maxZ; k++) {
5264
- const aVal = k < rowA.length ? toNumberOrThrow(rowA[k]) : 0;
5265
- const bVal = k < rowB.length ? toNumberOrThrow(rowB[k]) : 0;
5266
- total += aVal - bVal;
5267
- }
5268
- }
5269
- }
5270
- return total;
5271
- }
5272
-
5273
- throw new Error("Unsupported or mismatched structure");
5274
- }
5275
-
5276
-
5277
-
5278
5231
  /**
5279
5232
  * Returns the absolute value of a number.
5280
5233
  *
@@ -7849,8 +7802,9 @@ function DAYS(end_date, start_date) {
7849
7802
  if (start_date instanceof Error) {
7850
7803
  return start_date
7851
7804
  }
7805
+ console.log({x: formatDate(startOfDay(end_date)), y: formatDate(startOfDay(start_date)) });
7852
7806
 
7853
- return dateToSerial(startOfDay(end_date)) - dateToSerial(startOfDay(start_date))
7807
+ return formatDate(startOfDay(end_date)) - formatDate(startOfDay(start_date))
7854
7808
  }
7855
7809
 
7856
7810
  /**
@@ -7864,7 +7818,6 @@ function DAYS(end_date, start_date) {
7864
7818
  * @returns
7865
7819
  */
7866
7820
  function DAYS360(start_date, end_date, method) {
7867
- debugger
7868
7821
  method = parseBool(method || 'false');
7869
7822
  start_date = parseDate(start_date);
7870
7823
  end_date = parseDate(end_date);
@@ -7904,8 +7857,8 @@ function DAYS360(start_date, end_date, method) {
7904
7857
  ed = end_date.getDate();
7905
7858
  }
7906
7859
  }
7907
- const xxx = 360 * (end_date.getFullYear() - start_date.getFullYear()) + 30 * (em - sm) + (ed - sd);
7908
- return xxx
7860
+
7861
+ return 360 * (end_date.getFullYear() - start_date.getFullYear()) + 30 * (em - sm) + (ed - sd)
7909
7862
  }
7910
7863
 
7911
7864
  /**
@@ -8166,6 +8119,8 @@ NETWORKDAYS.INTL = (start_date, end_date, weekend, holidays) => {
8166
8119
  return total
8167
8120
  };
8168
8121
 
8122
+ const NETWORKDAYS_INTL = NETWORKDAYS.INTL;
8123
+
8169
8124
  /**
8170
8125
  * Returns the serial number of the current date and time.
8171
8126
  *
@@ -8218,9 +8173,14 @@ function TIME(hour, minute, second) {
8218
8173
  return num
8219
8174
  }
8220
8175
 
8221
- return (3600 * hour + 60 * minute + second) / 86400
8176
+ const hh = String(hour).padStart(2, '0');
8177
+ const mm = String(minute).padStart(2, '0');
8178
+ const ss = String(second).padStart(2, '0');
8179
+
8180
+ return `${hh}:${mm}:${ss}`
8222
8181
  }
8223
8182
 
8183
+
8224
8184
  /**
8225
8185
  * Converts a time in the form of text to a serial number.
8226
8186
  *
@@ -8247,10 +8207,8 @@ function TIMEVALUE(time_text) {
8247
8207
  * @returns
8248
8208
  */
8249
8209
  function TODAY() {
8250
- debugger
8251
- console.log({returnSerial});
8252
8210
  const today = startOfDay(new Date());
8253
- return returnSerial ? formatDate(today) : today
8211
+ return formatDate(today)
8254
8212
  }
8255
8213
 
8256
8214
  /**
@@ -8324,6 +8282,11 @@ function WORKDAY(start_date, days, holidays) {
8324
8282
  return WORKDAY.INTL(start_date, days, 1, holidays)
8325
8283
  }
8326
8284
 
8285
+ function ISDATE(value) {
8286
+ const parsed = parseDate(value);
8287
+ return !(parsed instanceof Error)
8288
+ }
8289
+
8327
8290
  /**
8328
8291
  * Returns the serial number of the date before or after a specified number of workdays using parameters to indicate which and how many days are weekend days.
8329
8292
  *
@@ -8408,9 +8371,11 @@ WORKDAY.INTL = (start_date, days, weekend, holidays) => {
8408
8371
  return value
8409
8372
  }
8410
8373
 
8411
- return start_date
8374
+ return formatDate(start_date)
8412
8375
  };
8413
8376
 
8377
+ const WORKDAY_INTL = WORKDAY.INTL;
8378
+
8414
8379
  /**
8415
8380
  * Converts a serial number to a year.
8416
8381
  *
@@ -13165,6 +13130,75 @@ async function EOA(address, categories, chain, startTime, endTime) {
13165
13130
  }
13166
13131
 
13167
13132
 
13133
+ function PNL() {
13134
+ const [A, B] = argsToArray(arguments);
13135
+
13136
+ const toNumberOrThrow = (val) => {
13137
+ const num = Number(val);
13138
+ if (isNaN(num)) throw new Error(`Invalid number value: ${val}`);
13139
+ return num;
13140
+ };
13141
+
13142
+ // Single numbers
13143
+ if (typeof A === "number" && typeof B === "number") {
13144
+ return A - B;
13145
+ }
13146
+
13147
+ // 1D arrays
13148
+ if (Array.isArray(A) && Array.isArray(B) && typeof A[0] !== "object") {
13149
+ const maxLen = Math.max(A.length, B.length);
13150
+ let total = 0;
13151
+ for (let i = 0; i < maxLen; i++) {
13152
+ const aVal = i < A.length ? toNumberOrThrow(A[i]) : 0;
13153
+ const bVal = i < B.length ? toNumberOrThrow(B[i]) : 0;
13154
+ total += aVal - bVal;
13155
+ }
13156
+ return total;
13157
+ }
13158
+
13159
+ // 2D arrays
13160
+ if (Array.isArray(A[0]) && typeof A[0][0] !== "object") {
13161
+ let total = 0;
13162
+ const maxRows = Math.max(A.length, B.length);
13163
+ for (let i = 0; i < maxRows; i++) {
13164
+ const rowA = A[i] || [];
13165
+ const rowB = B[i] || [];
13166
+ const maxCols = Math.max(rowA.length, rowB.length);
13167
+ for (let j = 0; j < maxCols; j++) {
13168
+ const aVal = j < rowA.length ? toNumberOrThrow(rowA[j]) : 0;
13169
+ const bVal = j < rowB.length ? toNumberOrThrow(rowB[j]) : 0;
13170
+ total += aVal - bVal;
13171
+ }
13172
+ }
13173
+ return total;
13174
+ }
13175
+
13176
+ // 3D arrays
13177
+ if (Array.isArray(A[0][0])) {
13178
+ let total = 0;
13179
+ const maxX = Math.max(A.length, B.length);
13180
+ for (let i = 0; i < maxX; i++) {
13181
+ const matA = A[i] || [];
13182
+ const matB = B[i] || [];
13183
+ const maxY = Math.max(matA.length, matB.length);
13184
+ for (let j = 0; j < maxY; j++) {
13185
+ const rowA = matA[j] || [];
13186
+ const rowB = matB[j] || [];
13187
+ const maxZ = Math.max(rowA.length, rowB.length);
13188
+ for (let k = 0; k < maxZ; k++) {
13189
+ const aVal = k < rowA.length ? toNumberOrThrow(rowA[k]) : 0;
13190
+ const bVal = k < rowB.length ? toNumberOrThrow(rowB[k]) : 0;
13191
+ total += aVal - bVal;
13192
+ }
13193
+ }
13194
+ }
13195
+ return total;
13196
+ }
13197
+
13198
+ throw new Error("Unsupported or mismatched structure");
13199
+ }
13200
+
13201
+
13168
13202
  async function FLVURL(token, vs_currencies) {
13169
13203
  return new Promise((resolve) => {
13170
13204
  setTimeout(() => {
@@ -13375,6 +13409,7 @@ exports.INTERCEPT = INTERCEPT;
13375
13409
  exports.IPMT = IPMT;
13376
13410
  exports.IRR = IRR;
13377
13411
  exports.ISBLANK = ISBLANK;
13412
+ exports.ISDATE = ISDATE;
13378
13413
  exports.ISERR = ISERR;
13379
13414
  exports.ISERROR = ISERROR;
13380
13415
  exports.ISEVEN = ISEVEN;
@@ -13429,6 +13464,7 @@ exports.NEGBINOM = NEGBINOM;
13429
13464
  exports.NEGBINOMDIST = NEGBINOMDIST;
13430
13465
  exports.NETWORKDAYS = NETWORKDAYS;
13431
13466
  exports.NETWORKDAYSINTL = NETWORKDAYSINTL;
13467
+ exports.NETWORKDAYS_INTL = NETWORKDAYS_INTL;
13432
13468
  exports.NOMINAL = NOMINAL;
13433
13469
  exports.NORM = NORM;
13434
13470
  exports.NORMDIST = NORMDIST;
@@ -13564,6 +13600,7 @@ exports.WEIBULL = WEIBULL;
13564
13600
  exports.WEIBULLDIST = WEIBULLDIST;
13565
13601
  exports.WORKDAY = WORKDAY;
13566
13602
  exports.WORKDAYINTL = WORKDAYINTL;
13603
+ exports.WORKDAY_INTL = WORKDAY_INTL;
13567
13604
  exports.XIRR = XIRR;
13568
13605
  exports.XNPV = XNPV;
13569
13606
  exports.XOR = XOR;
@@ -122,6 +122,30 @@ var FUNCTION_LOCALE = [
122
122
  require: "m"
123
123
  }
124
124
  ]
125
+ },
126
+ {
127
+ n: "PNL",
128
+ t: 20,
129
+ d: "Subtract each element from A column from B column and return the total sum.",
130
+ a: "Returns the total of A - B element-wise subtraction across two ranges.",
131
+ p: [
132
+ {
133
+ name: "A",
134
+ detail: "The column or array of values to subtract from B (e.g. cost).",
135
+ example: "A1:A10",
136
+ require: "m",
137
+ repeat: "n",
138
+ type: "range"
139
+ },
140
+ {
141
+ name: "B",
142
+ detail: "The column or array of values to subtract A from (e.g. revenue).",
143
+ example: "B1:B10",
144
+ require: "m",
145
+ repeat: "n",
146
+ type: "range"
147
+ }
148
+ ]
125
149
  }
126
150
  ];
127
151
  export {
package/lib/esm/index.mjs CHANGED
@@ -570,7 +570,28 @@ function parseDate(date) {
570
570
  }
571
571
  }
572
572
 
573
- // Fallback for other string formats
573
+ // Handle time-only string (HH:MM[:SS])
574
+ if (/^\d{1,2}:\d{2}(:\d{2})?$/.test(date)) {
575
+ const [h, m, s = '0'] = date.split(':').map(Number);
576
+ const now = new Date();
577
+ now.setHours(h, m, s, 0);
578
+ return now
579
+ }
580
+
581
+ // Handle AM/PM time format (e.g., "2:15 PM")
582
+ const ampmMatch = /^(\d{1,2}):(\d{2})\s*(AM|PM)$/i.exec(date);
583
+ if (ampmMatch) {
584
+ let [, hour, minute, meridian] = ampmMatch;
585
+ hour = parseInt(hour);
586
+ minute = parseInt(minute);
587
+ if (meridian.toUpperCase() === 'PM' && hour !== 12) hour += 12;
588
+ if (meridian.toUpperCase() === 'AM' && hour === 12) hour = 0;
589
+ const now = new Date();
590
+ now.setHours(hour, minute, 0, 0);
591
+ return now
592
+ }
593
+
594
+ // Fallback for other date strings
574
595
  const parsed = new Date(date);
575
596
  if (!isNaN(parsed)) {
576
597
  return parsed
@@ -580,6 +601,8 @@ function parseDate(date) {
580
601
  return value
581
602
  }
582
603
 
604
+
605
+
583
606
  function parseDateArray(arr) {
584
607
  let len = arr.length;
585
608
  let parsed;
@@ -5203,76 +5226,6 @@ Z.TEST = (array, x, sigma) => {
5203
5226
  return 1 - NORM.S.DIST((AVERAGE(array) - x) / (sigma / Math.sqrt(n)), true)
5204
5227
  };
5205
5228
 
5206
- function PNL() {
5207
- const [A, B] = argsToArray(arguments);
5208
-
5209
- const toNumberOrThrow = (val) => {
5210
- const num = Number(val);
5211
- if (isNaN(num)) throw new Error(`Invalid number value: ${val}`);
5212
- return num;
5213
- };
5214
-
5215
- // Single numbers
5216
- if (typeof A === "number" && typeof B === "number") {
5217
- return A - B;
5218
- }
5219
-
5220
- // 1D arrays
5221
- if (Array.isArray(A) && Array.isArray(B) && typeof A[0] !== "object") {
5222
- const maxLen = Math.max(A.length, B.length);
5223
- let total = 0;
5224
- for (let i = 0; i < maxLen; i++) {
5225
- const aVal = i < A.length ? toNumberOrThrow(A[i]) : 0;
5226
- const bVal = i < B.length ? toNumberOrThrow(B[i]) : 0;
5227
- total += aVal - bVal;
5228
- }
5229
- return total;
5230
- }
5231
-
5232
- // 2D arrays
5233
- if (Array.isArray(A[0]) && typeof A[0][0] !== "object") {
5234
- let total = 0;
5235
- const maxRows = Math.max(A.length, B.length);
5236
- for (let i = 0; i < maxRows; i++) {
5237
- const rowA = A[i] || [];
5238
- const rowB = B[i] || [];
5239
- const maxCols = Math.max(rowA.length, rowB.length);
5240
- for (let j = 0; j < maxCols; j++) {
5241
- const aVal = j < rowA.length ? toNumberOrThrow(rowA[j]) : 0;
5242
- const bVal = j < rowB.length ? toNumberOrThrow(rowB[j]) : 0;
5243
- total += aVal - bVal;
5244
- }
5245
- }
5246
- return total;
5247
- }
5248
-
5249
- // 3D arrays
5250
- if (Array.isArray(A[0][0])) {
5251
- let total = 0;
5252
- const maxX = Math.max(A.length, B.length);
5253
- for (let i = 0; i < maxX; i++) {
5254
- const matA = A[i] || [];
5255
- const matB = B[i] || [];
5256
- const maxY = Math.max(matA.length, matB.length);
5257
- for (let j = 0; j < maxY; j++) {
5258
- const rowA = matA[j] || [];
5259
- const rowB = matB[j] || [];
5260
- const maxZ = Math.max(rowA.length, rowB.length);
5261
- for (let k = 0; k < maxZ; k++) {
5262
- const aVal = k < rowA.length ? toNumberOrThrow(rowA[k]) : 0;
5263
- const bVal = k < rowB.length ? toNumberOrThrow(rowB[k]) : 0;
5264
- total += aVal - bVal;
5265
- }
5266
- }
5267
- }
5268
- return total;
5269
- }
5270
-
5271
- throw new Error("Unsupported or mismatched structure");
5272
- }
5273
-
5274
-
5275
-
5276
5229
  /**
5277
5230
  * Returns the absolute value of a number.
5278
5231
  *
@@ -7847,8 +7800,9 @@ function DAYS(end_date, start_date) {
7847
7800
  if (start_date instanceof Error) {
7848
7801
  return start_date
7849
7802
  }
7803
+ console.log({x: formatDate(startOfDay(end_date)), y: formatDate(startOfDay(start_date)) });
7850
7804
 
7851
- return dateToSerial(startOfDay(end_date)) - dateToSerial(startOfDay(start_date))
7805
+ return formatDate(startOfDay(end_date)) - formatDate(startOfDay(start_date))
7852
7806
  }
7853
7807
 
7854
7808
  /**
@@ -7862,7 +7816,6 @@ function DAYS(end_date, start_date) {
7862
7816
  * @returns
7863
7817
  */
7864
7818
  function DAYS360(start_date, end_date, method) {
7865
- debugger
7866
7819
  method = parseBool(method || 'false');
7867
7820
  start_date = parseDate(start_date);
7868
7821
  end_date = parseDate(end_date);
@@ -7902,8 +7855,8 @@ function DAYS360(start_date, end_date, method) {
7902
7855
  ed = end_date.getDate();
7903
7856
  }
7904
7857
  }
7905
- const xxx = 360 * (end_date.getFullYear() - start_date.getFullYear()) + 30 * (em - sm) + (ed - sd);
7906
- return xxx
7858
+
7859
+ return 360 * (end_date.getFullYear() - start_date.getFullYear()) + 30 * (em - sm) + (ed - sd)
7907
7860
  }
7908
7861
 
7909
7862
  /**
@@ -8164,6 +8117,8 @@ NETWORKDAYS.INTL = (start_date, end_date, weekend, holidays) => {
8164
8117
  return total
8165
8118
  };
8166
8119
 
8120
+ const NETWORKDAYS_INTL = NETWORKDAYS.INTL;
8121
+
8167
8122
  /**
8168
8123
  * Returns the serial number of the current date and time.
8169
8124
  *
@@ -8216,9 +8171,14 @@ function TIME(hour, minute, second) {
8216
8171
  return num
8217
8172
  }
8218
8173
 
8219
- return (3600 * hour + 60 * minute + second) / 86400
8174
+ const hh = String(hour).padStart(2, '0');
8175
+ const mm = String(minute).padStart(2, '0');
8176
+ const ss = String(second).padStart(2, '0');
8177
+
8178
+ return `${hh}:${mm}:${ss}`
8220
8179
  }
8221
8180
 
8181
+
8222
8182
  /**
8223
8183
  * Converts a time in the form of text to a serial number.
8224
8184
  *
@@ -8245,10 +8205,8 @@ function TIMEVALUE(time_text) {
8245
8205
  * @returns
8246
8206
  */
8247
8207
  function TODAY() {
8248
- debugger
8249
- console.log({returnSerial});
8250
8208
  const today = startOfDay(new Date());
8251
- return returnSerial ? formatDate(today) : today
8209
+ return formatDate(today)
8252
8210
  }
8253
8211
 
8254
8212
  /**
@@ -8322,6 +8280,11 @@ function WORKDAY(start_date, days, holidays) {
8322
8280
  return WORKDAY.INTL(start_date, days, 1, holidays)
8323
8281
  }
8324
8282
 
8283
+ function ISDATE(value) {
8284
+ const parsed = parseDate(value);
8285
+ return !(parsed instanceof Error)
8286
+ }
8287
+
8325
8288
  /**
8326
8289
  * Returns the serial number of the date before or after a specified number of workdays using parameters to indicate which and how many days are weekend days.
8327
8290
  *
@@ -8406,9 +8369,11 @@ WORKDAY.INTL = (start_date, days, weekend, holidays) => {
8406
8369
  return value
8407
8370
  }
8408
8371
 
8409
- return start_date
8372
+ return formatDate(start_date)
8410
8373
  };
8411
8374
 
8375
+ const WORKDAY_INTL = WORKDAY.INTL;
8376
+
8412
8377
  /**
8413
8378
  * Converts a serial number to a year.
8414
8379
  *
@@ -13163,6 +13128,75 @@ async function EOA(address, categories, chain, startTime, endTime) {
13163
13128
  }
13164
13129
 
13165
13130
 
13131
+ function PNL() {
13132
+ const [A, B] = argsToArray(arguments);
13133
+
13134
+ const toNumberOrThrow = (val) => {
13135
+ const num = Number(val);
13136
+ if (isNaN(num)) throw new Error(`Invalid number value: ${val}`);
13137
+ return num;
13138
+ };
13139
+
13140
+ // Single numbers
13141
+ if (typeof A === "number" && typeof B === "number") {
13142
+ return A - B;
13143
+ }
13144
+
13145
+ // 1D arrays
13146
+ if (Array.isArray(A) && Array.isArray(B) && typeof A[0] !== "object") {
13147
+ const maxLen = Math.max(A.length, B.length);
13148
+ let total = 0;
13149
+ for (let i = 0; i < maxLen; i++) {
13150
+ const aVal = i < A.length ? toNumberOrThrow(A[i]) : 0;
13151
+ const bVal = i < B.length ? toNumberOrThrow(B[i]) : 0;
13152
+ total += aVal - bVal;
13153
+ }
13154
+ return total;
13155
+ }
13156
+
13157
+ // 2D arrays
13158
+ if (Array.isArray(A[0]) && typeof A[0][0] !== "object") {
13159
+ let total = 0;
13160
+ const maxRows = Math.max(A.length, B.length);
13161
+ for (let i = 0; i < maxRows; i++) {
13162
+ const rowA = A[i] || [];
13163
+ const rowB = B[i] || [];
13164
+ const maxCols = Math.max(rowA.length, rowB.length);
13165
+ for (let j = 0; j < maxCols; j++) {
13166
+ const aVal = j < rowA.length ? toNumberOrThrow(rowA[j]) : 0;
13167
+ const bVal = j < rowB.length ? toNumberOrThrow(rowB[j]) : 0;
13168
+ total += aVal - bVal;
13169
+ }
13170
+ }
13171
+ return total;
13172
+ }
13173
+
13174
+ // 3D arrays
13175
+ if (Array.isArray(A[0][0])) {
13176
+ let total = 0;
13177
+ const maxX = Math.max(A.length, B.length);
13178
+ for (let i = 0; i < maxX; i++) {
13179
+ const matA = A[i] || [];
13180
+ const matB = B[i] || [];
13181
+ const maxY = Math.max(matA.length, matB.length);
13182
+ for (let j = 0; j < maxY; j++) {
13183
+ const rowA = matA[j] || [];
13184
+ const rowB = matB[j] || [];
13185
+ const maxZ = Math.max(rowA.length, rowB.length);
13186
+ for (let k = 0; k < maxZ; k++) {
13187
+ const aVal = k < rowA.length ? toNumberOrThrow(rowA[k]) : 0;
13188
+ const bVal = k < rowB.length ? toNumberOrThrow(rowB[k]) : 0;
13189
+ total += aVal - bVal;
13190
+ }
13191
+ }
13192
+ }
13193
+ return total;
13194
+ }
13195
+
13196
+ throw new Error("Unsupported or mismatched structure");
13197
+ }
13198
+
13199
+
13166
13200
  async function FLVURL(token, vs_currencies) {
13167
13201
  return new Promise((resolve) => {
13168
13202
  setTimeout(() => {
@@ -13173,4 +13207,4 @@ async function FLVURL(token, vs_currencies) {
13173
13207
 
13174
13208
  const utils = { errors, symbols, date };
13175
13209
 
13176
- export { ABS, ACCRINT, ACOS, ACOSH, ACOT, ACOTH, AGGREGATE, AND, ARABIC, 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, CEILING, CEILINGMATH, CEILINGPRECISE, CHAR, CHIDIST, CHIDISTRT, CHIINV, CHIINVRT, CHISQ, CHITEST, CHOOSE, CLEAN, CODE, 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, DEGREES, DELTA, DEVSQ, DGET, DISC, DMAX, DMIN, DOLLAR, DOLLARDE, DOLLARFR, DPRODUCT, DSTDEV, DSTDEVP, DSUM, DVAR, DVARP, EDATE, EFFECT, EOA, EOMONTH, ERF, ERFC, ERFCPRECISE, ERFPRECISE, ERROR, ETHERSCAN, EVEN, EXACT, EXP, EXPON, EXPONDIST, F, FACT, FACTDOUBLE, FALSE, FDIST, FDISTRT, FIND, FINV, FINVRT, FISHER, FISHERINV, FIXED, FLOOR, FLOORMATH, FLOORPRECISE, FLVURL, FORECAST, FREQUENCY, FTEST, FV, FVSCHEDULE, GAMMA, GAMMADIST, GAMMAINV, GAMMALN, GAMMALNPRECISE, GAUSS, GCD, GEOMEAN, GESTEP, GETPRICE, 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, ISERR, ISERROR, ISEVEN, ISLOGICAL, ISNA, ISNONTEXT, ISNUMBER, ISO, ISODD, ISOWEEKNUM, ISPMT, ISTEXT, KURT, LARGE, LCM, LEFT, LEN, LINEST, LN, LOG, LOG10, LOGEST, LOGINV, LOGNORM, LOGNORMDIST, LOGNORMINV, LOOKUP, LOWER, MATCH, MAX, MAXA, MAXIFS, MEDIAN, MID, MIN, MINA, MINIFS, MINUTE, MIRR, MMULT, MOD, MODE, MODEMULT, MODESNGL, MONTH, MROUND, MULTINOMIAL, MUNIT, N, NA, NEGBINOM, NEGBINOMDIST, NETWORKDAYS, NETWORKDAYSINTL, 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, POWER, PPMT, PRICEDISC, PROB, PRODUCT, PROPER, PV, QUARTILE, QUARTILEEXC, QUARTILEINC, QUOTIENT, RADIANS, RAND, RANDBETWEEN, RANK, RANKAVG, RANKEQ, RATE, REPLACE, REPT, RIGHT, ROMAN, ROUND, ROUNDDOWN, ROUNDUP, ROW, ROWS, RRI, RSQ, SEARCH, SEC, SECH, SECOND, SERIESSUM, SIGN, SIN, SINH, SKEW, SKEWP, SLN, SLOPE, SMALL, SORT, SQRT, SQRTPI, STANDARDIZE, STDEV, STDEVA, STDEVP, STDEVPA, STDEVS, STEYX, SUBSTITUTE, SUBTOTAL, SUM, SUMIF, SUMIFS, SUMPRODUCT, SUMSQ, SUMX2MY2, SUMX2PY2, SUMXMY2, SWITCH, SYD, T, TAN, TANH, TBILLEQ, TBILLPRICE, TBILLYIELD, TDIST, TDISTRT, TEXT, TEXTJOIN, TIME, TIMEVALUE, TINV, TODAY, TRANSPOSE, TREND, TRIM, TRIMMEAN, TRUE, TRUNC, TTEST, TYPE, UNICHAR, UNICODE, UNIQUE, UPPER, VALUE, VAR, VARA, VARP, VARPA, VARS, VLOOKUP, WEEKDAY, WEEKNUM, WEIBULL, WEIBULLDIST, WORKDAY, WORKDAYINTL, XIRR, XNPV, XOR, YEAR, YEARFRAC, Z, ZTEST, utils };
13210
+ export { ABS, ACCRINT, ACOS, ACOSH, ACOT, ACOTH, AGGREGATE, AND, ARABIC, 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, CEILING, CEILINGMATH, CEILINGPRECISE, CHAR, CHIDIST, CHIDISTRT, CHIINV, CHIINVRT, CHISQ, CHITEST, CHOOSE, CLEAN, CODE, 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, DEGREES, DELTA, DEVSQ, DGET, DISC, DMAX, DMIN, DOLLAR, DOLLARDE, DOLLARFR, DPRODUCT, DSTDEV, DSTDEVP, DSUM, DVAR, DVARP, EDATE, EFFECT, EOA, EOMONTH, ERF, ERFC, ERFCPRECISE, ERFPRECISE, ERROR, ETHERSCAN, EVEN, EXACT, EXP, EXPON, EXPONDIST, F, FACT, FACTDOUBLE, FALSE, FDIST, FDISTRT, FIND, FINV, FINVRT, FISHER, FISHERINV, FIXED, FLOOR, FLOORMATH, FLOORPRECISE, FLVURL, FORECAST, FREQUENCY, FTEST, FV, FVSCHEDULE, GAMMA, GAMMADIST, GAMMAINV, GAMMALN, GAMMALNPRECISE, GAUSS, GCD, GEOMEAN, GESTEP, GETPRICE, 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, LINEST, LN, LOG, LOG10, LOGEST, LOGINV, LOGNORM, LOGNORMDIST, LOGNORMINV, LOOKUP, LOWER, MATCH, MAX, MAXA, MAXIFS, MEDIAN, MID, MIN, MINA, MINIFS, MINUTE, MIRR, MMULT, MOD, MODE, MODEMULT, MODESNGL, MONTH, MROUND, MULTINOMIAL, MUNIT, N, NA, NEGBINOM, NEGBINOMDIST, NETWORKDAYS, NETWORKDAYSINTL, NETWORKDAYS_INTL, 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, POWER, PPMT, PRICEDISC, PROB, PRODUCT, PROPER, PV, QUARTILE, QUARTILEEXC, QUARTILEINC, QUOTIENT, RADIANS, RAND, RANDBETWEEN, RANK, RANKAVG, RANKEQ, RATE, REPLACE, REPT, RIGHT, ROMAN, ROUND, ROUNDDOWN, ROUNDUP, ROW, ROWS, RRI, RSQ, SEARCH, SEC, SECH, SECOND, SERIESSUM, SIGN, SIN, SINH, SKEW, SKEWP, SLN, SLOPE, SMALL, SORT, SQRT, SQRTPI, STANDARDIZE, STDEV, STDEVA, STDEVP, STDEVPA, STDEVS, STEYX, SUBSTITUTE, SUBTOTAL, SUM, SUMIF, SUMIFS, SUMPRODUCT, SUMSQ, SUMX2MY2, SUMX2PY2, SUMXMY2, SWITCH, SYD, T, TAN, TANH, TBILLEQ, TBILLPRICE, TBILLYIELD, TDIST, TDISTRT, TEXT, TEXTJOIN, TIME, TIMEVALUE, TINV, TODAY, TRANSPOSE, TREND, TRIM, TRIMMEAN, TRUE, TRUNC, TTEST, TYPE, UNICHAR, UNICODE, UNIQUE, UPPER, VALUE, VAR, VARA, VARP, VARPA, VARS, VLOOKUP, WEEKDAY, WEEKNUM, WEIBULL, WEIBULLDIST, WORKDAY, WORKDAYINTL, WORKDAY_INTL, XIRR, 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.11-mod-19-patch-2",
3
+ "version": "4.4.11-mod-19-patch-3",
4
4
  "description": "JavaScript implementation of most Microsoft Excel formula functions",
5
5
  "author": "Formulajs",
6
6
  "publishConfig": {