@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.
Files changed (159) hide show
  1. package/lib/command.d.ts +15 -5
  2. package/lib/command.d.ts.map +1 -1
  3. package/lib/command.js +11 -1
  4. package/lib/command.js.map +1 -1
  5. package/lib/const/application.d.ts +6 -1
  6. package/lib/const/application.d.ts.map +1 -1
  7. package/lib/const/application.js +8 -3
  8. package/lib/const/application.js.map +1 -1
  9. package/lib/declare.d.ts +2 -2
  10. package/lib/declare.d.ts.map +1 -1
  11. package/lib/editor.d.ts +4 -0
  12. package/lib/editor.d.ts.map +1 -1
  13. package/lib/electron.d.ts +1 -1
  14. package/lib/electron.d.ts.map +1 -1
  15. package/lib/event-bus/event-bus-types.d.ts +1 -1
  16. package/lib/event-bus/event-bus-types.d.ts.map +1 -1
  17. package/lib/event-bus/event-bus.js.map +1 -1
  18. package/lib/event-bus/event-decorator.js.map +1 -1
  19. package/lib/extension.schema.d.ts +1 -1
  20. package/lib/extension.schema.d.ts.map +1 -1
  21. package/lib/hash-calculate/WASMInterface.d.ts +2 -2
  22. package/lib/hash-calculate/WASMInterface.d.ts.map +1 -1
  23. package/lib/hash-calculate/hash-calculate.js.map +1 -1
  24. package/lib/hash-calculate/util.d.ts +2 -2
  25. package/lib/hash-calculate/util.d.ts.map +1 -1
  26. package/lib/json-schema.d.ts +9 -0
  27. package/lib/json-schema.d.ts.map +1 -1
  28. package/lib/keyboard/keymap.d.ts +1 -1
  29. package/lib/keyboard/keymap.d.ts.map +1 -1
  30. package/lib/localize.d.ts +1 -1
  31. package/lib/localize.d.ts.map +1 -1
  32. package/lib/log.d.ts +2 -2
  33. package/lib/log.d.ts.map +1 -1
  34. package/lib/mime.d.ts +6 -6
  35. package/lib/module.js.map +1 -1
  36. package/lib/preferences/preference-schema.d.ts +13 -3
  37. package/lib/preferences/preference-schema.d.ts.map +1 -1
  38. package/lib/preferences/preference-schema.js +11 -1
  39. package/lib/preferences/preference-schema.js.map +1 -1
  40. package/lib/preferences/preference-scope.d.ts +8 -1
  41. package/lib/preferences/preference-scope.d.ts.map +1 -1
  42. package/lib/preferences/preference-scope.js +11 -2
  43. package/lib/preferences/preference-scope.js.map +1 -1
  44. package/lib/problem-matcher.d.ts +1 -1
  45. package/lib/problem-matcher.d.ts.map +1 -1
  46. package/lib/problem-matcher.js.map +1 -1
  47. package/lib/problem-pattern.d.ts +4 -2
  48. package/lib/problem-pattern.d.ts.map +1 -1
  49. package/lib/problem-pattern.js +24 -1
  50. package/lib/problem-pattern.js.map +1 -1
  51. package/lib/reference.d.ts +2 -1
  52. package/lib/reference.d.ts.map +1 -1
  53. package/lib/reference.js +11 -6
  54. package/lib/reference.js.map +1 -1
  55. package/lib/reporter.js.map +1 -1
  56. package/lib/storage.d.ts +1 -1
  57. package/lib/storage.d.ts.map +1 -1
  58. package/lib/storage.js.map +1 -1
  59. package/lib/task-definition.js.map +1 -1
  60. package/lib/types/common.d.ts +1 -1
  61. package/lib/types/common.d.ts.map +1 -1
  62. package/lib/types/editor.d.ts +2 -2
  63. package/lib/types/editor.d.ts.map +1 -1
  64. package/lib/types/file-watch.d.ts +1 -1
  65. package/lib/types/file-watch.d.ts.map +1 -1
  66. package/lib/types/markers/markers-manager.d.ts.map +1 -1
  67. package/lib/types/markers/markers-manager.js +4 -10
  68. package/lib/types/markers/markers-manager.js.map +1 -1
  69. package/lib/types/markers/markers.d.ts +2 -0
  70. package/lib/types/markers/markers.d.ts.map +1 -1
  71. package/lib/types/markers/markers.js.map +1 -1
  72. package/package.json +7 -6
  73. package/src/LifeCyclePhase.ts +6 -0
  74. package/src/application-error.ts +77 -0
  75. package/src/application-props.ts +28 -0
  76. package/src/application.lifecycle.ts +15 -0
  77. package/src/browser-fs/ensure-dir.ts +46 -0
  78. package/src/browser-fs/util.ts +52 -0
  79. package/src/clipboard.ts +31 -0
  80. package/src/command.ts +726 -0
  81. package/src/commands/terminal.ts +0 -0
  82. package/src/comparers.ts +152 -0
  83. package/src/connection.ts +7 -0
  84. package/src/const/application.ts +11 -0
  85. package/src/const/index.ts +1 -0
  86. package/src/contribution-provider.ts +47 -0
  87. package/src/credential.ts +21 -0
  88. package/src/crypto.ts +8 -0
  89. package/src/declare.ts +3 -0
  90. package/src/di-helper/domain-helper.ts +48 -0
  91. package/src/di-helper/index.ts +1 -0
  92. package/src/editor.ts +6 -0
  93. package/src/electron.ts +168 -0
  94. package/src/env.ts +1 -0
  95. package/src/event-bus/basic-event.ts +3 -0
  96. package/src/event-bus/event-bus-types.ts +68 -0
  97. package/src/event-bus/event-bus.ts +57 -0
  98. package/src/event-bus/event-decorator.ts +32 -0
  99. package/src/event-bus/index.ts +4 -0
  100. package/src/extension.schema.ts +16 -0
  101. package/src/hash-calculate/WASMInterface.ts +266 -0
  102. package/src/hash-calculate/hash-calculate.ts +53 -0
  103. package/src/hash-calculate/lockedCreate.ts +17 -0
  104. package/src/hash-calculate/md5.wasm.json +1 -0
  105. package/src/hash-calculate/mutex.ts +30 -0
  106. package/src/hash-calculate/util.ts +190 -0
  107. package/src/id-generator.ts +15 -0
  108. package/src/index.ts +39 -0
  109. package/src/json-schema.ts +80 -0
  110. package/src/keyboard/index.ts +2 -0
  111. package/src/keyboard/keyboard-layout-provider.ts +46 -0
  112. package/src/keyboard/keymap.ts +224 -0
  113. package/src/line-text.ts +93 -0
  114. package/src/localize.ts +203 -0
  115. package/src/log.ts +338 -0
  116. package/src/markdown.ts +8 -0
  117. package/src/menu.ts +31 -0
  118. package/src/mime.ts +8 -0
  119. package/src/mocks/electron/browserMock.ts +10 -0
  120. package/src/mocks/electron/ipcRenderer.ts +30 -0
  121. package/src/module.ts +31 -0
  122. package/src/network.ts +47 -0
  123. package/src/node/cli.ts +5 -0
  124. package/src/node/port.ts +134 -0
  125. package/src/preferences/index.ts +2 -0
  126. package/src/preferences/preference-schema.ts +122 -0
  127. package/src/preferences/preference-scope.ts +65 -0
  128. package/src/problem-matcher.ts +389 -0
  129. package/src/problem-pattern.ts +574 -0
  130. package/src/range.ts +24 -0
  131. package/src/reference.ts +141 -0
  132. package/src/reporter.ts +64 -0
  133. package/src/settings/general.ts +5 -0
  134. package/src/settings/index.ts +3 -0
  135. package/src/settings/search.ts +7 -0
  136. package/src/settings/terminal.ts +9 -0
  137. package/src/storage.ts +99 -0
  138. package/src/task-definition.ts +172 -0
  139. package/src/theme.ts +7 -0
  140. package/src/types/accessibility.ts +4 -0
  141. package/src/types/application.ts +14 -0
  142. package/src/types/authentication.ts +120 -0
  143. package/src/types/common.ts +14 -0
  144. package/src/types/dnd.ts +8 -0
  145. package/src/types/editor.ts +246 -0
  146. package/src/types/extension.ts +96 -0
  147. package/src/types/file-watch.ts +100 -0
  148. package/src/types/file.ts +262 -0
  149. package/src/types/index.ts +15 -0
  150. package/src/types/markdown.ts +10 -0
  151. package/src/types/markers/index.ts +2 -0
  152. package/src/types/markers/markers-manager.ts +392 -0
  153. package/src/types/markers/markers.ts +125 -0
  154. package/src/types/message.ts +6 -0
  155. package/src/types/reporter.ts +96 -0
  156. package/src/types/statusbar.ts +6 -0
  157. package/src/types/string.ts +3 -0
  158. package/src/utils/index.ts +1 -0
  159. package/src/utils/ipc.ts +28 -0
File without changes
@@ -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,7 @@
1
+ import { BasicEvent } from './event-bus';
2
+
3
+ export class BrowserConnectionCloseEvent extends BasicEvent<void> {}
4
+
5
+ export class BrowserConnectionOpenEvent extends BasicEvent<void> {}
6
+
7
+ export class BrowserConnectionErrorEvent extends BasicEvent<Event> {}
@@ -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
@@ -0,0 +1,8 @@
1
+ export const CryptoServicePath = '/services/crypto';
2
+
3
+ export const INativeCryptoService = Symbol('INativeCryptoService');
4
+
5
+ export interface INativeCryptoService {
6
+ decrypt(hash: string): Promise<string>;
7
+ encrypt(password: string): Promise<string>;
8
+ }
package/src/declare.ts ADDED
@@ -0,0 +1,3 @@
1
+ export type ConstructorOf<T, K extends any[] = any[]> = new (...args: K) => T;
2
+
3
+ export type MaybeNull<T> = T | null | undefined;
@@ -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
@@ -0,0 +1,6 @@
1
+ export const CUSTOM_EDITOR_SCHEME = 'vscode_customEditor';
2
+
3
+ export const enum CommonLanguageId {
4
+ JSONC = 'jsonc',
5
+ Log = 'log',
6
+ }
@@ -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,3 @@
1
+ export class BasicEvent<T> {
2
+ constructor(public payload: T) {}
3
+ }
@@ -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,4 @@
1
+ export * from './basic-event';
2
+ export * from './event-bus-types';
3
+ export * from './event-bus';
4
+ export * from './event-decorator';
@@ -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
+ }