@fileverse-dev/formulajs 4.4.11-mod-19-patch-1 → 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
@@ -73,9 +73,17 @@ function dateToSerial(date) {
73
73
  return Math.ceil((date - d1900) / 86400000) + addOn
74
74
  }
75
75
 
76
+ function formatDate(date) {
77
+ const day = String(date.getDate()).padStart(2, '0');
78
+ const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are 0-indexed
79
+ const year = date.getFullYear();
80
+ return `${day}/${month}/${year}`
81
+ }
82
+
76
83
  var date = /*#__PURE__*/Object.freeze({
77
84
  __proto__: null,
78
85
  dateToSerial: dateToSerial,
86
+ formatDate: formatDate,
79
87
  get returnSerial () { return returnSerial; },
80
88
  serialToDate: serialToDate,
81
89
  useDate: useDate,
@@ -564,7 +572,28 @@ function parseDate(date) {
564
572
  }
565
573
  }
566
574
 
567
- // 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
568
597
  const parsed = new Date(date);
569
598
  if (!isNaN(parsed)) {
570
599
  return parsed
@@ -574,6 +603,8 @@ function parseDate(date) {
574
603
  return value
575
604
  }
576
605
 
606
+
607
+
577
608
  function parseDateArray(arr) {
578
609
  let len = arr.length;
579
610
  let parsed;
@@ -5197,76 +5228,6 @@ Z.TEST = (array, x, sigma) => {
5197
5228
  return 1 - NORM.S.DIST((AVERAGE(array) - x) / (sigma / Math.sqrt(n)), true)
5198
5229
  };
5199
5230
 
5200
- function PNL() {
5201
- const [A, B] = argsToArray(arguments);
5202
-
5203
- const toNumberOrThrow = (val) => {
5204
- const num = Number(val);
5205
- if (isNaN(num)) throw new Error(`Invalid number value: ${val}`);
5206
- return num;
5207
- };
5208
-
5209
- // Single numbers
5210
- if (typeof A === "number" && typeof B === "number") {
5211
- return A - B;
5212
- }
5213
-
5214
- // 1D arrays
5215
- if (Array.isArray(A) && Array.isArray(B) && typeof A[0] !== "object") {
5216
- const maxLen = Math.max(A.length, B.length);
5217
- let total = 0;
5218
- for (let i = 0; i < maxLen; i++) {
5219
- const aVal = i < A.length ? toNumberOrThrow(A[i]) : 0;
5220
- const bVal = i < B.length ? toNumberOrThrow(B[i]) : 0;
5221
- total += aVal - bVal;
5222
- }
5223
- return total;
5224
- }
5225
-
5226
- // 2D arrays
5227
- if (Array.isArray(A[0]) && typeof A[0][0] !== "object") {
5228
- let total = 0;
5229
- const maxRows = Math.max(A.length, B.length);
5230
- for (let i = 0; i < maxRows; i++) {
5231
- const rowA = A[i] || [];
5232
- const rowB = B[i] || [];
5233
- const maxCols = Math.max(rowA.length, rowB.length);
5234
- for (let j = 0; j < maxCols; j++) {
5235
- const aVal = j < rowA.length ? toNumberOrThrow(rowA[j]) : 0;
5236
- const bVal = j < rowB.length ? toNumberOrThrow(rowB[j]) : 0;
5237
- total += aVal - bVal;
5238
- }
5239
- }
5240
- return total;
5241
- }
5242
-
5243
- // 3D arrays
5244
- if (Array.isArray(A[0][0])) {
5245
- let total = 0;
5246
- const maxX = Math.max(A.length, B.length);
5247
- for (let i = 0; i < maxX; i++) {
5248
- const matA = A[i] || [];
5249
- const matB = B[i] || [];
5250
- const maxY = Math.max(matA.length, matB.length);
5251
- for (let j = 0; j < maxY; j++) {
5252
- const rowA = matA[j] || [];
5253
- const rowB = matB[j] || [];
5254
- const maxZ = Math.max(rowA.length, rowB.length);
5255
- for (let k = 0; k < maxZ; k++) {
5256
- const aVal = k < rowA.length ? toNumberOrThrow(rowA[k]) : 0;
5257
- const bVal = k < rowB.length ? toNumberOrThrow(rowB[k]) : 0;
5258
- total += aVal - bVal;
5259
- }
5260
- }
5261
- }
5262
- return total;
5263
- }
5264
-
5265
- throw new Error("Unsupported or mismatched structure");
5266
- }
5267
-
5268
-
5269
-
5270
5231
  /**
5271
5232
  * Returns the absolute value of a number.
5272
5233
  *
@@ -7841,8 +7802,9 @@ function DAYS(end_date, start_date) {
7841
7802
  if (start_date instanceof Error) {
7842
7803
  return start_date
7843
7804
  }
7805
+ console.log({x: formatDate(startOfDay(end_date)), y: formatDate(startOfDay(start_date)) });
7844
7806
 
7845
- return dateToSerial(startOfDay(end_date)) - dateToSerial(startOfDay(start_date))
7807
+ return formatDate(startOfDay(end_date)) - formatDate(startOfDay(start_date))
7846
7808
  }
7847
7809
 
7848
7810
  /**
@@ -8157,6 +8119,8 @@ NETWORKDAYS.INTL = (start_date, end_date, weekend, holidays) => {
8157
8119
  return total
8158
8120
  };
8159
8121
 
8122
+ const NETWORKDAYS_INTL = NETWORKDAYS.INTL;
8123
+
8160
8124
  /**
8161
8125
  * Returns the serial number of the current date and time.
8162
8126
  *
@@ -8209,9 +8173,14 @@ function TIME(hour, minute, second) {
8209
8173
  return num
8210
8174
  }
8211
8175
 
8212
- 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}`
8213
8181
  }
8214
8182
 
8183
+
8215
8184
  /**
8216
8185
  * Converts a time in the form of text to a serial number.
8217
8186
  *
@@ -8239,7 +8208,7 @@ function TIMEVALUE(time_text) {
8239
8208
  */
8240
8209
  function TODAY() {
8241
8210
  const today = startOfDay(new Date());
8242
- return returnSerial ? dateToSerial(today) : today
8211
+ return formatDate(today)
8243
8212
  }
8244
8213
 
8245
8214
  /**
@@ -8313,6 +8282,11 @@ function WORKDAY(start_date, days, holidays) {
8313
8282
  return WORKDAY.INTL(start_date, days, 1, holidays)
8314
8283
  }
8315
8284
 
8285
+ function ISDATE(value) {
8286
+ const parsed = parseDate(value);
8287
+ return !(parsed instanceof Error)
8288
+ }
8289
+
8316
8290
  /**
8317
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.
8318
8292
  *
@@ -8397,9 +8371,11 @@ WORKDAY.INTL = (start_date, days, weekend, holidays) => {
8397
8371
  return value
8398
8372
  }
8399
8373
 
8400
- return start_date
8374
+ return formatDate(start_date)
8401
8375
  };
8402
8376
 
8377
+ const WORKDAY_INTL = WORKDAY.INTL;
8378
+
8403
8379
  /**
8404
8380
  * Converts a serial number to a year.
8405
8381
  *
@@ -13154,6 +13130,75 @@ async function EOA(address, categories, chain, startTime, endTime) {
13154
13130
  }
13155
13131
 
13156
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
+
13157
13202
  async function FLVURL(token, vs_currencies) {
13158
13203
  return new Promise((resolve) => {
13159
13204
  setTimeout(() => {
@@ -13364,6 +13409,7 @@ exports.INTERCEPT = INTERCEPT;
13364
13409
  exports.IPMT = IPMT;
13365
13410
  exports.IRR = IRR;
13366
13411
  exports.ISBLANK = ISBLANK;
13412
+ exports.ISDATE = ISDATE;
13367
13413
  exports.ISERR = ISERR;
13368
13414
  exports.ISERROR = ISERROR;
13369
13415
  exports.ISEVEN = ISEVEN;
@@ -13418,6 +13464,7 @@ exports.NEGBINOM = NEGBINOM;
13418
13464
  exports.NEGBINOMDIST = NEGBINOMDIST;
13419
13465
  exports.NETWORKDAYS = NETWORKDAYS;
13420
13466
  exports.NETWORKDAYSINTL = NETWORKDAYSINTL;
13467
+ exports.NETWORKDAYS_INTL = NETWORKDAYS_INTL;
13421
13468
  exports.NOMINAL = NOMINAL;
13422
13469
  exports.NORM = NORM;
13423
13470
  exports.NORMDIST = NORMDIST;
@@ -13553,6 +13600,7 @@ exports.WEIBULL = WEIBULL;
13553
13600
  exports.WEIBULLDIST = WEIBULLDIST;
13554
13601
  exports.WORKDAY = WORKDAY;
13555
13602
  exports.WORKDAYINTL = WORKDAYINTL;
13603
+ exports.WORKDAY_INTL = WORKDAY_INTL;
13556
13604
  exports.XIRR = XIRR;
13557
13605
  exports.XNPV = XNPV;
13558
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
@@ -71,9 +71,17 @@ function dateToSerial(date) {
71
71
  return Math.ceil((date - d1900) / 86400000) + addOn
72
72
  }
73
73
 
74
+ function formatDate(date) {
75
+ const day = String(date.getDate()).padStart(2, '0');
76
+ const month = String(date.getMonth() + 1).padStart(2, '0'); // Months are 0-indexed
77
+ const year = date.getFullYear();
78
+ return `${day}/${month}/${year}`
79
+ }
80
+
74
81
  var date = /*#__PURE__*/Object.freeze({
75
82
  __proto__: null,
76
83
  dateToSerial: dateToSerial,
84
+ formatDate: formatDate,
77
85
  get returnSerial () { return returnSerial; },
78
86
  serialToDate: serialToDate,
79
87
  useDate: useDate,
@@ -562,7 +570,28 @@ function parseDate(date) {
562
570
  }
563
571
  }
564
572
 
565
- // 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
566
595
  const parsed = new Date(date);
567
596
  if (!isNaN(parsed)) {
568
597
  return parsed
@@ -572,6 +601,8 @@ function parseDate(date) {
572
601
  return value
573
602
  }
574
603
 
604
+
605
+
575
606
  function parseDateArray(arr) {
576
607
  let len = arr.length;
577
608
  let parsed;
@@ -5195,76 +5226,6 @@ Z.TEST = (array, x, sigma) => {
5195
5226
  return 1 - NORM.S.DIST((AVERAGE(array) - x) / (sigma / Math.sqrt(n)), true)
5196
5227
  };
5197
5228
 
5198
- function PNL() {
5199
- const [A, B] = argsToArray(arguments);
5200
-
5201
- const toNumberOrThrow = (val) => {
5202
- const num = Number(val);
5203
- if (isNaN(num)) throw new Error(`Invalid number value: ${val}`);
5204
- return num;
5205
- };
5206
-
5207
- // Single numbers
5208
- if (typeof A === "number" && typeof B === "number") {
5209
- return A - B;
5210
- }
5211
-
5212
- // 1D arrays
5213
- if (Array.isArray(A) && Array.isArray(B) && typeof A[0] !== "object") {
5214
- const maxLen = Math.max(A.length, B.length);
5215
- let total = 0;
5216
- for (let i = 0; i < maxLen; i++) {
5217
- const aVal = i < A.length ? toNumberOrThrow(A[i]) : 0;
5218
- const bVal = i < B.length ? toNumberOrThrow(B[i]) : 0;
5219
- total += aVal - bVal;
5220
- }
5221
- return total;
5222
- }
5223
-
5224
- // 2D arrays
5225
- if (Array.isArray(A[0]) && typeof A[0][0] !== "object") {
5226
- let total = 0;
5227
- const maxRows = Math.max(A.length, B.length);
5228
- for (let i = 0; i < maxRows; i++) {
5229
- const rowA = A[i] || [];
5230
- const rowB = B[i] || [];
5231
- const maxCols = Math.max(rowA.length, rowB.length);
5232
- for (let j = 0; j < maxCols; j++) {
5233
- const aVal = j < rowA.length ? toNumberOrThrow(rowA[j]) : 0;
5234
- const bVal = j < rowB.length ? toNumberOrThrow(rowB[j]) : 0;
5235
- total += aVal - bVal;
5236
- }
5237
- }
5238
- return total;
5239
- }
5240
-
5241
- // 3D arrays
5242
- if (Array.isArray(A[0][0])) {
5243
- let total = 0;
5244
- const maxX = Math.max(A.length, B.length);
5245
- for (let i = 0; i < maxX; i++) {
5246
- const matA = A[i] || [];
5247
- const matB = B[i] || [];
5248
- const maxY = Math.max(matA.length, matB.length);
5249
- for (let j = 0; j < maxY; j++) {
5250
- const rowA = matA[j] || [];
5251
- const rowB = matB[j] || [];
5252
- const maxZ = Math.max(rowA.length, rowB.length);
5253
- for (let k = 0; k < maxZ; k++) {
5254
- const aVal = k < rowA.length ? toNumberOrThrow(rowA[k]) : 0;
5255
- const bVal = k < rowB.length ? toNumberOrThrow(rowB[k]) : 0;
5256
- total += aVal - bVal;
5257
- }
5258
- }
5259
- }
5260
- return total;
5261
- }
5262
-
5263
- throw new Error("Unsupported or mismatched structure");
5264
- }
5265
-
5266
-
5267
-
5268
5229
  /**
5269
5230
  * Returns the absolute value of a number.
5270
5231
  *
@@ -7839,8 +7800,9 @@ function DAYS(end_date, start_date) {
7839
7800
  if (start_date instanceof Error) {
7840
7801
  return start_date
7841
7802
  }
7803
+ console.log({x: formatDate(startOfDay(end_date)), y: formatDate(startOfDay(start_date)) });
7842
7804
 
7843
- return dateToSerial(startOfDay(end_date)) - dateToSerial(startOfDay(start_date))
7805
+ return formatDate(startOfDay(end_date)) - formatDate(startOfDay(start_date))
7844
7806
  }
7845
7807
 
7846
7808
  /**
@@ -8155,6 +8117,8 @@ NETWORKDAYS.INTL = (start_date, end_date, weekend, holidays) => {
8155
8117
  return total
8156
8118
  };
8157
8119
 
8120
+ const NETWORKDAYS_INTL = NETWORKDAYS.INTL;
8121
+
8158
8122
  /**
8159
8123
  * Returns the serial number of the current date and time.
8160
8124
  *
@@ -8207,9 +8171,14 @@ function TIME(hour, minute, second) {
8207
8171
  return num
8208
8172
  }
8209
8173
 
8210
- 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}`
8211
8179
  }
8212
8180
 
8181
+
8213
8182
  /**
8214
8183
  * Converts a time in the form of text to a serial number.
8215
8184
  *
@@ -8237,7 +8206,7 @@ function TIMEVALUE(time_text) {
8237
8206
  */
8238
8207
  function TODAY() {
8239
8208
  const today = startOfDay(new Date());
8240
- return returnSerial ? dateToSerial(today) : today
8209
+ return formatDate(today)
8241
8210
  }
8242
8211
 
8243
8212
  /**
@@ -8311,6 +8280,11 @@ function WORKDAY(start_date, days, holidays) {
8311
8280
  return WORKDAY.INTL(start_date, days, 1, holidays)
8312
8281
  }
8313
8282
 
8283
+ function ISDATE(value) {
8284
+ const parsed = parseDate(value);
8285
+ return !(parsed instanceof Error)
8286
+ }
8287
+
8314
8288
  /**
8315
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.
8316
8290
  *
@@ -8395,9 +8369,11 @@ WORKDAY.INTL = (start_date, days, weekend, holidays) => {
8395
8369
  return value
8396
8370
  }
8397
8371
 
8398
- return start_date
8372
+ return formatDate(start_date)
8399
8373
  };
8400
8374
 
8375
+ const WORKDAY_INTL = WORKDAY.INTL;
8376
+
8401
8377
  /**
8402
8378
  * Converts a serial number to a year.
8403
8379
  *
@@ -13152,6 +13128,75 @@ async function EOA(address, categories, chain, startTime, endTime) {
13152
13128
  }
13153
13129
 
13154
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
+
13155
13200
  async function FLVURL(token, vs_currencies) {
13156
13201
  return new Promise((resolve) => {
13157
13202
  setTimeout(() => {
@@ -13162,4 +13207,4 @@ async function FLVURL(token, vs_currencies) {
13162
13207
 
13163
13208
  const utils = { errors, symbols, date };
13164
13209
 
13165
- 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-1",
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": {