@theia/core 1.75.0-next.8 → 1.75.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/README.md +27 -24
- package/i18n/nls.cs.json +334 -98
- package/i18n/nls.de.json +335 -99
- package/i18n/nls.es.json +337 -101
- package/i18n/nls.fr.json +335 -99
- package/i18n/nls.hu.json +337 -101
- package/i18n/nls.it.json +334 -98
- package/i18n/nls.ja.json +335 -99
- package/i18n/nls.json +338 -102
- package/i18n/nls.ko.json +335 -99
- package/i18n/nls.pl.json +335 -99
- package/i18n/nls.pt-br.json +338 -102
- package/i18n/nls.ru.json +338 -102
- package/i18n/nls.tr.json +337 -101
- package/i18n/nls.zh-cn.json +337 -101
- package/i18n/nls.zh-tw.json +337 -101
- package/lib/browser/about-dialog.js +6 -35
- package/lib/browser/about-dialog.js.map +1 -1
- package/lib/browser/authentication-service.js +1 -1
- package/lib/browser/authentication-service.js.map +1 -1
- package/lib/browser/breadcrumbs/breadcrumb-renderer.js +2 -22
- package/lib/browser/breadcrumbs/breadcrumb-renderer.js.map +1 -1
- package/lib/browser/breadcrumbs/breadcrumbs-renderer.js +2 -17
- package/lib/browser/breadcrumbs/breadcrumbs-renderer.js.map +1 -1
- package/lib/browser/browser-clipboard-service.js +1 -0
- package/lib/browser/browser-clipboard-service.js.map +1 -1
- package/lib/browser/catalog.json +148 -37
- package/lib/browser/components/card.js +4 -10
- package/lib/browser/components/card.js.map +1 -1
- package/lib/browser/connection-status-service.d.ts +1 -0
- package/lib/browser/connection-status-service.d.ts.map +1 -1
- package/lib/browser/connection-status-service.js +7 -0
- package/lib/browser/connection-status-service.js.map +1 -1
- package/lib/browser/dialogs/react-dialog.js +2 -17
- package/lib/browser/dialogs/react-dialog.js.map +1 -1
- package/lib/browser/dialogs/react-dialog.spec.js +3 -3
- package/lib/browser/dialogs/react-dialog.spec.js.map +1 -1
- package/lib/browser/dialogs.d.ts +1 -1
- package/lib/browser/dialogs.d.ts.map +1 -1
- package/lib/browser/dialogs.js +4 -3
- package/lib/browser/dialogs.js.map +1 -1
- package/lib/browser/frontend-application-state.js +1 -0
- package/lib/browser/frontend-application-state.js.map +1 -1
- package/lib/browser/hover-service.d.ts.map +1 -1
- package/lib/browser/hover-service.js +13 -0
- package/lib/browser/hover-service.js.map +1 -1
- package/lib/browser/icon-theme-service.d.ts +5 -3
- package/lib/browser/icon-theme-service.d.ts.map +1 -1
- package/lib/browser/icon-theme-service.js +7 -1
- package/lib/browser/icon-theme-service.js.map +1 -1
- package/lib/browser/keyboard/browser-keyboard-layout-provider.js +1 -0
- package/lib/browser/keyboard/browser-keyboard-layout-provider.js.map +1 -1
- package/lib/browser/markdown-rendering/markdown-link-handler.d.ts +11 -0
- package/lib/browser/markdown-rendering/markdown-link-handler.d.ts.map +1 -1
- package/lib/browser/markdown-rendering/markdown-link-handler.js +23 -1
- package/lib/browser/markdown-rendering/markdown-link-handler.js.map +1 -1
- package/lib/browser/markdown-rendering/markdown-renderer.d.ts +11 -0
- package/lib/browser/markdown-rendering/markdown-renderer.d.ts.map +1 -1
- package/lib/browser/markdown-rendering/markdown-renderer.js +41 -0
- package/lib/browser/markdown-rendering/markdown-renderer.js.map +1 -1
- package/lib/browser/markdown-rendering/markdown-renderer.spec.d.ts +2 -0
- package/lib/browser/markdown-rendering/markdown-renderer.spec.d.ts.map +1 -0
- package/lib/browser/markdown-rendering/markdown-renderer.spec.js +79 -0
- package/lib/browser/markdown-rendering/markdown-renderer.spec.js.map +1 -0
- package/lib/browser/markdown-rendering/markdown.js +6 -5
- package/lib/browser/markdown-rendering/markdown.js.map +1 -1
- package/lib/browser/markdown-rendering/markdown.spec.js +16 -16
- package/lib/browser/markdown-rendering/markdown.spec.js.map +1 -1
- package/lib/browser/messaging/ws-connection-source.d.ts.map +1 -1
- package/lib/browser/messaging/ws-connection-source.js +3 -0
- package/lib/browser/messaging/ws-connection-source.js.map +1 -1
- package/lib/browser/open-with-service.d.ts +2 -1
- package/lib/browser/open-with-service.d.ts.map +1 -1
- package/lib/browser/open-with-service.js +6 -1
- package/lib/browser/open-with-service.js.map +1 -1
- package/lib/browser/performance/frontend-stopwatch.d.ts +2 -1
- package/lib/browser/performance/frontend-stopwatch.d.ts.map +1 -1
- package/lib/browser/performance/frontend-stopwatch.js +6 -1
- package/lib/browser/performance/frontend-stopwatch.js.map +1 -1
- package/lib/browser/perspective-service.js +1 -1
- package/lib/browser/perspective-service.js.map +1 -1
- package/lib/browser/preferences/preference-proxy.spec.js +3 -0
- package/lib/browser/preferences/preference-proxy.spec.js.map +1 -1
- package/lib/browser/preferences/preference-service.spec.js +3 -0
- package/lib/browser/preferences/preference-service.spec.js.map +1 -1
- package/lib/browser/preferences/preference-validation-service.js +1 -1
- package/lib/browser/preferences/preference-validation-service.js.map +1 -1
- package/lib/browser/saveable-service.d.ts +2 -1
- package/lib/browser/saveable-service.d.ts.map +1 -1
- package/lib/browser/saveable-service.js +6 -1
- package/lib/browser/saveable-service.js.map +1 -1
- package/lib/browser/shell/application-shell.js +3 -3
- package/lib/browser/shell/application-shell.js.map +1 -1
- package/lib/browser/shell/application-shell.spec.d.ts +2 -0
- package/lib/browser/shell/application-shell.spec.d.ts.map +1 -0
- package/lib/browser/shell/application-shell.spec.js +57 -0
- package/lib/browser/shell/application-shell.spec.js.map +1 -0
- package/lib/browser/shell/shell-layout-restorer.d.ts +1 -1
- package/lib/browser/shell/shell-layout-restorer.d.ts.map +1 -1
- package/lib/browser/shell/shell-layout-restorer.js +5 -4
- package/lib/browser/shell/shell-layout-restorer.js.map +1 -1
- package/lib/browser/shell/sidebar-menu-widget.js +6 -7
- package/lib/browser/shell/sidebar-menu-widget.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js +4 -22
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts +2 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js +6 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js +8 -10
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-toolbar-item.js +2 -20
- package/lib/browser/shell/tab-bar-toolbar/tab-toolbar-item.js.map +1 -1
- package/lib/browser/source-tree/source-tree-widget.js +3 -18
- package/lib/browser/source-tree/source-tree-widget.js.map +1 -1
- package/lib/browser/status-bar/status-bar-view-model.d.ts +2 -1
- package/lib/browser/status-bar/status-bar-view-model.d.ts.map +1 -1
- package/lib/browser/status-bar/status-bar-view-model.js +6 -1
- package/lib/browser/status-bar/status-bar-view-model.js.map +1 -1
- package/lib/browser/status-bar/status-bar.js +10 -11
- package/lib/browser/status-bar/status-bar.js.map +1 -1
- package/lib/browser/storage-service.d.ts +1 -1
- package/lib/browser/storage-service.d.ts.map +1 -1
- package/lib/browser/storage-service.js +1 -0
- package/lib/browser/storage-service.js.map +1 -1
- package/lib/browser/tooltip-service.js +5 -5
- package/lib/browser/tooltip-service.js.map +1 -1
- package/lib/browser/tree/search-box.js +9 -16
- package/lib/browser/tree/search-box.js.map +1 -1
- package/lib/browser/tree/tree-compression/compressed-tree-widget.js +7 -9
- package/lib/browser/tree/tree-compression/compressed-tree-widget.js.map +1 -1
- package/lib/browser/tree/tree-model.d.ts.map +1 -1
- package/lib/browser/tree/tree-model.js +1 -0
- package/lib/browser/tree/tree-model.js.map +1 -1
- package/lib/browser/tree/tree-view-welcome-widget.js +8 -30
- package/lib/browser/tree/tree-view-welcome-widget.js.map +1 -1
- package/lib/browser/tree/tree-widget.js +30 -42
- package/lib/browser/tree/tree-widget.js.map +1 -1
- package/lib/browser/widget-manager.js +1 -0
- package/lib/browser/widget-manager.js.map +1 -1
- package/lib/browser/widgets/alert-message.js +4 -8
- package/lib/browser/widgets/alert-message.js.map +1 -1
- package/lib/browser/widgets/react-renderer.js +5 -4
- package/lib/browser/widgets/react-renderer.js.map +1 -1
- package/lib/browser/widgets/react-widget.js +5 -4
- package/lib/browser/widgets/react-widget.js.map +1 -1
- package/lib/browser/widgets/select-component.d.ts +2 -2
- package/lib/browser/widgets/select-component.d.ts.map +1 -1
- package/lib/browser/widgets/select-component.js +14 -19
- package/lib/browser/widgets/select-component.js.map +1 -1
- package/lib/browser/window/default-secondary-window-service.d.ts +2 -1
- package/lib/browser/window/default-secondary-window-service.d.ts.map +1 -1
- package/lib/browser/window/default-secondary-window-service.js +9 -4
- package/lib/browser/window/default-secondary-window-service.js.map +1 -1
- package/lib/browser-only/frontend-only-application-module.d.ts.map +1 -1
- package/lib/browser-only/frontend-only-application-module.js +25 -1
- package/lib/browser-only/frontend-only-application-module.js.map +1 -1
- package/lib/common/command.d.ts +37 -0
- package/lib/common/command.d.ts.map +1 -1
- package/lib/common/command.js +74 -4
- package/lib/common/command.js.map +1 -1
- package/lib/common/command.spec.js +109 -0
- package/lib/common/command.spec.js.map +1 -1
- package/lib/common/message-service-protocol.d.ts +2 -0
- package/lib/common/message-service-protocol.d.ts.map +1 -1
- package/lib/common/message-service-protocol.js +8 -2
- package/lib/common/message-service-protocol.js.map +1 -1
- package/lib/common/performance/stopwatch.js +1 -0
- package/lib/common/performance/stopwatch.js.map +1 -1
- package/lib/common/preferences/preference-schema-service.d.ts +2 -0
- package/lib/common/preferences/preference-schema-service.d.ts.map +1 -1
- package/lib/common/preferences/preference-schema-service.js +11 -5
- package/lib/common/preferences/preference-schema-service.js.map +1 -1
- package/lib/common/preferences/preference-service.d.ts +2 -0
- package/lib/common/preferences/preference-service.d.ts.map +1 -1
- package/lib/common/preferences/preference-service.js +7 -1
- package/lib/common/preferences/preference-service.js.map +1 -1
- package/lib/electron-browser/window/window-zoom-action-bar.js +6 -11
- package/lib/electron-browser/window/window-zoom-action-bar.js.map +1 -1
- package/lib/node/backend-application.js +6 -6
- package/lib/node/backend-application.js.map +1 -1
- package/lib/node/backend-application.spec.js +6 -3
- package/lib/node/backend-application.spec.js.map +1 -1
- package/lib/node/console-logger-server.d.ts.map +1 -1
- package/lib/node/console-logger-server.js +2 -0
- package/lib/node/console-logger-server.js.map +1 -1
- package/lib/node/env-variables/env-variables-server.d.ts +2 -0
- package/lib/node/env-variables/env-variables-server.d.ts.map +1 -1
- package/lib/node/env-variables/env-variables-server.js +7 -1
- package/lib/node/env-variables/env-variables-server.js.map +1 -1
- package/lib/node/hosting/browser-connection-token.d.ts +2 -0
- package/lib/node/hosting/browser-connection-token.d.ts.map +1 -1
- package/lib/node/hosting/browser-connection-token.js +14 -1
- package/lib/node/hosting/browser-connection-token.js.map +1 -1
- package/lib/node/hosting/browser-connection-token.spec.js +25 -2
- package/lib/node/hosting/browser-connection-token.spec.js.map +1 -1
- package/lib/node/key-store-server.d.ts +2 -0
- package/lib/node/key-store-server.d.ts.map +1 -1
- package/lib/node/key-store-server.js +6 -1
- package/lib/node/key-store-server.js.map +1 -1
- package/lib/node/logger-cli-contribution.d.ts.map +1 -1
- package/lib/node/logger-cli-contribution.js.map +1 -1
- package/lib/node/messaging/default-messaging-service.js +1 -1
- package/lib/node/messaging/default-messaging-service.js.map +1 -1
- package/lib/node/messaging/ipc-connection-provider.js +1 -0
- package/lib/node/messaging/ipc-connection-provider.js.map +1 -1
- package/lib/node/messaging/websocket-endpoint.js +1 -1
- package/lib/node/messaging/websocket-endpoint.js.map +1 -1
- package/lib/node/messaging/websocket-frontend-connection-service.d.ts +2 -1
- package/lib/node/messaging/websocket-frontend-connection-service.d.ts.map +1 -1
- package/lib/node/messaging/websocket-frontend-connection-service.js +11 -6
- package/lib/node/messaging/websocket-frontend-connection-service.js.map +1 -1
- package/lib/node/setting-service.js +1 -0
- package/lib/node/setting-service.js.map +1 -1
- package/package.json +32 -29
- package/shared/react/jsx-dev-runtime/index.d.ts +1 -0
- package/shared/react/jsx-dev-runtime/index.js +1 -0
- package/shared/react/jsx-runtime/index.d.ts +1 -0
- package/shared/react/jsx-runtime/index.js +1 -0
- package/shared/react-dom/server/index.d.ts +1 -0
- package/shared/react-dom/server/index.js +1 -0
- package/src/browser/authentication-service.ts +1 -1
- package/src/browser/browser-clipboard-service.ts +2 -2
- package/src/browser/connection-status-service.ts +7 -3
- package/src/browser/dialogs.ts +3 -2
- package/src/browser/frontend-application-state.ts +2 -2
- package/src/browser/hover-service.ts +13 -0
- package/src/browser/icon-theme-service.ts +6 -2
- package/src/browser/keyboard/browser-keyboard-layout-provider.ts +2 -2
- package/src/browser/markdown-rendering/markdown-link-handler.ts +23 -1
- package/src/browser/markdown-rendering/markdown-renderer.spec.ts +88 -0
- package/src/browser/markdown-rendering/markdown-renderer.ts +43 -0
- package/src/browser/messaging/ws-connection-source.ts +4 -0
- package/src/browser/open-with-service.ts +6 -3
- package/src/browser/performance/frontend-stopwatch.ts +6 -3
- package/src/browser/perspective-service.ts +1 -1
- package/src/browser/preferences/preference-proxy.spec.ts +3 -0
- package/src/browser/preferences/preference-service.spec.ts +3 -0
- package/src/browser/preferences/preference-validation-service.ts +1 -1
- package/src/browser/saveable-service.ts +5 -2
- package/src/browser/shell/application-shell.spec.ts +62 -0
- package/src/browser/shell/application-shell.ts +4 -4
- package/src/browser/shell/shell-layout-restorer.ts +6 -5
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.tsx +3 -2
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +5 -2
- package/src/browser/status-bar/status-bar-view-model.ts +7 -3
- package/src/browser/storage-service.ts +4 -2
- package/src/browser/style/sidepanel.css +2 -0
- package/src/browser/style/tabs.css +2 -0
- package/src/browser/style/view-container.css +2 -0
- package/src/browser/tree/tree-model.ts +4 -2
- package/src/browser/widget-manager.ts +1 -1
- package/src/browser/window/default-secondary-window-service.ts +9 -6
- package/src/browser-only/frontend-only-application-module.ts +25 -1
- package/src/common/command.spec.ts +125 -0
- package/src/common/command.ts +77 -4
- package/src/common/i18n/nls.metadata.json +3933 -1186
- package/src/common/message-service-protocol.ts +7 -3
- package/src/common/performance/stopwatch.ts +2 -2
- package/src/common/preferences/preference-schema-service.ts +9 -5
- package/src/common/preferences/preference-service.ts +6 -2
- package/src/node/backend-application.spec.ts +6 -3
- package/src/node/backend-application.ts +6 -6
- package/src/node/console-logger-server.ts +3 -0
- package/src/node/env-variables/env-variables-server.ts +6 -2
- package/src/node/hosting/browser-connection-token.spec.ts +30 -3
- package/src/node/hosting/browser-connection-token.ts +13 -2
- package/src/node/key-store-server.ts +6 -3
- package/src/node/logger-cli-contribution.ts +3 -0
- package/src/node/messaging/default-messaging-service.ts +1 -1
- package/src/node/messaging/ipc-connection-provider.ts +2 -2
- package/src/node/messaging/websocket-endpoint.ts +1 -1
- package/src/node/messaging/websocket-frontend-connection-service.ts +11 -8
- package/src/node/setting-service.ts +2 -2
|
@@ -119,7 +119,7 @@ export class WidgetManager {
|
|
|
119
119
|
@inject(ContributionProvider) @named(WidgetFactory)
|
|
120
120
|
protected readonly factoryProvider: ContributionProvider<WidgetFactory>;
|
|
121
121
|
|
|
122
|
-
@inject(ILogger)
|
|
122
|
+
@inject(ILogger) @named('core:WidgetManager')
|
|
123
123
|
protected readonly logger: ILogger;
|
|
124
124
|
|
|
125
125
|
protected readonly onWillCreateWidgetEmitter = new Emitter<WillCreateWidgetEvent>();
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
//
|
|
14
14
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
15
|
// *****************************************************************************
|
|
16
|
-
import { inject, injectable, postConstruct } from 'inversify';
|
|
16
|
+
import { inject, injectable, postConstruct, named } from 'inversify';
|
|
17
17
|
import { SecondaryWindow, SecondaryWindowService } from './secondary-window-service';
|
|
18
18
|
import { WindowService } from './window-service';
|
|
19
19
|
import { ExtractableWidget, Widget } from '../widgets';
|
|
20
20
|
import { ApplicationShell } from '../shell';
|
|
21
21
|
import { Saveable } from '../saveable';
|
|
22
|
-
import { Emitter, environment, Event, PreferenceService } from '../../common';
|
|
22
|
+
import { Emitter, environment, Event, PreferenceService, ILogger } from '../../common';
|
|
23
23
|
import { SaveableService } from '../saveable-service';
|
|
24
24
|
import { getAllWidgetsFromSecondaryWindow, getDefaultRestoreArea } from '../secondary-window-handler';
|
|
25
25
|
import { WindowFocusService } from './window-focus-service';
|
|
@@ -59,17 +59,20 @@ export class DefaultSecondaryWindowService implements SecondaryWindowService {
|
|
|
59
59
|
@inject(WindowFocusService)
|
|
60
60
|
protected readonly windowFocusService: WindowFocusService;
|
|
61
61
|
|
|
62
|
+
@inject(ILogger) @named('core:DefaultSecondaryWindowService')
|
|
63
|
+
protected readonly logger: ILogger;
|
|
64
|
+
|
|
62
65
|
@postConstruct()
|
|
63
66
|
init(): void {
|
|
64
67
|
// Set up messaging with secondary windows
|
|
65
68
|
window.addEventListener('message', (event: MessageEvent) => {
|
|
66
|
-
|
|
69
|
+
this.logger.trace('Message on main window', event);
|
|
67
70
|
if (event.data.fromSecondary) {
|
|
68
|
-
|
|
71
|
+
this.logger.trace('Message comes from secondary window');
|
|
69
72
|
return;
|
|
70
73
|
}
|
|
71
74
|
if (event.data.fromMain) {
|
|
72
|
-
|
|
75
|
+
this.logger.trace('Message has mainWindow marker, therefore ignore it');
|
|
73
76
|
return;
|
|
74
77
|
}
|
|
75
78
|
|
|
@@ -80,7 +83,7 @@ export class DefaultSecondaryWindowService implements SecondaryWindowService {
|
|
|
80
83
|
return;
|
|
81
84
|
}
|
|
82
85
|
|
|
83
|
-
|
|
86
|
+
this.logger.trace('Delegate main window message to secondary windows', event);
|
|
84
87
|
this.secondaryWindows.forEach(secondaryWindow => {
|
|
85
88
|
if (!secondaryWindow.window.closed) {
|
|
86
89
|
secondaryWindow.window.postMessage({ ...event.data, fromMain: true }, '*');
|
|
@@ -52,8 +52,32 @@ export const frontendOnlyApplicationModule = new ContainerModule((bind, unbind,
|
|
|
52
52
|
bind(QuickPickService).to(QuickPickServiceImpl).inSingletonScope();
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
let extensionsCache: Promise<ExtensionInfo[]> | undefined;
|
|
56
|
+
|
|
55
57
|
const mockedApplicationServer: ApplicationServer = {
|
|
56
|
-
getExtensionsInfos: async (): Promise<ExtensionInfo[]> =>
|
|
58
|
+
getExtensionsInfos: async (): Promise<ExtensionInfo[]> => {
|
|
59
|
+
if (extensionsCache === undefined) {
|
|
60
|
+
extensionsCache = (async () => {
|
|
61
|
+
try {
|
|
62
|
+
const res = await fetch('./extensions.json');
|
|
63
|
+
if (!res.ok) {
|
|
64
|
+
extensionsCache = undefined;
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
const raw = await res.json();
|
|
68
|
+
if (!Array.isArray(raw)) {
|
|
69
|
+
extensionsCache = undefined;
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
return raw as ExtensionInfo[];
|
|
73
|
+
} catch {
|
|
74
|
+
extensionsCache = undefined;
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
})();
|
|
78
|
+
}
|
|
79
|
+
return extensionsCache;
|
|
80
|
+
},
|
|
57
81
|
getApplicationInfo: async (): Promise<ApplicationInfo | undefined> => undefined,
|
|
58
82
|
getApplicationRoot: async (): Promise<string> => '',
|
|
59
83
|
getApplicationPlatform: () => Promise.resolve('web'),
|
|
@@ -139,6 +139,131 @@ describe('Commands', () => {
|
|
|
139
139
|
expect(commandRegistry.getAllHandlers('id').length).to.be.equal(2);
|
|
140
140
|
});
|
|
141
141
|
|
|
142
|
+
describe('registerAlias', () => {
|
|
143
|
+
|
|
144
|
+
it('onDidExecuteCommand fires for alias when target is executed', async () => {
|
|
145
|
+
commandRegistry.registerCommand({ id: 'target' }, new StubCommandHandler());
|
|
146
|
+
commandRegistry.registerAlias('alias', 'target');
|
|
147
|
+
const events: string[] = [];
|
|
148
|
+
commandRegistry.onDidExecuteCommand(e => events.push(e.commandId));
|
|
149
|
+
await commandRegistry.executeCommand('target');
|
|
150
|
+
expect(events).to.deep.equal(['target', 'alias']);
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it('onDidExecuteCommand fires only for alias when alias is executed (no reverse)', async () => {
|
|
154
|
+
commandRegistry.registerCommand({ id: 'alias' }, new StubCommandHandler());
|
|
155
|
+
commandRegistry.registerAlias('alias', 'target');
|
|
156
|
+
const events: string[] = [];
|
|
157
|
+
commandRegistry.onDidExecuteCommand(e => events.push(e.commandId));
|
|
158
|
+
await commandRegistry.executeCommand('alias');
|
|
159
|
+
// Unidirectional: an alias fires for its target, but not the other way round
|
|
160
|
+
expect(events).to.deep.equal(['alias']);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('onWillExecuteCommand fires for alias when target is executed', async () => {
|
|
164
|
+
commandRegistry.registerCommand({ id: 'target' }, new StubCommandHandler());
|
|
165
|
+
commandRegistry.registerAlias('alias', 'target');
|
|
166
|
+
const events: string[] = [];
|
|
167
|
+
commandRegistry.onWillExecuteCommand(e => events.push(e.commandId));
|
|
168
|
+
await commandRegistry.executeCommand('target');
|
|
169
|
+
expect(events).to.deep.equal(['target', 'alias']);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('disposing the alias removes the event link', async () => {
|
|
173
|
+
commandRegistry.registerCommand({ id: 'target' }, new StubCommandHandler());
|
|
174
|
+
const disposable = commandRegistry.registerAlias('alias', 'target');
|
|
175
|
+
disposable.dispose();
|
|
176
|
+
const events: string[] = [];
|
|
177
|
+
commandRegistry.onDidExecuteCommand(e => events.push(e.commandId));
|
|
178
|
+
await commandRegistry.executeCommand('target');
|
|
179
|
+
expect(events).to.deep.equal(['target']);
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('getAliases returns the aliases registered for a target', () => {
|
|
183
|
+
commandRegistry.registerAlias('a', 'b');
|
|
184
|
+
expect(commandRegistry.getAliases('b')).to.deep.equal(['a']);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it('getAliases returns nothing for the alias direction (unidirectional)', () => {
|
|
188
|
+
commandRegistry.registerAlias('a', 'b');
|
|
189
|
+
expect(commandRegistry.getAliases('a')).to.be.empty;
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('getAliases returns nothing for unaliased commands', () => {
|
|
193
|
+
expect(commandRegistry.getAliases('nonexistent')).to.be.empty;
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it('a target can carry several aliases', async () => {
|
|
197
|
+
commandRegistry.registerCommand({ id: 'target' }, new StubCommandHandler());
|
|
198
|
+
commandRegistry.registerAlias('alias1', 'target');
|
|
199
|
+
commandRegistry.registerAlias('alias2', 'target');
|
|
200
|
+
const events: string[] = [];
|
|
201
|
+
commandRegistry.onDidExecuteCommand(e => events.push(e.commandId));
|
|
202
|
+
await commandRegistry.executeCommand('target');
|
|
203
|
+
expect(events).to.deep.equal(['target', 'alias1', 'alias2']);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it('disposing one alias keeps the others', async () => {
|
|
207
|
+
commandRegistry.registerCommand({ id: 'target' }, new StubCommandHandler());
|
|
208
|
+
const first = commandRegistry.registerAlias('alias1', 'target');
|
|
209
|
+
commandRegistry.registerAlias('alias2', 'target');
|
|
210
|
+
first.dispose();
|
|
211
|
+
expect(commandRegistry.getAliases('target')).to.deep.equal(['alias2']);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
it('alias events include correct args', async () => {
|
|
215
|
+
commandRegistry.registerCommand({ id: 'target' }, new ConcatCommandHandler());
|
|
216
|
+
commandRegistry.registerAlias('alias', 'target');
|
|
217
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
218
|
+
const capturedArgs: any[][] = [];
|
|
219
|
+
commandRegistry.onDidExecuteCommand(e => capturedArgs.push(e.args));
|
|
220
|
+
await commandRegistry.executeCommand('target', 'x', 'y');
|
|
221
|
+
expect(capturedArgs.length).to.equal(2);
|
|
222
|
+
expect(capturedArgs[0]).to.deep.equal(['x', 'y']);
|
|
223
|
+
expect(capturedArgs[1]).to.deep.equal(['x', 'y']);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
it('nested execution: alias handler delegating to target fires target and alias events', async () => {
|
|
227
|
+
commandRegistry.registerCommand({ id: 'target' }, new StubCommandHandler());
|
|
228
|
+
commandRegistry.registerCommand({ id: 'alias' }, {
|
|
229
|
+
execute: () => commandRegistry.executeCommand('target')
|
|
230
|
+
});
|
|
231
|
+
commandRegistry.registerAlias('alias', 'target');
|
|
232
|
+
const events: string[] = [];
|
|
233
|
+
commandRegistry.onDidExecuteCommand(e => events.push(e.commandId));
|
|
234
|
+
await commandRegistry.executeCommand('alias');
|
|
235
|
+
// The alias is on the stack while the target runs, so its event is only reported once.
|
|
236
|
+
expect(events).to.deep.equal(['target', 'alias']);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it('reports the alias once for the will execute event as well', async () => {
|
|
240
|
+
commandRegistry.registerCommand({ id: 'target' }, new StubCommandHandler());
|
|
241
|
+
commandRegistry.registerCommand({ id: 'alias' }, {
|
|
242
|
+
execute: () => commandRegistry.executeCommand('target')
|
|
243
|
+
});
|
|
244
|
+
commandRegistry.registerAlias('alias', 'target');
|
|
245
|
+
const events: string[] = [];
|
|
246
|
+
commandRegistry.onWillExecuteCommand(e => events.push(e.commandId));
|
|
247
|
+
await commandRegistry.executeCommand('alias');
|
|
248
|
+
expect(events).to.deep.equal(['alias', 'target']);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
it('reports the alias again once the delegating execution finished', async () => {
|
|
252
|
+
commandRegistry.registerCommand({ id: 'target' }, new StubCommandHandler());
|
|
253
|
+
commandRegistry.registerCommand({ id: 'alias' }, {
|
|
254
|
+
execute: () => commandRegistry.executeCommand('target')
|
|
255
|
+
});
|
|
256
|
+
commandRegistry.registerAlias('alias', 'target');
|
|
257
|
+
await commandRegistry.executeCommand('alias');
|
|
258
|
+
|
|
259
|
+
const events: string[] = [];
|
|
260
|
+
commandRegistry.onDidExecuteCommand(e => events.push(e.commandId));
|
|
261
|
+
await commandRegistry.executeCommand('target');
|
|
262
|
+
expect(events).to.deep.equal(['target', 'alias']);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
});
|
|
266
|
+
|
|
142
267
|
describe('compareCommands', () => {
|
|
143
268
|
|
|
144
269
|
it('should sort command \'a\' before command \'b\' with categories', () => {
|
package/src/common/command.ts
CHANGED
|
@@ -202,6 +202,19 @@ export class CommandRegistry implements CommandService {
|
|
|
202
202
|
// List of recently used commands.
|
|
203
203
|
protected _recent: string[] = [];
|
|
204
204
|
|
|
205
|
+
/**
|
|
206
|
+
* Unidirectional alias map from a target command id to the alias command ids registered for it.
|
|
207
|
+
* When the target (for instance a native Theia command) is executed, events also fire for its
|
|
208
|
+
* aliases (for instance the VS Code command ids).
|
|
209
|
+
*/
|
|
210
|
+
protected readonly _aliases = new Map<string, Set<string>>();
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* How often each command is currently executing, so that an alias event can be skipped while the
|
|
214
|
+
* alias command itself is on the stack.
|
|
215
|
+
*/
|
|
216
|
+
protected readonly executionDepth = new Map<string, number>();
|
|
217
|
+
|
|
205
218
|
protected readonly onWillExecuteCommandEmitter = new Emitter<WillExecuteCommandEvent>();
|
|
206
219
|
readonly onWillExecuteCommand = this.onWillExecuteCommandEmitter.event;
|
|
207
220
|
|
|
@@ -277,6 +290,42 @@ export class CommandRegistry implements CommandService {
|
|
|
277
290
|
}
|
|
278
291
|
}
|
|
279
292
|
|
|
293
|
+
/**
|
|
294
|
+
* Register a unidirectional alias from a target command to an alias command.
|
|
295
|
+
* When the target command is executed, {@link onDidExecuteCommand} and {@link onWillExecuteCommand}
|
|
296
|
+
* fire for the alias id as well.
|
|
297
|
+
*
|
|
298
|
+
* This does not affect command handlers, enablement or visibility, only event emission. A target may
|
|
299
|
+
* carry several aliases.
|
|
300
|
+
*
|
|
301
|
+
* No event is fired for an alias while that alias is executing, which keeps an alias command that
|
|
302
|
+
* delegates to its target from reporting itself twice. The check is by command id rather than by call
|
|
303
|
+
* stack, so an unrelated execution of the alias that happens to overlap suppresses the event as well.
|
|
304
|
+
*
|
|
305
|
+
* @param aliasId the alias command id, for instance a VS Code command id
|
|
306
|
+
* @param targetId the target command id, for instance the native Theia command id
|
|
307
|
+
* @returns a `Disposable` that removes this alias again
|
|
308
|
+
*/
|
|
309
|
+
registerAlias(aliasId: string, targetId: string): Disposable {
|
|
310
|
+
const aliases = this._aliases.get(targetId) ?? new Set<string>();
|
|
311
|
+
aliases.add(aliasId);
|
|
312
|
+
this._aliases.set(targetId, aliases);
|
|
313
|
+
return Disposable.create(() => {
|
|
314
|
+
const registered = this._aliases.get(targetId);
|
|
315
|
+
if (registered?.delete(aliasId) && registered.size === 0) {
|
|
316
|
+
this._aliases.delete(targetId);
|
|
317
|
+
}
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Returns the alias ids registered for the given command id.
|
|
323
|
+
*/
|
|
324
|
+
getAliases(commandId: string): readonly string[] {
|
|
325
|
+
const aliases = this._aliases.get(commandId);
|
|
326
|
+
return aliases ? Array.from(aliases) : [];
|
|
327
|
+
}
|
|
328
|
+
|
|
280
329
|
/**
|
|
281
330
|
* Register the given handler for the given command identifier.
|
|
282
331
|
*
|
|
@@ -341,10 +390,23 @@ export class CommandRegistry implements CommandService {
|
|
|
341
390
|
async executeCommand<T>(commandId: string, ...args: any[]): Promise<T | undefined> {
|
|
342
391
|
const handler = this.getActiveHandler(commandId, ...args);
|
|
343
392
|
if (handler) {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
393
|
+
this.executionDepth.set(commandId, (this.executionDepth.get(commandId) ?? 0) + 1);
|
|
394
|
+
try {
|
|
395
|
+
await this.fireWillExecuteCommand(commandId, args);
|
|
396
|
+
const result = await handler.execute(...args);
|
|
397
|
+
this.onDidExecuteCommandEmitter.fire({ commandId, args });
|
|
398
|
+
for (const alias of this.getPendingAliases(commandId)) {
|
|
399
|
+
this.onDidExecuteCommandEmitter.fire({ commandId: alias, args });
|
|
400
|
+
}
|
|
401
|
+
return result;
|
|
402
|
+
} finally {
|
|
403
|
+
const depth = this.executionDepth.get(commandId) ?? 1;
|
|
404
|
+
if (depth > 1) {
|
|
405
|
+
this.executionDepth.set(commandId, depth - 1);
|
|
406
|
+
} else {
|
|
407
|
+
this.executionDepth.delete(commandId);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
348
410
|
}
|
|
349
411
|
throw Object.assign(new Error(`The command '${commandId}' cannot be executed. There are no active handlers available for the command.`), { code: 'NO_ACTIVE_HANDLER' });
|
|
350
412
|
}
|
|
@@ -352,6 +414,17 @@ export class CommandRegistry implements CommandService {
|
|
|
352
414
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
353
415
|
protected async fireWillExecuteCommand(commandId: string, args: any[] = []): Promise<void> {
|
|
354
416
|
await WaitUntilEvent.fire(this.onWillExecuteCommandEmitter, { commandId, args }, 30000);
|
|
417
|
+
for (const alias of this.getPendingAliases(commandId)) {
|
|
418
|
+
await WaitUntilEvent.fire(this.onWillExecuteCommandEmitter, { commandId: alias, args }, 30000);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* The aliases of the given command that are not executing themselves, and for which events are
|
|
424
|
+
* therefore still owed.
|
|
425
|
+
*/
|
|
426
|
+
protected getPendingAliases(commandId: string): readonly string[] {
|
|
427
|
+
return this.getAliases(commandId).filter(alias => !this.executionDepth.has(alias));
|
|
355
428
|
}
|
|
356
429
|
|
|
357
430
|
/**
|