@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/browser/formula.js +106 -79
- package/lib/browser/formula.min.js +2 -2
- package/lib/browser/formula.min.js.map +1 -1
- package/lib/cjs/index.cjs +117 -80
- package/lib/esm/crypto-constants.mjs +24 -0
- package/lib/esm/index.mjs +115 -81
- package/package.json +1 -1
- package/types/cjs/index.d.cts +30 -5
- package/types/esm/index.d.mts +30 -5
package/lib/cjs/index.cjs
CHANGED
|
@@ -572,7 +572,28 @@ function parseDate(date) {
|
|
|
572
572
|
}
|
|
573
573
|
}
|
|
574
574
|
|
|
575
|
-
//
|
|
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
|
|
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
|
-
|
|
7908
|
-
return
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
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
|
|
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
|
-
|
|
7906
|
-
return
|
|
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
|
-
|
|
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
|
|
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