@xterm/xterm 5.6.0-beta.8 → 5.6.0-beta.81

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 (122) hide show
  1. package/README.md +6 -3
  2. package/css/xterm.css +71 -4
  3. package/lib/xterm.js +1 -1
  4. package/lib/xterm.js.map +1 -1
  5. package/lib/xterm.mjs +53 -0
  6. package/lib/xterm.mjs.map +7 -0
  7. package/package.json +43 -33
  8. package/src/browser/AccessibilityManager.ts +53 -25
  9. package/src/browser/{Terminal.ts → CoreBrowserTerminal.ts} +139 -148
  10. package/src/browser/Linkifier.ts +26 -14
  11. package/src/browser/LocalizableStrings.ts +15 -4
  12. package/src/browser/{Types.d.ts → Types.ts} +67 -15
  13. package/src/browser/Viewport.ts +143 -370
  14. package/src/browser/decorations/BufferDecorationRenderer.ts +14 -9
  15. package/src/browser/decorations/OverviewRulerRenderer.ts +40 -44
  16. package/src/browser/public/Terminal.ts +25 -19
  17. package/src/browser/renderer/dom/DomRenderer.ts +22 -19
  18. package/src/browser/renderer/dom/DomRendererRowFactory.ts +35 -15
  19. package/src/browser/renderer/shared/CharAtlasUtils.ts +4 -0
  20. package/src/browser/renderer/shared/CustomGlyphs.ts +6 -0
  21. package/src/browser/renderer/shared/DevicePixelObserver.ts +1 -2
  22. package/src/browser/renderer/shared/TextureAtlas.ts +3 -3
  23. package/src/browser/renderer/shared/{Types.d.ts → Types.ts} +4 -4
  24. package/src/browser/services/CharSizeService.ts +6 -6
  25. package/src/browser/services/CoreBrowserService.ts +15 -15
  26. package/src/browser/services/LinkProviderService.ts +2 -2
  27. package/src/browser/services/RenderService.ts +20 -20
  28. package/src/browser/services/SelectionService.ts +8 -8
  29. package/src/browser/services/Services.ts +13 -13
  30. package/src/browser/services/ThemeService.ts +19 -58
  31. package/src/browser/shared/Constants.ts +8 -0
  32. package/src/common/CircularList.ts +5 -5
  33. package/src/common/CoreTerminal.ts +35 -41
  34. package/src/common/InputHandler.ts +63 -51
  35. package/src/common/{Types.d.ts → Types.ts} +13 -17
  36. package/src/common/buffer/Buffer.ts +15 -7
  37. package/src/common/buffer/BufferReflow.ts +9 -6
  38. package/src/common/buffer/BufferSet.ts +5 -5
  39. package/src/common/buffer/Marker.ts +4 -4
  40. package/src/common/buffer/{Types.d.ts → Types.ts} +2 -2
  41. package/src/common/input/WriteBuffer.ts +3 -3
  42. package/src/common/parser/EscapeSequenceParser.ts +4 -4
  43. package/src/common/public/BufferNamespaceApi.ts +3 -3
  44. package/src/common/services/BufferService.ts +7 -7
  45. package/src/common/services/CoreMouseService.ts +5 -3
  46. package/src/common/services/CoreService.ts +8 -6
  47. package/src/common/services/DecorationService.ts +8 -9
  48. package/src/common/services/InstantiationService.ts +1 -1
  49. package/src/common/services/LogService.ts +2 -2
  50. package/src/common/services/OptionsService.ts +6 -5
  51. package/src/common/services/ServiceRegistry.ts +1 -1
  52. package/src/common/services/Services.ts +26 -17
  53. package/src/common/services/UnicodeService.ts +2 -2
  54. package/src/vs/base/browser/browser.ts +141 -0
  55. package/src/vs/base/browser/canIUse.ts +49 -0
  56. package/src/vs/base/browser/dom.ts +2369 -0
  57. package/src/vs/base/browser/fastDomNode.ts +316 -0
  58. package/src/vs/base/browser/globalPointerMoveMonitor.ts +112 -0
  59. package/src/vs/base/browser/iframe.ts +135 -0
  60. package/src/vs/base/browser/keyboardEvent.ts +213 -0
  61. package/src/vs/base/browser/mouseEvent.ts +229 -0
  62. package/src/vs/base/browser/touch.ts +372 -0
  63. package/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +303 -0
  64. package/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +114 -0
  65. package/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +720 -0
  66. package/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +165 -0
  67. package/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +114 -0
  68. package/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +243 -0
  69. package/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +118 -0
  70. package/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +116 -0
  71. package/src/vs/base/browser/ui/widget.ts +57 -0
  72. package/src/vs/base/browser/window.ts +14 -0
  73. package/src/vs/base/common/arrays.ts +887 -0
  74. package/src/vs/base/common/arraysFind.ts +202 -0
  75. package/src/vs/base/common/assert.ts +71 -0
  76. package/src/vs/base/common/async.ts +1992 -0
  77. package/src/vs/base/common/cancellation.ts +148 -0
  78. package/src/vs/base/common/charCode.ts +450 -0
  79. package/src/vs/base/common/collections.ts +140 -0
  80. package/src/vs/base/common/decorators.ts +130 -0
  81. package/src/vs/base/common/equals.ts +146 -0
  82. package/src/vs/base/common/errors.ts +303 -0
  83. package/src/vs/base/common/event.ts +1778 -0
  84. package/src/vs/base/common/functional.ts +32 -0
  85. package/src/vs/base/common/hash.ts +316 -0
  86. package/src/vs/base/common/iterator.ts +159 -0
  87. package/src/vs/base/common/keyCodes.ts +526 -0
  88. package/src/vs/base/common/keybindings.ts +284 -0
  89. package/src/vs/base/common/lazy.ts +47 -0
  90. package/src/vs/base/common/lifecycle.ts +801 -0
  91. package/src/vs/base/common/linkedList.ts +142 -0
  92. package/src/vs/base/common/map.ts +202 -0
  93. package/src/vs/base/common/numbers.ts +98 -0
  94. package/src/vs/base/common/observable.ts +76 -0
  95. package/src/vs/base/common/observableInternal/api.ts +31 -0
  96. package/src/vs/base/common/observableInternal/autorun.ts +281 -0
  97. package/src/vs/base/common/observableInternal/base.ts +489 -0
  98. package/src/vs/base/common/observableInternal/debugName.ts +145 -0
  99. package/src/vs/base/common/observableInternal/derived.ts +428 -0
  100. package/src/vs/base/common/observableInternal/lazyObservableValue.ts +146 -0
  101. package/src/vs/base/common/observableInternal/logging.ts +328 -0
  102. package/src/vs/base/common/observableInternal/promise.ts +209 -0
  103. package/src/vs/base/common/observableInternal/utils.ts +610 -0
  104. package/src/vs/base/common/platform.ts +281 -0
  105. package/src/vs/base/common/scrollable.ts +522 -0
  106. package/src/vs/base/common/sequence.ts +34 -0
  107. package/src/vs/base/common/stopwatch.ts +43 -0
  108. package/src/vs/base/common/strings.ts +557 -0
  109. package/src/vs/base/common/symbols.ts +9 -0
  110. package/src/vs/base/common/uint.ts +59 -0
  111. package/src/vs/patches/nls.ts +90 -0
  112. package/src/vs/typings/base-common.d.ts +20 -0
  113. package/src/vs/typings/require.d.ts +42 -0
  114. package/src/vs/typings/thenable.d.ts +12 -0
  115. package/src/vs/typings/vscode-globals-nls.d.ts +36 -0
  116. package/src/vs/typings/vscode-globals-product.d.ts +33 -0
  117. package/typings/xterm.d.ts +66 -15
  118. package/src/browser/Lifecycle.ts +0 -33
  119. package/src/common/EventEmitter.ts +0 -78
  120. package/src/common/Lifecycle.ts +0 -108
  121. /package/src/browser/selection/{Types.d.ts → Types.ts} +0 -0
  122. /package/src/common/parser/{Types.d.ts → Types.ts} +0 -0
@@ -0,0 +1,140 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ /**
7
+ * An interface for a JavaScript object that
8
+ * acts a dictionary. The keys are strings.
9
+ */
10
+ export type IStringDictionary<V> = Record<string, V>;
11
+
12
+ /**
13
+ * An interface for a JavaScript object that
14
+ * acts a dictionary. The keys are numbers.
15
+ */
16
+ export type INumberDictionary<V> = Record<number, V>;
17
+
18
+ /**
19
+ * Groups the collection into a dictionary based on the provided
20
+ * group function.
21
+ */
22
+ export function groupBy<K extends string | number | symbol, V>(data: V[], groupFn: (element: V) => K): Record<K, V[]> {
23
+ const result: Record<K, V[]> = Object.create(null);
24
+ for (const element of data) {
25
+ const key = groupFn(element);
26
+ let target = result[key];
27
+ if (!target) {
28
+ target = result[key] = [];
29
+ }
30
+ target.push(element);
31
+ }
32
+ return result;
33
+ }
34
+
35
+ export function diffSets<T>(before: Set<T>, after: Set<T>): { removed: T[]; added: T[] } {
36
+ const removed: T[] = [];
37
+ const added: T[] = [];
38
+ for (const element of before) {
39
+ if (!after.has(element)) {
40
+ removed.push(element);
41
+ }
42
+ }
43
+ for (const element of after) {
44
+ if (!before.has(element)) {
45
+ added.push(element);
46
+ }
47
+ }
48
+ return { removed, added };
49
+ }
50
+
51
+ export function diffMaps<K, V>(before: Map<K, V>, after: Map<K, V>): { removed: V[]; added: V[] } {
52
+ const removed: V[] = [];
53
+ const added: V[] = [];
54
+ for (const [index, value] of before) {
55
+ if (!after.has(index)) {
56
+ removed.push(value);
57
+ }
58
+ }
59
+ for (const [index, value] of after) {
60
+ if (!before.has(index)) {
61
+ added.push(value);
62
+ }
63
+ }
64
+ return { removed, added };
65
+ }
66
+
67
+ /**
68
+ * Computes the intersection of two sets.
69
+ *
70
+ * @param setA - The first set.
71
+ * @param setB - The second iterable.
72
+ * @returns A new set containing the elements that are in both `setA` and `setB`.
73
+ */
74
+ export function intersection<T>(setA: Set<T>, setB: Iterable<T>): Set<T> {
75
+ const result = new Set<T>();
76
+ for (const elem of setB) {
77
+ if (setA.has(elem)) {
78
+ result.add(elem);
79
+ }
80
+ }
81
+ return result;
82
+ }
83
+
84
+ export class SetWithKey<T> implements Set<T> {
85
+ private _map = new Map<any, T>();
86
+
87
+ constructor(values: T[], private toKey: (t: T) => any) {
88
+ for (const value of values) {
89
+ this.add(value);
90
+ }
91
+ }
92
+
93
+ get size(): number {
94
+ return this._map.size;
95
+ }
96
+
97
+ add(value: T): this {
98
+ const key = this.toKey(value);
99
+ this._map.set(key, value);
100
+ return this;
101
+ }
102
+
103
+ delete(value: T): boolean {
104
+ return this._map.delete(this.toKey(value));
105
+ }
106
+
107
+ has(value: T): boolean {
108
+ return this._map.has(this.toKey(value));
109
+ }
110
+
111
+ *entries(): IterableIterator<[T, T]> {
112
+ for (const entry of this._map.values()) {
113
+ yield [entry, entry];
114
+ }
115
+ }
116
+
117
+ keys(): IterableIterator<T> {
118
+ return this.values();
119
+ }
120
+
121
+ *values(): IterableIterator<T> {
122
+ for (const entry of this._map.values()) {
123
+ yield entry;
124
+ }
125
+ }
126
+
127
+ clear(): void {
128
+ this._map.clear();
129
+ }
130
+
131
+ forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void {
132
+ this._map.forEach(entry => callbackfn.call(thisArg, entry, entry, this));
133
+ }
134
+
135
+ [Symbol.iterator](): IterableIterator<T> {
136
+ return this.values();
137
+ }
138
+
139
+ [Symbol.toStringTag]: string = 'SetWithKey';
140
+ }
@@ -0,0 +1,130 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ function createDecorator(mapFn: (fn: Function, key: string) => Function): Function {
7
+ return (target: any, key: string, descriptor: any) => {
8
+ let fnKey: string | null = null;
9
+ let fn: Function | null = null;
10
+
11
+ if (typeof descriptor.value === 'function') {
12
+ fnKey = 'value';
13
+ fn = descriptor.value;
14
+ } else if (typeof descriptor.get === 'function') {
15
+ fnKey = 'get';
16
+ fn = descriptor.get;
17
+ }
18
+
19
+ if (!fn) {
20
+ throw new Error('not supported');
21
+ }
22
+
23
+ descriptor[fnKey!] = mapFn(fn, key);
24
+ };
25
+ }
26
+
27
+ export function memoize(_target: any, key: string, descriptor: any) {
28
+ let fnKey: string | null = null;
29
+ let fn: Function | null = null;
30
+
31
+ if (typeof descriptor.value === 'function') {
32
+ fnKey = 'value';
33
+ fn = descriptor.value;
34
+
35
+ if (fn!.length !== 0) {
36
+ console.warn('Memoize should only be used in functions with zero parameters');
37
+ }
38
+ } else if (typeof descriptor.get === 'function') {
39
+ fnKey = 'get';
40
+ fn = descriptor.get;
41
+ }
42
+
43
+ if (!fn) {
44
+ throw new Error('not supported');
45
+ }
46
+
47
+ const memoizeKey = `$memoize$${key}`;
48
+ descriptor[fnKey!] = function (...args: any[]) {
49
+ if (!this.hasOwnProperty(memoizeKey)) {
50
+ Object.defineProperty(this, memoizeKey, {
51
+ configurable: false,
52
+ enumerable: false,
53
+ writable: false,
54
+ value: fn.apply(this, args)
55
+ });
56
+ }
57
+
58
+ return this[memoizeKey];
59
+ };
60
+ }
61
+
62
+ export interface IDebounceReducer<T> {
63
+ (previousValue: T, ...args: any[]): T;
64
+ }
65
+
66
+ export function debounce<T>(delay: number, reducer?: IDebounceReducer<T>, initialValueProvider?: () => T): Function {
67
+ return createDecorator((fn, key) => {
68
+ const timerKey = `$debounce$${key}`;
69
+ const resultKey = `$debounce$result$${key}`;
70
+
71
+ return function (this: any, ...args: any[]) {
72
+ if (!this[resultKey]) {
73
+ this[resultKey] = initialValueProvider ? initialValueProvider() : undefined;
74
+ }
75
+
76
+ clearTimeout(this[timerKey]);
77
+
78
+ if (reducer) {
79
+ this[resultKey] = reducer(this[resultKey], ...args);
80
+ args = [this[resultKey]];
81
+ }
82
+
83
+ this[timerKey] = setTimeout(() => {
84
+ fn.apply(this, args);
85
+ this[resultKey] = initialValueProvider ? initialValueProvider() : undefined;
86
+ }, delay);
87
+ };
88
+ });
89
+ }
90
+
91
+ export function throttle<T>(delay: number, reducer?: IDebounceReducer<T>, initialValueProvider?: () => T): Function {
92
+ return createDecorator((fn, key) => {
93
+ const timerKey = `$throttle$timer$${key}`;
94
+ const resultKey = `$throttle$result$${key}`;
95
+ const lastRunKey = `$throttle$lastRun$${key}`;
96
+ const pendingKey = `$throttle$pending$${key}`;
97
+
98
+ return function (this: any, ...args: any[]) {
99
+ if (!this[resultKey]) {
100
+ this[resultKey] = initialValueProvider ? initialValueProvider() : undefined;
101
+ }
102
+ if (this[lastRunKey] === null || this[lastRunKey] === undefined) {
103
+ this[lastRunKey] = -Number.MAX_VALUE;
104
+ }
105
+
106
+ if (reducer) {
107
+ this[resultKey] = reducer(this[resultKey], ...args);
108
+ }
109
+
110
+ if (this[pendingKey]) {
111
+ return;
112
+ }
113
+
114
+ const nextTime = this[lastRunKey] + delay;
115
+ if (nextTime <= Date.now()) {
116
+ this[lastRunKey] = Date.now();
117
+ fn.apply(this, [this[resultKey]]);
118
+ this[resultKey] = initialValueProvider ? initialValueProvider() : undefined;
119
+ } else {
120
+ this[pendingKey] = true;
121
+ this[timerKey] = setTimeout(() => {
122
+ this[pendingKey] = false;
123
+ this[lastRunKey] = Date.now();
124
+ fn.apply(this, [this[resultKey]]);
125
+ this[resultKey] = initialValueProvider ? initialValueProvider() : undefined;
126
+ }, nextTime - Date.now());
127
+ }
128
+ };
129
+ });
130
+ }
@@ -0,0 +1,146 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ import * as arrays from 'vs/base/common/arrays';
7
+
8
+ export type EqualityComparer<T> = (a: T, b: T) => boolean;
9
+
10
+ /**
11
+ * Compares two items for equality using strict equality.
12
+ */
13
+ export const strictEquals: EqualityComparer<any> = (a, b) => a === b;
14
+
15
+ /**
16
+ * Checks if the items of two arrays are equal.
17
+ * By default, strict equality is used to compare elements, but a custom equality comparer can be provided.
18
+ */
19
+ export function itemsEquals<T>(itemEquals: EqualityComparer<T> = strictEquals): EqualityComparer<readonly T[]> {
20
+ return (a, b) => arrays.equals(a, b, itemEquals);
21
+ }
22
+
23
+ /**
24
+ * Two items are considered equal, if their stringified representations are equal.
25
+ */
26
+ export function jsonStringifyEquals<T>(): EqualityComparer<T> {
27
+ return (a, b) => JSON.stringify(a) === JSON.stringify(b);
28
+ }
29
+
30
+ /**
31
+ * Uses `item.equals(other)` to determine equality.
32
+ */
33
+ export function itemEquals<T extends { equals(other: T): boolean }>(): EqualityComparer<T> {
34
+ return (a, b) => a.equals(b);
35
+ }
36
+
37
+ /**
38
+ * Checks if two items are both null or undefined, or are equal according to the provided equality comparer.
39
+ */
40
+ export function equalsIfDefined<T>(v1: T | undefined | null, v2: T | undefined | null, equals: EqualityComparer<T>): boolean;
41
+ /**
42
+ * Returns an equality comparer that checks if two items are both null or undefined, or are equal according to the provided equality comparer.
43
+ */
44
+ export function equalsIfDefined<T>(equals: EqualityComparer<T>): EqualityComparer<T | undefined | null>;
45
+ export function equalsIfDefined<T>(equalsOrV1: EqualityComparer<T> | T, v2?: T | undefined | null, equals?: EqualityComparer<T>): EqualityComparer<T | undefined | null> | boolean {
46
+ if (equals !== undefined) {
47
+ const v1 = equalsOrV1 as T | undefined;
48
+ if (v1 === undefined || v1 === null || v2 === undefined || v2 === null) {
49
+ return v2 === v1;
50
+ }
51
+ return equals(v1, v2);
52
+ } else {
53
+ const equals = equalsOrV1 as EqualityComparer<T>;
54
+ return (v1, v2) => {
55
+ if (v1 === undefined || v1 === null || v2 === undefined || v2 === null) {
56
+ return v2 === v1;
57
+ }
58
+ return equals(v1, v2);
59
+ };
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Drills into arrays (items ordered) and objects (keys unordered) and uses strict equality on everything else.
65
+ */
66
+ export function structuralEquals<T>(a: T, b: T): boolean {
67
+ if (a === b) {
68
+ return true;
69
+ }
70
+
71
+ if (Array.isArray(a) && Array.isArray(b)) {
72
+ if (a.length !== b.length) {
73
+ return false;
74
+ }
75
+ for (let i = 0; i < a.length; i++) {
76
+ if (!structuralEquals(a[i], b[i])) {
77
+ return false;
78
+ }
79
+ }
80
+ return true;
81
+ }
82
+
83
+ if (a && typeof a === 'object' && b && typeof b === 'object') {
84
+ if (Object.getPrototypeOf(a) === Object.prototype && Object.getPrototypeOf(b) === Object.prototype) {
85
+ const aObj = a as Record<string, unknown>;
86
+ const bObj = b as Record<string, unknown>;
87
+ const keysA = Object.keys(aObj);
88
+ const keysB = Object.keys(bObj);
89
+ const keysBSet = new Set(keysB);
90
+
91
+ if (keysA.length !== keysB.length) {
92
+ return false;
93
+ }
94
+
95
+ for (const key of keysA) {
96
+ if (!keysBSet.has(key)) {
97
+ return false;
98
+ }
99
+ if (!structuralEquals(aObj[key], bObj[key])) {
100
+ return false;
101
+ }
102
+ }
103
+
104
+ return true;
105
+ }
106
+ }
107
+
108
+ return false;
109
+ }
110
+
111
+ /**
112
+ * `getStructuralKey(a) === getStructuralKey(b) <=> structuralEquals(a, b)`
113
+ * (assuming that a and b are not cyclic structures and nothing extends globalThis Array).
114
+ */
115
+ export function getStructuralKey(t: unknown): string {
116
+ return JSON.stringify(toNormalizedJsonStructure(t));
117
+ }
118
+
119
+ let objectId = 0;
120
+ const objIds = new WeakMap<object, number>();
121
+
122
+ function toNormalizedJsonStructure(t: unknown): unknown {
123
+ if (Array.isArray(t)) {
124
+ return t.map(toNormalizedJsonStructure);
125
+ }
126
+
127
+ if (t && typeof t === 'object') {
128
+ if (Object.getPrototypeOf(t) === Object.prototype) {
129
+ const tObj = t as Record<string, unknown>;
130
+ const res: Record<string, unknown> = Object.create(null);
131
+ for (const key of Object.keys(tObj).sort()) {
132
+ res[key] = toNormalizedJsonStructure(tObj[key]);
133
+ }
134
+ return res;
135
+ } else {
136
+ let objId = objIds.get(t);
137
+ if (objId === undefined) {
138
+ objId = objectId++;
139
+ objIds.set(t, objId);
140
+ }
141
+ // Random string to prevent collisions
142
+ return objId + '----2b76a038c20c4bcc';
143
+ }
144
+ }
145
+ return t;
146
+ }
@@ -0,0 +1,303 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Microsoft Corporation. All rights reserved.
3
+ * Licensed under the MIT License. See License.txt in the project root for license information.
4
+ *--------------------------------------------------------------------------------------------*/
5
+
6
+ export interface ErrorListenerCallback {
7
+ (error: any): void;
8
+ }
9
+
10
+ export interface ErrorListenerUnbind {
11
+ (): void;
12
+ }
13
+
14
+ // Avoid circular dependency on EventEmitter by implementing a subset of the interface.
15
+ export class ErrorHandler {
16
+ private unexpectedErrorHandler: (e: any) => void;
17
+ private listeners: ErrorListenerCallback[];
18
+
19
+ constructor() {
20
+
21
+ this.listeners = [];
22
+
23
+ this.unexpectedErrorHandler = function (e: any) {
24
+ setTimeout(() => {
25
+ if (e.stack) {
26
+ if (ErrorNoTelemetry.isErrorNoTelemetry(e)) {
27
+ throw new ErrorNoTelemetry(e.message + '\n\n' + e.stack);
28
+ }
29
+
30
+ throw new Error(e.message + '\n\n' + e.stack);
31
+ }
32
+
33
+ throw e;
34
+ }, 0);
35
+ };
36
+ }
37
+
38
+ addListener(listener: ErrorListenerCallback): ErrorListenerUnbind {
39
+ this.listeners.push(listener);
40
+
41
+ return () => {
42
+ this._removeListener(listener);
43
+ };
44
+ }
45
+
46
+ private emit(e: any): void {
47
+ this.listeners.forEach((listener) => {
48
+ listener(e);
49
+ });
50
+ }
51
+
52
+ private _removeListener(listener: ErrorListenerCallback): void {
53
+ this.listeners.splice(this.listeners.indexOf(listener), 1);
54
+ }
55
+
56
+ setUnexpectedErrorHandler(newUnexpectedErrorHandler: (e: any) => void): void {
57
+ this.unexpectedErrorHandler = newUnexpectedErrorHandler;
58
+ }
59
+
60
+ getUnexpectedErrorHandler(): (e: any) => void {
61
+ return this.unexpectedErrorHandler;
62
+ }
63
+
64
+ onUnexpectedError(e: any): void {
65
+ this.unexpectedErrorHandler(e);
66
+ this.emit(e);
67
+ }
68
+
69
+ // For external errors, we don't want the listeners to be called
70
+ onUnexpectedExternalError(e: any): void {
71
+ this.unexpectedErrorHandler(e);
72
+ }
73
+ }
74
+
75
+ export const errorHandler = new ErrorHandler();
76
+
77
+ /** @skipMangle */
78
+ export function setUnexpectedErrorHandler(newUnexpectedErrorHandler: (e: any) => void): void {
79
+ errorHandler.setUnexpectedErrorHandler(newUnexpectedErrorHandler);
80
+ }
81
+
82
+ /**
83
+ * Returns if the error is a SIGPIPE error. SIGPIPE errors should generally be
84
+ * logged at most once, to avoid a loop.
85
+ *
86
+ * @see https://github.com/microsoft/vscode-remote-release/issues/6481
87
+ */
88
+ export function isSigPipeError(e: unknown): e is Error {
89
+ if (!e || typeof e !== 'object') {
90
+ return false;
91
+ }
92
+
93
+ const cast = e as Record<string, string | undefined>;
94
+ return cast.code === 'EPIPE' && cast.syscall?.toUpperCase() === 'WRITE';
95
+ }
96
+
97
+ export function onUnexpectedError(e: any): undefined {
98
+ // ignore errors from cancelled promises
99
+ if (!isCancellationError(e)) {
100
+ errorHandler.onUnexpectedError(e);
101
+ }
102
+ return undefined;
103
+ }
104
+
105
+ export function onUnexpectedExternalError(e: any): undefined {
106
+ // ignore errors from cancelled promises
107
+ if (!isCancellationError(e)) {
108
+ errorHandler.onUnexpectedExternalError(e);
109
+ }
110
+ return undefined;
111
+ }
112
+
113
+ export interface SerializedError {
114
+ readonly $isError: true;
115
+ readonly name: string;
116
+ readonly message: string;
117
+ readonly stack: string;
118
+ readonly noTelemetry: boolean;
119
+ }
120
+
121
+ export function transformErrorForSerialization(error: Error): SerializedError;
122
+ export function transformErrorForSerialization(error: any): any;
123
+ export function transformErrorForSerialization(error: any): any {
124
+ if (error instanceof Error) {
125
+ const { name, message } = error;
126
+ const stack: string = (<any>error).stacktrace || (<any>error).stack;
127
+ return {
128
+ $isError: true,
129
+ name,
130
+ message,
131
+ stack,
132
+ noTelemetry: ErrorNoTelemetry.isErrorNoTelemetry(error)
133
+ };
134
+ }
135
+
136
+ // return as is
137
+ return error;
138
+ }
139
+
140
+ export function transformErrorFromSerialization(data: SerializedError): Error {
141
+ let error: Error;
142
+ if (data.noTelemetry) {
143
+ error = new ErrorNoTelemetry();
144
+ } else {
145
+ error = new Error();
146
+ error.name = data.name;
147
+ }
148
+ error.message = data.message;
149
+ error.stack = data.stack;
150
+ return error;
151
+ }
152
+
153
+ // see https://github.com/v8/v8/wiki/Stack%20Trace%20API#basic-stack-traces
154
+ export interface V8CallSite {
155
+ getThis(): unknown;
156
+ getTypeName(): string | null;
157
+ getFunction(): Function | undefined;
158
+ getFunctionName(): string | null;
159
+ getMethodName(): string | null;
160
+ getFileName(): string | null;
161
+ getLineNumber(): number | null;
162
+ getColumnNumber(): number | null;
163
+ getEvalOrigin(): string | undefined;
164
+ isToplevel(): boolean;
165
+ isEval(): boolean;
166
+ isNative(): boolean;
167
+ isConstructor(): boolean;
168
+ toString(): string;
169
+ }
170
+
171
+ const canceledName = 'Canceled';
172
+
173
+ /**
174
+ * Checks if the given error is a promise in canceled state
175
+ */
176
+ export function isCancellationError(error: any): boolean {
177
+ if (error instanceof CancellationError) {
178
+ return true;
179
+ }
180
+ return error instanceof Error && error.name === canceledName && error.message === canceledName;
181
+ }
182
+
183
+ // !!!IMPORTANT!!!
184
+ // Do NOT change this class because it is also used as an API-type.
185
+ export class CancellationError extends Error {
186
+ constructor() {
187
+ super(canceledName);
188
+ this.name = this.message;
189
+ }
190
+ }
191
+
192
+ /**
193
+ * @deprecated use {@link CancellationError `new CancellationError()`} instead
194
+ */
195
+ export function canceled(): Error {
196
+ const error = new Error(canceledName);
197
+ error.name = error.message;
198
+ return error;
199
+ }
200
+
201
+ export function illegalArgument(name?: string): Error {
202
+ if (name) {
203
+ return new Error(`Illegal argument: ${name}`);
204
+ } else {
205
+ return new Error('Illegal argument');
206
+ }
207
+ }
208
+
209
+ export function illegalState(name?: string): Error {
210
+ if (name) {
211
+ return new Error(`Illegal state: ${name}`);
212
+ } else {
213
+ return new Error('Illegal state');
214
+ }
215
+ }
216
+
217
+ export class ReadonlyError extends TypeError {
218
+ constructor(name?: string) {
219
+ super(name ? `${name} is read-only and cannot be changed` : 'Cannot change read-only property');
220
+ }
221
+ }
222
+
223
+ export function getErrorMessage(err: any): string {
224
+ if (!err) {
225
+ return 'Error';
226
+ }
227
+
228
+ if (err.message) {
229
+ return err.message;
230
+ }
231
+
232
+ if (err.stack) {
233
+ return err.stack.split('\n')[0];
234
+ }
235
+
236
+ return String(err);
237
+ }
238
+
239
+ export class NotImplementedError extends Error {
240
+ constructor(message?: string) {
241
+ super('NotImplemented');
242
+ if (message) {
243
+ this.message = message;
244
+ }
245
+ }
246
+ }
247
+
248
+ export class NotSupportedError extends Error {
249
+ constructor(message?: string) {
250
+ super('NotSupported');
251
+ if (message) {
252
+ this.message = message;
253
+ }
254
+ }
255
+ }
256
+
257
+ export class ExpectedError extends Error {
258
+ readonly isExpected = true;
259
+ }
260
+
261
+ /**
262
+ * Error that when thrown won't be logged in telemetry as an unhandled error.
263
+ */
264
+ export class ErrorNoTelemetry extends Error {
265
+ override readonly name: string;
266
+
267
+ constructor(msg?: string) {
268
+ super(msg);
269
+ this.name = 'CodeExpectedError';
270
+ }
271
+
272
+ public static fromError(err: Error): ErrorNoTelemetry {
273
+ if (err instanceof ErrorNoTelemetry) {
274
+ return err;
275
+ }
276
+
277
+ const result = new ErrorNoTelemetry();
278
+ result.message = err.message;
279
+ result.stack = err.stack;
280
+ return result;
281
+ }
282
+
283
+ public static isErrorNoTelemetry(err: Error): err is ErrorNoTelemetry {
284
+ return err.name === 'CodeExpectedError';
285
+ }
286
+ }
287
+
288
+ /**
289
+ * This error indicates a bug.
290
+ * Do not throw this for invalid user input.
291
+ * Only catch this error to recover gracefully from bugs.
292
+ */
293
+ export class BugIndicatingError extends Error {
294
+ constructor(message?: string) {
295
+ super(message || 'An unexpected bug occurred.');
296
+ Object.setPrototypeOf(this, BugIndicatingError.prototype);
297
+
298
+ // Because we know for sure only buggy code throws this,
299
+ // we definitely want to break here and fix the bug.
300
+ // eslint-disable-next-line no-debugger
301
+ // debugger;
302
+ }
303
+ }