full-utils 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.cjs +3 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +1 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.mjs +3 -0
- package/dist/browser.mjs.map +1 -0
- package/dist/index.cjs +2 -1038
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.mjs +3 -0
- package/dist/index.mjs.map +1 -0
- package/dist/node.cjs +3 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.cts +166 -0
- package/dist/node.d.ts +166 -0
- package/dist/node.mjs +3 -0
- package/dist/node.mjs.map +1 -0
- package/package.json +12 -2
- package/dist/index.js +0 -978
- package/dist/index.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1,1039 +1,3 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// src/arr/formatStrToFuncArgs.ts
|
|
4
|
-
function formatStrToFuncArgs(value) {
|
|
5
|
-
if (!isStr(value)) {
|
|
6
|
-
return [value];
|
|
7
|
-
}
|
|
8
|
-
let src = value.trim();
|
|
9
|
-
if (src === "") {
|
|
10
|
-
return [];
|
|
11
|
-
}
|
|
12
|
-
if (src.startsWith("[") && src.endsWith("]")) {
|
|
13
|
-
src = src.slice(1, -1).trim();
|
|
14
|
-
if (src === "") {
|
|
15
|
-
return [];
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
let buf = "", inQuote = false, quoteChar = null, esc = false, depthParen = 0, depthBracket = 0, depthBrace = 0;
|
|
19
|
-
const items = [];
|
|
20
|
-
const finalize = () => {
|
|
21
|
-
const trimmed = buf.trim();
|
|
22
|
-
if (trimmed !== "") {
|
|
23
|
-
items.push(trimmed);
|
|
24
|
-
}
|
|
25
|
-
buf = "";
|
|
26
|
-
};
|
|
27
|
-
for (let i = 0; i < src.length; i++) {
|
|
28
|
-
const ch = src[i];
|
|
29
|
-
if (inQuote) {
|
|
30
|
-
buf += ch;
|
|
31
|
-
if (esc) {
|
|
32
|
-
esc = false;
|
|
33
|
-
continue;
|
|
34
|
-
}
|
|
35
|
-
if (ch === "\\") {
|
|
36
|
-
esc = true;
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
if (ch === quoteChar) {
|
|
40
|
-
inQuote = false;
|
|
41
|
-
quoteChar = null;
|
|
42
|
-
}
|
|
43
|
-
continue;
|
|
44
|
-
}
|
|
45
|
-
if (ch === '"' || ch === "'") {
|
|
46
|
-
inQuote = true;
|
|
47
|
-
quoteChar = ch;
|
|
48
|
-
buf += ch;
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
if (ch === "(") {
|
|
52
|
-
depthParen++;
|
|
53
|
-
buf += ch;
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
if (ch === ")") {
|
|
57
|
-
depthParen = Math.max(0, depthParen - 1);
|
|
58
|
-
buf += ch;
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
if (ch === "[") {
|
|
62
|
-
depthBracket++;
|
|
63
|
-
buf += ch;
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
if (ch === "]") {
|
|
67
|
-
depthBracket = Math.max(0, depthBracket - 1);
|
|
68
|
-
buf += ch;
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
if (ch === "{") {
|
|
72
|
-
depthBrace++;
|
|
73
|
-
buf += ch;
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
if (ch === "}") {
|
|
77
|
-
depthBrace = Math.max(0, depthBrace - 1);
|
|
78
|
-
buf += ch;
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
if (ch === "," && depthParen === 0 && depthBracket === 0 && depthBrace === 0) {
|
|
82
|
-
finalize();
|
|
83
|
-
continue;
|
|
84
|
-
}
|
|
85
|
-
buf += ch;
|
|
86
|
-
}
|
|
87
|
-
if (buf.length) {
|
|
88
|
-
finalize();
|
|
89
|
-
}
|
|
90
|
-
return items.map((raw) => {
|
|
91
|
-
if (raw.startsWith("$") && raw.includes("(") && raw.endsWith(")")) {
|
|
92
|
-
return raw;
|
|
93
|
-
}
|
|
94
|
-
if (raw === "null") {
|
|
95
|
-
return null;
|
|
96
|
-
}
|
|
97
|
-
if (raw === "undefined") {
|
|
98
|
-
return void 0;
|
|
99
|
-
}
|
|
100
|
-
if (isStrBool(raw)) {
|
|
101
|
-
return formatToBool(raw);
|
|
102
|
-
}
|
|
103
|
-
const n = formatToNum(raw);
|
|
104
|
-
if (Number.isFinite(n)) {
|
|
105
|
-
return n;
|
|
106
|
-
}
|
|
107
|
-
if (raw === "Infinity") {
|
|
108
|
-
return Infinity;
|
|
109
|
-
}
|
|
110
|
-
if (raw === "-Infinity") {
|
|
111
|
-
return -Infinity;
|
|
112
|
-
}
|
|
113
|
-
const rawStr = String(raw || "");
|
|
114
|
-
const hasQuotes = rawStr.length >= 2 && (rawStr.startsWith("'") && rawStr.endsWith("'") || rawStr.startsWith('"') && rawStr.endsWith('"'));
|
|
115
|
-
if (hasQuotes) {
|
|
116
|
-
return rawStr.slice(1, -1).replace(/\\\\/g, "\\").replace(/\\'/g, "'").replace(/\\"/g, '"');
|
|
117
|
-
}
|
|
118
|
-
if (rawStr.startsWith("{") && rawStr.endsWith("}") || rawStr.startsWith("[") && rawStr.endsWith("]")) {
|
|
119
|
-
try {
|
|
120
|
-
return jsonDecode(rawStr);
|
|
121
|
-
} catch {
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return rawStr;
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// src/arr/splitArrToPortions.ts
|
|
129
|
-
function splitArrToPortions(arr, portionLength) {
|
|
130
|
-
if (!Number.isInteger(portionLength) || portionLength <= 0) {
|
|
131
|
-
return [];
|
|
132
|
-
}
|
|
133
|
-
const out = [];
|
|
134
|
-
let i = 0;
|
|
135
|
-
while (i < arr.length) {
|
|
136
|
-
out.push(arr.slice(i, i + portionLength));
|
|
137
|
-
i += portionLength;
|
|
138
|
-
}
|
|
139
|
-
return out;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// src/bool/formatToBool.ts
|
|
143
|
-
function formatToBool(value) {
|
|
144
|
-
switch (true) {
|
|
145
|
-
case isBool(value):
|
|
146
|
-
return value;
|
|
147
|
-
case isNumP(value):
|
|
148
|
-
return true;
|
|
149
|
-
case isNumNZ(value):
|
|
150
|
-
return false;
|
|
151
|
-
case (isStrFilled(value) && ["true", "1", "yes", "on"].includes(String(value ?? "").trim().toLowerCase())):
|
|
152
|
-
return true;
|
|
153
|
-
case (isStrFilled(value) && ["false", "0", "no", "off"].includes(String(value ?? "").trim().toLowerCase())):
|
|
154
|
-
return false;
|
|
155
|
-
}
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
// src/common/wait.ts
|
|
160
|
-
async function wait(timeout = 0) {
|
|
161
|
-
await new Promise((resolve) => setTimeout(() => resolve(true), timeout));
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// src/date/floorDateToMinutes.ts
|
|
165
|
-
function floorDateToMinutes(everyMinutes = 1, date = /* @__PURE__ */ new Date()) {
|
|
166
|
-
const step = Math.min(60, Math.max(1, Math.trunc(Math.abs(everyMinutes))));
|
|
167
|
-
const m = date.getMinutes();
|
|
168
|
-
const floored = Math.floor(m / step) * step;
|
|
169
|
-
const d = new Date(date);
|
|
170
|
-
d.setMinutes(floored, 0, 0);
|
|
171
|
-
return d;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// src/date/formatDateToString.ts
|
|
175
|
-
function formatDateToString(date = /* @__PURE__ */ new Date()) {
|
|
176
|
-
const pad = (n) => String(n).padStart(2, "0");
|
|
177
|
-
const year = date.getFullYear();
|
|
178
|
-
const month = pad(date.getMonth() + 1);
|
|
179
|
-
const day = pad(date.getDate());
|
|
180
|
-
const hours = pad(date.getHours());
|
|
181
|
-
const minutes = pad(date.getMinutes());
|
|
182
|
-
const seconds = pad(date.getSeconds());
|
|
183
|
-
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// src/date/partsToSeconds.ts
|
|
187
|
-
function partsToSeconds(parts) {
|
|
188
|
-
const { days = 0, hours = 0, minutes = 0, seconds = 0 } = parts;
|
|
189
|
-
return days * 86400 + hours * 3600 + minutes * 60 + seconds;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// src/date/secondsToParts.ts
|
|
193
|
-
function secondsToParts(total) {
|
|
194
|
-
if (!Number.isFinite(total) || total < 0) {
|
|
195
|
-
throw new Error("Invalid total seconds");
|
|
196
|
-
}
|
|
197
|
-
const days = Math.floor(total / 86400);
|
|
198
|
-
const hours = Math.floor(total % 86400 / 3600);
|
|
199
|
-
const minutes = Math.floor(total % 3600 / 60);
|
|
200
|
-
const seconds = total % 60;
|
|
201
|
-
return { days, hours, minutes, seconds };
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// src/ip-addr/cidrToRange.ts
|
|
205
|
-
function cidrToRange(cidr) {
|
|
206
|
-
const [ip, maskStr] = cidr.split("/");
|
|
207
|
-
const base = parseIPv4(ip);
|
|
208
|
-
const mask = maskStr ? Number(maskStr) : NaN;
|
|
209
|
-
if (base === null || !Number.isInteger(mask) || mask < 0 || mask > 32) {
|
|
210
|
-
return null;
|
|
211
|
-
}
|
|
212
|
-
const netmask = mask === 0 ? 0 : 4294967295 << 32 - mask >>> 0;
|
|
213
|
-
const start = base & netmask;
|
|
214
|
-
const end = start | ~netmask >>> 0;
|
|
215
|
-
return [toIPv4(start), toIPv4(end)];
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// src/ip-addr/ipAddrToNum.ts
|
|
219
|
-
function ipAddrToNum(ip) {
|
|
220
|
-
const parts = ip.split(".").map((p) => Number(p));
|
|
221
|
-
if (parts.length !== 4 || parts.some((p) => !Number.isInteger(p) || p < 0 || p > 255)) {
|
|
222
|
-
throw new Error("Invalid IPv4 address");
|
|
223
|
-
}
|
|
224
|
-
const buffer = new ArrayBuffer(4);
|
|
225
|
-
const dv = new DataView(buffer);
|
|
226
|
-
let i = 0;
|
|
227
|
-
while (i < 4) {
|
|
228
|
-
dv.setUint8(i, parts[i]);
|
|
229
|
-
i++;
|
|
230
|
-
}
|
|
231
|
-
return dv.getUint32(0, false);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// src/ip-addr/numToIpAddr.ts
|
|
235
|
-
function numToIpAddr(num) {
|
|
236
|
-
if (!isNumP(num)) {
|
|
237
|
-
return "";
|
|
238
|
-
}
|
|
239
|
-
const nbuffer = new ArrayBuffer(4);
|
|
240
|
-
const ndv = new DataView(nbuffer);
|
|
241
|
-
ndv.setUint32(0, num, false);
|
|
242
|
-
const output = [];
|
|
243
|
-
let i = 0;
|
|
244
|
-
while (i < 4) {
|
|
245
|
-
output.push(ndv.getUint8(i));
|
|
246
|
-
i++;
|
|
247
|
-
}
|
|
248
|
-
return output.join(".");
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
// src/ip-addr/parseIPv4.ts
|
|
252
|
-
function parseIPv4(ip) {
|
|
253
|
-
if (!isStr(ip)) {
|
|
254
|
-
return null;
|
|
255
|
-
}
|
|
256
|
-
const parts = formatToTrim(ip).split(".");
|
|
257
|
-
if (parts.length !== 4) {
|
|
258
|
-
return null;
|
|
259
|
-
}
|
|
260
|
-
let out = 0;
|
|
261
|
-
for (let i = 0; i < 4; i++) {
|
|
262
|
-
if (!/^\d{1,3}$/.test(parts[i])) {
|
|
263
|
-
return null;
|
|
264
|
-
}
|
|
265
|
-
const n = Number(parts[i]);
|
|
266
|
-
if (n < 0 || n > 255) {
|
|
267
|
-
return null;
|
|
268
|
-
}
|
|
269
|
-
out = out << 8 | n;
|
|
270
|
-
}
|
|
271
|
-
return out >>> 0;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
// src/ip-addr/rangeIPv4.ts
|
|
275
|
-
function* rangeIPv4(from, to, opts = {}) {
|
|
276
|
-
const { includeNetwork = true, includeBroadcast = true } = opts;
|
|
277
|
-
let startNum;
|
|
278
|
-
let endNum;
|
|
279
|
-
let isCIDR = false;
|
|
280
|
-
let cidrMask = null;
|
|
281
|
-
if (to === void 0 && from.includes("/")) {
|
|
282
|
-
const range = cidrToRange(from);
|
|
283
|
-
if (!range) {
|
|
284
|
-
throw new Error(`Invalid CIDR: "${from}"`);
|
|
285
|
-
}
|
|
286
|
-
const [startStr, endStr] = range;
|
|
287
|
-
const [_, maskStr] = from.split("/");
|
|
288
|
-
cidrMask = Number(maskStr);
|
|
289
|
-
startNum = parseIPv4(startStr);
|
|
290
|
-
endNum = parseIPv4(endStr);
|
|
291
|
-
isCIDR = true;
|
|
292
|
-
} else {
|
|
293
|
-
const s = parseIPv4(from);
|
|
294
|
-
if (s === null) {
|
|
295
|
-
throw new Error(`Invalid IPv4: "${from}"`);
|
|
296
|
-
}
|
|
297
|
-
startNum = s;
|
|
298
|
-
if (to && to.trim() !== "") {
|
|
299
|
-
const e = parseIPv4(to);
|
|
300
|
-
if (e === null) {
|
|
301
|
-
throw new Error(`Invalid IPv4: "${to}"`);
|
|
302
|
-
}
|
|
303
|
-
endNum = e;
|
|
304
|
-
} else {
|
|
305
|
-
const a = startNum >>> 24 & 255;
|
|
306
|
-
const b = startNum >>> 16 & 255;
|
|
307
|
-
const c = startNum >>> 8 & 255;
|
|
308
|
-
endNum = (a << 24 | b << 16 | c << 8 | 255) >>> 0;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
if (startNum > endNum) {
|
|
312
|
-
[startNum, endNum] = [endNum, startNum];
|
|
313
|
-
}
|
|
314
|
-
let skipNetworkAt = -1;
|
|
315
|
-
let skipBroadcastAt = -1;
|
|
316
|
-
if (isCIDR && cidrMask !== null) {
|
|
317
|
-
if (cidrMask <= 30) {
|
|
318
|
-
skipNetworkAt = startNum;
|
|
319
|
-
skipBroadcastAt = endNum;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
for (let cur = startNum; cur <= endNum; cur = cur + 1 >>> 0) {
|
|
323
|
-
if (!includeNetwork && cur === skipNetworkAt) {
|
|
324
|
-
if (cur === endNum) {
|
|
325
|
-
break;
|
|
326
|
-
}
|
|
327
|
-
continue;
|
|
328
|
-
}
|
|
329
|
-
if (!includeBroadcast && cur === skipBroadcastAt) {
|
|
330
|
-
if (cur === endNum) {
|
|
331
|
-
break;
|
|
332
|
-
}
|
|
333
|
-
continue;
|
|
334
|
-
}
|
|
335
|
-
yield toIPv4(cur);
|
|
336
|
-
if (cur === 4294967295) {
|
|
337
|
-
break;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// src/ip-addr/rangeIPv4ToArr.ts
|
|
343
|
-
function rangeIPv4ToArr2(from, to, opts = {}) {
|
|
344
|
-
const { limit = 1e6 } = opts;
|
|
345
|
-
const out = [];
|
|
346
|
-
let count = 0;
|
|
347
|
-
for (const ip of rangeIPv4(from, to, opts)) {
|
|
348
|
-
if (count >= limit) {
|
|
349
|
-
throw new Error(`Range is too large (> ${limit}). Use the generator version instead.`);
|
|
350
|
-
}
|
|
351
|
-
out.push(ip);
|
|
352
|
-
count++;
|
|
353
|
-
}
|
|
354
|
-
return out;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// src/ip-addr/toIPv4.ts
|
|
358
|
-
function toIPv4(n) {
|
|
359
|
-
if (!Number.isInteger(n) || n < 0 || n > 4294967295) {
|
|
360
|
-
throw new Error(`Invalid IPv4 number: ${n}`);
|
|
361
|
-
}
|
|
362
|
-
return [
|
|
363
|
-
n >>> 24 & 255,
|
|
364
|
-
n >>> 16 & 255,
|
|
365
|
-
n >>> 8 & 255,
|
|
366
|
-
n & 255
|
|
367
|
-
].join(".");
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
// src/is/isArr.ts
|
|
371
|
-
function isArr(value) {
|
|
372
|
-
return Array.isArray(value);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// src/is/isArrFilled.ts
|
|
376
|
-
function isArrFilled(value) {
|
|
377
|
-
return isArr(value) && value.length > 0;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// src/is/isBool.ts
|
|
381
|
-
function isBool(value) {
|
|
382
|
-
return typeof value === "boolean";
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
// src/is/isDate.ts
|
|
386
|
-
function isDate(value) {
|
|
387
|
-
if (value instanceof Date) {
|
|
388
|
-
return !Number.isNaN(value.getTime());
|
|
389
|
-
}
|
|
390
|
-
if (isStr(value) || isNum(value)) {
|
|
391
|
-
const d = new Date(value);
|
|
392
|
-
return !Number.isNaN(d.getTime());
|
|
393
|
-
}
|
|
394
|
-
return false;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
// src/is/isEmail.ts
|
|
398
|
-
var emailRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z]{2,})+$/;
|
|
399
|
-
function isEmail(value) {
|
|
400
|
-
if (!isStrFilled(value)) {
|
|
401
|
-
return false;
|
|
402
|
-
}
|
|
403
|
-
return emailRegex.test(value);
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
// src/is/isExists.ts
|
|
407
|
-
function isExists(value) {
|
|
408
|
-
return value !== null && value !== void 0;
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
// src/is/isFunc.ts
|
|
412
|
-
function isFunc(value) {
|
|
413
|
-
return typeof value === "function";
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
// src/is/isIpAddr.ts
|
|
417
|
-
var IPV4_RE = /^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/;
|
|
418
|
-
function isIpAddr(value) {
|
|
419
|
-
if (!isStr(value)) {
|
|
420
|
-
return false;
|
|
421
|
-
}
|
|
422
|
-
const v = value.trim();
|
|
423
|
-
return IPV4_RE.test(v);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
// src/is/isMacAddr.ts
|
|
427
|
-
function isMacAddr(value) {
|
|
428
|
-
return isStr(value) && /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/.test(value);
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
// src/is/isNum.ts
|
|
432
|
-
function isNum(value) {
|
|
433
|
-
return typeof value === "number" && Number.isFinite(value);
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
// src/is/isNumFloat.ts
|
|
437
|
-
function isNumFloat(value) {
|
|
438
|
-
return isNum(value) && !Number.isInteger(value);
|
|
439
|
-
}
|
|
440
|
-
|
|
441
|
-
// src/is/isNumN.ts
|
|
442
|
-
function isNumN(value) {
|
|
443
|
-
return isNum(value) && value < 0;
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
// src/is/isNumNZ.ts
|
|
447
|
-
function isNumNZ(value) {
|
|
448
|
-
return isNum(value) && value <= 0;
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// src/is/isNumP.ts
|
|
452
|
-
function isNumP(value) {
|
|
453
|
-
return isNum(value) && value > 0;
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
// src/is/isNumPZ.ts
|
|
457
|
-
function isNumPZ(value) {
|
|
458
|
-
return isNum(value) && value >= 0;
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
// src/is/isObj.ts
|
|
462
|
-
function isObj(value) {
|
|
463
|
-
return typeof value === "object" && value !== null && Object.prototype.toString.call(value) === "[object Object]" && !Array.isArray(value);
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
// src/is/isObjFilled.ts
|
|
467
|
-
function isObjFilled(value) {
|
|
468
|
-
return isObj(value) && Object.keys(value).length > 0;
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
// src/is/isPassword.ts
|
|
472
|
-
function isPassword(value, {
|
|
473
|
-
minLength = 8,
|
|
474
|
-
maxLength = 256,
|
|
475
|
-
requireUppercase = true,
|
|
476
|
-
requireLowercase = true,
|
|
477
|
-
requireDigit = true,
|
|
478
|
-
requireSpecial = true
|
|
479
|
-
} = {}) {
|
|
480
|
-
if (!isStr(value)) {
|
|
481
|
-
return false;
|
|
482
|
-
}
|
|
483
|
-
if (value.length < minLength || value.length > maxLength) {
|
|
484
|
-
return false;
|
|
485
|
-
}
|
|
486
|
-
if (requireUppercase && !/[A-ZА-Я]/.test(value)) {
|
|
487
|
-
return false;
|
|
488
|
-
}
|
|
489
|
-
if (requireLowercase && !/[a-zа-я]/.test(value)) {
|
|
490
|
-
return false;
|
|
491
|
-
}
|
|
492
|
-
if (requireDigit && !/\d/.test(value)) {
|
|
493
|
-
return false;
|
|
494
|
-
}
|
|
495
|
-
if (requireSpecial && !/[~!?@#$%^&*_\-+()\[\]{}><\\\/|"'.,:;=]/.test(value)) {
|
|
496
|
-
return false;
|
|
497
|
-
}
|
|
498
|
-
return true;
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
// src/is/isPhone.ts
|
|
502
|
-
function isPhone(value) {
|
|
503
|
-
if (!isStrFilled(value) && !isNum(value)) {
|
|
504
|
-
return false;
|
|
505
|
-
}
|
|
506
|
-
const valueProcessed = String(value).trim();
|
|
507
|
-
if (valueProcessed.startsWith("-")) {
|
|
508
|
-
return false;
|
|
509
|
-
}
|
|
510
|
-
if ((valueProcessed.match(/\+/g) || []).length > 1) {
|
|
511
|
-
return false;
|
|
512
|
-
}
|
|
513
|
-
if (valueProcessed.includes("+") && !valueProcessed.startsWith("+")) {
|
|
514
|
-
return false;
|
|
515
|
-
}
|
|
516
|
-
if (!/^\+?[0-9-]+$/.test(valueProcessed)) {
|
|
517
|
-
return false;
|
|
518
|
-
}
|
|
519
|
-
if (valueProcessed.length < 3 || valueProcessed.length > 20) {
|
|
520
|
-
return false;
|
|
521
|
-
}
|
|
522
|
-
if (!/[0-9]$/.test(valueProcessed)) {
|
|
523
|
-
return false;
|
|
524
|
-
}
|
|
525
|
-
if (valueProcessed.includes("--")) {
|
|
526
|
-
return false;
|
|
527
|
-
}
|
|
528
|
-
return true;
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
// src/is/isStr.ts
|
|
532
|
-
function isStr(value) {
|
|
533
|
-
return typeof value === "string";
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
// src/is/isStrBool.ts
|
|
537
|
-
function isStrBool(value) {
|
|
538
|
-
if (!isStrFilled(value)) {
|
|
539
|
-
return false;
|
|
540
|
-
}
|
|
541
|
-
const normalized = value.trim().toLowerCase();
|
|
542
|
-
return normalized === "true" || normalized === "false";
|
|
543
|
-
}
|
|
544
|
-
|
|
545
|
-
// src/is/isStrFilled.ts
|
|
546
|
-
function isStrFilled(value) {
|
|
547
|
-
return isStr(value) && value.trim().length > 0;
|
|
548
|
-
}
|
|
549
|
-
|
|
550
|
-
// src/is/isStrAscDesc.ts
|
|
551
|
-
function isStrAscDesc(value) {
|
|
552
|
-
if (!isStrFilled(value)) {
|
|
553
|
-
return false;
|
|
554
|
-
}
|
|
555
|
-
const normalized = value.trim().toLowerCase();
|
|
556
|
-
return normalized === "asc" || normalized === "desc";
|
|
557
|
-
}
|
|
558
|
-
|
|
559
|
-
// src/is/isVar.ts
|
|
560
|
-
function isVar(value) {
|
|
561
|
-
return isStr(value) && /^[A-Za-z_][A-Za-z0-9_]*$/.test(value);
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
// src/json/parseStringLike.ts
|
|
565
|
-
var QUOTED_RE = /^(['"`])([\s\S]*)\1$/;
|
|
566
|
-
function parseStringLike(s, allowString) {
|
|
567
|
-
const trimmed = s.trim();
|
|
568
|
-
const pr = tryParseJSON(trimmed);
|
|
569
|
-
if (pr.ok) {
|
|
570
|
-
return pr.value;
|
|
571
|
-
}
|
|
572
|
-
const m = QUOTED_RE.exec(trimmed);
|
|
573
|
-
if (m) {
|
|
574
|
-
return m[2];
|
|
575
|
-
}
|
|
576
|
-
return allowString ? trimmed : null;
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
// src/json/tryParseJSON.ts
|
|
580
|
-
function tryParseJSON(str) {
|
|
581
|
-
try {
|
|
582
|
-
return { ok: true, value: JSON.parse(str) };
|
|
583
|
-
} catch (err) {
|
|
584
|
-
}
|
|
585
|
-
return { ok: false };
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
// src/json/jsonDecode.ts
|
|
589
|
-
function jsonDecode(value, allowString = false) {
|
|
590
|
-
if (value === null || isNum(value) || isBool(value)) {
|
|
591
|
-
return value;
|
|
592
|
-
}
|
|
593
|
-
if (isArrFilled(value)) {
|
|
594
|
-
const arr = value;
|
|
595
|
-
const out = [];
|
|
596
|
-
for (const item of arr) {
|
|
597
|
-
if (isStrFilled(item)) {
|
|
598
|
-
out.push(parseStringLike(String(item), allowString));
|
|
599
|
-
} else {
|
|
600
|
-
out.push(item);
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
return out;
|
|
604
|
-
}
|
|
605
|
-
if (isObjFilled(value)) {
|
|
606
|
-
const src = value;
|
|
607
|
-
const out = {};
|
|
608
|
-
for (const key of Object.keys(src)) {
|
|
609
|
-
const v = src[key];
|
|
610
|
-
if (isStrFilled(v)) {
|
|
611
|
-
out[key] = parseStringLike(String(v), allowString);
|
|
612
|
-
} else {
|
|
613
|
-
out[key] = v;
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
return out;
|
|
617
|
-
}
|
|
618
|
-
if (isArr(value) || isObj(value)) {
|
|
619
|
-
return value;
|
|
620
|
-
}
|
|
621
|
-
if (isStrFilled(value)) {
|
|
622
|
-
return parseStringLike(String(value), allowString);
|
|
623
|
-
}
|
|
624
|
-
return null;
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
// src/json/jsonEncode.ts
|
|
628
|
-
function jsonEncode2(value) {
|
|
629
|
-
try {
|
|
630
|
-
return isObj(value) || isArr(value) ? JSON.stringify(value) : "";
|
|
631
|
-
} catch (err) {
|
|
632
|
-
}
|
|
633
|
-
return "";
|
|
634
|
-
}
|
|
635
|
-
|
|
636
|
-
// src/num/changeFixedDecimalScale.ts
|
|
637
|
-
function changeFixedDecimalScale(value, scaleDelta) {
|
|
638
|
-
const delta = Math.trunc(scaleDelta);
|
|
639
|
-
if (delta === 0) {
|
|
640
|
-
return { ...value };
|
|
641
|
-
}
|
|
642
|
-
if (delta > 0) {
|
|
643
|
-
return {
|
|
644
|
-
sign: value.sign,
|
|
645
|
-
digitsInteger: value.digitsInteger,
|
|
646
|
-
scale: value.scale + delta
|
|
647
|
-
};
|
|
648
|
-
}
|
|
649
|
-
const multiplier = 10n ** BigInt(-delta);
|
|
650
|
-
return {
|
|
651
|
-
sign: value.sign,
|
|
652
|
-
digitsInteger: value.digitsInteger * multiplier,
|
|
653
|
-
scale: value.scale + delta
|
|
654
|
-
};
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
// src/num/convertExponentialToParts.ts
|
|
658
|
-
function convertExponentialToParts(sign, exponentialString) {
|
|
659
|
-
const match = /^([0-9]+)(?:\.([0-9]*))?e([+\-]?[0-9]+)$/i.exec(
|
|
660
|
-
(() => {
|
|
661
|
-
const [coefficient, exponentText] = exponentialString.split(/e/i);
|
|
662
|
-
const [integerPart, fractionalPart = ""] = coefficient.split(".");
|
|
663
|
-
const allDigits2 = integerPart.replace(/^0+/, "") + fractionalPart;
|
|
664
|
-
const exponentValue = parseInt(exponentText, 10) - fractionalPart.length;
|
|
665
|
-
return `${allDigits2 || "0"}e${exponentValue}`;
|
|
666
|
-
})()
|
|
667
|
-
);
|
|
668
|
-
if (!match) {
|
|
669
|
-
throw new Error("Failed to parse exponential notation.");
|
|
670
|
-
}
|
|
671
|
-
let allDigits = match[1];
|
|
672
|
-
const exponent = parseInt(match[3], 10);
|
|
673
|
-
if (isNumPZ(exponent)) {
|
|
674
|
-
allDigits = allDigits + "0".repeat(exponent);
|
|
675
|
-
return {
|
|
676
|
-
sign,
|
|
677
|
-
integerPart: allDigits || "0",
|
|
678
|
-
fractionalPart: ""
|
|
679
|
-
};
|
|
680
|
-
} else {
|
|
681
|
-
const digitsToLeft = -exponent;
|
|
682
|
-
if (digitsToLeft >= allDigits.length) {
|
|
683
|
-
const missingZeros = "0".repeat(digitsToLeft - allDigits.length);
|
|
684
|
-
return {
|
|
685
|
-
sign,
|
|
686
|
-
integerPart: "0",
|
|
687
|
-
fractionalPart: missingZeros + allDigits
|
|
688
|
-
};
|
|
689
|
-
} else {
|
|
690
|
-
const splitIndex = allDigits.length - digitsToLeft;
|
|
691
|
-
return {
|
|
692
|
-
sign,
|
|
693
|
-
integerPart: allDigits.slice(0, splitIndex),
|
|
694
|
-
fractionalPart: allDigits.slice(splitIndex)
|
|
695
|
-
};
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
// src/num/fixedDecimalToNum.ts
|
|
701
|
-
function fixedDecimalToNum(value) {
|
|
702
|
-
return Number(fixedDecimalToStr(value));
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
// src/num/fixedDecimalToStr.ts
|
|
706
|
-
function fixedDecimalToStr(value) {
|
|
707
|
-
const signSymbol = value.sign < 0 ? "-" : "";
|
|
708
|
-
const allDigitsString = value.digitsInteger.toString();
|
|
709
|
-
if (value.scale === 0) {
|
|
710
|
-
return signSymbol + allDigitsString;
|
|
711
|
-
}
|
|
712
|
-
const padZeros = value.scale - allDigitsString.length;
|
|
713
|
-
if (padZeros >= 0) {
|
|
714
|
-
return signSymbol + "0." + "0".repeat(padZeros) + allDigitsString;
|
|
715
|
-
}
|
|
716
|
-
const integerBoundary = allDigitsString.length - value.scale;
|
|
717
|
-
const integerText = allDigitsString.slice(0, integerBoundary);
|
|
718
|
-
const fractionalText = allDigitsString.slice(integerBoundary);
|
|
719
|
-
return signSymbol + integerText + "." + fractionalText;
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
// src/num/formatToNum.ts
|
|
723
|
-
function formatToNum(value, round = 1) {
|
|
724
|
-
return fixedDecimalToNum(round > 1 ? roundFixedDecimal(parseToFixedDecimal(value), round, "half-up") : parseToFixedDecimal(value));
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
// src/num/normalizeToDecimalComponents.ts
|
|
728
|
-
function normalizeToDecimalComponents(input) {
|
|
729
|
-
if (typeof input === "bigint") {
|
|
730
|
-
const sign = input < 0n ? -1 : 1;
|
|
731
|
-
const absoluteValue = (input < 0n ? -input : input).toString();
|
|
732
|
-
return {
|
|
733
|
-
sign,
|
|
734
|
-
integerPart: absoluteValue,
|
|
735
|
-
fractionalPart: ""
|
|
736
|
-
};
|
|
737
|
-
}
|
|
738
|
-
if (typeof input === "number") {
|
|
739
|
-
if (!Number.isFinite(input)) {
|
|
740
|
-
throw new Error("Input number is not finite.");
|
|
741
|
-
}
|
|
742
|
-
const sign = input < 0 ? -1 : 1;
|
|
743
|
-
const absoluteValue = Math.abs(input);
|
|
744
|
-
const exponentialForm = absoluteValue.toExponential(30);
|
|
745
|
-
return convertExponentialToParts(sign, exponentialForm);
|
|
746
|
-
}
|
|
747
|
-
if (typeof input === "string") {
|
|
748
|
-
let processed = input.trim().replace(",", ".");
|
|
749
|
-
if (!processed) {
|
|
750
|
-
throw new Error("Input string is empty.");
|
|
751
|
-
}
|
|
752
|
-
let sign = 1;
|
|
753
|
-
if (processed.startsWith("+") || processed.startsWith("-")) {
|
|
754
|
-
sign = processed.startsWith("-") ? -1 : 1;
|
|
755
|
-
processed = processed.slice(1);
|
|
756
|
-
}
|
|
757
|
-
if (/^[0-9]*\.?[0-9]*(e[+\-]?[0-9]+)?$/i.test(processed)) {
|
|
758
|
-
if (/e/i.test(processed)) {
|
|
759
|
-
return convertExponentialToParts(sign, processed);
|
|
760
|
-
}
|
|
761
|
-
const [integerPart = "0", fractionalPart = ""] = processed.split(".");
|
|
762
|
-
return {
|
|
763
|
-
sign,
|
|
764
|
-
integerPart,
|
|
765
|
-
fractionalPart
|
|
766
|
-
};
|
|
767
|
-
}
|
|
768
|
-
throw new Error("Invalid numeric string.");
|
|
769
|
-
}
|
|
770
|
-
throw new Error("Unsupported input type.");
|
|
771
|
-
}
|
|
772
|
-
|
|
773
|
-
// src/num/parseToFixedDecimal.ts
|
|
774
|
-
function parseToFixedDecimal(input) {
|
|
775
|
-
const {
|
|
776
|
-
sign,
|
|
777
|
-
integerPart,
|
|
778
|
-
fractionalPart
|
|
779
|
-
} = normalizeToDecimalComponents(input);
|
|
780
|
-
const integerDigits = integerPart.replace(/^0+/, "") || "0";
|
|
781
|
-
const fractionalDigits = fractionalPart.replace(/0+$/, "");
|
|
782
|
-
const combinedDigits = integerDigits + fractionalDigits || "0";
|
|
783
|
-
return {
|
|
784
|
-
sign,
|
|
785
|
-
digitsInteger: BigInt(combinedDigits),
|
|
786
|
-
scale: fractionalDigits.length
|
|
787
|
-
};
|
|
788
|
-
}
|
|
789
|
-
|
|
790
|
-
// src/num/roundFixedDecimal.ts
|
|
791
|
-
function roundFixedDecimal(source, decimalPlaces, roundMode = "half-up") {
|
|
792
|
-
const targetPrecision = Math.max(0, Math.trunc(decimalPlaces));
|
|
793
|
-
if (source.scale <= targetPrecision) {
|
|
794
|
-
return { ...source };
|
|
795
|
-
}
|
|
796
|
-
const digitsToRemove = source.scale - targetPrecision;
|
|
797
|
-
const divisionFactor = 10n ** BigInt(digitsToRemove);
|
|
798
|
-
const integerPart = source.digitsInteger / divisionFactor;
|
|
799
|
-
const remainder = source.digitsInteger % divisionFactor;
|
|
800
|
-
if (roundMode === "trunc" || remainder === 0n) {
|
|
801
|
-
return {
|
|
802
|
-
sign: source.sign,
|
|
803
|
-
digitsInteger: integerPart,
|
|
804
|
-
scale: targetPrecision
|
|
805
|
-
};
|
|
806
|
-
}
|
|
807
|
-
const halfThreshold = divisionFactor / 2n;
|
|
808
|
-
const shouldRoundUp = remainder >= halfThreshold;
|
|
809
|
-
const roundedValue = shouldRoundUp ? integerPart + 1n : integerPart;
|
|
810
|
-
return {
|
|
811
|
-
sign: source.sign,
|
|
812
|
-
digitsInteger: roundedValue,
|
|
813
|
-
scale: targetPrecision
|
|
814
|
-
};
|
|
815
|
-
}
|
|
816
|
-
|
|
817
|
-
// src/str/formatToLowerCase.ts
|
|
818
|
-
function formatToLowerCase(value) {
|
|
819
|
-
if (!isStr(value)) {
|
|
820
|
-
return "";
|
|
821
|
-
}
|
|
822
|
-
const trimmed = formatToTrim(value);
|
|
823
|
-
return isStrFilled(trimmed) ? trimmed.toLowerCase() : "";
|
|
824
|
-
}
|
|
825
|
-
|
|
826
|
-
// src/str/formatToNull.ts
|
|
827
|
-
function formatToNull(value) {
|
|
828
|
-
return isStr(value) && formatToTrim(value) === "" || value === void 0 ? null : value;
|
|
829
|
-
}
|
|
830
|
-
|
|
831
|
-
// src/str/formatToPhone.ts
|
|
832
|
-
function formatToPhone(value, defaultCountry = "+7") {
|
|
833
|
-
if (!isStr(value)) {
|
|
834
|
-
return null;
|
|
835
|
-
}
|
|
836
|
-
let phone = formatToTrim(value).replace(/[\s\-().]/g, "");
|
|
837
|
-
if (/^00\d{8,15}$/.test(phone)) {
|
|
838
|
-
phone = "+" + phone.slice(2);
|
|
839
|
-
} else if (/^\d{10}$/.test(phone)) {
|
|
840
|
-
phone = defaultCountry + phone;
|
|
841
|
-
} else if (/^\d{9,15}$/.test(phone) && !phone.startsWith("0")) {
|
|
842
|
-
phone = "+" + phone;
|
|
843
|
-
}
|
|
844
|
-
return /^\+\d{10,15}$/.test(phone) ? phone : null;
|
|
845
|
-
}
|
|
846
|
-
|
|
847
|
-
// src/str/formatToTrim.ts
|
|
848
|
-
function formatToTrim(value) {
|
|
849
|
-
return String(isStr(value) ? value.trim().normalize("NFKC").replace(/[\u200B-\u200D\uFEFF]/g, "") : "");
|
|
850
|
-
}
|
|
851
|
-
|
|
852
|
-
// src/str/formatToUndefined.ts
|
|
853
|
-
function formatToUndefined2(value) {
|
|
854
|
-
return isStr(value) && formatToTrim(value) === "" || value === null ? void 0 : value;
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
// src/units/toGB.ts
|
|
858
|
-
var KB = 1024;
|
|
859
|
-
var MB = KB * 1024;
|
|
860
|
-
var GB = MB * 1024;
|
|
861
|
-
var TB = GB * 1024;
|
|
862
|
-
var PB = TB * 1024;
|
|
863
|
-
function toGB(value, unit = "") {
|
|
864
|
-
const v = formatToNum(value);
|
|
865
|
-
if (!isNum(v)) {
|
|
866
|
-
throw new Error(`toGB: value "${value}" is not numeric`);
|
|
867
|
-
}
|
|
868
|
-
const u = String(unit).trim().toLowerCase().replace(/\s+/g, "");
|
|
869
|
-
const c = u ? u[0] : "g";
|
|
870
|
-
let out;
|
|
871
|
-
switch (c) {
|
|
872
|
-
case "b":
|
|
873
|
-
out = v / GB;
|
|
874
|
-
break;
|
|
875
|
-
case "k":
|
|
876
|
-
out = v / MB;
|
|
877
|
-
break;
|
|
878
|
-
case "m":
|
|
879
|
-
out = v / GB;
|
|
880
|
-
break;
|
|
881
|
-
case "g":
|
|
882
|
-
out = v;
|
|
883
|
-
break;
|
|
884
|
-
case "t":
|
|
885
|
-
out = v * (TB / GB);
|
|
886
|
-
break;
|
|
887
|
-
case "p":
|
|
888
|
-
out = v * (PB / GB);
|
|
889
|
-
break;
|
|
890
|
-
default:
|
|
891
|
-
out = v;
|
|
892
|
-
break;
|
|
893
|
-
}
|
|
894
|
-
if (!isNum(out)) {
|
|
895
|
-
throw new Error(`toGB: result is not finite (value="${value}", unit="${unit}")`);
|
|
896
|
-
}
|
|
897
|
-
return Object.is(out, -0) ? 0 : out;
|
|
898
|
-
}
|
|
899
|
-
|
|
900
|
-
// src/units/normalizeUnit.ts
|
|
901
|
-
function normalizeUnit(u) {
|
|
902
|
-
return String(u).trim().toLowerCase().replace(/\s+/g, "").replace(/(?:\/?s|hash(?:es)?)$/i, "");
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
// src/units/toGH.ts
|
|
906
|
-
var FACTOR = {
|
|
907
|
-
h: 1e-9,
|
|
908
|
-
k: 1e-6,
|
|
909
|
-
m: 1e-3,
|
|
910
|
-
g: 1,
|
|
911
|
-
t: 1e3,
|
|
912
|
-
p: 1e6,
|
|
913
|
-
e: 1e9
|
|
914
|
-
};
|
|
915
|
-
function toGH(value, unit = "") {
|
|
916
|
-
const v = formatToNum(value);
|
|
917
|
-
if (!isNum(v)) {
|
|
918
|
-
return 0;
|
|
919
|
-
}
|
|
920
|
-
const u = normalizeUnit(unit);
|
|
921
|
-
const c = u ? u[0] : "g";
|
|
922
|
-
const factor = FACTOR[c] ?? 1;
|
|
923
|
-
const out = v * factor;
|
|
924
|
-
if (!isNum(out)) {
|
|
925
|
-
throw new Error(`toGH: result is not finite (value="${v}", unit="${u}")`);
|
|
926
|
-
}
|
|
927
|
-
return Object.is(out, -0) ? 0 : out;
|
|
928
|
-
}
|
|
929
|
-
|
|
930
|
-
// src/units/toH.ts
|
|
931
|
-
var FACTOR_H = {
|
|
932
|
-
h: 1,
|
|
933
|
-
k: 1e3,
|
|
934
|
-
m: 1e6,
|
|
935
|
-
g: 1e9,
|
|
936
|
-
t: 1e12,
|
|
937
|
-
p: 1e15,
|
|
938
|
-
e: 1e18
|
|
939
|
-
};
|
|
940
|
-
function toH(value, unit = "") {
|
|
941
|
-
const v = formatToNum(value);
|
|
942
|
-
if (!isNum(v)) {
|
|
943
|
-
return 0;
|
|
944
|
-
}
|
|
945
|
-
const u = normalizeUnit(unit);
|
|
946
|
-
const c = u ? u[0] : "h";
|
|
947
|
-
const factor = FACTOR_H[c] ?? 1;
|
|
948
|
-
const out = v * factor;
|
|
949
|
-
if (!isNum(out)) {
|
|
950
|
-
throw new Error(`toH: result is not finite (value="${v}", unit="${u}")`);
|
|
951
|
-
}
|
|
952
|
-
return Object.is(out, -0) ? 0 : out;
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
// src/url/extractHost.ts
|
|
956
|
-
var HAS_SCHEME = /^[a-zA-Z][a-zA-Z\d+\-.]*:/;
|
|
957
|
-
function extractHost(value = "") {
|
|
958
|
-
if (!isStrFilled(value)) {
|
|
959
|
-
return "";
|
|
960
|
-
}
|
|
961
|
-
let v = value.trim();
|
|
962
|
-
const candidate = HAS_SCHEME.test(v) ? v : `http://${v}`;
|
|
963
|
-
try {
|
|
964
|
-
const u = new URL(candidate);
|
|
965
|
-
let host = u.hostname;
|
|
966
|
-
return host;
|
|
967
|
-
} catch {
|
|
968
|
-
const withoutCreds = v.split("@").pop() || v;
|
|
969
|
-
const firstSegment = withoutCreds.split(/[/?#]/, 1)[0];
|
|
970
|
-
const mIPv6 = firstSegment.match(/^\[([^\]]+)\]/);
|
|
971
|
-
if (mIPv6) {
|
|
972
|
-
return mIPv6[1];
|
|
973
|
-
}
|
|
974
|
-
return firstSegment.split(":", 1)[0] || "";
|
|
975
|
-
}
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
exports.changeFixedDecimalScale = changeFixedDecimalScale;
|
|
979
|
-
exports.cidrToRange = cidrToRange;
|
|
980
|
-
exports.convertExponentialToParts = convertExponentialToParts;
|
|
981
|
-
exports.extractHost = extractHost;
|
|
982
|
-
exports.fixedDecimalToNum = fixedDecimalToNum;
|
|
983
|
-
exports.fixedDecimalToStr = fixedDecimalToStr;
|
|
984
|
-
exports.floorDateToMinutes = floorDateToMinutes;
|
|
985
|
-
exports.formatDateToString = formatDateToString;
|
|
986
|
-
exports.formatStrToFuncArgs = formatStrToFuncArgs;
|
|
987
|
-
exports.formatToBool = formatToBool;
|
|
988
|
-
exports.formatToLowerCase = formatToLowerCase;
|
|
989
|
-
exports.formatToNull = formatToNull;
|
|
990
|
-
exports.formatToNum = formatToNum;
|
|
991
|
-
exports.formatToPhone = formatToPhone;
|
|
992
|
-
exports.formatToTrim = formatToTrim;
|
|
993
|
-
exports.formatToUndefined = formatToUndefined2;
|
|
994
|
-
exports.ipAddrToNum = ipAddrToNum;
|
|
995
|
-
exports.isArr = isArr;
|
|
996
|
-
exports.isArrFilled = isArrFilled;
|
|
997
|
-
exports.isBool = isBool;
|
|
998
|
-
exports.isDate = isDate;
|
|
999
|
-
exports.isEmail = isEmail;
|
|
1000
|
-
exports.isExists = isExists;
|
|
1001
|
-
exports.isFunc = isFunc;
|
|
1002
|
-
exports.isIpAddr = isIpAddr;
|
|
1003
|
-
exports.isMacAddr = isMacAddr;
|
|
1004
|
-
exports.isNum = isNum;
|
|
1005
|
-
exports.isNumFloat = isNumFloat;
|
|
1006
|
-
exports.isNumN = isNumN;
|
|
1007
|
-
exports.isNumNZ = isNumNZ;
|
|
1008
|
-
exports.isNumP = isNumP;
|
|
1009
|
-
exports.isNumPZ = isNumPZ;
|
|
1010
|
-
exports.isObj = isObj;
|
|
1011
|
-
exports.isObjFilled = isObjFilled;
|
|
1012
|
-
exports.isPassword = isPassword;
|
|
1013
|
-
exports.isPhone = isPhone;
|
|
1014
|
-
exports.isStr = isStr;
|
|
1015
|
-
exports.isStrAscDesc = isStrAscDesc;
|
|
1016
|
-
exports.isStrBool = isStrBool;
|
|
1017
|
-
exports.isStrFilled = isStrFilled;
|
|
1018
|
-
exports.isVar = isVar;
|
|
1019
|
-
exports.jsonDecode = jsonDecode;
|
|
1020
|
-
exports.jsonEncode = jsonEncode2;
|
|
1021
|
-
exports.normalizeToDecimalComponents = normalizeToDecimalComponents;
|
|
1022
|
-
exports.numToIpAddr = numToIpAddr;
|
|
1023
|
-
exports.parseIPv4 = parseIPv4;
|
|
1024
|
-
exports.parseStringLike = parseStringLike;
|
|
1025
|
-
exports.parseToFixedDecimal = parseToFixedDecimal;
|
|
1026
|
-
exports.partsToSeconds = partsToSeconds;
|
|
1027
|
-
exports.rangeIPv4 = rangeIPv4;
|
|
1028
|
-
exports.rangeIPv4ToArr = rangeIPv4ToArr2;
|
|
1029
|
-
exports.roundFixedDecimal = roundFixedDecimal;
|
|
1030
|
-
exports.secondsToParts = secondsToParts;
|
|
1031
|
-
exports.splitArrToPortions = splitArrToPortions;
|
|
1032
|
-
exports.toGB = toGB;
|
|
1033
|
-
exports.toGH = toGH;
|
|
1034
|
-
exports.toH = toH;
|
|
1035
|
-
exports.toIPv4 = toIPv4;
|
|
1036
|
-
exports.tryParseJSON = tryParseJSON;
|
|
1037
|
-
exports.wait = wait;
|
|
1038
|
-
//# sourceMappingURL=index.cjs.map
|
|
1
|
+
'use strict';function ot(t){if(!m(t))return [t];let r=t.trim();if(r==="")return [];if(r.startsWith("[")&&r.endsWith("]")&&(r=r.slice(1,-1).trim(),r===""))return [];let n="",e=false,o=null,i=false,s=0,p=0,d=0,h=[],x=()=>{let u=n.trim();u!==""&&h.push(u),n="";};for(let u=0;u<r.length;u++){let f=r[u];if(e){if(n+=f,i){i=false;continue}if(f==="\\"){i=true;continue}f===o&&(e=false,o=null);continue}if(f==='"'||f==="'"){e=true,o=f,n+=f;continue}if(f==="("){s++,n+=f;continue}if(f===")"){s=Math.max(0,s-1),n+=f;continue}if(f==="["){p++,n+=f;continue}if(f==="]"){p=Math.max(0,p-1),n+=f;continue}if(f==="{"){d++,n+=f;continue}if(f==="}"){d=Math.max(0,d-1),n+=f;continue}if(f===","&&s===0&&p===0&&d===0){x();continue}n+=f;}return n.length&&x(),h.map(u=>{if(u.startsWith("$")&&u.includes("(")&&u.endsWith(")"))return u;if(u==="null")return null;if(u==="undefined")return;if(E(u))return $(u);let f=w(u);if(Number.isFinite(f))return f;if(u==="Infinity")return 1/0;if(u==="-Infinity")return -1/0;let l=String(u||"");if(l.length>=2&&(l.startsWith("'")&&l.endsWith("'")||l.startsWith('"')&&l.endsWith('"')))return l.slice(1,-1).replace(/\\\\/g,"\\").replace(/\\'/g,"'").replace(/\\"/g,'"');if(l.startsWith("{")&&l.endsWith("}")||l.startsWith("[")&&l.endsWith("]"))try{return B(l)}catch{}return l})}function st(t,r){if(!Number.isInteger(r)||r<=0)return [];let n=[],e=0;for(;e<t.length;)n.push(t.slice(e,e+r)),e+=r;return n}function $(t){switch(true){case F(t):return t;case y(t):return true;case R(t):return false;case(a(t)&&["true","1","yes","on"].includes(String(t??"").trim().toLowerCase())):return true;case(a(t)&&["false","0","no","off"].includes(String(t??"").trim().toLowerCase())):return false}return false}async function ct(t=0){await new Promise(r=>setTimeout(()=>r(true),t));}function pt(t=1,r=new Date){let n=Math.min(60,Math.max(1,Math.trunc(Math.abs(t)))),e=r.getMinutes(),o=Math.floor(e/n)*n,i=new Date(r);return i.setMinutes(o,0,0),i}function dt(t=new Date){let r=d=>String(d).padStart(2,"0"),n=t.getFullYear(),e=r(t.getMonth()+1),o=r(t.getDate()),i=r(t.getHours()),s=r(t.getMinutes()),p=r(t.getSeconds());return `${n}-${e}-${o} ${i}:${s}:${p}`}function xt(t){let{days:r=0,hours:n=0,minutes:e=0,seconds:o=0}=t;return r*86400+n*3600+e*60+o}function wt(t){if(!Number.isFinite(t)||t<0)throw new Error("Invalid total seconds");let r=Math.floor(t/86400),n=Math.floor(t%86400/3600),e=Math.floor(t%3600/60),o=t%60;return {days:r,hours:n,minutes:e,seconds:o}}function M(t){let[r,n]=t.split("/"),e=b(r),o=n?Number(n):NaN;if(e===null||!Number.isInteger(o)||o<0||o>32)return null;let i=o===0?0:4294967295<<32-o>>>0,s=e&i,p=s|~i>>>0;return [N(s),N(p)]}function Nt(t){let r=t.split(".").map(i=>Number(i));if(r.length!==4||r.some(i=>!Number.isInteger(i)||i<0||i>255))throw new Error("Invalid IPv4 address");let n=new ArrayBuffer(4),e=new DataView(n),o=0;for(;o<4;)e.setUint8(o,r[o]),o++;return e.getUint32(0,false)}function It(t){if(!y(t))return "";let r=new ArrayBuffer(4),n=new DataView(r);n.setUint32(0,t,false);let e=[],o=0;for(;o<4;)e.push(n.getUint8(o)),o++;return e.join(".")}function b(t){if(!m(t))return null;let r=g(t).split(".");if(r.length!==4)return null;let n=0;for(let e=0;e<4;e++){if(!/^\d{1,3}$/.test(r[e]))return null;let o=Number(r[e]);if(o<0||o>255)return null;n=n<<8|o;}return n>>>0}function*j(t,r,n={}){let{includeNetwork:e=true,includeBroadcast:o=true}=n,i,s,p=false,d=null;if(r===void 0&&t.includes("/")){let u=M(t);if(!u)throw new Error(`Invalid CIDR: "${t}"`);let[f,l]=u,[D,Q]=t.split("/");d=Number(Q),i=b(f),s=b(l),p=true;}else {let u=b(t);if(u===null)throw new Error(`Invalid IPv4: "${t}"`);if(i=u,r&&r.trim()!==""){let f=b(r);if(f===null)throw new Error(`Invalid IPv4: "${r}"`);s=f;}else {let f=i>>>24&255,l=i>>>16&255,D=i>>>8&255;s=(f<<24|l<<16|D<<8|255)>>>0;}}i>s&&([i,s]=[s,i]);let h=-1,x=-1;p&&d!==null&&d<=30&&(h=i,x=s);for(let u=i;u<=s;u=u+1>>>0){if(!e&&u===h){if(u===s)break;continue}if(!o&&u===x){if(u===s)break;continue}if(yield N(u),u===4294967295)break}}function Mt(t,r,n={}){let{limit:e=1e6}=n,o=[],i=0;for(let s of j(t,r,n)){if(i>=e)throw new Error(`Range is too large (> ${e}). Use the generator version instead.`);o.push(s),i++;}return o}function N(t){if(!Number.isInteger(t)||t<0||t>4294967295)throw new Error(`Invalid IPv4 number: ${t}`);return [t>>>24&255,t>>>16&255,t>>>8&255,t&255].join(".")}function k(t){return Array.isArray(t)}function L(t){return k(t)&&t.length>0}function F(t){return typeof t=="boolean"}function Zt(t){if(t instanceof Date)return !Number.isNaN(t.getTime());if(m(t)||c(t)){let r=new Date(t);return !Number.isNaN(r.getTime())}return false}var K=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z]{2,})+$/;function Ht(t){return a(t)?K.test(t):false}function Qt(t){return t!=null}function qt(t){return typeof t=="function"}var q=/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/;function vt(t){if(!m(t))return false;let r=t.trim();return q.test(r)}function nr(t){return m(t)&&/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/.test(t)}function c(t){return typeof t=="number"&&Number.isFinite(t)}function sr(t){return c(t)&&!Number.isInteger(t)}function mr(t){return c(t)&&t<0}function R(t){return c(t)&&t<=0}function y(t){return c(t)&&t>0}function C(t){return c(t)&&t>=0}function T(t){return typeof t=="object"&&t!==null&&Object.prototype.toString.call(t)==="[object Object]"&&!Array.isArray(t)}function z(t){return T(t)&&Object.keys(t).length>0}function Tr(t,{minLength:r=8,maxLength:n=256,requireUppercase:e=true,requireLowercase:o=true,requireDigit:i=true,requireSpecial:s=true}={}){return !(!m(t)||t.length<r||t.length>n||e&&!/[A-ZА-Я]/.test(t)||o&&!/[a-zа-я]/.test(t)||i&&!/\d/.test(t)||s&&!/[~!?@#$%^&*_\-+()\[\]{}><\\\/|"'.,:;=]/.test(t))}function Fr(t){if(!a(t)&&!c(t))return false;let r=String(t).trim();return !(r.startsWith("-")||(r.match(/\+/g)||[]).length>1||r.includes("+")&&!r.startsWith("+")||!/^\+?[0-9-]+$/.test(r)||r.length<3||r.length>20||!/[0-9]$/.test(r)||r.includes("--"))}function m(t){return typeof t=="string"}function E(t){if(!a(t))return false;let r=t.trim().toLowerCase();return r==="true"||r==="false"}function a(t){return m(t)&&t.trim().length>0}function Er(t){if(!a(t))return false;let r=t.trim().toLowerCase();return r==="asc"||r==="desc"}function Mr(t){return m(t)&&/^[A-Za-z_][A-Za-z0-9_]*$/.test(t)}var Y=/^(['"`])([\s\S]*)\1$/;function P(t,r){let n=t.trim(),e=W(n);if(e.ok)return e.value;let o=Y.exec(n);return o?o[2]:r?n:null}function W(t){try{return {ok:!0,value:JSON.parse(t)}}catch{}return {ok:false}}function B(t,r=false){if(t===null||c(t)||F(t))return t;if(L(t)){let n=t,e=[];for(let o of n)a(o)?e.push(P(String(o),r)):e.push(o);return e}if(z(t)){let n=t,e={};for(let o of Object.keys(n)){let i=n[o];a(i)?e[o]=P(String(i),r):e[o]=i;}return e}return k(t)||T(t)?t:a(t)?P(String(t),r):null}function Gr(t){try{return T(t)||k(t)?JSON.stringify(t):""}catch{}return ""}function Vr(t,r){let n=Math.trunc(r);if(n===0)return {...t};if(n>0)return {sign:t.sign,digitsInteger:t.digitsInteger,scale:t.scale+n};let e=10n**BigInt(-n);return {sign:t.sign,digitsInteger:t.digitsInteger*e,scale:t.scale+n}}function A(t,r){let n=/^([0-9]+)(?:\.([0-9]*))?e([+\-]?[0-9]+)$/i.exec((()=>{let[i,s]=r.split(/e/i),[p,d=""]=i.split("."),h=p.replace(/^0+/,"")+d,x=parseInt(s,10)-d.length;return `${h||"0"}e${x}`})());if(!n)throw new Error("Failed to parse exponential notation.");let e=n[1],o=parseInt(n[3],10);if(C(o))return e=e+"0".repeat(o),{sign:t,integerPart:e||"0",fractionalPart:""};{let i=-o;if(i>=e.length){let s="0".repeat(i-e.length);return {sign:t,integerPart:"0",fractionalPart:s+e}}else {let s=e.length-i;return {sign:t,integerPart:e.slice(0,s),fractionalPart:e.slice(s)}}}}function J(t){return Number(U(t))}function U(t){let r=t.sign<0?"-":"",n=t.digitsInteger.toString();if(t.scale===0)return r+n;let e=t.scale-n.length;if(e>=0)return r+"0."+"0".repeat(e)+n;let o=n.length-t.scale,i=n.slice(0,o),s=n.slice(o);return r+i+"."+s}function w(t,r=1){return J(r>1?Z(O(t),r,"half-up"):O(t))}function _(t){if(typeof t=="bigint"){let r=t<0n?-1:1,n=(t<0n?-t:t).toString();return {sign:r,integerPart:n,fractionalPart:""}}if(typeof t=="number"){if(!Number.isFinite(t))throw new Error("Input number is not finite.");let r=t<0?-1:1,e=Math.abs(t).toExponential(30);return A(r,e)}if(typeof t=="string"){let r=t.trim().replace(",",".");if(!r)throw new Error("Input string is empty.");let n=1;if((r.startsWith("+")||r.startsWith("-"))&&(n=r.startsWith("-")?-1:1,r=r.slice(1)),/^[0-9]*\.?[0-9]*(e[+\-]?[0-9]+)?$/i.test(r)){if(/e/i.test(r))return A(n,r);let[e="0",o=""]=r.split(".");return {sign:n,integerPart:e,fractionalPart:o}}throw new Error("Invalid numeric string.")}throw new Error("Unsupported input type.")}function O(t){let{sign:r,integerPart:n,fractionalPart:e}=_(t),o=n.replace(/^0+/,"")||"0",i=e.replace(/0+$/,""),s=o+i||"0";return {sign:r,digitsInteger:BigInt(s),scale:i.length}}function Z(t,r,n="half-up"){let e=Math.max(0,Math.trunc(r));if(t.scale<=e)return {...t};let o=t.scale-e,i=10n**BigInt(o),s=t.digitsInteger/i,p=t.digitsInteger%i;if(n==="trunc"||p===0n)return {sign:t.sign,digitsInteger:s,scale:e};let d=i/2n,x=p>=d?s+1n:s;return {sign:t.sign,digitsInteger:x,scale:e}}function G(t){if(!m(t))return "";let r=g(t);return a(r)?r.toLowerCase():""}function an(t){if(!m(t))return "";let r=G(t);return a(r)?r[0].toUpperCase()+r.slice(1):""}function gn(t){return m(t)&&g(t)===""||t===void 0?null:t}function wn(t,r="+7"){if(!m(t))return null;let n=g(t).replace(/[\s\-().]/g,"");return /^00\d{8,15}$/.test(n)?n="+"+n.slice(2):/^\d{10}$/.test(n)?n=r+n:/^\d{9,15}$/.test(n)&&!n.startsWith("0")&&(n="+"+n),/^\+\d{10,15}$/.test(n)?n:null}function g(t){return String(m(t)?t.trim().normalize("NFKC").replace(/[\u200B-\u200D\uFEFF]/g,""):"")}function Fn(t){return m(t)&&g(t)===""||t===null?void 0:t}var X=1024,H=X*1024,S=H*1024,V=S*1024,v=V*1024;function In(t,r=""){let n=w(t);if(!c(n))throw new Error(`toGB: value "${t}" is not numeric`);let e=String(r).trim().toLowerCase().replace(/\s+/g,""),o=e?e[0]:"g",i;switch(o){case "b":i=n/S;break;case "k":i=n/H;break;case "m":i=n/S;break;case "g":i=n;break;case "t":i=n*(V/S);break;case "p":i=n*(v/S);break;default:i=n;break}if(!c(i))throw new Error(`toGB: result is not finite (value="${t}", unit="${r}")`);return Object.is(i,-0)?0:i}function I(t){return String(t).trim().toLowerCase().replace(/\s+/g,"").replace(/(?:\/?s|hash(?:es)?)$/i,"")}var tt={h:1e-9,k:1e-6,m:.001,g:1,t:1e3,p:1e6,e:1e9};function En(t,r=""){let n=w(t);if(!c(n))return 0;let e=I(r),o=e?e[0]:"g",i=tt[o]??1,s=n*i;if(!c(s))throw new Error(`toGH: result is not finite (value="${n}", unit="${e}")`);return Object.is(s,-0)?0:s}var rt={h:1,k:1e3,m:1e6,g:1e9,t:1e12,p:1e15,e:1e18};function jn(t,r=""){let n=w(t);if(!c(n))return 0;let e=I(r),o=e?e[0]:"h",i=rt[o]??1,s=n*i;if(!c(s))throw new Error(`toH: result is not finite (value="${n}", unit="${e}")`);return Object.is(s,-0)?0:s}var nt=/^[a-zA-Z][a-zA-Z\d+\-.]*:/;function zn(t=""){if(!a(t))return "";let r=t.trim(),n=nt.test(r)?r:`http://${r}`;try{return new URL(n).hostname}catch{let o=(r.split("@").pop()||r).split(/[/?#]/,1)[0],i=o.match(/^\[([^\]]+)\]/);return i?i[1]:o.split(":",1)[0]||""}}
|
|
2
|
+
exports.changeFixedDecimalScale=Vr;exports.cidrToRange=M;exports.convertExponentialToParts=A;exports.extractHost=zn;exports.fixedDecimalToNum=J;exports.fixedDecimalToStr=U;exports.floorDateToMinutes=pt;exports.formatDateToString=dt;exports.formatStrToFuncArgs=ot;exports.formatToBool=$;exports.formatToLowerCase=G;exports.formatToNormalCase=an;exports.formatToNull=gn;exports.formatToNum=w;exports.formatToPhone=wn;exports.formatToTrim=g;exports.formatToUndefined=Fn;exports.ipAddrToNum=Nt;exports.isArr=k;exports.isArrFilled=L;exports.isBool=F;exports.isDate=Zt;exports.isEmail=Ht;exports.isExists=Qt;exports.isFunc=qt;exports.isIpAddr=vt;exports.isMacAddr=nr;exports.isNum=c;exports.isNumFloat=sr;exports.isNumN=mr;exports.isNumNZ=R;exports.isNumP=y;exports.isNumPZ=C;exports.isObj=T;exports.isObjFilled=z;exports.isPassword=Tr;exports.isPhone=Fr;exports.isStr=m;exports.isStrAscDesc=Er;exports.isStrBool=E;exports.isStrFilled=a;exports.isVar=Mr;exports.jsonDecode=B;exports.jsonEncode=Gr;exports.normalizeToDecimalComponents=_;exports.numToIpAddr=It;exports.parseIPv4=b;exports.parseStringLike=P;exports.parseToFixedDecimal=O;exports.partsToSeconds=xt;exports.rangeIPv4=j;exports.rangeIPv4ToArr=Mt;exports.roundFixedDecimal=Z;exports.secondsToParts=wt;exports.splitArrToPortions=st;exports.toGB=In;exports.toGH=En;exports.toH=jn;exports.toIPv4=N;exports.tryParseJSON=W;exports.wait=ct;//# sourceMappingURL=index.cjs.map
|
|
1039
3
|
//# sourceMappingURL=index.cjs.map
|