@opensumi/ide-core-common 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/command.d.ts +15 -5
- package/lib/command.d.ts.map +1 -1
- package/lib/command.js +11 -1
- package/lib/command.js.map +1 -1
- package/lib/const/application.d.ts +6 -1
- package/lib/const/application.d.ts.map +1 -1
- package/lib/const/application.js +8 -3
- package/lib/const/application.js.map +1 -1
- package/lib/declare.d.ts +2 -2
- package/lib/declare.d.ts.map +1 -1
- package/lib/editor.d.ts +4 -0
- package/lib/editor.d.ts.map +1 -1
- package/lib/electron.d.ts +1 -1
- package/lib/electron.d.ts.map +1 -1
- package/lib/event-bus/event-bus-types.d.ts +1 -1
- package/lib/event-bus/event-bus-types.d.ts.map +1 -1
- package/lib/event-bus/event-bus.js.map +1 -1
- package/lib/event-bus/event-decorator.js.map +1 -1
- package/lib/extension.schema.d.ts +1 -1
- package/lib/extension.schema.d.ts.map +1 -1
- package/lib/hash-calculate/WASMInterface.d.ts +2 -2
- package/lib/hash-calculate/WASMInterface.d.ts.map +1 -1
- package/lib/hash-calculate/hash-calculate.js.map +1 -1
- package/lib/hash-calculate/util.d.ts +2 -2
- package/lib/hash-calculate/util.d.ts.map +1 -1
- package/lib/json-schema.d.ts +9 -0
- package/lib/json-schema.d.ts.map +1 -1
- package/lib/keyboard/keymap.d.ts +1 -1
- package/lib/keyboard/keymap.d.ts.map +1 -1
- package/lib/localize.d.ts +1 -1
- package/lib/localize.d.ts.map +1 -1
- package/lib/log.d.ts +2 -2
- package/lib/log.d.ts.map +1 -1
- package/lib/mime.d.ts +6 -6
- package/lib/module.js.map +1 -1
- package/lib/preferences/preference-schema.d.ts +13 -3
- package/lib/preferences/preference-schema.d.ts.map +1 -1
- package/lib/preferences/preference-schema.js +11 -1
- package/lib/preferences/preference-schema.js.map +1 -1
- package/lib/preferences/preference-scope.d.ts +8 -1
- package/lib/preferences/preference-scope.d.ts.map +1 -1
- package/lib/preferences/preference-scope.js +11 -2
- package/lib/preferences/preference-scope.js.map +1 -1
- package/lib/problem-matcher.d.ts +1 -1
- package/lib/problem-matcher.d.ts.map +1 -1
- package/lib/problem-matcher.js.map +1 -1
- package/lib/problem-pattern.d.ts +4 -2
- package/lib/problem-pattern.d.ts.map +1 -1
- package/lib/problem-pattern.js +24 -1
- package/lib/problem-pattern.js.map +1 -1
- package/lib/reference.d.ts +2 -1
- package/lib/reference.d.ts.map +1 -1
- package/lib/reference.js +11 -6
- package/lib/reference.js.map +1 -1
- package/lib/reporter.js.map +1 -1
- package/lib/storage.d.ts +1 -1
- package/lib/storage.d.ts.map +1 -1
- package/lib/storage.js.map +1 -1
- package/lib/task-definition.js.map +1 -1
- package/lib/types/common.d.ts +1 -1
- package/lib/types/common.d.ts.map +1 -1
- package/lib/types/editor.d.ts +2 -2
- package/lib/types/editor.d.ts.map +1 -1
- package/lib/types/file-watch.d.ts +1 -1
- package/lib/types/file-watch.d.ts.map +1 -1
- package/lib/types/markers/markers-manager.d.ts.map +1 -1
- package/lib/types/markers/markers-manager.js +4 -10
- package/lib/types/markers/markers-manager.js.map +1 -1
- package/lib/types/markers/markers.d.ts +2 -0
- package/lib/types/markers/markers.d.ts.map +1 -1
- package/lib/types/markers/markers.js.map +1 -1
- package/package.json +7 -6
- package/src/LifeCyclePhase.ts +6 -0
- package/src/application-error.ts +77 -0
- package/src/application-props.ts +28 -0
- package/src/application.lifecycle.ts +15 -0
- package/src/browser-fs/ensure-dir.ts +46 -0
- package/src/browser-fs/util.ts +52 -0
- package/src/clipboard.ts +31 -0
- package/src/command.ts +726 -0
- package/src/commands/terminal.ts +0 -0
- package/src/comparers.ts +152 -0
- package/src/connection.ts +7 -0
- package/src/const/application.ts +11 -0
- package/src/const/index.ts +1 -0
- package/src/contribution-provider.ts +47 -0
- package/src/credential.ts +21 -0
- package/src/crypto.ts +8 -0
- package/src/declare.ts +3 -0
- package/src/di-helper/domain-helper.ts +48 -0
- package/src/di-helper/index.ts +1 -0
- package/src/editor.ts +6 -0
- package/src/electron.ts +168 -0
- package/src/env.ts +1 -0
- package/src/event-bus/basic-event.ts +3 -0
- package/src/event-bus/event-bus-types.ts +68 -0
- package/src/event-bus/event-bus.ts +57 -0
- package/src/event-bus/event-decorator.ts +32 -0
- package/src/event-bus/index.ts +4 -0
- package/src/extension.schema.ts +16 -0
- package/src/hash-calculate/WASMInterface.ts +266 -0
- package/src/hash-calculate/hash-calculate.ts +53 -0
- package/src/hash-calculate/lockedCreate.ts +17 -0
- package/src/hash-calculate/md5.wasm.json +1 -0
- package/src/hash-calculate/mutex.ts +30 -0
- package/src/hash-calculate/util.ts +190 -0
- package/src/id-generator.ts +15 -0
- package/src/index.ts +39 -0
- package/src/json-schema.ts +80 -0
- package/src/keyboard/index.ts +2 -0
- package/src/keyboard/keyboard-layout-provider.ts +46 -0
- package/src/keyboard/keymap.ts +224 -0
- package/src/line-text.ts +93 -0
- package/src/localize.ts +203 -0
- package/src/log.ts +338 -0
- package/src/markdown.ts +8 -0
- package/src/menu.ts +31 -0
- package/src/mime.ts +8 -0
- package/src/mocks/electron/browserMock.ts +10 -0
- package/src/mocks/electron/ipcRenderer.ts +30 -0
- package/src/module.ts +31 -0
- package/src/network.ts +47 -0
- package/src/node/cli.ts +5 -0
- package/src/node/port.ts +134 -0
- package/src/preferences/index.ts +2 -0
- package/src/preferences/preference-schema.ts +122 -0
- package/src/preferences/preference-scope.ts +65 -0
- package/src/problem-matcher.ts +389 -0
- package/src/problem-pattern.ts +574 -0
- package/src/range.ts +24 -0
- package/src/reference.ts +141 -0
- package/src/reporter.ts +64 -0
- package/src/settings/general.ts +5 -0
- package/src/settings/index.ts +3 -0
- package/src/settings/search.ts +7 -0
- package/src/settings/terminal.ts +9 -0
- package/src/storage.ts +99 -0
- package/src/task-definition.ts +172 -0
- package/src/theme.ts +7 -0
- package/src/types/accessibility.ts +4 -0
- package/src/types/application.ts +14 -0
- package/src/types/authentication.ts +120 -0
- package/src/types/common.ts +14 -0
- package/src/types/dnd.ts +8 -0
- package/src/types/editor.ts +246 -0
- package/src/types/extension.ts +96 -0
- package/src/types/file-watch.ts +100 -0
- package/src/types/file.ts +262 -0
- package/src/types/index.ts +15 -0
- package/src/types/markdown.ts +10 -0
- package/src/types/markers/index.ts +2 -0
- package/src/types/markers/markers-manager.ts +392 -0
- package/src/types/markers/markers.ts +125 -0
- package/src/types/message.ts +6 -0
- package/src/types/reporter.ts +96 -0
- package/src/types/statusbar.ts +6 -0
- package/src/types/string.ts +3 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/ipc.ts +28 -0
|
File without changes
|
package/src/comparers.ts
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
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/comparers.ts
|
|
6
|
+
|
|
7
|
+
import { path, IdleValue } from '@opensumi/ide-utils';
|
|
8
|
+
|
|
9
|
+
import { IRange } from './types';
|
|
10
|
+
const { sep } = path;
|
|
11
|
+
const intlFileNameCollator: IdleValue<{ collator: Intl.Collator; collatorIsNumeric: boolean }> = new IdleValue(() => {
|
|
12
|
+
const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });
|
|
13
|
+
return {
|
|
14
|
+
collator,
|
|
15
|
+
collatorIsNumeric: collator.resolvedOptions().numeric,
|
|
16
|
+
};
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export function compareFileNames(one: string | null, other: string | null, caseSensitive = false): number {
|
|
20
|
+
const a = one || '';
|
|
21
|
+
const b = other || '';
|
|
22
|
+
const result = intlFileNameCollator.getValue().collator.compare(a, b);
|
|
23
|
+
|
|
24
|
+
// Using the numeric option in the collator will
|
|
25
|
+
// make compare(`foo1`, `foo01`) === 0. We must disambiguate.
|
|
26
|
+
if (intlFileNameCollator.getValue().collatorIsNumeric && result === 0 && a !== b) {
|
|
27
|
+
return a < b ? -1 : 1;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return result;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function comparePathComponents(one: string, other: string, caseSensitive = false): number {
|
|
34
|
+
if (!caseSensitive) {
|
|
35
|
+
one = one && one.toLowerCase();
|
|
36
|
+
other = other && other.toLowerCase();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if (one === other) {
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return one < other ? -1 : 1;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function comparePaths(one: string, other: string, caseSensitive = false): number {
|
|
47
|
+
const oneParts = one.split(sep);
|
|
48
|
+
const otherParts = other.split(sep);
|
|
49
|
+
|
|
50
|
+
const lastOne = oneParts.length - 1;
|
|
51
|
+
const lastOther = otherParts.length - 1;
|
|
52
|
+
let endOne: boolean;
|
|
53
|
+
let endOther: boolean;
|
|
54
|
+
|
|
55
|
+
for (let i = 0; ; i++) {
|
|
56
|
+
endOne = lastOne === i;
|
|
57
|
+
endOther = lastOther === i;
|
|
58
|
+
|
|
59
|
+
if (endOne && endOther) {
|
|
60
|
+
return compareFileNames(oneParts[i], otherParts[i], caseSensitive);
|
|
61
|
+
} else if (endOne) {
|
|
62
|
+
return -1;
|
|
63
|
+
} else if (endOther) {
|
|
64
|
+
return 1;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const result = comparePathComponents(oneParts[i], otherParts[i], caseSensitive);
|
|
68
|
+
|
|
69
|
+
if (result !== 0) {
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function compareAnything(one: string, other: string, lookFor: string): number {
|
|
76
|
+
const elementAName = one.toLowerCase();
|
|
77
|
+
const elementBName = other.toLowerCase();
|
|
78
|
+
|
|
79
|
+
// Sort prefix matches over non prefix matches
|
|
80
|
+
const prefixCompare = compareByPrefix(one, other, lookFor);
|
|
81
|
+
if (prefixCompare) {
|
|
82
|
+
return prefixCompare;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Sort suffix matches over non suffix matches
|
|
86
|
+
const elementASuffixMatch = elementAName.endsWith(lookFor);
|
|
87
|
+
const elementBSuffixMatch = elementBName.endsWith(lookFor);
|
|
88
|
+
if (elementASuffixMatch !== elementBSuffixMatch) {
|
|
89
|
+
return elementASuffixMatch ? -1 : 1;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Understand file names
|
|
93
|
+
const r = compareFileNames(elementAName, elementBName);
|
|
94
|
+
if (r !== 0) {
|
|
95
|
+
return r;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Compare by name
|
|
99
|
+
return elementAName.localeCompare(elementBName);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function compareByPrefix(one: string, other: string, lookFor: string): number {
|
|
103
|
+
const elementAName = one.toLowerCase();
|
|
104
|
+
const elementBName = other.toLowerCase();
|
|
105
|
+
|
|
106
|
+
// Sort prefix matches over non prefix matches
|
|
107
|
+
const elementAPrefixMatch = elementAName.startsWith(lookFor);
|
|
108
|
+
const elementBPrefixMatch = elementBName.startsWith(lookFor);
|
|
109
|
+
if (elementAPrefixMatch !== elementBPrefixMatch) {
|
|
110
|
+
return elementAPrefixMatch ? -1 : 1;
|
|
111
|
+
} else if (elementAPrefixMatch && elementBPrefixMatch) {
|
|
112
|
+
// Same prefix: Sort shorter matches to the top to have those on top that match more precisely
|
|
113
|
+
if (elementAName.length < elementBName.length) {
|
|
114
|
+
return -1;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (elementAName.length > elementBName.length) {
|
|
118
|
+
return 1;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return 0;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function compareRangesUsingStarts(a: IRange | null | undefined, b: IRange | null | undefined): number {
|
|
126
|
+
if (a && b) {
|
|
127
|
+
const aStartLineNumber = a.startLineNumber | 0;
|
|
128
|
+
const bStartLineNumber = b.startLineNumber | 0;
|
|
129
|
+
|
|
130
|
+
if (aStartLineNumber === bStartLineNumber) {
|
|
131
|
+
const aStartColumn = a.startColumn | 0;
|
|
132
|
+
const bStartColumn = b.startColumn | 0;
|
|
133
|
+
|
|
134
|
+
if (aStartColumn === bStartColumn) {
|
|
135
|
+
const aEndLineNumber = a.endLineNumber | 0;
|
|
136
|
+
const bEndLineNumber = b.endLineNumber | 0;
|
|
137
|
+
|
|
138
|
+
if (aEndLineNumber === bEndLineNumber) {
|
|
139
|
+
const aEndColumn = a.endColumn | 0;
|
|
140
|
+
const bEndColumn = b.endColumn | 0;
|
|
141
|
+
return aEndColumn - bEndColumn;
|
|
142
|
+
}
|
|
143
|
+
return aEndLineNumber - bEndLineNumber;
|
|
144
|
+
}
|
|
145
|
+
return aStartColumn - bStartColumn;
|
|
146
|
+
}
|
|
147
|
+
return aStartLineNumber - bStartLineNumber;
|
|
148
|
+
}
|
|
149
|
+
const aExists = a ? 1 : 0;
|
|
150
|
+
const bExists = b ? 1 : 0;
|
|
151
|
+
return aExists - bExists;
|
|
152
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const DEFAULT_APPLICATION_NAME = 'OpenSumi';
|
|
2
|
+
export const DEFAULT_APPLICATION_DESKTOP_HOST = 'desktop';
|
|
3
|
+
export const DEFAULT_APPLICATION_WEB_HOST = 'web';
|
|
4
|
+
export const DEFAULT_URI_SCHEME = 'sumi';
|
|
5
|
+
export const DEFAULT_OPENVSX_REGISTRY = 'https://open-vsx.org'; // Official Registry
|
|
6
|
+
|
|
7
|
+
export namespace DEFAULT_TRS_REGISTRY {
|
|
8
|
+
export const ENDPOINT = 'https://marketplace.opentrs.cn';
|
|
9
|
+
export const ACCOUNT_ID = 'clcJKq_Gea47whxAJGrgoYqf';
|
|
10
|
+
export const MASTER_KEY = '_V_LPJ6Ar-1nrSVa05xDGBYp';
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './application';
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Injector, Domain, ConstructorOf } from '@opensumi/di';
|
|
2
|
+
|
|
3
|
+
export const ContributionProvider = Symbol('ContributionProvider');
|
|
4
|
+
|
|
5
|
+
export interface ContributionProvider<T extends object> {
|
|
6
|
+
getContributions(): T[];
|
|
7
|
+
addContribution(...contributionsCls: ConstructorOf<any>[]): void;
|
|
8
|
+
reload(): T[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class BaseContributionProvider<T extends object> implements ContributionProvider<T> {
|
|
12
|
+
protected services: T[] | undefined;
|
|
13
|
+
|
|
14
|
+
constructor(protected readonly domain: Domain, protected readonly injector: Injector) {}
|
|
15
|
+
|
|
16
|
+
addContribution(...contributionsCls: ConstructorOf<T>[]): void {
|
|
17
|
+
for (const contributionCls of contributionsCls) {
|
|
18
|
+
this.injector.addProviders(contributionCls);
|
|
19
|
+
if (this.services) {
|
|
20
|
+
this.services.push(this.injector.get(contributionCls));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
getContributions(): T[] {
|
|
26
|
+
return this.injector.getFromDomain(this.domain);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
reload(): T[] {
|
|
30
|
+
this.services = this.injector.getFromDomain(this.domain);
|
|
31
|
+
return this.services;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* 使用工厂函数创建 ContributionProvider
|
|
37
|
+
* @param injector 全局唯一的 injector,用来获取当前 Domain 的 Contribution、并注册 ContributionProvider
|
|
38
|
+
* @param domain 用来区分 Contribution 的标识,也是 ContributionProvider 的 Token
|
|
39
|
+
*/
|
|
40
|
+
export function createContributionProvider(injector: Injector, domain: Domain) {
|
|
41
|
+
const contributionProvider = new BaseContributionProvider(domain, injector);
|
|
42
|
+
|
|
43
|
+
injector.addProviders({
|
|
44
|
+
token: domain,
|
|
45
|
+
useValue: contributionProvider,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const KeytarServicePath = '/services/keytar';
|
|
2
|
+
|
|
3
|
+
export const INativeCredentialService = Symbol('INativeCredentialService');
|
|
4
|
+
|
|
5
|
+
export interface INativeCredentialService {
|
|
6
|
+
setPassword(service: string, account: string, password: string): Promise<void>;
|
|
7
|
+
getPassword(service: string, account: string): Promise<string | null>;
|
|
8
|
+
deletePassword(service: string, account: string): Promise<boolean>;
|
|
9
|
+
findPassword(service: string): Promise<string | null>;
|
|
10
|
+
findCredentials(service: string): Promise<Array<{ account: string; password: string }>>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface IChunkedPassword {
|
|
14
|
+
content: string;
|
|
15
|
+
hasNextChunk: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface ICredentialsChangeEvent {
|
|
19
|
+
service: string;
|
|
20
|
+
account: string;
|
|
21
|
+
}
|
package/src/crypto.ts
ADDED
package/src/declare.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { markInjectable, getInjectableOpts, Domain } from '@opensumi/di';
|
|
2
|
+
|
|
3
|
+
import { ConstructorOf } from '../declare';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 修饰一个 Class 是某个特定的 DI 分组的装饰器
|
|
7
|
+
* @param domains
|
|
8
|
+
*/
|
|
9
|
+
export function Domain(...domains: Domain[]) {
|
|
10
|
+
return (target: ConstructorOf<any>) => {
|
|
11
|
+
const opts = getInjectableOpts(target) || {};
|
|
12
|
+
opts.domain = domains;
|
|
13
|
+
markInjectable(target, opts);
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const domainMap = new Map<Domain, ConstructorOf<any>>();
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 带全局记录的 Domain 装饰器
|
|
21
|
+
* @param domain
|
|
22
|
+
*/
|
|
23
|
+
export function EffectDomain(domain: Domain) {
|
|
24
|
+
return (target: ConstructorOf<any>) => {
|
|
25
|
+
const opts = getInjectableOpts(target) || {};
|
|
26
|
+
opts.domain = domain;
|
|
27
|
+
markInjectable(target, opts);
|
|
28
|
+
|
|
29
|
+
const tmp = domainMap.get(domain);
|
|
30
|
+
if (!tmp) {
|
|
31
|
+
domainMap.set(domain, target);
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function getDomainConstructors(...domains: Domain[]) {
|
|
37
|
+
const constructorSet = new Set<ConstructorOf<any>>();
|
|
38
|
+
for (const domain of domains) {
|
|
39
|
+
const constructor = domainMap.get(domain);
|
|
40
|
+
if (constructor) {
|
|
41
|
+
constructorSet.add(constructor);
|
|
42
|
+
} else {
|
|
43
|
+
// eslint-disable-next-line no-console
|
|
44
|
+
console.error(`没有获取到 ${String(domain)} 对应的Constructor!`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return Array.from(constructorSet);
|
|
48
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './domain-helper';
|
package/src/editor.ts
ADDED
package/src/electron.ts
ADDED
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import type Electron from 'electron';
|
|
2
|
+
|
|
3
|
+
import { IDisposable } from '@opensumi/ide-utils';
|
|
4
|
+
|
|
5
|
+
import { ExtensionCandidate } from './types';
|
|
6
|
+
|
|
7
|
+
export interface IElectronMainApi<Events> {
|
|
8
|
+
on(event: Events, listener: (...args) => void): IDisposable;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type IElectronPlainWebviewWindowOptions = Electron.BrowserWindowConstructorOptions;
|
|
12
|
+
|
|
13
|
+
export interface IElectronMainUIServiceShape {
|
|
14
|
+
openPath(path: string): Promise<string>;
|
|
15
|
+
|
|
16
|
+
openExternal(uri: string): void;
|
|
17
|
+
|
|
18
|
+
moveToTrash(path: string): Promise<void>;
|
|
19
|
+
|
|
20
|
+
isMaximized(windowId: number): Promise<boolean>;
|
|
21
|
+
|
|
22
|
+
maximize(windowId: number): Promise<void>;
|
|
23
|
+
|
|
24
|
+
isFullScreen(windowId: number): Promise<boolean>;
|
|
25
|
+
|
|
26
|
+
showOpenDialog(windowId: number, options: Electron.OpenDialogOptions): Promise<string[] | undefined>;
|
|
27
|
+
|
|
28
|
+
showSaveDialog(windowId: number, options: Electron.SaveDialogOptions): Promise<string | undefined>;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 默认:最小缩放因子为 0.25,最大缩放因子为 5.0
|
|
32
|
+
*/
|
|
33
|
+
setZoomFactor(
|
|
34
|
+
webContentsId: number,
|
|
35
|
+
options: { value?: number; delta?: number; minValue?: number | undefined; maxValue?: number | undefined },
|
|
36
|
+
): Promise<void>;
|
|
37
|
+
getZoomFactor(webContentsId: number): Promise<number | undefined>;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* 在资源管理器里打开文件
|
|
41
|
+
* @param path 文件路径(不带file协议头)
|
|
42
|
+
*/
|
|
43
|
+
revealInFinder(path: string): Promise<void>;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* 在系统终端中打开文件路径
|
|
47
|
+
* @param path 文件路径(不带file协议头)
|
|
48
|
+
*/
|
|
49
|
+
revealInSystemTerminal(path: string): Promise<void>;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* 创建一个browserWindow
|
|
53
|
+
* @param options
|
|
54
|
+
* @returns windowId
|
|
55
|
+
*/
|
|
56
|
+
createBrowserWindow(options?: IElectronPlainWebviewWindowOptions): Promise<number>;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 显示指定的窗口
|
|
60
|
+
* @param windowId
|
|
61
|
+
*/
|
|
62
|
+
showBrowserWindow(windowId: number): Promise<void>;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* 隐藏指定的窗口
|
|
66
|
+
* @param windowId
|
|
67
|
+
*/
|
|
68
|
+
hideBrowserWindow(windowId: number): Promise<void>;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 设置窗口大小
|
|
72
|
+
* @param windowId
|
|
73
|
+
* @param size
|
|
74
|
+
*/
|
|
75
|
+
setSize(windowId: number, size: { width: number; height: number }): Promise<void>;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* 设置窗口是否始终置顶
|
|
79
|
+
* @param windowId
|
|
80
|
+
* @param flag
|
|
81
|
+
*/
|
|
82
|
+
setAlwaysOnTop(windowId: number, flag: boolean): Promise<void>;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* 让一个指定的 browserWindow 加载一个url
|
|
86
|
+
* @param windowId
|
|
87
|
+
* @param url
|
|
88
|
+
*/
|
|
89
|
+
browserWindowLoadUrl(windowId: number, url: string): Promise<void>;
|
|
90
|
+
/**
|
|
91
|
+
* 关闭一个browserWindow
|
|
92
|
+
* @param windowId
|
|
93
|
+
*/
|
|
94
|
+
closeBrowserWindow(windowId: number): Promise<void>;
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* 向一个browserWindow发送消息
|
|
98
|
+
* @param windowId: window的id
|
|
99
|
+
* @param message: 消息体,需要能被序列化
|
|
100
|
+
*/
|
|
101
|
+
postMessageToBrowserWindow(windowId: number, channel: string, message: any): Promise<void>;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 获得一个 browserWindow 的 webContentsId
|
|
105
|
+
* @param windowId
|
|
106
|
+
*/
|
|
107
|
+
getWebContentsId(windowId: number): Promise<number>;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* clipboard 相关 read/write Text/Buffer
|
|
111
|
+
*/
|
|
112
|
+
readClipboardText(): Promise<string>;
|
|
113
|
+
writeClipboardText(text: string): Promise<void>;
|
|
114
|
+
readClipboardBuffer(field: string): Promise<Uint8Array>;
|
|
115
|
+
writeClipboardBuffer(field: string, buffer: Uint8Array): Promise<void>;
|
|
116
|
+
/**
|
|
117
|
+
* Specifies whether the window’s document has been edited, and the icon in title
|
|
118
|
+
* bar will become gray when set to `true`.
|
|
119
|
+
*
|
|
120
|
+
* @platform darwin
|
|
121
|
+
*/
|
|
122
|
+
setDocumentEdited(windowId: number, edited: boolean): void;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export interface IElectronMainUIService
|
|
126
|
+
extends IElectronMainUIServiceShape,
|
|
127
|
+
IElectronMainApi<'fullScreenStatusChange' | 'windowClosed' | 'maximizeStatusChange'> {}
|
|
128
|
+
|
|
129
|
+
export const IElectronMainUIService = 'IElectronMainUIService';
|
|
130
|
+
|
|
131
|
+
export interface IElectronMainLifeCycleService extends IElectronMainApi<void> {
|
|
132
|
+
minimizeWindow(windowId: number);
|
|
133
|
+
fullscreenWindow(windowId: number);
|
|
134
|
+
maximizeWindow(windowId: number);
|
|
135
|
+
unmaximizeWindow(windowId: number);
|
|
136
|
+
closeWindow(windowId: number);
|
|
137
|
+
reloadWindow(windowId: number);
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* 在某个窗口打开新的工作区
|
|
141
|
+
* @param workspace 工作区主Uri
|
|
142
|
+
* @param options
|
|
143
|
+
*/
|
|
144
|
+
openWorkspace(workspace: string, options?: any);
|
|
145
|
+
|
|
146
|
+
setExtensionDir(path: string, windowId: number);
|
|
147
|
+
setExtensionCandidate(candidate: ExtensionCandidate[], windowId: number): void;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export const IElectronMainLifeCycleService = 'IElectronMainLifeCycleService';
|
|
151
|
+
|
|
152
|
+
export interface IURLHandler {
|
|
153
|
+
handleURL(url: string): Promise<boolean>;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export const IElectronURLService = 'IElectronURLService';
|
|
157
|
+
|
|
158
|
+
export interface IElectronURLService {
|
|
159
|
+
open(url: string): Promise<boolean>;
|
|
160
|
+
|
|
161
|
+
registerHandler(handler: IURLHandler): void;
|
|
162
|
+
|
|
163
|
+
registerDefaultHandler(handler: IURLHandler): void;
|
|
164
|
+
|
|
165
|
+
deregisterHandler(handler: IURLHandler): void;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export interface IElectronRendererURLService extends IElectronMainApi<string>, IElectronURLService {}
|
package/src/env.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const firstSessionDateStorageKey = 'sumi.env.firstSessionDate';
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { IAsyncResult, IDisposable } from '@opensumi/ide-utils';
|
|
2
|
+
|
|
3
|
+
import { ConstructorOf } from '../declare';
|
|
4
|
+
|
|
5
|
+
export interface IEventFireOpts {
|
|
6
|
+
nextTick?: boolean;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface IAsyncEventFireOpts {
|
|
10
|
+
/**
|
|
11
|
+
* 异步事件发送时,listener的最大执行时长(listener并发执行)
|
|
12
|
+
*/
|
|
13
|
+
timeout?: number;
|
|
14
|
+
}
|
|
15
|
+
export type IEventListener<T> = (target: T) => void;
|
|
16
|
+
|
|
17
|
+
export const IEventBus = Symbol('IEventBus');
|
|
18
|
+
export interface IEventBus {
|
|
19
|
+
/**
|
|
20
|
+
* 发出一个事件
|
|
21
|
+
* Sample:
|
|
22
|
+
class ResizeEvent extends BasicEvent<number> {}
|
|
23
|
+
|
|
24
|
+
class LayoutStore {
|
|
25
|
+
@Autowired(IEventBus)
|
|
26
|
+
private eventBus: IEventBus;
|
|
27
|
+
|
|
28
|
+
public fireResizeEvent() {
|
|
29
|
+
const size = this.getSize();
|
|
30
|
+
const resizeEvent = new ResizeEvent(size);
|
|
31
|
+
this.eventBus.fire(resizeEvent);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// 不推荐,但是兼容 vscode 的 Event 设计
|
|
35
|
+
public onDidResize(listener: (t: ResizeEvent) => void) {
|
|
36
|
+
return this.eventBus.on(ResizeEvent, listener)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
*/
|
|
40
|
+
fire(target: any, opts?: IEventFireOpts): void;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 发送一个异步事件,等待并收集结果
|
|
44
|
+
* @param e
|
|
45
|
+
* @param opts
|
|
46
|
+
*/
|
|
47
|
+
fireAndAwait<R>(e: any, opts?: IAsyncEventFireOpts): Promise<IAsyncResult<R>[]>;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 监听 EventBus 中的事件
|
|
51
|
+
* Sample:
|
|
52
|
+
@Injectable()
|
|
53
|
+
class FileTreeStore extends WitEventBus {
|
|
54
|
+
@Autowired(IEventBus)
|
|
55
|
+
private eventBus: IEventBus;
|
|
56
|
+
|
|
57
|
+
@OnEvent(LayoutResize)
|
|
58
|
+
public onLayoutResize(event: LayoutResize) {
|
|
59
|
+
console.log(event.payload); // size number
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
*/
|
|
63
|
+
on<T>(constructor: ConstructorOf<T>, listener: IEventListener<T>): IDisposable;
|
|
64
|
+
/**
|
|
65
|
+
* 监听 EventBus 中的事件,只会触发一次
|
|
66
|
+
*/
|
|
67
|
+
once<T>(constructor: ConstructorOf<T>, listener: IEventListener<T>): IDisposable;
|
|
68
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Injectable } from '@opensumi/di';
|
|
2
|
+
import { Emitter, IAsyncResult, Event } from '@opensumi/ide-utils';
|
|
3
|
+
|
|
4
|
+
import { ConstructorOf } from '../declare';
|
|
5
|
+
|
|
6
|
+
import { BasicEvent } from './basic-event';
|
|
7
|
+
import { IEventBus, IEventListener, IEventFireOpts, IAsyncEventFireOpts } from './event-bus-types';
|
|
8
|
+
|
|
9
|
+
@Injectable()
|
|
10
|
+
export class EventBusImpl implements IEventBus {
|
|
11
|
+
private emitterMap = new Map<any, Emitter<any>>();
|
|
12
|
+
|
|
13
|
+
fire<T extends BasicEvent<any>>(e: T, opts: IEventFireOpts = {}) {
|
|
14
|
+
const Constructor = e && e.constructor;
|
|
15
|
+
if (typeof Constructor === 'function' && BasicEvent.isPrototypeOf(Constructor)) {
|
|
16
|
+
const emitter = this.emitterMap.get(Constructor);
|
|
17
|
+
if (emitter) {
|
|
18
|
+
emitter.fire(e);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async fireAndAwait<T extends BasicEvent<any>, R>(
|
|
24
|
+
e: T,
|
|
25
|
+
opts: IAsyncEventFireOpts = { timeout: 2000 },
|
|
26
|
+
): Promise<IAsyncResult<R>[]> {
|
|
27
|
+
const Constructor = e && e.constructor;
|
|
28
|
+
if (typeof Constructor === 'function' && BasicEvent.isPrototypeOf(Constructor)) {
|
|
29
|
+
const emitter = this.emitterMap.get(Constructor);
|
|
30
|
+
if (emitter) {
|
|
31
|
+
return emitter.fireAndAwait<R>(e, opts.timeout);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
on<T>(Constructor: ConstructorOf<T>, listener: IEventListener<T>) {
|
|
38
|
+
const emitter = this.getOrCreateEmitter(Constructor);
|
|
39
|
+
return emitter.event(listener);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
once<T>(Constructor: ConstructorOf<T>, listener: IEventListener<T>) {
|
|
43
|
+
const emitter = this.getOrCreateEmitter(Constructor);
|
|
44
|
+
return Event.once(emitter.event)(listener);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private getOrCreateEmitter(key: any) {
|
|
48
|
+
const current = this.emitterMap.get(key);
|
|
49
|
+
if (current) {
|
|
50
|
+
return current;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const emitter = new Emitter();
|
|
54
|
+
this.emitterMap.set(key, emitter);
|
|
55
|
+
return emitter;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Autowired } from '@opensumi/di';
|
|
2
|
+
import { Disposable } from '@opensumi/ide-utils';
|
|
3
|
+
|
|
4
|
+
import { ConstructorOf } from '../declare';
|
|
5
|
+
|
|
6
|
+
import { BasicEvent } from './basic-event';
|
|
7
|
+
import { IEventBus } from './event-bus-types';
|
|
8
|
+
|
|
9
|
+
const EVENT_TOKEN = Symbol('EVENT_TOKEN');
|
|
10
|
+
|
|
11
|
+
export class WithEventBus extends Disposable {
|
|
12
|
+
@Autowired(IEventBus)
|
|
13
|
+
protected eventBus: IEventBus;
|
|
14
|
+
|
|
15
|
+
constructor(...args: any[]) {
|
|
16
|
+
super(...args);
|
|
17
|
+
|
|
18
|
+
const map: Map<string, ConstructorOf<any>> = Reflect.getMetadata(EVENT_TOKEN, this) || new Map();
|
|
19
|
+
for (const [key, Constructor] of map.entries()) {
|
|
20
|
+
const dispose = this.eventBus.on(Constructor, (event: any) => (this as any)[key](event));
|
|
21
|
+
this.addDispose(dispose);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function OnEvent<T extends BasicEvent<any>>(Constructor: ConstructorOf<T>) {
|
|
27
|
+
return (target: object, key: string, descriptor: TypedPropertyDescriptor<(event: T) => void>) => {
|
|
28
|
+
const map: Map<string, ConstructorOf<any>> = Reflect.getMetadata(EVENT_TOKEN, target) || new Map();
|
|
29
|
+
map.set(key, Constructor);
|
|
30
|
+
Reflect.defineMetadata(EVENT_TOKEN, map, target);
|
|
31
|
+
};
|
|
32
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { IJSONSchema } from './json-schema';
|
|
2
|
+
|
|
3
|
+
export type FrameworkKind = 'vscode' | 'opensumi';
|
|
4
|
+
|
|
5
|
+
export interface IExtensionPointDescriptor {
|
|
6
|
+
extensionPoint: string;
|
|
7
|
+
jsonSchema: IJSONSchema;
|
|
8
|
+
frameworkKind?: FrameworkKind[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export const IExtensionsSchemaService = Symbol('IExtensionsSchemaService');
|
|
12
|
+
|
|
13
|
+
export interface IExtensionsSchemaService {
|
|
14
|
+
registerExtensionPoint(desc: IExtensionPointDescriptor): void;
|
|
15
|
+
appendExtensionPoint(points: string[], desc: IExtensionPointDescriptor): void;
|
|
16
|
+
}
|