@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.
Files changed (32) hide show
  1. package/dist/client/jsenv_terminal_recorder_node_modules.js +753 -803
  2. package/dist/{xterm.html → client/xterm.html} +2 -2
  3. package/dist/jsenv_terminal_recorder_node_modules.js +773 -753
  4. package/dist/{client/terminal_recorder_browser.js → terminal_recorder_browser.js} +123 -26
  5. package/package.json +3 -4
  6. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
  7. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +64 -0
  8. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js +2 -0
  9. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.js.map +434 -0
  10. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-serialize/lib/addon-serialize.mjs.map +477 -0
  11. 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
  12. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js +2 -0
  13. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/addon-webgl/lib/addon-webgl.js.map +1134 -0
  14. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/xterm/css/xterm.css +204 -0
  15. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/xterm/lib/xterm.js +2 -0
  16. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/node_modules/@xterm/xterm/lib/xterm.js.map +2558 -0
  17. package/src/.jsenv/chrome@134.00/@fs/Users/dmail/Documents/dev/core/packages/internal/plugin-supervisor/src/client/supervisor.js +1395 -0
  18. package/src/.jsenv/chrome@134.00/gif_encoder.js +400 -0
  19. package/src/.jsenv/chrome@134.00/gif_encoder.js.map +11 -0
  20. package/src/.jsenv/chrome@134.00/lzw_encoder.js +253 -0
  21. package/src/.jsenv/chrome@134.00/neuquant.js +498 -0
  22. package/src/.jsenv/chrome@134.00/terminal_recorder.js +389 -0
  23. package/src/.jsenv/chrome@134.00/terminal_recorder.js.map +11 -0
  24. package/src/.jsenv/chrome@134.00/xterm.html +46 -0
  25. package/src/.jsenv/chrome@134.00/xterm.html@L14C5-L18C14.js +5 -0
  26. package/src/.jsenv/chrome@134.00/xterm.html@L19C5-L24C14.js +7 -0
  27. package/src/.jsenv/chrome@134.00/xterm.html@L19C5-L24C14.js.map +11 -0
  28. package/src/svg/parse_ansi.js +9 -8
  29. package/src/svg/render_terminal_svg.js +17 -15
  30. package/src/svg/xml_generator.js +2 -3
  31. package/src/terminal_recording.js +15 -5
  32. /package/dist/{css → client/css}/xterm.css +0 -0
@@ -1,4 +1,99 @@
1
- import { stripAnsi, ansiRegex, stringWidth, __jsenv_default_import__ } from "/jsenv_terminal_recorder_node_modules.js";
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
- lines.forEach((line) => {
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 chunk = bundle("text", word);
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
- innerHTML += renderNode(child, {
483
- depth: depth + 1,
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.8",
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.3.1",
41
- "@jsenv/server": "16.0.5",
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
+ }