@jsenv/terminal-recorder 1.5.8 → 1.5.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/dist/client/jsenv_terminal_recorder_node_modules.js +753 -803
- package/dist/{xterm.html → client/xterm.html} +2 -2
- package/dist/jsenv_terminal_recorder_node_modules.js +773 -753
- package/dist/{client/terminal_recorder_browser.js → terminal_recorder_browser.js} +123 -26
- package/package.json +3 -4
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +64 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +434 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +477 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize7as_js_module=.mjs +749 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js +2 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +1134 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/xterm/css/xterm.css +204 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/xterm/lib/xterm.js +2 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/xterm/lib/xterm.js.map +2558 -0
- package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/packages/internal/plugin-supervisor/src/client/supervisor.js +1395 -0
- package/src/.jsenv/chrome@134.00/gif_encoder.js +400 -0
- package/src/.jsenv/chrome@134.00/gif_encoder.js.map +11 -0
- package/src/.jsenv/chrome@134.00/lzw_encoder.js +253 -0
- package/src/.jsenv/chrome@134.00/neuquant.js +498 -0
- package/src/.jsenv/chrome@134.00/terminal_recorder.js +389 -0
- package/src/.jsenv/chrome@134.00/terminal_recorder.js.map +11 -0
- package/src/.jsenv/chrome@134.00/xterm.html +46 -0
- package/src/.jsenv/chrome@134.00/xterm.html@L14C5-L18C14.js +5 -0
- package/src/.jsenv/chrome@134.00/xterm.html@L19C5-L24C14.js +7 -0
- package/src/.jsenv/chrome@134.00/xterm.html@L19C5-L24C14.js.map +11 -0
- package/src/svg/parse_ansi.js +9 -8
- package/src/svg/render_terminal_svg.js +17 -15
- package/src/svg/xml_generator.js +2 -3
- package/src/terminal_recording.js +15 -5
- /package/dist/{css → client/css}/xterm.css +0 -0
|
@@ -1,4 +1,99 @@
|
|
|
1
|
-
import { stripAnsi, ansiRegex,
|
|
1
|
+
import { emojiRegex, eastAsianWidth, stripAnsi, ansiRegex, __jsenv_default_import__ } from "./jsenv_terminal_recorder_node_modules.js";
|
|
2
|
+
|
|
3
|
+
const createMeasureTextWidth = ({ stripAnsi }) => {
|
|
4
|
+
const segmenter = new Intl.Segmenter();
|
|
5
|
+
const defaultIgnorableCodePointRegex = /^\p{Default_Ignorable_Code_Point}$/u;
|
|
6
|
+
|
|
7
|
+
const measureTextWidth = (
|
|
8
|
+
string,
|
|
9
|
+
{
|
|
10
|
+
ambiguousIsNarrow = true,
|
|
11
|
+
countAnsiEscapeCodes = false,
|
|
12
|
+
skipEmojis = false,
|
|
13
|
+
} = {},
|
|
14
|
+
) => {
|
|
15
|
+
if (typeof string !== "string" || string.length === 0) {
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (!countAnsiEscapeCodes) {
|
|
20
|
+
string = stripAnsi(string);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (string.length === 0) {
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let width = 0;
|
|
28
|
+
const eastAsianWidthOptions = { ambiguousAsWide: !ambiguousIsNarrow };
|
|
29
|
+
|
|
30
|
+
for (const { segment: character } of segmenter.segment(string)) {
|
|
31
|
+
const codePoint = character.codePointAt(0);
|
|
32
|
+
|
|
33
|
+
// Ignore control characters
|
|
34
|
+
if (codePoint <= 0x1f || (codePoint >= 0x7f && codePoint <= 0x9f)) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Ignore zero-width characters
|
|
39
|
+
if (
|
|
40
|
+
(codePoint >= 0x20_0b && codePoint <= 0x20_0f) || // Zero-width space, non-joiner, joiner, left-to-right mark, right-to-left mark
|
|
41
|
+
codePoint === 0xfe_ff // Zero-width no-break space
|
|
42
|
+
) {
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Ignore combining characters
|
|
47
|
+
if (
|
|
48
|
+
(codePoint >= 0x3_00 && codePoint <= 0x3_6f) || // Combining diacritical marks
|
|
49
|
+
(codePoint >= 0x1a_b0 && codePoint <= 0x1a_ff) || // Combining diacritical marks extended
|
|
50
|
+
(codePoint >= 0x1d_c0 && codePoint <= 0x1d_ff) || // Combining diacritical marks supplement
|
|
51
|
+
(codePoint >= 0x20_d0 && codePoint <= 0x20_ff) || // Combining diacritical marks for symbols
|
|
52
|
+
(codePoint >= 0xfe_20 && codePoint <= 0xfe_2f) // Combining half marks
|
|
53
|
+
) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Ignore surrogate pairs
|
|
58
|
+
if (codePoint >= 0xd8_00 && codePoint <= 0xdf_ff) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Ignore variation selectors
|
|
63
|
+
if (codePoint >= 0xfe_00 && codePoint <= 0xfe_0f) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// This covers some of the above cases, but we still keep them for performance reasons.
|
|
68
|
+
if (defaultIgnorableCodePointRegex.test(character)) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (!skipEmojis && emojiRegex().test(character)) {
|
|
73
|
+
if (process.env.CAPTURING_SIDE_EFFECTS) {
|
|
74
|
+
if (character === "✔️") {
|
|
75
|
+
width += 2;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
width += measureTextWidth(character, {
|
|
80
|
+
skipEmojis: true,
|
|
81
|
+
countAnsiEscapeCodes: true, // to skip call to stripAnsi
|
|
82
|
+
});
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
width += eastAsianWidth(codePoint, eastAsianWidthOptions);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return width;
|
|
90
|
+
};
|
|
91
|
+
return measureTextWidth;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const measureTextWidth = createMeasureTextWidth({
|
|
95
|
+
stripAnsi,
|
|
96
|
+
});
|
|
2
97
|
|
|
3
98
|
// inspired by https://github.com/F1LT3R/parse-ansi/blob/master/index.js
|
|
4
99
|
|
|
@@ -10,12 +105,12 @@ const parseAnsi = (ansi) => {
|
|
|
10
105
|
const lines = plainText.split("\n");
|
|
11
106
|
const rows = lines.length;
|
|
12
107
|
let columns = 0;
|
|
13
|
-
|
|
108
|
+
for (const line of lines) {
|
|
14
109
|
const len = line.length;
|
|
15
110
|
if (len > columns) {
|
|
16
111
|
columns = len;
|
|
17
112
|
}
|
|
18
|
-
}
|
|
113
|
+
}
|
|
19
114
|
|
|
20
115
|
const result = {
|
|
21
116
|
raw: ansi,
|
|
@@ -156,7 +251,7 @@ const parseAnsi = (ansi) => {
|
|
|
156
251
|
let nAnsi = 0;
|
|
157
252
|
let nPlain = 0;
|
|
158
253
|
|
|
159
|
-
const bundle = (type, value) => {
|
|
254
|
+
const bundle = (type, value, { width = 0, height = 0 } = {}) => {
|
|
160
255
|
const chunk = {
|
|
161
256
|
type,
|
|
162
257
|
value,
|
|
@@ -165,9 +260,10 @@ const parseAnsi = (ansi) => {
|
|
|
165
260
|
y,
|
|
166
261
|
n: nPlain,
|
|
167
262
|
raw: nAnsi,
|
|
263
|
+
width,
|
|
264
|
+
height,
|
|
168
265
|
},
|
|
169
266
|
};
|
|
170
|
-
|
|
171
267
|
if (type === "text" || type === "ansi") {
|
|
172
268
|
const style = {};
|
|
173
269
|
|
|
@@ -217,7 +313,7 @@ const parseAnsi = (ansi) => {
|
|
|
217
313
|
for (const word of words) {
|
|
218
314
|
// Newline character
|
|
219
315
|
if (word === "\n") {
|
|
220
|
-
const chunk = bundle("newline", "\n");
|
|
316
|
+
const chunk = bundle("newline", "\n", { height: 1 });
|
|
221
317
|
result.chunks.push(chunk);
|
|
222
318
|
x = 0;
|
|
223
319
|
y += 1;
|
|
@@ -227,9 +323,9 @@ const parseAnsi = (ansi) => {
|
|
|
227
323
|
}
|
|
228
324
|
// Text characters
|
|
229
325
|
if (delimiters.includes(word) === false) {
|
|
230
|
-
const
|
|
326
|
+
const width = measureTextWidth(word);
|
|
327
|
+
const chunk = bundle("text", word, { width });
|
|
231
328
|
result.chunks.push(chunk);
|
|
232
|
-
const width = stringWidth(word);
|
|
233
329
|
x += width;
|
|
234
330
|
nAnsi += width;
|
|
235
331
|
nPlain += width;
|
|
@@ -479,9 +575,8 @@ const createXmlGenerator = ({
|
|
|
479
575
|
for (const child of node.children) {
|
|
480
576
|
innerHTML += "\n ";
|
|
481
577
|
innerHTML += " ".repeat(depth);
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
});
|
|
578
|
+
const childHtml = renderNode(child, { depth: depth + 1 });
|
|
579
|
+
innerHTML += childHtml;
|
|
485
580
|
}
|
|
486
581
|
innerHTML += "\n";
|
|
487
582
|
innerHTML += " ".repeat(depth);
|
|
@@ -747,11 +842,24 @@ const renderTerminalSvg = (
|
|
|
747
842
|
continue;
|
|
748
843
|
}
|
|
749
844
|
const { position } = chunk;
|
|
750
|
-
const x =
|
|
751
|
-
offsetLeft + (position.x + leadingWhitespaceWidth(value)) * font.width;
|
|
752
|
-
const y = offsetTop + position.y + font.lineHeight * position.y;
|
|
753
|
-
const w = font.width * value.length;
|
|
754
845
|
const attrs = {};
|
|
846
|
+
|
|
847
|
+
// Some SVG Implementations drop whitespaces
|
|
848
|
+
// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xml:space
|
|
849
|
+
// and https://codepen.io/dmail/pen/wvLvbbP
|
|
850
|
+
if (
|
|
851
|
+
// in the following case we need to preserve whitespaces:
|
|
852
|
+
// - one or more leading whitespace
|
|
853
|
+
// - one or more trailing whitespace
|
|
854
|
+
// - 2 or more whitespace in the middle of the string
|
|
855
|
+
/^\s+|\s\s|\s+$/.test(value)
|
|
856
|
+
) {
|
|
857
|
+
attrs.style = "white-space:pre";
|
|
858
|
+
}
|
|
859
|
+
const x = offsetLeft + position.x * font.width;
|
|
860
|
+
const y = offsetTop + position.y + font.lineHeight * position.y;
|
|
861
|
+
const w = font.width * position.width;
|
|
862
|
+
|
|
755
863
|
if (style.bold) {
|
|
756
864
|
attrs["font-weight"] = "bold";
|
|
757
865
|
}
|
|
@@ -823,15 +931,4 @@ const renderTerminalSvg = (
|
|
|
823
931
|
return svgString;
|
|
824
932
|
};
|
|
825
933
|
|
|
826
|
-
// Some SVG Implementations drop whitespaces
|
|
827
|
-
// https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xml:space
|
|
828
|
-
// and https://codepen.io/dmail/pen/wvLvbbP
|
|
829
|
-
const leadingWhitespaceWidth = (text) => {
|
|
830
|
-
if (text.trim() === "") {
|
|
831
|
-
return 0;
|
|
832
|
-
}
|
|
833
|
-
const leadingSpace = text.match(/^\s*/g);
|
|
834
|
-
return leadingSpace[0].length;
|
|
835
|
-
};
|
|
836
|
-
|
|
837
934
|
export { parseAnsi, renderTerminalSvg };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jsenv/terminal-recorder",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.10",
|
|
4
4
|
"description": "Record terminal output as .svg, .gif, .webm, .mp4",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -37,13 +37,12 @@
|
|
|
37
37
|
"prepublishOnly": "npm run build"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@jsenv/humanize": "1.
|
|
41
|
-
"@jsenv/server": "16.0.
|
|
40
|
+
"@jsenv/humanize": "1.4.0",
|
|
41
|
+
"@jsenv/server": "16.0.6",
|
|
42
42
|
"@playwright/browser-chromium": "1.51.0",
|
|
43
43
|
"ansi-regex": "6.1.0",
|
|
44
44
|
"he": "1.2.0",
|
|
45
45
|
"playwright": "1.51.0",
|
|
46
|
-
"string-width": "5.1.2",
|
|
47
46
|
"strip-ansi": "7.1.0",
|
|
48
47
|
"eastasianwidth": "0.3.0",
|
|
49
48
|
"webm-to-mp4": "1.0.0"
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FitAddon=t():e.FitAddon=t()}(self,(()=>(()=>{"use strict";var e={};return(()=>{var t=e;Object.defineProperty(t,"__esModule",{value:!0}),t.FitAddon=void 0,t.FitAddon=class{activate(e){this._terminal=e}dispose(){}fit(){const e=this.proposeDimensions();if(!e||!this._terminal||isNaN(e.cols)||isNaN(e.rows))return;const t=this._terminal._core;this._terminal.rows===e.rows&&this._terminal.cols===e.cols||(t._renderService.clear(),this._terminal.resize(e.cols,e.rows))}proposeDimensions(){if(!this._terminal)return;if(!this._terminal.element||!this._terminal.element.parentElement)return;const e=this._terminal._core,t=e._renderService.dimensions;if(0===t.css.cell.width||0===t.css.cell.height)return;const r=0===this._terminal.options.scrollback?0:e.viewport.scrollBarWidth,i=window.getComputedStyle(this._terminal.element.parentElement),o=parseInt(i.getPropertyValue("height")),s=Math.max(0,parseInt(i.getPropertyValue("width"))),n=window.getComputedStyle(this._terminal.element),l=o-(parseInt(n.getPropertyValue("padding-top"))+parseInt(n.getPropertyValue("padding-bottom"))),a=s-(parseInt(n.getPropertyValue("padding-right"))+parseInt(n.getPropertyValue("padding-left")))-r;return{cols:Math.max(2,Math.floor(a/t.css.cell.width)),rows:Math.max(1,Math.floor(l/t.css.cell.height))}}}})(),e})()));
|
|
2
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkb24tZml0LmpzIiwibWFwcGluZ3MiOiJDQUFBLFNBQTJDQSxFQUFNQyxHQUMxQixpQkFBWkMsU0FBMEMsaUJBQVhDLE9BQ3hDQSxPQUFPRCxRQUFVRCxJQUNRLG1CQUFYRyxRQUF5QkEsT0FBT0MsSUFDOUNELE9BQU8sR0FBSUgsR0FDZSxpQkFBWkMsUUFDZEEsUUFBa0IsU0FBSUQsSUFFdEJELEVBQWUsU0FBSUMsR0FDcEIsQ0FURCxDQVNHSyxNQUFNLEksbUhDZVQsaUJBR1MsUUFBQUMsQ0FBU0MsR0FDZEMsS0FBS0MsVUFBWUYsQ0FDbkIsQ0FFTyxPQUFBRyxHQUFpQixDQUVqQixHQUFBQyxHQUNMLE1BQU1DLEVBQU9KLEtBQUtLLG9CQUNsQixJQUFLRCxJQUFTSixLQUFLQyxXQUFhSyxNQUFNRixFQUFLRyxPQUFTRCxNQUFNRixFQUFLSSxNQUM3RCxPQUlGLE1BQU1DLEVBQVFULEtBQUtDLFVBQWtCUyxNQUdqQ1YsS0FBS0MsVUFBVU8sT0FBU0osRUFBS0ksTUFBUVIsS0FBS0MsVUFBVU0sT0FBU0gsRUFBS0csT0FDcEVFLEVBQUtFLGVBQWVDLFFBQ3BCWixLQUFLQyxVQUFVWSxPQUFPVCxFQUFLRyxLQUFNSCxFQUFLSSxNQUUxQyxDQUVPLGlCQUFBSCxHQUNMLElBQUtMLEtBQUtDLFVBQ1IsT0FHRixJQUFLRCxLQUFLQyxVQUFVYSxVQUFZZCxLQUFLQyxVQUFVYSxRQUFRQyxjQUNyRCxPQUlGLE1BQU1OLEVBQVFULEtBQUtDLFVBQWtCUyxNQUMvQk4sRUFBMEJLLEVBQUtFLGVBQWVLLFdBRXBELEdBQTRCLElBQXhCWixFQUFLYSxJQUFJQyxLQUFLQyxPQUF3QyxJQUF6QmYsRUFBS2EsSUFBSUMsS0FBS0UsT0FDN0MsT0FHRixNQUFNQyxFQUF1RCxJQUF0Q3JCLEtBQUtDLFVBQVVxQixRQUFRQyxXQUM1QyxFQUFJZCxFQUFLZSxTQUFTQyxlQUVkQyxFQUFxQkMsT0FBT0MsaUJBQWlCNUIsS0FBS0MsVUFBVWEsUUFBUUMsZUFDcEVjLEVBQXNCQyxTQUFTSixFQUFtQkssaUJBQWlCLFdBQ25FQyxFQUFxQkMsS0FBS0MsSUFBSSxFQUFHSixTQUFTSixFQUFtQkssaUJBQWlCLFdBQzlFSSxFQUFlUixPQUFPQyxpQkFBaUI1QixLQUFLQyxVQUFVYSxTQVN0RHNCLEVBQWtCUCxHQVBqQkMsU0FBU0ssRUFBYUosaUJBQWlCLGdCQUNwQ0QsU0FBU0ssRUFBYUosaUJBQWlCLG9CQU8zQ00sRUFBaUJMLEdBTmRGLFNBQVNLLEVBQWFKLGlCQUFpQixrQkFDeENELFNBQVNLLEVBQWFKLGlCQUFpQixrQkFLaUJWLEVBS2hFLE1BSmlCLENBQ2ZkLEtBQU0wQixLQUFLQyxJQS9ESSxFQStEY0QsS0FBS0ssTUFBTUQsRUFBaUJqQyxFQUFLYSxJQUFJQyxLQUFLQyxRQUN2RVgsS0FBTXlCLEtBQUtDLElBL0RJLEVBK0RjRCxLQUFLSyxNQUFNRixFQUFrQmhDLEVBQUthLElBQUlDLEtBQUtFLFNBRzVFLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9GaXRBZGRvbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vRml0QWRkb24vc3JjL0ZpdEFkZG9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIkZpdEFkZG9uXCJdID0gZmFjdG9yeSgpO1xuXHRlbHNlXG5cdFx0cm9vdFtcIkZpdEFkZG9uXCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgKCkgPT4ge1xucmV0dXJuICIsIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSB4dGVybS5qcyBhdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBUZXJtaW5hbCwgSVRlcm1pbmFsQWRkb24gfSBmcm9tICdAeHRlcm0veHRlcm0nO1xuaW1wb3J0IHR5cGUgeyBGaXRBZGRvbiBhcyBJRml0QXBpIH0gZnJvbSAnQHh0ZXJtL2FkZG9uLWZpdCc7XG5pbXBvcnQgeyBJUmVuZGVyRGltZW5zaW9ucyB9IGZyb20gJ2Jyb3dzZXIvcmVuZGVyZXIvc2hhcmVkL1R5cGVzJztcblxuaW50ZXJmYWNlIElUZXJtaW5hbERpbWVuc2lvbnMge1xuICAvKipcbiAgICogVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSB0ZXJtaW5hbC5cbiAgICovXG4gIHJvd3M6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB0ZXJtaW5hbC5cbiAgICovXG4gIGNvbHM6IG51bWJlcjtcbn1cblxuY29uc3QgTUlOSU1VTV9DT0xTID0gMjtcbmNvbnN0IE1JTklNVU1fUk9XUyA9IDE7XG5cbmV4cG9ydCBjbGFzcyBGaXRBZGRvbiBpbXBsZW1lbnRzIElUZXJtaW5hbEFkZG9uICwgSUZpdEFwaSB7XG4gIHByaXZhdGUgX3Rlcm1pbmFsOiBUZXJtaW5hbCB8IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgYWN0aXZhdGUodGVybWluYWw6IFRlcm1pbmFsKTogdm9pZCB7XG4gICAgdGhpcy5fdGVybWluYWwgPSB0ZXJtaW5hbDtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCk6IHZvaWQge31cblxuICBwdWJsaWMgZml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGRpbXMgPSB0aGlzLnByb3Bvc2VEaW1lbnNpb25zKCk7XG4gICAgaWYgKCFkaW1zIHx8ICF0aGlzLl90ZXJtaW5hbCB8fCBpc05hTihkaW1zLmNvbHMpIHx8IGlzTmFOKGRpbXMucm93cykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBSZW1vdmUgcmVsaWFuY2Ugb24gcHJpdmF0ZSBBUElcbiAgICBjb25zdCBjb3JlID0gKHRoaXMuX3Rlcm1pbmFsIGFzIGFueSkuX2NvcmU7XG5cbiAgICAvLyBGb3JjZSBhIGZ1bGwgcmVuZGVyXG4gICAgaWYgKHRoaXMuX3Rlcm1pbmFsLnJvd3MgIT09IGRpbXMucm93cyB8fCB0aGlzLl90ZXJtaW5hbC5jb2xzICE9PSBkaW1zLmNvbHMpIHtcbiAgICAgIGNvcmUuX3JlbmRlclNlcnZpY2UuY2xlYXIoKTtcbiAgICAgIHRoaXMuX3Rlcm1pbmFsLnJlc2l6ZShkaW1zLmNvbHMsIGRpbXMucm93cyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb3Bvc2VEaW1lbnNpb25zKCk6IElUZXJtaW5hbERpbWVuc2lvbnMgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5fdGVybWluYWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl90ZXJtaW5hbC5lbGVtZW50IHx8ICF0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogUmVtb3ZlIHJlbGlhbmNlIG9uIHByaXZhdGUgQVBJXG4gICAgY29uc3QgY29yZSA9ICh0aGlzLl90ZXJtaW5hbCBhcyBhbnkpLl9jb3JlO1xuICAgIGNvbnN0IGRpbXM6IElSZW5kZXJEaW1lbnNpb25zID0gY29yZS5fcmVuZGVyU2VydmljZS5kaW1lbnNpb25zO1xuXG4gICAgaWYgKGRpbXMuY3NzLmNlbGwud2lkdGggPT09IDAgfHwgZGltcy5jc3MuY2VsbC5oZWlnaHQgPT09IDApIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLl90ZXJtaW5hbC5vcHRpb25zLnNjcm9sbGJhY2sgPT09IDAgP1xuICAgICAgMCA6IGNvcmUudmlld3BvcnQuc2Nyb2xsQmFyV2lkdGg7XG5cbiAgICBjb25zdCBwYXJlbnRFbGVtZW50U3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl90ZXJtaW5hbC5lbGVtZW50LnBhcmVudEVsZW1lbnQpO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnRIZWlnaHQgPSBwYXJzZUludChwYXJlbnRFbGVtZW50U3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnaGVpZ2h0JykpO1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnRXaWR0aCA9IE1hdGgubWF4KDAsIHBhcnNlSW50KHBhcmVudEVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd3aWR0aCcpKSk7XG4gICAgY29uc3QgZWxlbWVudFN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fdGVybWluYWwuZWxlbWVudCk7XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmcgPSB7XG4gICAgICB0b3A6IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXRvcCcpKSxcbiAgICAgIGJvdHRvbTogcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctYm90dG9tJykpLFxuICAgICAgcmlnaHQ6IHBhcnNlSW50KGVsZW1lbnRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCdwYWRkaW5nLXJpZ2h0JykpLFxuICAgICAgbGVmdDogcGFyc2VJbnQoZWxlbWVudFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3BhZGRpbmctbGVmdCcpKVxuICAgIH07XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmdWZXIgPSBlbGVtZW50UGFkZGluZy50b3AgKyBlbGVtZW50UGFkZGluZy5ib3R0b207XG4gICAgY29uc3QgZWxlbWVudFBhZGRpbmdIb3IgPSBlbGVtZW50UGFkZGluZy5yaWdodCArIGVsZW1lbnRQYWRkaW5nLmxlZnQ7XG4gICAgY29uc3QgYXZhaWxhYmxlSGVpZ2h0ID0gcGFyZW50RWxlbWVudEhlaWdodCAtIGVsZW1lbnRQYWRkaW5nVmVyO1xuICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gcGFyZW50RWxlbWVudFdpZHRoIC0gZWxlbWVudFBhZGRpbmdIb3IgLSBzY3JvbGxiYXJXaWR0aDtcbiAgICBjb25zdCBnZW9tZXRyeSA9IHtcbiAgICAgIGNvbHM6IE1hdGgubWF4KE1JTklNVU1fQ09MUywgTWF0aC5mbG9vcihhdmFpbGFibGVXaWR0aCAvIGRpbXMuY3NzLmNlbGwud2lkdGgpKSxcbiAgICAgIHJvd3M6IE1hdGgubWF4KE1JTklNVU1fUk9XUywgTWF0aC5mbG9vcihhdmFpbGFibGVIZWlnaHQgLyBkaW1zLmNzcy5jZWxsLmhlaWdodCkpXG4gICAgfTtcbiAgICByZXR1cm4gZ2VvbWV0cnk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJkZWZpbmUiLCJhbWQiLCJzZWxmIiwiYWN0aXZhdGUiLCJ0ZXJtaW5hbCIsInRoaXMiLCJfdGVybWluYWwiLCJkaXNwb3NlIiwiZml0IiwiZGltcyIsInByb3Bvc2VEaW1lbnNpb25zIiwiaXNOYU4iLCJjb2xzIiwicm93cyIsImNvcmUiLCJfY29yZSIsIl9yZW5kZXJTZXJ2aWNlIiwiY2xlYXIiLCJyZXNpemUiLCJlbGVtZW50IiwicGFyZW50RWxlbWVudCIsImRpbWVuc2lvbnMiLCJjc3MiLCJjZWxsIiwid2lkdGgiLCJoZWlnaHQiLCJzY3JvbGxiYXJXaWR0aCIsIm9wdGlvbnMiLCJzY3JvbGxiYWNrIiwidmlld3BvcnQiLCJzY3JvbGxCYXJXaWR0aCIsInBhcmVudEVsZW1lbnRTdHlsZSIsIndpbmRvdyIsImdldENvbXB1dGVkU3R5bGUiLCJwYXJlbnRFbGVtZW50SGVpZ2h0IiwicGFyc2VJbnQiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicGFyZW50RWxlbWVudFdpZHRoIiwiTWF0aCIsIm1heCIsImVsZW1lbnRTdHlsZSIsImF2YWlsYWJsZUhlaWdodCIsImF2YWlsYWJsZVdpZHRoIiwiZmxvb3IiXSwic291cmNlUm9vdCI6IiJ9
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"file": "addon-fit.js",
|
|
4
|
+
"mappings": "CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAkB,SAAID,IAEtBD,EAAe,SAAIC,GACpB,CATD,CASGK,MAAM,I,mHCeT,iBAGS,QAAAC,CAASC,GACdC,KAAKC,UAAYF,CACnB,CAEO,OAAAG,GAAiB,CAEjB,GAAAC,GACL,MAAMC,EAAOJ,KAAKK,oBAClB,IAAKD,IAASJ,KAAKC,WAAaK,MAAMF,EAAKG,OAASD,MAAMF,EAAKI,MAC7D,OAIF,MAAMC,EAAQT,KAAKC,UAAkBS,MAGjCV,KAAKC,UAAUO,OAASJ,EAAKI,MAAQR,KAAKC,UAAUM,OAASH,EAAKG,OACpEE,EAAKE,eAAeC,QACpBZ,KAAKC,UAAUY,OAAOT,EAAKG,KAAMH,EAAKI,MAE1C,CAEO,iBAAAH,GACL,IAAKL,KAAKC,UACR,OAGF,IAAKD,KAAKC,UAAUa,UAAYd,KAAKC,UAAUa,QAAQC,cACrD,OAIF,MAAMN,EAAQT,KAAKC,UAAkBS,MAC/BN,EAA0BK,EAAKE,eAAeK,WAEpD,GAA4B,IAAxBZ,EAAKa,IAAIC,KAAKC,OAAwC,IAAzBf,EAAKa,IAAIC,KAAKE,OAC7C,OAGF,MAAMC,EAAuD,IAAtCrB,KAAKC,UAAUqB,QAAQC,WAC5C,EAAId,EAAKe,SAASC,eAEdC,EAAqBC,OAAOC,iBAAiB5B,KAAKC,UAAUa,QAAQC,eACpEc,EAAsBC,SAASJ,EAAmBK,iBAAiB,WACnEC,EAAqBC,KAAKC,IAAI,EAAGJ,SAASJ,EAAmBK,iBAAiB,WAC9EI,EAAeR,OAAOC,iBAAiB5B,KAAKC,UAAUa,SAStDsB,EAAkBP,GAPjBC,SAASK,EAAaJ,iBAAiB,gBACpCD,SAASK,EAAaJ,iBAAiB,oBAO3CM,EAAiBL,GANdF,SAASK,EAAaJ,iBAAiB,kBACxCD,SAASK,EAAaJ,iBAAiB,kBAKiBV,EAKhE,MAJiB,CACfd,KAAM0B,KAAKC,IA/DI,EA+DcD,KAAKK,MAAMD,EAAiBjC,EAAKa,IAAIC,KAAKC,QACvEX,KAAMyB,KAAKC,IA/DI,EA+DcD,KAAKK,MAAMF,EAAkBhC,EAAKa,IAAIC,KAAKE,SAG5E,E",
|
|
5
|
+
"sources": [
|
|
6
|
+
"webpack://FitAddon/webpack/universalModuleDefinition",
|
|
7
|
+
"webpack://FitAddon/src/FitAddon.ts"
|
|
8
|
+
],
|
|
9
|
+
"sourcesContent": [
|
|
10
|
+
"(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FitAddon\"] = factory();\n\telse\n\t\troot[\"FitAddon\"] = factory();\n})(self, () => {\nreturn ",
|
|
11
|
+
"/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { Terminal, ITerminalAddon } from '@xterm/xterm';\nimport type { FitAddon as IFitApi } from '@xterm/addon-fit';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\n\ninterface ITerminalDimensions {\n /**\n * The number of rows in the terminal.\n */\n rows: number;\n\n /**\n * The number of columns in the terminal.\n */\n cols: number;\n}\n\nconst MINIMUM_COLS = 2;\nconst MINIMUM_ROWS = 1;\n\nexport class FitAddon implements ITerminalAddon , IFitApi {\n private _terminal: Terminal | undefined;\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n }\n\n public dispose(): void {}\n\n public fit(): void {\n const dims = this.proposeDimensions();\n if (!dims || !this._terminal || isNaN(dims.cols) || isNaN(dims.rows)) {\n return;\n }\n\n // TODO: Remove reliance on private API\n const core = (this._terminal as any)._core;\n\n // Force a full render\n if (this._terminal.rows !== dims.rows || this._terminal.cols !== dims.cols) {\n core._renderService.clear();\n this._terminal.resize(dims.cols, dims.rows);\n }\n }\n\n public proposeDimensions(): ITerminalDimensions | undefined {\n if (!this._terminal) {\n return undefined;\n }\n\n if (!this._terminal.element || !this._terminal.element.parentElement) {\n return undefined;\n }\n\n // TODO: Remove reliance on private API\n const core = (this._terminal as any)._core;\n const dims: IRenderDimensions = core._renderService.dimensions;\n\n if (dims.css.cell.width === 0 || dims.css.cell.height === 0) {\n return undefined;\n }\n\n const scrollbarWidth = this._terminal.options.scrollback === 0 ?\n 0 : core.viewport.scrollBarWidth;\n\n const parentElementStyle = window.getComputedStyle(this._terminal.element.parentElement);\n const parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height'));\n const parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width')));\n const elementStyle = window.getComputedStyle(this._terminal.element);\n const elementPadding = {\n top: parseInt(elementStyle.getPropertyValue('padding-top')),\n bottom: parseInt(elementStyle.getPropertyValue('padding-bottom')),\n right: parseInt(elementStyle.getPropertyValue('padding-right')),\n left: parseInt(elementStyle.getPropertyValue('padding-left'))\n };\n const elementPaddingVer = elementPadding.top + elementPadding.bottom;\n const elementPaddingHor = elementPadding.right + elementPadding.left;\n const availableHeight = parentElementHeight - elementPaddingVer;\n const availableWidth = parentElementWidth - elementPaddingHor - scrollbarWidth;\n const geometry = {\n cols: Math.max(MINIMUM_COLS, Math.floor(availableWidth / dims.css.cell.width)),\n rows: Math.max(MINIMUM_ROWS, Math.floor(availableHeight / dims.css.cell.height))\n };\n return geometry;\n }\n}\n"
|
|
12
|
+
],
|
|
13
|
+
"names": [
|
|
14
|
+
"root",
|
|
15
|
+
"factory",
|
|
16
|
+
"exports",
|
|
17
|
+
"module",
|
|
18
|
+
"define",
|
|
19
|
+
"amd",
|
|
20
|
+
"self",
|
|
21
|
+
"activate",
|
|
22
|
+
"terminal",
|
|
23
|
+
"this",
|
|
24
|
+
"_terminal",
|
|
25
|
+
"dispose",
|
|
26
|
+
"fit",
|
|
27
|
+
"dims",
|
|
28
|
+
"proposeDimensions",
|
|
29
|
+
"isNaN",
|
|
30
|
+
"cols",
|
|
31
|
+
"rows",
|
|
32
|
+
"core",
|
|
33
|
+
"_core",
|
|
34
|
+
"_renderService",
|
|
35
|
+
"clear",
|
|
36
|
+
"resize",
|
|
37
|
+
"element",
|
|
38
|
+
"parentElement",
|
|
39
|
+
"dimensions",
|
|
40
|
+
"css",
|
|
41
|
+
"cell",
|
|
42
|
+
"width",
|
|
43
|
+
"height",
|
|
44
|
+
"scrollbarWidth",
|
|
45
|
+
"options",
|
|
46
|
+
"scrollback",
|
|
47
|
+
"viewport",
|
|
48
|
+
"scrollBarWidth",
|
|
49
|
+
"parentElementStyle",
|
|
50
|
+
"window",
|
|
51
|
+
"getComputedStyle",
|
|
52
|
+
"parentElementHeight",
|
|
53
|
+
"parseInt",
|
|
54
|
+
"getPropertyValue",
|
|
55
|
+
"parentElementWidth",
|
|
56
|
+
"Math",
|
|
57
|
+
"max",
|
|
58
|
+
"elementStyle",
|
|
59
|
+
"availableHeight",
|
|
60
|
+
"availableWidth",
|
|
61
|
+
"floor"
|
|
62
|
+
],
|
|
63
|
+
"sourceRoot": ""
|
|
64
|
+
}
|