@opensumi/ide-utils 2.21.13 → 2.22.0
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/lib/arrays.d.ts +3 -3
- package/lib/arrays.d.ts.map +1 -1
- package/lib/arrays.js.map +1 -1
- package/lib/async.d.ts +3 -3
- package/lib/async.d.ts.map +1 -1
- package/lib/buffer.js +4 -4
- package/lib/buffer.js.map +1 -1
- package/lib/character-classifier.js +3 -3
- package/lib/character-classifier.js.map +1 -1
- package/lib/decorators.d.ts +1 -1
- package/lib/decorators.d.ts.map +1 -1
- package/lib/encoding.d.ts +7 -1
- package/lib/encoding.d.ts.map +1 -1
- package/lib/encoding.js +15 -2
- package/lib/encoding.js.map +1 -1
- package/lib/errors.d.ts +2 -2
- package/lib/errors.d.ts.map +1 -1
- package/lib/event.d.ts +2 -2
- package/lib/event.d.ts.map +1 -1
- package/lib/filters.d.ts +3 -3
- package/lib/filters.d.ts.map +1 -1
- package/lib/filters.js +25 -25
- package/lib/filters.js.map +1 -1
- package/lib/glob.d.ts +2 -2
- package/lib/glob.d.ts.map +1 -1
- package/lib/glob.js +1 -1
- package/lib/glob.js.map +1 -1
- package/lib/hash.js +10 -10
- package/lib/hash.js.map +1 -1
- package/lib/iterator.d.ts +1 -1
- package/lib/iterator.d.ts.map +1 -1
- package/lib/linked-text.d.ts +1 -1
- package/lib/linked-text.d.ts.map +1 -1
- package/lib/linked-text.js.map +1 -1
- package/lib/map.js +17 -17
- package/lib/map.js.map +1 -1
- package/lib/objects.d.ts +1 -0
- package/lib/objects.d.ts.map +1 -1
- package/lib/objects.js +38 -1
- package/lib/objects.js.map +1 -1
- package/lib/os.d.ts +1 -8
- package/lib/os.d.ts.map +1 -1
- package/lib/os.js +4 -8
- package/lib/os.js.map +1 -1
- package/lib/path.d.ts +1 -1
- package/lib/path.d.ts.map +1 -1
- package/lib/path.js +29 -29
- package/lib/path.js.map +1 -1
- package/lib/platform.js +8 -8
- package/lib/platform.js.map +1 -1
- package/lib/process.d.ts.map +1 -1
- package/lib/process.js +28 -13
- package/lib/process.js.map +1 -1
- package/lib/progress.js +3 -3
- package/lib/progress.js.map +1 -1
- package/lib/strings.js +9 -9
- package/lib/strings.js.map +1 -1
- package/lib/types.d.ts +5 -1
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +8 -1
- package/lib/types.js.map +1 -1
- package/lib/uint.js +4 -4
- package/lib/uint.js.map +1 -1
- package/lib/uri.js +8 -8
- package/lib/uri.js.map +1 -1
- package/lib/uuid.d.ts +1 -1
- package/lib/uuid.d.ts.map +1 -1
- package/lib/uuid.js +3 -2
- package/lib/uuid.js.map +1 -1
- package/package.json +8 -6
- package/src/ansi.ts +10 -0
- package/src/argv.ts +57 -0
- package/src/arrays.ts +328 -0
- package/src/async.ts +580 -0
- package/src/buffer.ts +290 -0
- package/src/cache.ts +37 -0
- package/src/cancellation.ts +136 -0
- package/src/charCode.ts +425 -0
- package/src/character-classifier.ts +82 -0
- package/src/const/encoding.ts +242 -0
- package/src/const/index.ts +1 -0
- package/src/date.ts +36 -0
- package/src/decorators.ts +166 -0
- package/src/disposable.ts +377 -0
- package/src/encoding.ts +278 -0
- package/src/errors.ts +192 -0
- package/src/event.ts +1024 -0
- package/src/file-uri.ts +41 -0
- package/src/filters.ts +887 -0
- package/src/functional.ts +43 -0
- package/src/glob.ts +752 -0
- package/src/hash.ts +336 -0
- package/src/iconLabels.ts +149 -0
- package/src/index.ts +40 -0
- package/src/iterator.ts +36 -0
- package/src/lifecycle.ts +48 -0
- package/src/linked-list.ts +144 -0
- package/src/linked-text.ts +55 -0
- package/src/lru-map.ts +133 -0
- package/src/map.ts +934 -0
- package/src/marshalling.ts +62 -0
- package/src/objects.ts +145 -0
- package/src/os.ts +76 -0
- package/src/path.ts +1885 -0
- package/src/platform.ts +194 -0
- package/src/process.ts +43 -0
- package/src/progress.ts +83 -0
- package/src/promises.ts +23 -0
- package/src/sequence.ts +28 -0
- package/src/strings.ts +1002 -0
- package/src/types.ts +214 -0
- package/src/uint.ts +59 -0
- package/src/uri.ts +298 -0
- package/src/uuid.ts +6 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Iterator, IteratorResult, FIN } from './iterator';
|
|
2
|
+
|
|
3
|
+
class Node<E> {
|
|
4
|
+
static readonly Undefined = new Node<any>(undefined);
|
|
5
|
+
|
|
6
|
+
element: E;
|
|
7
|
+
next: Node<E>;
|
|
8
|
+
prev: Node<E>;
|
|
9
|
+
|
|
10
|
+
constructor(element: E) {
|
|
11
|
+
this.element = element;
|
|
12
|
+
this.next = Node.Undefined;
|
|
13
|
+
this.prev = Node.Undefined;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class LinkedList<E> {
|
|
18
|
+
private _first: Node<E> = Node.Undefined;
|
|
19
|
+
private _last: Node<E> = Node.Undefined;
|
|
20
|
+
private _size = 0;
|
|
21
|
+
|
|
22
|
+
get size(): number {
|
|
23
|
+
return this._size;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
isEmpty(): boolean {
|
|
27
|
+
return this._first === Node.Undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
clear(): void {
|
|
31
|
+
this._first = Node.Undefined;
|
|
32
|
+
this._last = Node.Undefined;
|
|
33
|
+
this._size = 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
unshift(element: E): () => void {
|
|
37
|
+
return this._insert(element, false);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
push(element: E): () => void {
|
|
41
|
+
return this._insert(element, true);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private _insert(element: E, atTheEnd: boolean): () => void {
|
|
45
|
+
const newNode = new Node(element);
|
|
46
|
+
if (this._first === Node.Undefined) {
|
|
47
|
+
this._first = newNode;
|
|
48
|
+
this._last = newNode;
|
|
49
|
+
} else if (atTheEnd) {
|
|
50
|
+
// push
|
|
51
|
+
const oldLast = this._last!;
|
|
52
|
+
this._last = newNode;
|
|
53
|
+
newNode.prev = oldLast;
|
|
54
|
+
oldLast.next = newNode;
|
|
55
|
+
} else {
|
|
56
|
+
// unshift
|
|
57
|
+
const oldFirst = this._first;
|
|
58
|
+
this._first = newNode;
|
|
59
|
+
newNode.next = oldFirst;
|
|
60
|
+
oldFirst.prev = newNode;
|
|
61
|
+
}
|
|
62
|
+
this._size += 1;
|
|
63
|
+
|
|
64
|
+
let didRemove = false;
|
|
65
|
+
return () => {
|
|
66
|
+
if (!didRemove) {
|
|
67
|
+
didRemove = true;
|
|
68
|
+
this._remove(newNode);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
shift(): E | undefined {
|
|
74
|
+
if (this._first === Node.Undefined) {
|
|
75
|
+
return undefined;
|
|
76
|
+
} else {
|
|
77
|
+
const res = this._first.element;
|
|
78
|
+
this._remove(this._first);
|
|
79
|
+
return res;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
pop(): E | undefined {
|
|
84
|
+
if (this._last === Node.Undefined) {
|
|
85
|
+
return undefined;
|
|
86
|
+
} else {
|
|
87
|
+
const res = this._last.element;
|
|
88
|
+
this._remove(this._last);
|
|
89
|
+
return res;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private _remove(node: Node<E>): void {
|
|
94
|
+
if (node.prev !== Node.Undefined && node.next !== Node.Undefined) {
|
|
95
|
+
// middle
|
|
96
|
+
const anchor = node.prev;
|
|
97
|
+
anchor.next = node.next;
|
|
98
|
+
node.next.prev = anchor;
|
|
99
|
+
} else if (node.prev === Node.Undefined && node.next === Node.Undefined) {
|
|
100
|
+
// only node
|
|
101
|
+
this._first = Node.Undefined;
|
|
102
|
+
this._last = Node.Undefined;
|
|
103
|
+
} else if (node.next === Node.Undefined) {
|
|
104
|
+
// last
|
|
105
|
+
this._last = this._last!.prev!;
|
|
106
|
+
this._last.next = Node.Undefined;
|
|
107
|
+
} else if (node.prev === Node.Undefined) {
|
|
108
|
+
// first
|
|
109
|
+
this._first = this._first!.next!;
|
|
110
|
+
this._first.prev = Node.Undefined;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// done
|
|
114
|
+
this._size -= 1;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
iterator(): Iterator<E> {
|
|
118
|
+
let element: { done: false; value: E };
|
|
119
|
+
let node = this._first;
|
|
120
|
+
return {
|
|
121
|
+
next(): IteratorResult<E> {
|
|
122
|
+
if (node === Node.Undefined) {
|
|
123
|
+
return FIN;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (!element) {
|
|
127
|
+
element = { done: false, value: node.element };
|
|
128
|
+
} else {
|
|
129
|
+
element.value = node.element;
|
|
130
|
+
}
|
|
131
|
+
node = node.next;
|
|
132
|
+
return element;
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
toArray(): E[] {
|
|
138
|
+
const result: E[] = [];
|
|
139
|
+
for (let node = this._first; node !== Node.Undefined; node = node.next) {
|
|
140
|
+
result.push(node.element);
|
|
141
|
+
}
|
|
142
|
+
return result;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
// Some code copied and modified from https://github.com/microsoft/vscode/blob/1.44.0/src/vs/base/common/linkedText.ts
|
|
6
|
+
|
|
7
|
+
import { memoize } from './decorators';
|
|
8
|
+
|
|
9
|
+
export interface ILink {
|
|
10
|
+
readonly label: string;
|
|
11
|
+
readonly href: string;
|
|
12
|
+
readonly title?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type LinkedTextNode = string | ILink;
|
|
16
|
+
|
|
17
|
+
export class LinkedText {
|
|
18
|
+
constructor(readonly nodes: LinkedTextNode[]) {}
|
|
19
|
+
|
|
20
|
+
@memoize
|
|
21
|
+
toString(): string {
|
|
22
|
+
return this.nodes.map((node) => (typeof node === 'string' ? node : node.label)).join('');
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const LINK_REGEX = /\[([^\]]+)\]\(((?:https?:\/\/|command:)[^\)\s]+)(?: ("|')([^\3]+)(\3))?\)/gi;
|
|
27
|
+
|
|
28
|
+
export function parseLinkedText(text: string): LinkedText {
|
|
29
|
+
const result: LinkedTextNode[] = [];
|
|
30
|
+
|
|
31
|
+
let index = 0;
|
|
32
|
+
let match: RegExpExecArray | null;
|
|
33
|
+
|
|
34
|
+
while ((match = LINK_REGEX.exec(text))) {
|
|
35
|
+
if (match.index - index > 0) {
|
|
36
|
+
result.push(text.substring(index, match.index));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const [, label, href, , title] = match;
|
|
40
|
+
|
|
41
|
+
if (title) {
|
|
42
|
+
result.push({ label, href, title });
|
|
43
|
+
} else {
|
|
44
|
+
result.push({ label, href });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
index = match.index + match[0].length;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (index < text.length) {
|
|
51
|
+
result.push(text.substring(index));
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return new LinkedText(result);
|
|
55
|
+
}
|
package/src/lru-map.ts
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Emitter, Event } from './event';
|
|
2
|
+
|
|
3
|
+
export interface ILRULinkListNode<K> {
|
|
4
|
+
key: K | undefined;
|
|
5
|
+
next: ILRULinkListNode<K> | undefined;
|
|
6
|
+
prev: ILRULinkListNode<K> | undefined;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 自带LRU清理的Map
|
|
11
|
+
* 双向链表 + Map
|
|
12
|
+
*/
|
|
13
|
+
export class LRUMap<K, V> extends Map<K, V> {
|
|
14
|
+
private _onDidDelete = new Emitter<{ key: K; value: V }>();
|
|
15
|
+
|
|
16
|
+
public readonly onDidDelete: Event<{ key: K; value: V }> = this._onDidDelete.event;
|
|
17
|
+
|
|
18
|
+
private head: ILRULinkListNode<K> = { key: undefined, prev: undefined, next: undefined };
|
|
19
|
+
|
|
20
|
+
private tail: ILRULinkListNode<K> = { key: undefined, prev: undefined, next: undefined };
|
|
21
|
+
|
|
22
|
+
private map: Map<K, ILRULinkListNode<K>> = new Map();
|
|
23
|
+
|
|
24
|
+
constructor(private hardLimit: number, private softLimit: number) {
|
|
25
|
+
super();
|
|
26
|
+
if (hardLimit <= softLimit) {
|
|
27
|
+
throw new Error('hardLimit 必须比 softLimit大');
|
|
28
|
+
}
|
|
29
|
+
this.head.next = this.tail;
|
|
30
|
+
this.tail.prev = this.head;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
private markRecentUsed(key: K) {
|
|
34
|
+
if (!this.map.get(key)) {
|
|
35
|
+
this.map.set(key, { key, prev: undefined, next: undefined });
|
|
36
|
+
}
|
|
37
|
+
this.putHead(this.map.get(key)!);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
get(key: K): V | undefined {
|
|
41
|
+
const v = super.get(key);
|
|
42
|
+
if (v) {
|
|
43
|
+
this.markRecentUsed(key);
|
|
44
|
+
}
|
|
45
|
+
return v;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
set(key: K, value: V): this {
|
|
49
|
+
this.markRecentUsed(key);
|
|
50
|
+
super.set(key, value);
|
|
51
|
+
if (this.size > this.hardLimit) {
|
|
52
|
+
this.shrink();
|
|
53
|
+
}
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
putHead(node: ILRULinkListNode<K>) {
|
|
58
|
+
this.deleteNodeFromList(node);
|
|
59
|
+
const lastHead = this.head.next;
|
|
60
|
+
this.head.next = node;
|
|
61
|
+
node.next = lastHead;
|
|
62
|
+
node.prev = undefined;
|
|
63
|
+
if (lastHead) {
|
|
64
|
+
lastHead.prev = node;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protected deleteNodeFromList(node: ILRULinkListNode<K>) {
|
|
69
|
+
if (node.prev) {
|
|
70
|
+
node.prev.next = node.next;
|
|
71
|
+
}
|
|
72
|
+
if (node.next) {
|
|
73
|
+
node.next.prev = node.prev;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
delete(key: K) {
|
|
78
|
+
const node = this.map.get(key);
|
|
79
|
+
if (node) {
|
|
80
|
+
this.deleteNodeFromList(node);
|
|
81
|
+
}
|
|
82
|
+
const value = super.get(key);
|
|
83
|
+
this._onDidDelete.fire({
|
|
84
|
+
key,
|
|
85
|
+
value: value!,
|
|
86
|
+
});
|
|
87
|
+
return super.delete(key);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
shrink() {
|
|
91
|
+
const toDelete = this.size - this.softLimit;
|
|
92
|
+
let toDeleteNode: ILRULinkListNode<K> = this.tail;
|
|
93
|
+
for (let i = 0; i < toDelete; i++) {
|
|
94
|
+
toDeleteNode = this.tail.prev!;
|
|
95
|
+
if (!toDeleteNode || toDeleteNode === this.head) {
|
|
96
|
+
break;
|
|
97
|
+
} else {
|
|
98
|
+
this.delete(toDeleteNode.key!);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const NOW = Symbol('now');
|
|
105
|
+
/**
|
|
106
|
+
* 支持过期时间
|
|
107
|
+
*/
|
|
108
|
+
export class StaleLRUMap<K, V> extends LRUMap<K, V> {
|
|
109
|
+
constructor(hardLimit: number, softLimit: number, private maxAge: number) {
|
|
110
|
+
super(hardLimit, softLimit);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
get(key: K): V | undefined {
|
|
114
|
+
const v = super.get(key);
|
|
115
|
+
if (v) {
|
|
116
|
+
if (!this._isStale(v)) {
|
|
117
|
+
return v;
|
|
118
|
+
}
|
|
119
|
+
// 过期则删除该条记录
|
|
120
|
+
this.delete(key);
|
|
121
|
+
}
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
set(key: K, value: V): this {
|
|
126
|
+
value[NOW] = Date.now();
|
|
127
|
+
return super.set(key, value);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
private _isStale(value: V): boolean {
|
|
131
|
+
return value[NOW] + this.maxAge <= Date.now();
|
|
132
|
+
}
|
|
133
|
+
}
|