@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/browser/formula.js +112 -72
- package/lib/browser/formula.min.js +2 -2
- package/lib/browser/formula.min.js.map +1 -1
- package/lib/cjs/index.cjs +123 -75
- package/lib/esm/crypto-constants.mjs +24 -0
- package/lib/esm/index.mjs +121 -76
- package/package.json +1 -1
- package/types/cjs/index.d.cts +32 -5
- package/types/esm/index.d.mts +32 -5
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
|
-
//
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
//
|
|
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
|
|
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
|
-
|
|
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
|
|
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