esp32tool 1.6.5 → 1.6.6
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/apple-touch-icon.png +0 -0
- package/dist/util/console-color.d.ts +5 -1
- package/dist/util/console-color.js +291 -13
- package/dist/util/timestamp-transformer.js +5 -7
- package/icons/icon-128.png +0 -0
- package/icons/icon-144.png +0 -0
- package/icons/icon-152.png +0 -0
- package/icons/icon-192.png +0 -0
- package/icons/icon-384.png +0 -0
- package/icons/icon-512.png +0 -0
- package/icons/icon-72.png +0 -0
- package/icons/icon-96.png +0 -0
- package/js/util/console-color.js +291 -13
- package/js/util/timestamp-transformer.js +5 -7
- package/package.cli.json +1 -1
- package/package.json +9 -9
- package/screenshots/desktop.png +0 -0
- package/screenshots/mobile.png +0 -0
- package/src/util/console-color.ts +288 -13
- package/src/util/timestamp-transformer.ts +5 -7
- package/sw.js +1 -1
package/js/util/console-color.js
CHANGED
|
@@ -1,3 +1,56 @@
|
|
|
1
|
+
const ANSI_256 = (() => {
|
|
2
|
+
const t = [];
|
|
3
|
+
// Standard colors 0-7
|
|
4
|
+
t[0] = "rgb(0,0,0)";
|
|
5
|
+
t[1] = "rgb(128,0,0)";
|
|
6
|
+
t[2] = "rgb(0,128,0)";
|
|
7
|
+
t[3] = "rgb(128,128,0)";
|
|
8
|
+
t[4] = "rgb(0,0,128)";
|
|
9
|
+
t[5] = "rgb(128,0,128)";
|
|
10
|
+
t[6] = "rgb(0,128,128)";
|
|
11
|
+
t[7] = "rgb(192,192,192)";
|
|
12
|
+
// Bright colors 8-15
|
|
13
|
+
t[8] = "rgb(128,128,128)";
|
|
14
|
+
t[9] = "rgb(255,0,0)";
|
|
15
|
+
t[10] = "rgb(0,255,0)";
|
|
16
|
+
t[11] = "rgb(255,255,0)";
|
|
17
|
+
t[12] = "rgb(99,153,255)";
|
|
18
|
+
t[13] = "rgb(255,0,255)";
|
|
19
|
+
t[14] = "rgb(0,255,255)";
|
|
20
|
+
t[15] = "rgb(255,255,255)";
|
|
21
|
+
// 6x6x6 color cube 16-231
|
|
22
|
+
for (let i = 0; i < 216; i++) {
|
|
23
|
+
const r = Math.floor(i / 36);
|
|
24
|
+
const g = Math.floor((i % 36) / 6);
|
|
25
|
+
const b = i % 6;
|
|
26
|
+
t[16 + i] =
|
|
27
|
+
"rgb(" +
|
|
28
|
+
(r ? r * 40 + 55 : 0) +
|
|
29
|
+
"," +
|
|
30
|
+
(g ? g * 40 + 55 : 0) +
|
|
31
|
+
"," +
|
|
32
|
+
(b ? b * 40 + 55 : 0) +
|
|
33
|
+
")";
|
|
34
|
+
}
|
|
35
|
+
// Grayscale ramp 232-255
|
|
36
|
+
for (let i = 0; i < 24; i++) {
|
|
37
|
+
const v = i * 10 + 8;
|
|
38
|
+
t[232 + i] = "rgb(" + v + "," + v + "," + v + ")";
|
|
39
|
+
}
|
|
40
|
+
return t;
|
|
41
|
+
})();
|
|
42
|
+
// Maps 256-color indices 0–7 to the named CSS class tokens so that
|
|
43
|
+
// \x1b[38;5;1m renders the same red as \x1b[31m.
|
|
44
|
+
const ANSI_NAMED = [
|
|
45
|
+
"black",
|
|
46
|
+
"red",
|
|
47
|
+
"green",
|
|
48
|
+
"yellow",
|
|
49
|
+
"blue",
|
|
50
|
+
"magenta",
|
|
51
|
+
"cyan",
|
|
52
|
+
"white",
|
|
53
|
+
];
|
|
1
54
|
export class ColoredConsole {
|
|
2
55
|
constructor(targetElement) {
|
|
3
56
|
this.targetElement = targetElement;
|
|
@@ -8,6 +61,10 @@ export class ColoredConsole {
|
|
|
8
61
|
strikethrough: false,
|
|
9
62
|
foregroundColor: null,
|
|
10
63
|
backgroundColor: null,
|
|
64
|
+
fgRgb: null,
|
|
65
|
+
bgRgb: null,
|
|
66
|
+
dim: false,
|
|
67
|
+
reverse: false,
|
|
11
68
|
carriageReturn: false,
|
|
12
69
|
lines: [],
|
|
13
70
|
secret: false,
|
|
@@ -24,7 +81,7 @@ export class ColoredConsole {
|
|
|
24
81
|
processLine(line) {
|
|
25
82
|
// biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape sequences
|
|
26
83
|
// eslint-disable-next-line no-control-regex
|
|
27
|
-
const re = /(?:\x1B|\\x1B)(?:\[(.*?)[@-~]|\].*?(?:\x07|\x1B\\))/g;
|
|
84
|
+
const re = /(?:\x1B|\\x1B)(?:\[(.*?)([@-~])|\].*?(?:\x07|\x1B\\))/g;
|
|
28
85
|
let i = 0;
|
|
29
86
|
const lineSpan = document.createElement("span");
|
|
30
87
|
lineSpan.classList.add("line");
|
|
@@ -34,6 +91,8 @@ export class ColoredConsole {
|
|
|
34
91
|
const span = document.createElement("span");
|
|
35
92
|
if (this.state.bold)
|
|
36
93
|
span.classList.add("log-bold");
|
|
94
|
+
if (this.state.dim)
|
|
95
|
+
span.classList.add("log-dim");
|
|
37
96
|
if (this.state.italic)
|
|
38
97
|
span.classList.add("log-italic");
|
|
39
98
|
if (this.state.underline)
|
|
@@ -46,10 +105,41 @@ export class ColoredConsole {
|
|
|
46
105
|
span.classList.add("log-blink");
|
|
47
106
|
if (this.state.rapidBlink)
|
|
48
107
|
span.classList.add("log-rapid-blink");
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
108
|
+
// Resolve colors with reverse-video support
|
|
109
|
+
let fgRgb = this.state.fgRgb;
|
|
110
|
+
let bgRgb = this.state.bgRgb;
|
|
111
|
+
let fg = this.state.foregroundColor;
|
|
112
|
+
let bg = this.state.backgroundColor;
|
|
113
|
+
if (this.state.reverse) {
|
|
114
|
+
fgRgb = this.state.bgRgb;
|
|
115
|
+
bgRgb = this.state.fgRgb;
|
|
116
|
+
fg = this.state.backgroundColor;
|
|
117
|
+
bg = this.state.foregroundColor;
|
|
118
|
+
// When one side is unset, fill in the terminal defaults so the
|
|
119
|
+
// swap is always visible (fg default=#ddd, bg default=#1c1c1c).
|
|
120
|
+
if (!fgRgb && !fg && !bgRgb && !bg) {
|
|
121
|
+
span.classList.add("log-reverse");
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
if (!fgRgb && !fg)
|
|
125
|
+
fgRgb = "rgb(28,28,28)";
|
|
126
|
+
if (!bgRgb && !bg)
|
|
127
|
+
bgRgb = "rgb(221,221,221)";
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Inline rgb() style takes priority over CSS class
|
|
131
|
+
if (fgRgb) {
|
|
132
|
+
span.style.color = fgRgb;
|
|
133
|
+
}
|
|
134
|
+
else if (fg !== null) {
|
|
135
|
+
span.classList.add(`log-fg-${fg}`);
|
|
136
|
+
}
|
|
137
|
+
if (bgRgb) {
|
|
138
|
+
span.style.backgroundColor = bgRgb;
|
|
139
|
+
}
|
|
140
|
+
else if (bg !== null) {
|
|
141
|
+
span.classList.add(`log-bg-${bg}`);
|
|
142
|
+
}
|
|
53
143
|
span.appendChild(document.createTextNode(content));
|
|
54
144
|
lineSpan.appendChild(span);
|
|
55
145
|
if (this.state.secret) {
|
|
@@ -66,18 +156,39 @@ export class ColoredConsole {
|
|
|
66
156
|
const j = match.index;
|
|
67
157
|
addSpan(line.substring(i, j));
|
|
68
158
|
i = j + match[0].length;
|
|
69
|
-
|
|
159
|
+
// Only process SGR sequences (final byte 'm'); skip cursor, erase, etc.
|
|
160
|
+
if (match[1] === undefined || match[2] !== "m")
|
|
161
|
+
continue;
|
|
162
|
+
const rawCodes = match[1] === "" ? [""] : match[1].split(";");
|
|
163
|
+
const codes = [];
|
|
164
|
+
let invalidSgr = false;
|
|
165
|
+
for (const rawCode of rawCodes) {
|
|
166
|
+
if (rawCode === "") {
|
|
167
|
+
codes.push(0);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
if (!/^\d+$/.test(rawCode)) {
|
|
171
|
+
invalidSgr = true;
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
codes.push(Number(rawCode));
|
|
175
|
+
}
|
|
176
|
+
if (invalidSgr)
|
|
70
177
|
continue;
|
|
71
|
-
for (
|
|
72
|
-
|
|
178
|
+
for (let ci = 0; ci < codes.length; ci++) {
|
|
179
|
+
const code = codes[ci];
|
|
180
|
+
switch (code) {
|
|
73
181
|
case 0:
|
|
74
|
-
// reset
|
|
75
182
|
this.state.bold = false;
|
|
183
|
+
this.state.dim = false;
|
|
76
184
|
this.state.italic = false;
|
|
77
185
|
this.state.underline = false;
|
|
78
186
|
this.state.strikethrough = false;
|
|
79
187
|
this.state.foregroundColor = null;
|
|
80
188
|
this.state.backgroundColor = null;
|
|
189
|
+
this.state.fgRgb = null;
|
|
190
|
+
this.state.bgRgb = null;
|
|
191
|
+
this.state.reverse = false;
|
|
81
192
|
this.state.secret = false;
|
|
82
193
|
this.state.blink = false;
|
|
83
194
|
this.state.rapidBlink = false;
|
|
@@ -85,6 +196,9 @@ export class ColoredConsole {
|
|
|
85
196
|
case 1:
|
|
86
197
|
this.state.bold = true;
|
|
87
198
|
break;
|
|
199
|
+
case 2:
|
|
200
|
+
this.state.dim = true;
|
|
201
|
+
break;
|
|
88
202
|
case 3:
|
|
89
203
|
this.state.italic = true;
|
|
90
204
|
break;
|
|
@@ -99,6 +213,9 @@ export class ColoredConsole {
|
|
|
99
213
|
this.state.rapidBlink = true;
|
|
100
214
|
this.state.blink = false;
|
|
101
215
|
break;
|
|
216
|
+
case 7:
|
|
217
|
+
this.state.reverse = true;
|
|
218
|
+
break;
|
|
102
219
|
case 8:
|
|
103
220
|
this.state.secret = true;
|
|
104
221
|
break;
|
|
@@ -107,6 +224,7 @@ export class ColoredConsole {
|
|
|
107
224
|
break;
|
|
108
225
|
case 22:
|
|
109
226
|
this.state.bold = false;
|
|
227
|
+
this.state.dim = false;
|
|
110
228
|
break;
|
|
111
229
|
case 23:
|
|
112
230
|
this.state.italic = false;
|
|
@@ -118,6 +236,9 @@ export class ColoredConsole {
|
|
|
118
236
|
this.state.blink = false;
|
|
119
237
|
this.state.rapidBlink = false;
|
|
120
238
|
break;
|
|
239
|
+
case 27:
|
|
240
|
+
this.state.reverse = false;
|
|
241
|
+
break;
|
|
121
242
|
case 28:
|
|
122
243
|
this.state.secret = false;
|
|
123
244
|
break;
|
|
@@ -126,57 +247,211 @@ export class ColoredConsole {
|
|
|
126
247
|
break;
|
|
127
248
|
case 30:
|
|
128
249
|
this.state.foregroundColor = "black";
|
|
250
|
+
this.state.fgRgb = null;
|
|
129
251
|
break;
|
|
130
252
|
case 31:
|
|
131
253
|
this.state.foregroundColor = "red";
|
|
254
|
+
this.state.fgRgb = null;
|
|
132
255
|
break;
|
|
133
256
|
case 32:
|
|
134
257
|
this.state.foregroundColor = "green";
|
|
258
|
+
this.state.fgRgb = null;
|
|
135
259
|
break;
|
|
136
260
|
case 33:
|
|
137
261
|
this.state.foregroundColor = "yellow";
|
|
262
|
+
this.state.fgRgb = null;
|
|
138
263
|
break;
|
|
139
264
|
case 34:
|
|
140
265
|
this.state.foregroundColor = "blue";
|
|
266
|
+
this.state.fgRgb = null;
|
|
141
267
|
break;
|
|
142
268
|
case 35:
|
|
143
269
|
this.state.foregroundColor = "magenta";
|
|
270
|
+
this.state.fgRgb = null;
|
|
144
271
|
break;
|
|
145
272
|
case 36:
|
|
146
273
|
this.state.foregroundColor = "cyan";
|
|
274
|
+
this.state.fgRgb = null;
|
|
147
275
|
break;
|
|
148
276
|
case 37:
|
|
149
277
|
this.state.foregroundColor = "white";
|
|
278
|
+
this.state.fgRgb = null;
|
|
279
|
+
break;
|
|
280
|
+
case 38:
|
|
281
|
+
// Extended foreground: 38;5;n (256-color) or 38;2;r;g;b (true-color)
|
|
282
|
+
if (ci + 1 < codes.length) {
|
|
283
|
+
if (codes[ci + 1] === 5) {
|
|
284
|
+
if (ci + 2 < codes.length) {
|
|
285
|
+
const idx = codes[ci + 2];
|
|
286
|
+
if (idx >= 0 && idx <= 7 && ANSI_NAMED[idx]) {
|
|
287
|
+
this.state.foregroundColor = ANSI_NAMED[idx];
|
|
288
|
+
this.state.fgRgb = null;
|
|
289
|
+
}
|
|
290
|
+
else if (idx >= 0 && idx <= 255 && ANSI_256[idx]) {
|
|
291
|
+
this.state.foregroundColor = null;
|
|
292
|
+
this.state.fgRgb = ANSI_256[idx];
|
|
293
|
+
}
|
|
294
|
+
ci += 2;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
ci += 1;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
else if (codes[ci + 1] === 2) {
|
|
301
|
+
if (ci + 4 < codes.length) {
|
|
302
|
+
this.state.foregroundColor = null;
|
|
303
|
+
const r = Math.max(0, Math.min(255, codes[ci + 2]));
|
|
304
|
+
const g = Math.max(0, Math.min(255, codes[ci + 3]));
|
|
305
|
+
const b = Math.max(0, Math.min(255, codes[ci + 4]));
|
|
306
|
+
this.state.fgRgb = "rgb(" + r + "," + g + "," + b + ")";
|
|
307
|
+
ci += 4;
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
ci = codes.length - 1;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
150
314
|
break;
|
|
151
315
|
case 39:
|
|
152
316
|
this.state.foregroundColor = null;
|
|
317
|
+
this.state.fgRgb = null;
|
|
153
318
|
break;
|
|
154
319
|
case 40:
|
|
155
320
|
this.state.backgroundColor = "black";
|
|
321
|
+
this.state.bgRgb = null;
|
|
156
322
|
break;
|
|
157
323
|
case 41:
|
|
158
324
|
this.state.backgroundColor = "red";
|
|
325
|
+
this.state.bgRgb = null;
|
|
159
326
|
break;
|
|
160
327
|
case 42:
|
|
161
328
|
this.state.backgroundColor = "green";
|
|
329
|
+
this.state.bgRgb = null;
|
|
162
330
|
break;
|
|
163
331
|
case 43:
|
|
164
332
|
this.state.backgroundColor = "yellow";
|
|
333
|
+
this.state.bgRgb = null;
|
|
165
334
|
break;
|
|
166
335
|
case 44:
|
|
167
336
|
this.state.backgroundColor = "blue";
|
|
337
|
+
this.state.bgRgb = null;
|
|
168
338
|
break;
|
|
169
339
|
case 45:
|
|
170
340
|
this.state.backgroundColor = "magenta";
|
|
341
|
+
this.state.bgRgb = null;
|
|
171
342
|
break;
|
|
172
343
|
case 46:
|
|
173
344
|
this.state.backgroundColor = "cyan";
|
|
345
|
+
this.state.bgRgb = null;
|
|
174
346
|
break;
|
|
175
347
|
case 47:
|
|
176
348
|
this.state.backgroundColor = "white";
|
|
349
|
+
this.state.bgRgb = null;
|
|
350
|
+
break;
|
|
351
|
+
case 48:
|
|
352
|
+
// Extended background: 48;5;n (256-color) or 48;2;r;g;b (true-color)
|
|
353
|
+
if (ci + 1 < codes.length) {
|
|
354
|
+
if (codes[ci + 1] === 5) {
|
|
355
|
+
if (ci + 2 < codes.length) {
|
|
356
|
+
const idx = codes[ci + 2];
|
|
357
|
+
if (idx >= 0 && idx <= 7 && ANSI_NAMED[idx]) {
|
|
358
|
+
this.state.backgroundColor = ANSI_NAMED[idx];
|
|
359
|
+
this.state.bgRgb = null;
|
|
360
|
+
}
|
|
361
|
+
else if (idx >= 0 && idx <= 255 && ANSI_256[idx]) {
|
|
362
|
+
this.state.backgroundColor = null;
|
|
363
|
+
this.state.bgRgb = ANSI_256[idx];
|
|
364
|
+
}
|
|
365
|
+
ci += 2;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
ci += 1;
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
else if (codes[ci + 1] === 2) {
|
|
372
|
+
if (ci + 4 < codes.length) {
|
|
373
|
+
this.state.backgroundColor = null;
|
|
374
|
+
const r = Math.max(0, Math.min(255, codes[ci + 2]));
|
|
375
|
+
const g = Math.max(0, Math.min(255, codes[ci + 3]));
|
|
376
|
+
const b = Math.max(0, Math.min(255, codes[ci + 4]));
|
|
377
|
+
this.state.bgRgb = "rgb(" + r + "," + g + "," + b + ")";
|
|
378
|
+
ci += 4;
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
ci = codes.length - 1;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
177
385
|
break;
|
|
178
386
|
case 49:
|
|
179
387
|
this.state.backgroundColor = null;
|
|
388
|
+
this.state.bgRgb = null;
|
|
389
|
+
break;
|
|
390
|
+
// Bright foreground colors
|
|
391
|
+
case 90:
|
|
392
|
+
this.state.foregroundColor = null;
|
|
393
|
+
this.state.fgRgb = ANSI_256[8];
|
|
394
|
+
break;
|
|
395
|
+
case 91:
|
|
396
|
+
this.state.foregroundColor = null;
|
|
397
|
+
this.state.fgRgb = ANSI_256[9];
|
|
398
|
+
break;
|
|
399
|
+
case 92:
|
|
400
|
+
this.state.foregroundColor = null;
|
|
401
|
+
this.state.fgRgb = ANSI_256[10];
|
|
402
|
+
break;
|
|
403
|
+
case 93:
|
|
404
|
+
this.state.foregroundColor = null;
|
|
405
|
+
this.state.fgRgb = ANSI_256[11];
|
|
406
|
+
break;
|
|
407
|
+
case 94:
|
|
408
|
+
this.state.foregroundColor = null;
|
|
409
|
+
this.state.fgRgb = ANSI_256[12];
|
|
410
|
+
break;
|
|
411
|
+
case 95:
|
|
412
|
+
this.state.foregroundColor = null;
|
|
413
|
+
this.state.fgRgb = ANSI_256[13];
|
|
414
|
+
break;
|
|
415
|
+
case 96:
|
|
416
|
+
this.state.foregroundColor = null;
|
|
417
|
+
this.state.fgRgb = ANSI_256[14];
|
|
418
|
+
break;
|
|
419
|
+
case 97:
|
|
420
|
+
this.state.foregroundColor = null;
|
|
421
|
+
this.state.fgRgb = ANSI_256[15];
|
|
422
|
+
break;
|
|
423
|
+
// Bright background colors
|
|
424
|
+
case 100:
|
|
425
|
+
this.state.backgroundColor = null;
|
|
426
|
+
this.state.bgRgb = ANSI_256[8];
|
|
427
|
+
break;
|
|
428
|
+
case 101:
|
|
429
|
+
this.state.backgroundColor = null;
|
|
430
|
+
this.state.bgRgb = ANSI_256[9];
|
|
431
|
+
break;
|
|
432
|
+
case 102:
|
|
433
|
+
this.state.backgroundColor = null;
|
|
434
|
+
this.state.bgRgb = ANSI_256[10];
|
|
435
|
+
break;
|
|
436
|
+
case 103:
|
|
437
|
+
this.state.backgroundColor = null;
|
|
438
|
+
this.state.bgRgb = ANSI_256[11];
|
|
439
|
+
break;
|
|
440
|
+
case 104:
|
|
441
|
+
this.state.backgroundColor = null;
|
|
442
|
+
this.state.bgRgb = ANSI_256[12];
|
|
443
|
+
break;
|
|
444
|
+
case 105:
|
|
445
|
+
this.state.backgroundColor = null;
|
|
446
|
+
this.state.bgRgb = ANSI_256[13];
|
|
447
|
+
break;
|
|
448
|
+
case 106:
|
|
449
|
+
this.state.backgroundColor = null;
|
|
450
|
+
this.state.bgRgb = ANSI_256[14];
|
|
451
|
+
break;
|
|
452
|
+
case 107:
|
|
453
|
+
this.state.backgroundColor = null;
|
|
454
|
+
this.state.bgRgb = ANSI_256[15];
|
|
180
455
|
break;
|
|
181
456
|
}
|
|
182
457
|
}
|
|
@@ -193,8 +468,6 @@ export class ColoredConsole {
|
|
|
193
468
|
return;
|
|
194
469
|
}
|
|
195
470
|
for (const line of this.state.lines) {
|
|
196
|
-
// A lone \r is a pure carriage-return signal — update state but don't
|
|
197
|
-
// create a DOM node for it (it has no renderable content).
|
|
198
471
|
if (line === "\r") {
|
|
199
472
|
this.state.carriageReturn = true;
|
|
200
473
|
continue;
|
|
@@ -217,13 +490,11 @@ export class ColoredConsole {
|
|
|
217
490
|
this.targetElement.appendChild(fragment);
|
|
218
491
|
}
|
|
219
492
|
this.state.lines = [];
|
|
220
|
-
// Keep scroll at bottom
|
|
221
493
|
if (atBottom) {
|
|
222
494
|
this.targetElement.scrollTop = this.targetElement.scrollHeight;
|
|
223
495
|
}
|
|
224
496
|
}
|
|
225
497
|
addLine(line) {
|
|
226
|
-
// Processing of lines is deferred for performance reasons
|
|
227
498
|
if (this.state.lines.length === 0) {
|
|
228
499
|
setTimeout(() => this.processLines(), 0);
|
|
229
500
|
}
|
|
@@ -249,6 +520,9 @@ export const coloredConsoleStyles = `
|
|
|
249
520
|
.log-bold {
|
|
250
521
|
font-weight: bold;
|
|
251
522
|
}
|
|
523
|
+
.log-dim {
|
|
524
|
+
opacity: 0.5;
|
|
525
|
+
}
|
|
252
526
|
.log-italic {
|
|
253
527
|
font-style: italic;
|
|
254
528
|
}
|
|
@@ -283,6 +557,10 @@ export const coloredConsoleStyles = `
|
|
|
283
557
|
width: 1px;
|
|
284
558
|
font-size: 1px;
|
|
285
559
|
}
|
|
560
|
+
.log-reverse {
|
|
561
|
+
background: #ddd;
|
|
562
|
+
color: #1c1c1c;
|
|
563
|
+
}
|
|
286
564
|
.log-fg-black {
|
|
287
565
|
color: rgb(128, 128, 128);
|
|
288
566
|
}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
// Matches lines that already carry a wall-clock
|
|
2
|
-
//
|
|
3
|
-
// like
|
|
4
|
-
//
|
|
1
|
+
// Matches lines that already carry a wall-clock timestamp so we don't add a
|
|
2
|
+
// redundant one. Only real wall-clock formats are matched — tick-based
|
|
3
|
+
// formats like FreeRTOS "(12345)" or ESP-IDF "I (15) boot:" are NOT matched
|
|
4
|
+
// because they don't carry time-of-day information
|
|
5
5
|
// Covered formats:
|
|
6
|
-
// (123456) FreeRTOS ms-tick e.g. "(12345) "
|
|
7
6
|
// [HH:MM:SS] wall-clock bracket
|
|
8
7
|
// [HH:MM:SS.mmm] wall-clock bracket with millis
|
|
9
|
-
// I (1234) tag: ESP-IDF log level + tick e.g. "I (1234) wifi: ..."
|
|
10
8
|
// HH:MM:SS.mmm plain wall-clock
|
|
11
|
-
const DEVICE_TIMESTAMP_RE = /^\s*(?:\
|
|
9
|
+
const DEVICE_TIMESTAMP_RE = /^\s*(?:\[\d{2}:\d{2}:\d{2}(?:\.\d+)?\]|(?:\d{2}:){2}\d{2}\.\d)/;
|
|
12
10
|
export class TimestampTransformer {
|
|
13
11
|
constructor() {
|
|
14
12
|
this.deviceHasTimestamps = false;
|
package/package.cli.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "esp32tool",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.6",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Flash & Read ESP devices using WebSerial, Electron, and also Android mobile via WebUSB",
|
|
6
6
|
"main": "electron/main.cjs",
|
|
@@ -50,27 +50,27 @@
|
|
|
50
50
|
"@electron-forge/maker-zip": "^7.11.1",
|
|
51
51
|
"@electron-forge/plugin-auto-unpack-natives": "^7.11.1",
|
|
52
52
|
"@electron/fuses": "^2.1.1",
|
|
53
|
-
"@eslint/js": "^9.39.
|
|
53
|
+
"@eslint/js": "^9.39.4",
|
|
54
54
|
"@rollup/plugin-json": "^6.1.0",
|
|
55
|
-
"@rollup/plugin-node-resolve": "^16.0.
|
|
55
|
+
"@rollup/plugin-node-resolve": "^16.0.3",
|
|
56
56
|
"@rollup/plugin-terser": "^1.0.0",
|
|
57
57
|
"@rollup/plugin-typescript": "^12.3.0",
|
|
58
58
|
"@types/node": "^25.5.2",
|
|
59
59
|
"@types/pako": "^2.0.4",
|
|
60
60
|
"@types/serialport": "^10.2.0",
|
|
61
|
-
"@types/w3c-web-serial": "^1.0.
|
|
61
|
+
"@types/w3c-web-serial": "^1.0.8",
|
|
62
62
|
"archiver": "^7.0.1",
|
|
63
|
-
"electron": "^41.
|
|
63
|
+
"electron": "^41.3.0",
|
|
64
64
|
"electron-squirrel-startup": "^1.0.1",
|
|
65
|
-
"eslint": "^10.2.
|
|
65
|
+
"eslint": "^10.2.1",
|
|
66
66
|
"eslint-config-prettier": "^10.1.8",
|
|
67
67
|
"eslint-plugin-prettier": "^5.5.5",
|
|
68
68
|
"npm-run-all": "^4.1.5",
|
|
69
|
-
"prettier": "^3.8.
|
|
70
|
-
"rollup": "^4.60.
|
|
69
|
+
"prettier": "^3.8.3",
|
|
70
|
+
"rollup": "^4.60.2",
|
|
71
71
|
"serve": "^14.2.6",
|
|
72
72
|
"typescript": "^5.9.3",
|
|
73
|
-
"typescript-eslint": "^8.
|
|
73
|
+
"typescript-eslint": "^8.59.0"
|
|
74
74
|
},
|
|
75
75
|
"dependencies": {
|
|
76
76
|
"pako": "^2.1.0",
|
package/screenshots/desktop.png
CHANGED
|
Binary file
|
package/screenshots/mobile.png
CHANGED
|
Binary file
|