@visulima/pail 4.0.0-alpha.1 → 4.0.0-alpha.10
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/CHANGELOG.md +164 -0
- package/LICENSE.md +434 -6
- package/README.md +323 -0
- package/dist/error.d.ts +104 -0
- package/dist/error.js +76 -0
- package/dist/index.browser.d.ts +3 -1
- package/dist/index.browser.js +1490 -3
- package/dist/index.server.d.ts +3 -1
- package/dist/index.server.js +2668 -14
- package/dist/interactive/index.js +2 -2
- package/dist/middleware/elysia.d.ts +71 -0
- package/dist/middleware/elysia.js +70 -0
- package/dist/middleware/express.d.ts +86 -0
- package/dist/middleware/express.js +29 -0
- package/dist/middleware/fastify.d.ts +81 -0
- package/dist/middleware/fastify.js +46 -0
- package/dist/middleware/hono.d.ts +85 -0
- package/dist/middleware/hono.js +33 -0
- package/dist/middleware/next/handler.d.ts +36 -0
- package/dist/middleware/next/handler.js +53 -0
- package/dist/middleware/next/middleware.d.ts +59 -0
- package/dist/middleware/next/storage.d.ts +14 -0
- package/dist/middleware/shared/create-middleware-logger.d.ts +82 -0
- package/dist/middleware/shared/headers.d.ts +14 -0
- package/dist/middleware/shared/routes.d.ts +30 -0
- package/dist/middleware/shared/storage.d.ts +29 -0
- package/dist/middleware/sveltekit.d.ts +123 -0
- package/dist/middleware/sveltekit.js +43 -0
- package/dist/object-tree.d.ts +2 -2
- package/dist/object-tree.js +7 -7
- package/dist/packem_shared/AbstractJsonReporter-CjtVgHbU.js +288 -0
- package/dist/packem_shared/{AbstractJsonReporter-BaZ33PlE.js → AbstractJsonReporter-DlugSJpY.js} +111 -27
- package/dist/packem_shared/{InteractiveManager-CZ85hGNW.js → InteractiveManager-CowYA3Hx.js} +17 -11
- package/dist/packem_shared/{interactive-stream-hook-DG4BtN12.js → InteractiveStreamHook-BypRlYTX.js} +3 -11
- package/dist/packem_shared/{JsonReporter-VzgyLEYz.js → JsonReporter-BgPvIyC2.js} +2 -2
- package/dist/packem_shared/{JsonReporter-BRw4skd5.js → JsonReporter-Dbw82ewj.js} +2 -2
- package/dist/packem_shared/{PrettyReporter-DySIXBjQ.js → PrettyReporter-C2dCzIaf.js} +54 -8
- package/dist/packem_shared/{format-label-De49vNPd.js → PrettyReporter-gMqa7j_m.js} +370 -75
- package/dist/packem_shared/Spinner-Cokext9b.js +2183 -0
- package/dist/packem_shared/abstract-pretty-reporter-szQO-IgK.js +2635 -0
- package/dist/packem_shared/constants-B1RjD_ps.js +99 -0
- package/dist/packem_shared/createPailError-B_sgL0nF.js +76 -0
- package/dist/packem_shared/getBarChar-D7JfmdTr.js +459 -0
- package/dist/packem_shared/headers-BxHWM6KI.js +127 -0
- package/dist/packem_shared/{index-DqKWykfa.js → index-BEfVUy9P.js} +174 -64
- package/dist/packem_shared/{index-BomQ3E6J.js → index-Bx3-C0j9.js} +29 -21
- package/dist/packem_shared/pailMiddleware-Ci88geIF.js +24 -0
- package/dist/packem_shared/storage-D0vqz8OX.js +36 -0
- package/dist/packem_shared/{InteractiveStreamHook-DiSubbJ1.js → useLogger-D0rU3lcX.js} +13 -1
- package/dist/packem_shared/{write-console-log-based-on-level-DBmRYXpj.js → write-console-log-based-on-level-ree2lDPw.js} +5 -4
- package/dist/packem_shared/{write-stream-BG8fhcs3.js → write-stream-BuFtjATz.js} +1 -1
- package/dist/pail.browser.d.ts +1 -1
- package/dist/processor/environment-processor.d.ts +124 -0
- package/dist/processor/environment-processor.js +82 -0
- package/dist/processor/message-formatter-processor.d.ts +2 -3
- package/dist/processor/message-formatter-processor.js +654 -5
- package/dist/processor/opentelemetry-processor.js +4 -4
- package/dist/processor/redact-processor.d.ts +1 -1
- package/dist/processor/redact-processor.js +2 -1
- package/dist/processor/sampling-processor.d.ts +111 -0
- package/dist/processor/sampling-processor.js +59 -0
- package/dist/progress-bar.d.ts +10 -1
- package/dist/progress-bar.js +75 -20
- package/dist/reporter/file/json-file-reporter.js +1 -1
- package/dist/reporter/http/abstract-http-reporter.js +23 -26
- package/dist/reporter/http/http-reporter.edge-light.js +133 -52
- package/dist/reporter/json/abstract-json-reporter.d.ts +1 -1
- package/dist/reporter/json/index.browser.js +2 -2
- package/dist/reporter/json/index.js +2 -2
- package/dist/reporter/pretty/index.browser.js +1 -1
- package/dist/reporter/pretty/index.js +1 -1
- package/dist/reporter/simple/simple-reporter.server.js +8 -12
- package/dist/spinner.js +37 -4
- package/dist/types.d.ts +3 -3
- package/dist/wide-event.d.ts +300 -0
- package/dist/wide-event.js +283 -0
- package/package.json +71 -7
- package/dist/packem_shared/PrettyReporter-DgZB2eBG.js +0 -222
- package/dist/packem_shared/abstract-pretty-reporter-Di_sdm2r.js +0 -50
- package/dist/packem_shared/get-longest-label-C9PWeyKq.js +0 -9
- package/dist/packem_shared/pail.browser-u2CSR_af.js +0 -1427
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { WideEvent } from '../wide-event.js';
|
|
2
|
+
|
|
3
|
+
const patternToRegex = (pattern) => {
|
|
4
|
+
let regex = "^";
|
|
5
|
+
let index = 0;
|
|
6
|
+
while (index < pattern.length) {
|
|
7
|
+
const char = pattern[index];
|
|
8
|
+
if (char === "*" && pattern[index + 1] === "*") {
|
|
9
|
+
index += 2;
|
|
10
|
+
if (pattern[index] === "/") {
|
|
11
|
+
index += 1;
|
|
12
|
+
}
|
|
13
|
+
if (index >= pattern.length && regex.endsWith("/")) {
|
|
14
|
+
regex = `${regex.slice(0, -1)}(/.*)?`;
|
|
15
|
+
} else if (index >= pattern.length) {
|
|
16
|
+
regex += ".*";
|
|
17
|
+
} else {
|
|
18
|
+
regex += "(.*/)?";
|
|
19
|
+
}
|
|
20
|
+
} else {
|
|
21
|
+
switch (char) {
|
|
22
|
+
case "*": {
|
|
23
|
+
regex += "[^/]*";
|
|
24
|
+
index += 1;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
case ".": {
|
|
28
|
+
regex += String.raw`\.`;
|
|
29
|
+
index += 1;
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
case "?": {
|
|
33
|
+
regex += "[^/]";
|
|
34
|
+
index += 1;
|
|
35
|
+
break;
|
|
36
|
+
}
|
|
37
|
+
default: {
|
|
38
|
+
regex += char;
|
|
39
|
+
index += 1;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
regex += "$";
|
|
45
|
+
return new RegExp(regex);
|
|
46
|
+
};
|
|
47
|
+
const matchesPattern = (path, pattern) => patternToRegex(pattern).test(path);
|
|
48
|
+
const shouldLog = (path, include, exclude) => {
|
|
49
|
+
if (exclude?.some((pattern) => matchesPattern(path, pattern))) {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
if (!include?.length) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
return include.some((pattern) => matchesPattern(path, pattern));
|
|
56
|
+
};
|
|
57
|
+
const getServiceForPath = (path, routes) => {
|
|
58
|
+
if (!routes) {
|
|
59
|
+
return void 0;
|
|
60
|
+
}
|
|
61
|
+
const entries = Object.entries(routes);
|
|
62
|
+
for (let i = 0; i < entries.length; i += 1) {
|
|
63
|
+
const [pattern, config] = entries[i];
|
|
64
|
+
if (matchesPattern(path, pattern)) {
|
|
65
|
+
return config.service;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return void 0;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const createMiddlewareLogger = (options, request) => {
|
|
72
|
+
const { exclude, include, pail, routes, service } = options;
|
|
73
|
+
const { headers, method, path, requestId } = request;
|
|
74
|
+
if (!shouldLog(path, include, exclude)) {
|
|
75
|
+
const noopLogger = new WideEvent({ autoEmit: false, name: `${method} ${path}`, pail });
|
|
76
|
+
return {
|
|
77
|
+
finish: () => {
|
|
78
|
+
},
|
|
79
|
+
logger: noopLogger,
|
|
80
|
+
skipped: true
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const routeService = getServiceForPath(path, routes) ?? service;
|
|
84
|
+
const logger = new WideEvent({
|
|
85
|
+
name: `${method} ${path}`,
|
|
86
|
+
pail,
|
|
87
|
+
service: routeService
|
|
88
|
+
});
|
|
89
|
+
logger.set({
|
|
90
|
+
method,
|
|
91
|
+
path,
|
|
92
|
+
requestId,
|
|
93
|
+
...headers ? { headers } : {}
|
|
94
|
+
});
|
|
95
|
+
const finish = (finishOptions) => {
|
|
96
|
+
logger.finish(finishOptions);
|
|
97
|
+
};
|
|
98
|
+
return {
|
|
99
|
+
finish,
|
|
100
|
+
logger,
|
|
101
|
+
skipped: false
|
|
102
|
+
};
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const SENSITIVE_HEADERS = /* @__PURE__ */ new Set(["authorization", "cookie", "proxy-authorization", "set-cookie", "x-api-key", "x-auth-token"]);
|
|
106
|
+
const extractSafeHeaders = (headers) => {
|
|
107
|
+
const safe = {};
|
|
108
|
+
headers.forEach((value, key) => {
|
|
109
|
+
if (!SENSITIVE_HEADERS.has(key.toLowerCase())) {
|
|
110
|
+
safe[key.toLowerCase()] = value;
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
return safe;
|
|
114
|
+
};
|
|
115
|
+
const extractSafeNodeHeaders = (headers) => {
|
|
116
|
+
const safe = {};
|
|
117
|
+
const entries = Object.entries(headers);
|
|
118
|
+
for (let i = 0; i < entries.length; i += 1) {
|
|
119
|
+
const [key, value] = entries[i];
|
|
120
|
+
if (!SENSITIVE_HEADERS.has(key.toLowerCase()) && value !== void 0) {
|
|
121
|
+
safe[key.toLowerCase()] = Array.isArray(value) ? value.join(", ") : value;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return safe;
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export { extractSafeHeaders as a, createMiddlewareLogger as c, extractSafeNodeHeaders as e };
|
|
@@ -24,6 +24,117 @@ const {
|
|
|
24
24
|
const fs = __cjs_getBuiltinModule("node:fs");
|
|
25
25
|
const tty = __cjs_getBuiltinModule("node:tty");
|
|
26
26
|
|
|
27
|
+
const ambiguousRanges = [161, 161, 164, 164, 167, 168, 170, 170, 173, 174, 176, 180, 182, 186, 188, 191, 198, 198, 208, 208, 215, 216, 222, 225, 230, 230, 232, 234, 236, 237, 240, 240, 242, 243, 247, 250, 252, 252, 254, 254, 257, 257, 273, 273, 275, 275, 283, 283, 294, 295, 299, 299, 305, 307, 312, 312, 319, 322, 324, 324, 328, 331, 333, 333, 338, 339, 358, 359, 363, 363, 462, 462, 464, 464, 466, 466, 468, 468, 470, 470, 472, 472, 474, 474, 476, 476, 593, 593, 609, 609, 708, 708, 711, 711, 713, 715, 717, 717, 720, 720, 728, 731, 733, 733, 735, 735, 768, 879, 913, 929, 931, 937, 945, 961, 963, 969, 1025, 1025, 1040, 1103, 1105, 1105, 8208, 8208, 8211, 8214, 8216, 8217, 8220, 8221, 8224, 8226, 8228, 8231, 8240, 8240, 8242, 8243, 8245, 8245, 8251, 8251, 8254, 8254, 8308, 8308, 8319, 8319, 8321, 8324, 8364, 8364, 8451, 8451, 8453, 8453, 8457, 8457, 8467, 8467, 8470, 8470, 8481, 8482, 8486, 8486, 8491, 8491, 8531, 8532, 8539, 8542, 8544, 8555, 8560, 8569, 8585, 8585, 8592, 8601, 8632, 8633, 8658, 8658, 8660, 8660, 8679, 8679, 8704, 8704, 8706, 8707, 8711, 8712, 8715, 8715, 8719, 8719, 8721, 8721, 8725, 8725, 8730, 8730, 8733, 8736, 8739, 8739, 8741, 8741, 8743, 8748, 8750, 8750, 8756, 8759, 8764, 8765, 8776, 8776, 8780, 8780, 8786, 8786, 8800, 8801, 8804, 8807, 8810, 8811, 8814, 8815, 8834, 8835, 8838, 8839, 8853, 8853, 8857, 8857, 8869, 8869, 8895, 8895, 8978, 8978, 9312, 9449, 9451, 9547, 9552, 9587, 9600, 9615, 9618, 9621, 9632, 9633, 9635, 9641, 9650, 9651, 9654, 9655, 9660, 9661, 9664, 9665, 9670, 9672, 9675, 9675, 9678, 9681, 9698, 9701, 9711, 9711, 9733, 9734, 9737, 9737, 9742, 9743, 9756, 9756, 9758, 9758, 9792, 9792, 9794, 9794, 9824, 9825, 9827, 9829, 9831, 9834, 9836, 9837, 9839, 9839, 9886, 9887, 9919, 9919, 9926, 9933, 9935, 9939, 9941, 9953, 9955, 9955, 9960, 9961, 9963, 9969, 9972, 9972, 9974, 9977, 9979, 9980, 9982, 9983, 10045, 10045, 10102, 10111, 11094, 11097, 12872, 12879, 57344, 63743, 65024, 65039, 65533, 65533, 127232, 127242, 127248, 127277, 127280, 127337, 127344, 127373, 127375, 127376, 127387, 127404, 917760, 917999, 983040, 1048573, 1048576, 1114109];
|
|
28
|
+
const fullwidthRanges = [12288, 12288, 65281, 65376, 65504, 65510];
|
|
29
|
+
const halfwidthRanges = [8361, 8361, 65377, 65470, 65474, 65479, 65482, 65487, 65490, 65495, 65498, 65500, 65512, 65518];
|
|
30
|
+
const narrowRanges = [32, 126, 162, 163, 165, 166, 172, 172, 175, 175, 10214, 10221, 10629, 10630];
|
|
31
|
+
const wideRanges = [4352, 4447, 8986, 8987, 9001, 9002, 9193, 9196, 9200, 9200, 9203, 9203, 9725, 9726, 9748, 9749, 9776, 9783, 9800, 9811, 9855, 9855, 9866, 9871, 9875, 9875, 9889, 9889, 9898, 9899, 9917, 9918, 9924, 9925, 9934, 9934, 9940, 9940, 9962, 9962, 9970, 9971, 9973, 9973, 9978, 9978, 9981, 9981, 9989, 9989, 9994, 9995, 10024, 10024, 10060, 10060, 10062, 10062, 10067, 10069, 10071, 10071, 10133, 10135, 10160, 10160, 10175, 10175, 11035, 11036, 11088, 11088, 11093, 11093, 11904, 11929, 11931, 12019, 12032, 12245, 12272, 12287, 12289, 12350, 12353, 12438, 12441, 12543, 12549, 12591, 12593, 12686, 12688, 12773, 12783, 12830, 12832, 12871, 12880, 42124, 42128, 42182, 43360, 43388, 44032, 55203, 63744, 64255, 65040, 65049, 65072, 65106, 65108, 65126, 65128, 65131, 94176, 94180, 94192, 94198, 94208, 101589, 101631, 101662, 101760, 101874, 110576, 110579, 110581, 110587, 110589, 110590, 110592, 110882, 110898, 110898, 110928, 110930, 110933, 110933, 110948, 110951, 110960, 111355, 119552, 119638, 119648, 119670, 126980, 126980, 127183, 127183, 127374, 127374, 127377, 127386, 127488, 127490, 127504, 127547, 127552, 127560, 127568, 127569, 127584, 127589, 127744, 127776, 127789, 127797, 127799, 127868, 127870, 127891, 127904, 127946, 127951, 127955, 127968, 127984, 127988, 127988, 127992, 128062, 128064, 128064, 128066, 128252, 128255, 128317, 128331, 128334, 128336, 128359, 128378, 128378, 128405, 128406, 128420, 128420, 128507, 128591, 128640, 128709, 128716, 128716, 128720, 128722, 128725, 128728, 128732, 128735, 128747, 128748, 128756, 128764, 128992, 129003, 129008, 129008, 129292, 129338, 129340, 129349, 129351, 129535, 129648, 129660, 129664, 129674, 129678, 129734, 129736, 129736, 129741, 129756, 129759, 129770, 129775, 129784, 131072, 196605, 196608, 262141];
|
|
32
|
+
const isInRange = (ranges, codePoint) => {
|
|
33
|
+
let low = 0;
|
|
34
|
+
let high = Math.floor(ranges.length / 2) - 1;
|
|
35
|
+
while (low <= high) {
|
|
36
|
+
const mid = Math.floor((low + high) / 2);
|
|
37
|
+
const i = mid * 2;
|
|
38
|
+
if (codePoint < ranges[i]) {
|
|
39
|
+
high = mid - 1;
|
|
40
|
+
} else if (codePoint > ranges[i + 1]) {
|
|
41
|
+
low = mid + 1;
|
|
42
|
+
} else {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
};
|
|
48
|
+
const minimumAmbiguousCodePoint = ambiguousRanges[0];
|
|
49
|
+
const maximumAmbiguousCodePoint = ambiguousRanges.at(-1);
|
|
50
|
+
const minimumFullWidthCodePoint = fullwidthRanges[0];
|
|
51
|
+
const maximumFullWidthCodePoint = fullwidthRanges.at(-1);
|
|
52
|
+
const minimumHalfWidthCodePoint = halfwidthRanges[0];
|
|
53
|
+
const maximumHalfWidthCodePoint = halfwidthRanges.at(-1);
|
|
54
|
+
const minimumNarrowCodePoint = narrowRanges[0];
|
|
55
|
+
const maximumNarrowCodePoint = narrowRanges.at(-1);
|
|
56
|
+
const minimumWideCodePoint = wideRanges[0];
|
|
57
|
+
const maximumWideCodePoint = wideRanges.at(-1);
|
|
58
|
+
const commonCjkCodePoint = 19968;
|
|
59
|
+
const [wideFastPathStart, wideFastPathEnd] = findWideFastPathRange(wideRanges);
|
|
60
|
+
function findWideFastPathRange(ranges) {
|
|
61
|
+
let fastPathStart = ranges[0];
|
|
62
|
+
let fastPathEnd = ranges[1];
|
|
63
|
+
for (let index = 0; index < ranges.length; index += 2) {
|
|
64
|
+
const start = ranges[index];
|
|
65
|
+
const end = ranges[index + 1];
|
|
66
|
+
if (commonCjkCodePoint >= start && commonCjkCodePoint <= end) {
|
|
67
|
+
return [start, end];
|
|
68
|
+
}
|
|
69
|
+
if (end - start > fastPathEnd - fastPathStart) {
|
|
70
|
+
fastPathStart = start;
|
|
71
|
+
fastPathEnd = end;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return [fastPathStart, fastPathEnd];
|
|
75
|
+
}
|
|
76
|
+
const isAmbiguous = (codePoint) => {
|
|
77
|
+
if (codePoint < minimumAmbiguousCodePoint || codePoint > maximumAmbiguousCodePoint) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
return isInRange(ambiguousRanges, codePoint);
|
|
81
|
+
};
|
|
82
|
+
const isFullWidth = (codePoint) => {
|
|
83
|
+
if (codePoint < minimumFullWidthCodePoint || codePoint > maximumFullWidthCodePoint) {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
return isInRange(fullwidthRanges, codePoint);
|
|
87
|
+
};
|
|
88
|
+
const isHalfWidth = (codePoint) => {
|
|
89
|
+
if (codePoint < minimumHalfWidthCodePoint || codePoint > maximumHalfWidthCodePoint) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return isInRange(halfwidthRanges, codePoint);
|
|
93
|
+
};
|
|
94
|
+
const isNarrow = (codePoint) => {
|
|
95
|
+
if (codePoint < minimumNarrowCodePoint || codePoint > maximumNarrowCodePoint) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
return isInRange(narrowRanges, codePoint);
|
|
99
|
+
};
|
|
100
|
+
const isWide = (codePoint) => {
|
|
101
|
+
if (codePoint >= wideFastPathStart && codePoint <= wideFastPathEnd) {
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
if (codePoint < minimumWideCodePoint || codePoint > maximumWideCodePoint) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
return isInRange(wideRanges, codePoint);
|
|
108
|
+
};
|
|
109
|
+
function getCategory(codePoint) {
|
|
110
|
+
if (isAmbiguous(codePoint)) {
|
|
111
|
+
return "ambiguous";
|
|
112
|
+
}
|
|
113
|
+
if (isFullWidth(codePoint)) {
|
|
114
|
+
return "fullwidth";
|
|
115
|
+
}
|
|
116
|
+
if (isHalfWidth(codePoint)) {
|
|
117
|
+
return "halfwidth";
|
|
118
|
+
}
|
|
119
|
+
if (isNarrow(codePoint)) {
|
|
120
|
+
return "narrow";
|
|
121
|
+
}
|
|
122
|
+
if (isWide(codePoint)) {
|
|
123
|
+
return "wide";
|
|
124
|
+
}
|
|
125
|
+
return "neutral";
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
function validate(codePoint) {
|
|
129
|
+
if (!Number.isSafeInteger(codePoint)) {
|
|
130
|
+
throw new TypeError(`Expected a code point, got \`${typeof codePoint}\`.`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function eastAsianWidthType(codePoint) {
|
|
134
|
+
validate(codePoint);
|
|
135
|
+
return getCategory(codePoint);
|
|
136
|
+
}
|
|
137
|
+
|
|
27
138
|
const r = String.raw;
|
|
28
139
|
const e = r`\p{Emoji}(?:\p{EMod}|[\u{E0020}-\u{E007E}]+\u{E007F}|\uFE0F?\u20E3?)`;
|
|
29
140
|
const emojiRegex = () => new RegExp(r`\p{RI}{2}|(?)${e}(?:\u200D${e})*`, "gu");
|
|
@@ -79,36 +190,6 @@ const RE_ANSI = /[\u001B\u009B](?:[[()#;?]{0,10}(?:\d{1,4}(?:;\d{0,4})*)?[0-9A-O
|
|
|
79
190
|
const RE_CONTROL = /[\u0000-\u0008\n-\u001F\u007F-\u009F]{1,1000}/y;
|
|
80
191
|
const RE_EMOJI = emojiRegex();
|
|
81
192
|
|
|
82
|
-
function isAmbiguous(x) {
|
|
83
|
-
return x === 161 || x === 164 || x === 167 || x === 168 || x === 170 || x === 173 || x === 174 || x >= 176 && x <= 180 || x >= 182 && x <= 186 || x >= 188 && x <= 191 || x === 198 || x === 208 || x === 215 || x === 216 || x >= 222 && x <= 225 || x === 230 || x >= 232 && x <= 234 || x === 236 || x === 237 || x === 240 || x === 242 || x === 243 || x >= 247 && x <= 250 || x === 252 || x === 254 || x === 257 || x === 273 || x === 275 || x === 283 || x === 294 || x === 295 || x === 299 || x >= 305 && x <= 307 || x === 312 || x >= 319 && x <= 322 || x === 324 || x >= 328 && x <= 331 || x === 333 || x === 338 || x === 339 || x === 358 || x === 359 || x === 363 || x === 462 || x === 464 || x === 466 || x === 468 || x === 470 || x === 472 || x === 474 || x === 476 || x === 593 || x === 609 || x === 708 || x === 711 || x >= 713 && x <= 715 || x === 717 || x === 720 || x >= 728 && x <= 731 || x === 733 || x === 735 || x >= 768 && x <= 879 || x >= 913 && x <= 929 || x >= 931 && x <= 937 || x >= 945 && x <= 961 || x >= 963 && x <= 969 || x === 1025 || x >= 1040 && x <= 1103 || x === 1105 || x === 8208 || x >= 8211 && x <= 8214 || x === 8216 || x === 8217 || x === 8220 || x === 8221 || x >= 8224 && x <= 8226 || x >= 8228 && x <= 8231 || x === 8240 || x === 8242 || x === 8243 || x === 8245 || x === 8251 || x === 8254 || x === 8308 || x === 8319 || x >= 8321 && x <= 8324 || x === 8364 || x === 8451 || x === 8453 || x === 8457 || x === 8467 || x === 8470 || x === 8481 || x === 8482 || x === 8486 || x === 8491 || x === 8531 || x === 8532 || x >= 8539 && x <= 8542 || x >= 8544 && x <= 8555 || x >= 8560 && x <= 8569 || x === 8585 || x >= 8592 && x <= 8601 || x === 8632 || x === 8633 || x === 8658 || x === 8660 || x === 8679 || x === 8704 || x === 8706 || x === 8707 || x === 8711 || x === 8712 || x === 8715 || x === 8719 || x === 8721 || x === 8725 || x === 8730 || x >= 8733 && x <= 8736 || x === 8739 || x === 8741 || x >= 8743 && x <= 8748 || x === 8750 || x >= 8756 && x <= 8759 || x === 8764 || x === 8765 || x === 8776 || x === 8780 || x === 8786 || x === 8800 || x === 8801 || x >= 8804 && x <= 8807 || x === 8810 || x === 8811 || x === 8814 || x === 8815 || x === 8834 || x === 8835 || x === 8838 || x === 8839 || x === 8853 || x === 8857 || x === 8869 || x === 8895 || x === 8978 || x >= 9312 && x <= 9449 || x >= 9451 && x <= 9547 || x >= 9552 && x <= 9587 || x >= 9600 && x <= 9615 || x >= 9618 && x <= 9621 || x === 9632 || x === 9633 || x >= 9635 && x <= 9641 || x === 9650 || x === 9651 || x === 9654 || x === 9655 || x === 9660 || x === 9661 || x === 9664 || x === 9665 || x >= 9670 && x <= 9672 || x === 9675 || x >= 9678 && x <= 9681 || x >= 9698 && x <= 9701 || x === 9711 || x === 9733 || x === 9734 || x === 9737 || x === 9742 || x === 9743 || x === 9756 || x === 9758 || x === 9792 || x === 9794 || x === 9824 || x === 9825 || x >= 9827 && x <= 9829 || x >= 9831 && x <= 9834 || x === 9836 || x === 9837 || x === 9839 || x === 9886 || x === 9887 || x === 9919 || x >= 9926 && x <= 9933 || x >= 9935 && x <= 9939 || x >= 9941 && x <= 9953 || x === 9955 || x === 9960 || x === 9961 || x >= 9963 && x <= 9969 || x === 9972 || x >= 9974 && x <= 9977 || x === 9979 || x === 9980 || x === 9982 || x === 9983 || x === 10045 || x >= 10102 && x <= 10111 || x >= 11094 && x <= 11097 || x >= 12872 && x <= 12879 || x >= 57344 && x <= 63743 || x >= 65024 && x <= 65039 || x === 65533 || x >= 127232 && x <= 127242 || x >= 127248 && x <= 127277 || x >= 127280 && x <= 127337 || x >= 127344 && x <= 127373 || x === 127375 || x === 127376 || x >= 127387 && x <= 127404 || x >= 917760 && x <= 917999 || x >= 983040 && x <= 1048573 || x >= 1048576 && x <= 1114109;
|
|
84
|
-
}
|
|
85
|
-
function isFullWidth(x) {
|
|
86
|
-
return x === 12288 || x >= 65281 && x <= 65376 || x >= 65504 && x <= 65510;
|
|
87
|
-
}
|
|
88
|
-
function isWide(x) {
|
|
89
|
-
return x >= 4352 && x <= 4447 || x === 8986 || x === 8987 || x === 9001 || x === 9002 || x >= 9193 && x <= 9196 || x === 9200 || x === 9203 || x === 9725 || x === 9726 || x === 9748 || x === 9749 || x >= 9776 && x <= 9783 || x >= 9800 && x <= 9811 || x === 9855 || x >= 9866 && x <= 9871 || x === 9875 || x === 9889 || x === 9898 || x === 9899 || x === 9917 || x === 9918 || x === 9924 || x === 9925 || x === 9934 || x === 9940 || x === 9962 || x === 9970 || x === 9971 || x === 9973 || x === 9978 || x === 9981 || x === 9989 || x === 9994 || x === 9995 || x === 10024 || x === 10060 || x === 10062 || x >= 10067 && x <= 10069 || x === 10071 || x >= 10133 && x <= 10135 || x === 10160 || x === 10175 || x === 11035 || x === 11036 || x === 11088 || x === 11093 || x >= 11904 && x <= 11929 || x >= 11931 && x <= 12019 || x >= 12032 && x <= 12245 || x >= 12272 && x <= 12287 || x >= 12289 && x <= 12350 || x >= 12353 && x <= 12438 || x >= 12441 && x <= 12543 || x >= 12549 && x <= 12591 || x >= 12593 && x <= 12686 || x >= 12688 && x <= 12773 || x >= 12783 && x <= 12830 || x >= 12832 && x <= 12871 || x >= 12880 && x <= 42124 || x >= 42128 && x <= 42182 || x >= 43360 && x <= 43388 || x >= 44032 && x <= 55203 || x >= 63744 && x <= 64255 || x >= 65040 && x <= 65049 || x >= 65072 && x <= 65106 || x >= 65108 && x <= 65126 || x >= 65128 && x <= 65131 || x >= 94176 && x <= 94180 || x >= 94192 && x <= 94198 || x >= 94208 && x <= 101589 || x >= 101631 && x <= 101662 || x >= 101760 && x <= 101874 || x >= 110576 && x <= 110579 || x >= 110581 && x <= 110587 || x === 110589 || x === 110590 || x >= 110592 && x <= 110882 || x === 110898 || x >= 110928 && x <= 110930 || x === 110933 || x >= 110948 && x <= 110951 || x >= 110960 && x <= 111355 || x >= 119552 && x <= 119638 || x >= 119648 && x <= 119670 || x === 126980 || x === 127183 || x === 127374 || x >= 127377 && x <= 127386 || x >= 127488 && x <= 127490 || x >= 127504 && x <= 127547 || x >= 127552 && x <= 127560 || x === 127568 || x === 127569 || x >= 127584 && x <= 127589 || x >= 127744 && x <= 127776 || x >= 127789 && x <= 127797 || x >= 127799 && x <= 127868 || x >= 127870 && x <= 127891 || x >= 127904 && x <= 127946 || x >= 127951 && x <= 127955 || x >= 127968 && x <= 127984 || x === 127988 || x >= 127992 && x <= 128062 || x === 128064 || x >= 128066 && x <= 128252 || x >= 128255 && x <= 128317 || x >= 128331 && x <= 128334 || x >= 128336 && x <= 128359 || x === 128378 || x === 128405 || x === 128406 || x === 128420 || x >= 128507 && x <= 128591 || x >= 128640 && x <= 128709 || x === 128716 || x >= 128720 && x <= 128722 || x >= 128725 && x <= 128728 || x >= 128732 && x <= 128735 || x === 128747 || x === 128748 || x >= 128756 && x <= 128764 || x >= 128992 && x <= 129003 || x === 129008 || x >= 129292 && x <= 129338 || x >= 129340 && x <= 129349 || x >= 129351 && x <= 129535 || x >= 129648 && x <= 129660 || x >= 129664 && x <= 129674 || x >= 129678 && x <= 129734 || x === 129736 || x >= 129741 && x <= 129756 || x >= 129759 && x <= 129770 || x >= 129775 && x <= 129784 || x >= 131072 && x <= 196605 || x >= 196608 && x <= 262141;
|
|
90
|
-
}
|
|
91
|
-
function getCategory(x) {
|
|
92
|
-
if (isAmbiguous(x)) return "ambiguous";
|
|
93
|
-
if (isFullWidth(x)) return "fullwidth";
|
|
94
|
-
if (x === 8361 || x >= 65377 && x <= 65470 || x >= 65474 && x <= 65479 || x >= 65482 && x <= 65487 || x >= 65490 && x <= 65495 || x >= 65498 && x <= 65500 || x >= 65512 && x <= 65518) {
|
|
95
|
-
return "halfwidth";
|
|
96
|
-
}
|
|
97
|
-
if (x >= 32 && x <= 126 || x === 162 || x === 163 || x === 165 || x === 166 || x === 172 || x === 175 || x >= 10214 && x <= 10221 || x === 10629 || x === 10630) {
|
|
98
|
-
return "narrow";
|
|
99
|
-
}
|
|
100
|
-
if (isWide(x)) return "wide";
|
|
101
|
-
return "neutral";
|
|
102
|
-
}
|
|
103
|
-
function validate(codePoint) {
|
|
104
|
-
if (!Number.isSafeInteger(codePoint)) {
|
|
105
|
-
throw new TypeError(`Expected a code point, got \`${typeof codePoint}\`.`);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
function eastAsianWidthType(codePoint) {
|
|
109
|
-
validate(codePoint);
|
|
110
|
-
return getCategory(codePoint);
|
|
111
|
-
}
|
|
112
193
|
const charWidthCache = /* @__PURE__ */ new Map();
|
|
113
194
|
const RE_LATIN_CHARS = /(?:[\u0020-\u007E\u00A0-\u00FF](?!\uFE0F)){1,1000}/y;
|
|
114
195
|
const getCharType = (codePoint) => {
|
|
@@ -441,9 +522,10 @@ const getStringTruncatedWidth = (input, options = {}) => {
|
|
|
441
522
|
|
|
442
523
|
const getStringWidth = (input, options = {}) => getStringTruncatedWidth(input, { ...options, ellipsis: "", ellipsisWidth: 0, limit: Number.POSITIVE_INFINITY }).width;
|
|
443
524
|
|
|
525
|
+
const RE_ANSI_CODE = /\x1B\[(\d+)m/;
|
|
444
526
|
class AnsiStateTracker {
|
|
445
|
-
activeForeground =
|
|
446
|
-
activeBackground =
|
|
527
|
+
activeForeground = void 0;
|
|
528
|
+
activeBackground = void 0;
|
|
447
529
|
// Track other formatting (bold, italic, etc.)
|
|
448
530
|
activeFormatting = [];
|
|
449
531
|
/**
|
|
@@ -451,24 +533,24 @@ class AnsiStateTracker {
|
|
|
451
533
|
* @param sequence The escape sequence to process
|
|
452
534
|
*/
|
|
453
535
|
processEscape(sequence) {
|
|
454
|
-
const match =
|
|
536
|
+
const match = RE_ANSI_CODE.exec(sequence);
|
|
455
537
|
if (!match) {
|
|
456
538
|
return;
|
|
457
539
|
}
|
|
458
540
|
const code = Number.parseInt(match[1], 10);
|
|
459
541
|
switch (code) {
|
|
460
542
|
case 0: {
|
|
461
|
-
this.activeForeground =
|
|
462
|
-
this.activeBackground =
|
|
543
|
+
this.activeForeground = void 0;
|
|
544
|
+
this.activeBackground = void 0;
|
|
463
545
|
this.activeFormatting = [];
|
|
464
546
|
break;
|
|
465
547
|
}
|
|
466
548
|
case 39: {
|
|
467
|
-
this.activeForeground =
|
|
549
|
+
this.activeForeground = void 0;
|
|
468
550
|
break;
|
|
469
551
|
}
|
|
470
552
|
case 49: {
|
|
471
|
-
this.activeBackground =
|
|
553
|
+
this.activeBackground = void 0;
|
|
472
554
|
break;
|
|
473
555
|
}
|
|
474
556
|
default: {
|
|
@@ -502,7 +584,7 @@ class AnsiStateTracker {
|
|
|
502
584
|
}
|
|
503
585
|
}
|
|
504
586
|
/**
|
|
505
|
-
* Gets all active escape sequences to apply
|
|
587
|
+
* Gets all active escape sequences to apply.
|
|
506
588
|
* @returns String with all active escapes
|
|
507
589
|
*/
|
|
508
590
|
getStartEscapesForAllActiveAttributes() {
|
|
@@ -532,7 +614,7 @@ class AnsiStateTracker {
|
|
|
532
614
|
"\x1B[9m": "\x1B[29m"
|
|
533
615
|
// Strikethrough
|
|
534
616
|
};
|
|
535
|
-
[...this.activeFormatting].
|
|
617
|
+
[...this.activeFormatting].toReversed().forEach((formatCode) => {
|
|
536
618
|
const resetCode = formatResetMap[formatCode];
|
|
537
619
|
if (resetCode) {
|
|
538
620
|
closingEscapes.push(resetCode);
|
|
@@ -561,7 +643,6 @@ const processAnsiString = (string, options = {}) => {
|
|
|
561
643
|
const stateTracker = new AnsiStateTracker();
|
|
562
644
|
let currentText = "";
|
|
563
645
|
let isInsideEscape = false;
|
|
564
|
-
let isInsideLinkEscape = false;
|
|
565
646
|
let escapeBuffer = "";
|
|
566
647
|
let currentUrl = "";
|
|
567
648
|
let isInHyperlink = false;
|
|
@@ -589,7 +670,7 @@ const processAnsiString = (string, options = {}) => {
|
|
|
589
670
|
isInsideEscape = true;
|
|
590
671
|
escapeBuffer = character;
|
|
591
672
|
const escapeInfo = checkEscapeSequence(chars, index);
|
|
592
|
-
isInsideLinkEscape = escapeInfo
|
|
673
|
+
const { isInsideLinkEscape } = escapeInfo;
|
|
593
674
|
if (isInsideLinkEscape) {
|
|
594
675
|
let urlEnd = index + 1;
|
|
595
676
|
currentUrl = "";
|
|
@@ -616,7 +697,6 @@ const processAnsiString = (string, options = {}) => {
|
|
|
616
697
|
index = urlEnd;
|
|
617
698
|
isInHyperlink = true;
|
|
618
699
|
isInsideEscape = false;
|
|
619
|
-
isInsideLinkEscape = false;
|
|
620
700
|
escapeBuffer = "";
|
|
621
701
|
continue;
|
|
622
702
|
}
|
|
@@ -702,7 +782,7 @@ const processAnsiString = (string, options = {}) => {
|
|
|
702
782
|
};
|
|
703
783
|
const wrapAnsiCode = (code) => {
|
|
704
784
|
const escapeChar = ESCAPES.values().next().value;
|
|
705
|
-
return `${escapeChar}${ANSI_CSI}${code}${ANSI_SGR_TERMINATOR}`;
|
|
785
|
+
return `${escapeChar}${ANSI_CSI}${String(code)}${ANSI_SGR_TERMINATOR}`;
|
|
706
786
|
};
|
|
707
787
|
const wrapAnsiHyperlink = (url) => {
|
|
708
788
|
const escapeChar = ESCAPES.values().next().value;
|
|
@@ -753,6 +833,8 @@ const preserveAnsi = (rawLines) => {
|
|
|
753
833
|
}
|
|
754
834
|
return returnValue;
|
|
755
835
|
};
|
|
836
|
+
const RE_SPLIT_WHITESPACE = /(?=\s)|(?<=\s)/;
|
|
837
|
+
const RE_WHITESPACE_ONLY = /^\s+$/;
|
|
756
838
|
const resetAnsiAtLineBreak = (currentLine) => {
|
|
757
839
|
if (!currentLine.includes("\x1B")) {
|
|
758
840
|
return currentLine;
|
|
@@ -791,7 +873,8 @@ const wrapWithBreakAtWidth = (string, width, trim) => {
|
|
|
791
873
|
let isInsideEscape = false;
|
|
792
874
|
let isInsideLinkEscape = false;
|
|
793
875
|
let escapeBuffer = "";
|
|
794
|
-
|
|
876
|
+
let index = 0;
|
|
877
|
+
while (index < string.length) {
|
|
795
878
|
const char = string[index];
|
|
796
879
|
if (ESCAPES.has(char)) {
|
|
797
880
|
isInsideEscape = true;
|
|
@@ -799,6 +882,7 @@ const wrapWithBreakAtWidth = (string, width, trim) => {
|
|
|
799
882
|
currentLine += char;
|
|
800
883
|
const escapeInfo = checkEscapeSequence([...string], index);
|
|
801
884
|
isInsideLinkEscape = escapeInfo.isInsideLinkEscape;
|
|
885
|
+
index += 1;
|
|
802
886
|
continue;
|
|
803
887
|
}
|
|
804
888
|
if (isInsideEscape) {
|
|
@@ -812,12 +896,14 @@ const wrapWithBreakAtWidth = (string, width, trim) => {
|
|
|
812
896
|
isInsideEscape = false;
|
|
813
897
|
ansiTracker.processEscape(escapeBuffer);
|
|
814
898
|
}
|
|
899
|
+
index += 1;
|
|
815
900
|
continue;
|
|
816
901
|
}
|
|
817
902
|
const charWidth = getStringWidth(char);
|
|
818
903
|
const isSpace = char === " ";
|
|
819
904
|
if (charWidth === 0) {
|
|
820
905
|
currentLine += char;
|
|
906
|
+
index += 1;
|
|
821
907
|
continue;
|
|
822
908
|
}
|
|
823
909
|
if (currentWidth + charWidth > width) {
|
|
@@ -829,12 +915,6 @@ const wrapWithBreakAtWidth = (string, width, trim) => {
|
|
|
829
915
|
if (isSpace && trim) {
|
|
830
916
|
while (index < string.length && string[index] === " ") {
|
|
831
917
|
index += 1;
|
|
832
|
-
if (index >= string.length) {
|
|
833
|
-
break;
|
|
834
|
-
}
|
|
835
|
-
}
|
|
836
|
-
if (index < string.length) {
|
|
837
|
-
index--;
|
|
838
918
|
}
|
|
839
919
|
continue;
|
|
840
920
|
}
|
|
@@ -850,9 +930,10 @@ const wrapWithBreakAtWidth = (string, width, trim) => {
|
|
|
850
930
|
while (index < string.length && string[index] === " ") {
|
|
851
931
|
index += 1;
|
|
852
932
|
}
|
|
853
|
-
|
|
933
|
+
continue;
|
|
854
934
|
}
|
|
855
935
|
}
|
|
936
|
+
index += 1;
|
|
856
937
|
}
|
|
857
938
|
if (currentLine) {
|
|
858
939
|
rows.push(currentLine + ansiTracker.getEndEscapesForAllActiveAttributes());
|
|
@@ -872,13 +953,15 @@ const wrapCharByChar = (string, width, trim) => {
|
|
|
872
953
|
let currentWidth = 0;
|
|
873
954
|
processAnsiString(inputToProcess, {
|
|
874
955
|
getWidth: getStringWidth,
|
|
956
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity,sonarjs/no-invariant-returns
|
|
875
957
|
onSegment: (segment, stateTracker) => {
|
|
958
|
+
const segText = segment.text ?? "";
|
|
876
959
|
if (segment.isEscapeSequence) {
|
|
877
|
-
currentLine +=
|
|
960
|
+
currentLine += segText;
|
|
878
961
|
} else {
|
|
879
|
-
const isSpace =
|
|
962
|
+
const isSpace = segText === " ";
|
|
880
963
|
if (segment.width === 0) {
|
|
881
|
-
currentLine +=
|
|
964
|
+
currentLine += segText;
|
|
882
965
|
return true;
|
|
883
966
|
}
|
|
884
967
|
if (currentWidth + segment.width > width) {
|
|
@@ -891,11 +974,11 @@ const wrapCharByChar = (string, width, trim) => {
|
|
|
891
974
|
if (trim) {
|
|
892
975
|
return true;
|
|
893
976
|
}
|
|
894
|
-
rows.push(stateTracker.getStartEscapesForAllActiveAttributes() +
|
|
977
|
+
rows.push(stateTracker.getStartEscapesForAllActiveAttributes() + segText);
|
|
895
978
|
return true;
|
|
896
979
|
}
|
|
897
980
|
}
|
|
898
|
-
currentLine +=
|
|
981
|
+
currentLine += segText;
|
|
899
982
|
currentWidth += segment.width;
|
|
900
983
|
}
|
|
901
984
|
return true;
|
|
@@ -914,14 +997,14 @@ const wrapWithWordBoundaries = (string, width, trim) => {
|
|
|
914
997
|
if (inputToProcess.length === 0) {
|
|
915
998
|
return [];
|
|
916
999
|
}
|
|
917
|
-
const tokens = inputToProcess.split(
|
|
1000
|
+
const tokens = inputToProcess.split(RE_SPLIT_WHITESPACE);
|
|
918
1001
|
const rows = [];
|
|
919
1002
|
let currentLine = "";
|
|
920
1003
|
let currentWidth = 0;
|
|
921
1004
|
let index = 0;
|
|
922
1005
|
while (index < tokens.length) {
|
|
923
1006
|
const token = tokens[index];
|
|
924
|
-
const isSpace =
|
|
1007
|
+
const isSpace = RE_WHITESPACE_ONLY.test(token);
|
|
925
1008
|
const tokenVisibleWidth = getStringWidth(token);
|
|
926
1009
|
if (token.length === 0) {
|
|
927
1010
|
index += 1;
|
|
@@ -962,14 +1045,14 @@ const wrapAndBreakWords = (string, width, trim) => {
|
|
|
962
1045
|
if (inputToProcess.length === 0) {
|
|
963
1046
|
return [];
|
|
964
1047
|
}
|
|
965
|
-
const tokens = inputToProcess.split(
|
|
1048
|
+
const tokens = inputToProcess.split(RE_SPLIT_WHITESPACE);
|
|
966
1049
|
const rows = [];
|
|
967
1050
|
let currentLine = "";
|
|
968
1051
|
let currentWidth = 0;
|
|
969
1052
|
let index = 0;
|
|
970
1053
|
while (index < tokens.length) {
|
|
971
1054
|
const token = tokens[index];
|
|
972
|
-
const isSpace =
|
|
1055
|
+
const isSpace = RE_WHITESPACE_ONLY.test(token);
|
|
973
1056
|
const tokenVisibleWidth = getStringWidth(token);
|
|
974
1057
|
if (token.length === 0) {
|
|
975
1058
|
index += 1;
|
|
@@ -985,10 +1068,10 @@ const wrapAndBreakWords = (string, width, trim) => {
|
|
|
985
1068
|
}
|
|
986
1069
|
const brokenLines = wrapWithBreakAtWidth(token, width, trim);
|
|
987
1070
|
if (brokenLines.length > 0) {
|
|
988
|
-
for (let
|
|
989
|
-
rows.push(brokenLines[
|
|
1071
|
+
for (let brokenLineIndex = 0; brokenLineIndex < brokenLines.length - 1; brokenLineIndex += 1) {
|
|
1072
|
+
rows.push(brokenLines[brokenLineIndex]);
|
|
990
1073
|
}
|
|
991
|
-
currentLine = brokenLines
|
|
1074
|
+
currentLine = brokenLines.at(-1);
|
|
992
1075
|
currentWidth = getStringWidth(currentLine);
|
|
993
1076
|
} else {
|
|
994
1077
|
currentLine = "";
|
|
@@ -1038,7 +1121,7 @@ const wordWrap = (string, options = {}) => {
|
|
|
1038
1121
|
if (trim && string.trim() === "") {
|
|
1039
1122
|
return "";
|
|
1040
1123
|
}
|
|
1041
|
-
let normalizedString =
|
|
1124
|
+
let normalizedString = string.normalize("NFC").replaceAll("\r\n", "\n");
|
|
1042
1125
|
if (removeZeroWidthCharacters) {
|
|
1043
1126
|
normalizedString = normalizedString.replaceAll(RE_ZERO_WIDTH, "");
|
|
1044
1127
|
}
|
|
@@ -1092,6 +1175,30 @@ const createIfNotDefault = (maybeColumns, maybeRows) => {
|
|
|
1092
1175
|
}
|
|
1093
1176
|
return { columns, rows };
|
|
1094
1177
|
};
|
|
1178
|
+
const isForegroundProcess = () => {
|
|
1179
|
+
if (process.platform !== "linux") {
|
|
1180
|
+
return true;
|
|
1181
|
+
}
|
|
1182
|
+
try {
|
|
1183
|
+
const statContents = fs.readFileSync("/proc/self/stat", "utf8");
|
|
1184
|
+
const closingParenthesisIndex = statContents.lastIndexOf(") ");
|
|
1185
|
+
if (closingParenthesisIndex === -1) {
|
|
1186
|
+
return false;
|
|
1187
|
+
}
|
|
1188
|
+
const statFields = statContents.slice(closingParenthesisIndex + 2).trim().split(/\s+/);
|
|
1189
|
+
const processGroupId = Number.parseInt(statFields[2], 10);
|
|
1190
|
+
const foregroundProcessGroupId = Number.parseInt(statFields[5], 10);
|
|
1191
|
+
if (Number.isNaN(processGroupId) || Number.isNaN(foregroundProcessGroupId)) {
|
|
1192
|
+
return false;
|
|
1193
|
+
}
|
|
1194
|
+
if (foregroundProcessGroupId <= 0) {
|
|
1195
|
+
return false;
|
|
1196
|
+
}
|
|
1197
|
+
return processGroupId === foregroundProcessGroupId;
|
|
1198
|
+
} catch {
|
|
1199
|
+
return false;
|
|
1200
|
+
}
|
|
1201
|
+
};
|
|
1095
1202
|
function terminalSize() {
|
|
1096
1203
|
const { env, stdout, stderr } = process;
|
|
1097
1204
|
if (stdout?.columns && stdout?.rows) {
|
|
@@ -1135,6 +1242,9 @@ const tput = () => {
|
|
|
1135
1242
|
};
|
|
1136
1243
|
const resize = () => {
|
|
1137
1244
|
try {
|
|
1245
|
+
if (!isForegroundProcess()) {
|
|
1246
|
+
return;
|
|
1247
|
+
}
|
|
1138
1248
|
const size = exec("resize", ["-u"]).match(/\d+/g);
|
|
1139
1249
|
if (size.length === 2) {
|
|
1140
1250
|
return createIfNotDefault(size[0], size[1]);
|