mirror of
https://github.com/arduino/arduino-ide.git
synced 2025-07-13 22:36:32 +00:00
feat: use theia@1.57.0
(#2654)
This commit is contained in:
parent
d298b3ffc9
commit
859d29d41a
1
.github/workflows/build.yml
vendored
1
.github/workflows/build.yml
vendored
@ -294,6 +294,7 @@ jobs:
|
|||||||
SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe"
|
SIGNTOOL_PATH: "C:/Program Files (x86)/Windows Kits/10/bin/10.0.19041.0/x86/signtool.exe"
|
||||||
WIN_CERT_PASSWORD: ${{ secrets[matrix.config.certificate-password-secret] }}
|
WIN_CERT_PASSWORD: ${{ secrets[matrix.config.certificate-password-secret] }}
|
||||||
WIN_CERT_CONTAINER_NAME: ${{ secrets[matrix.config.certificate-container] }}
|
WIN_CERT_CONTAINER_NAME: ${{ secrets[matrix.config.certificate-container] }}
|
||||||
|
PUPPETEER_SKIP_DOWNLOAD: true
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
|
@ -24,28 +24,29 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@grpc/grpc-js": "^1.8.14",
|
"@grpc/grpc-js": "^1.8.14",
|
||||||
"@theia/application-package": "1.41.0",
|
"@theia/application-package": "1.57.0",
|
||||||
"@theia/core": "1.41.0",
|
"@theia/core": "1.57.0",
|
||||||
"@theia/debug": "1.41.0",
|
"@theia/debug": "1.57.0",
|
||||||
"@theia/editor": "1.41.0",
|
"@theia/editor": "1.57.0",
|
||||||
"@theia/electron": "1.41.0",
|
"@theia/electron": "1.57.0",
|
||||||
"@theia/filesystem": "1.41.0",
|
"@theia/filesystem": "1.57.0",
|
||||||
"@theia/keymaps": "1.41.0",
|
"@theia/keymaps": "1.57.0",
|
||||||
"@theia/markers": "1.41.0",
|
"@theia/markers": "1.57.0",
|
||||||
"@theia/messages": "1.41.0",
|
"@theia/messages": "1.57.0",
|
||||||
"@theia/monaco": "1.41.0",
|
"@theia/monaco": "1.57.0",
|
||||||
"@theia/monaco-editor-core": "1.72.3",
|
"@theia/monaco-editor-core": "1.83.101",
|
||||||
"@theia/navigator": "1.41.0",
|
"@theia/navigator": "1.57.0",
|
||||||
"@theia/outline-view": "1.41.0",
|
"@theia/outline-view": "1.57.0",
|
||||||
"@theia/output": "1.41.0",
|
"@theia/output": "1.57.0",
|
||||||
"@theia/plugin-ext": "1.41.0",
|
"@theia/plugin-ext": "1.57.0",
|
||||||
"@theia/plugin-ext-vscode": "1.41.0",
|
"@theia/plugin-ext-vscode": "1.57.0",
|
||||||
"@theia/preferences": "1.41.0",
|
"@theia/preferences": "1.57.0",
|
||||||
"@theia/scm": "1.41.0",
|
"@theia/scm": "1.57.0",
|
||||||
"@theia/search-in-workspace": "1.41.0",
|
"@theia/search-in-workspace": "1.57.0",
|
||||||
"@theia/terminal": "1.41.0",
|
"@theia/terminal": "1.57.0",
|
||||||
"@theia/typehierarchy": "1.41.0",
|
"@theia/test": "1.57.0",
|
||||||
"@theia/workspace": "1.41.0",
|
"@theia/typehierarchy": "1.57.0",
|
||||||
|
"@theia/workspace": "1.57.0",
|
||||||
"@tippyjs/react": "^4.2.5",
|
"@tippyjs/react": "^4.2.5",
|
||||||
"@types/auth0-js": "^9.21.3",
|
"@types/auth0-js": "^9.21.3",
|
||||||
"@types/btoa": "^1.2.3",
|
"@types/btoa": "^1.2.3",
|
||||||
@ -57,7 +58,6 @@
|
|||||||
"@types/node-fetch": "^2.5.7",
|
"@types/node-fetch": "^2.5.7",
|
||||||
"@types/p-queue": "^2.3.1",
|
"@types/p-queue": "^2.3.1",
|
||||||
"@types/ps-tree": "^1.1.0",
|
"@types/ps-tree": "^1.1.0",
|
||||||
"@types/react-tabs": "^2.3.2",
|
|
||||||
"@types/temp": "^0.8.34",
|
"@types/temp": "^0.8.34",
|
||||||
"arduino-serial-plotter-webapp": "0.2.0",
|
"arduino-serial-plotter-webapp": "0.2.0",
|
||||||
"async-mutex": "^0.3.0",
|
"async-mutex": "^0.3.0",
|
||||||
@ -99,7 +99,7 @@
|
|||||||
"react-markdown": "^8.0.0",
|
"react-markdown": "^8.0.0",
|
||||||
"react-perfect-scrollbar": "^1.5.8",
|
"react-perfect-scrollbar": "^1.5.8",
|
||||||
"react-select": "^5.6.0",
|
"react-select": "^5.6.0",
|
||||||
"react-tabs": "^3.1.2",
|
"react-tabs": "^6.1.0",
|
||||||
"react-window": "^1.8.6",
|
"react-window": "^1.8.6",
|
||||||
"semver": "^7.3.2",
|
"semver": "^7.3.2",
|
||||||
"string-natural-compare": "^2.0.3",
|
"string-natural-compare": "^2.0.3",
|
||||||
@ -126,7 +126,7 @@
|
|||||||
"mockdate": "^3.0.5",
|
"mockdate": "^3.0.5",
|
||||||
"moment": "^2.24.0",
|
"moment": "^2.24.0",
|
||||||
"ncp": "^2.0.0",
|
"ncp": "^2.0.0",
|
||||||
"rimraf": "^2.6.1"
|
"rimraf": "^5.0.0"
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"@pingghost/protoc": "^1.0.2",
|
"@pingghost/protoc": "^1.0.2",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution';
|
import { ColorContribution } from '@theia/core/lib/browser/color-application-contribution';
|
||||||
import { ColorRegistry } from '@theia/core/lib/browser/color-registry';
|
import { ColorRegistry } from '@theia/core/lib/browser/color-registry';
|
||||||
import { CommonMenus } from '@theia/core/lib/browser/common-frontend-contribution';
|
import { CommonMenus } from '@theia/core/lib/browser/common-frontend-contribution';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||||
import {
|
import {
|
||||||
TabBarToolbarContribution,
|
TabBarToolbarContribution,
|
||||||
|
@ -1,18 +1,12 @@
|
|||||||
import '../../src/browser/style/index.css';
|
import '../../src/browser/style/index.css';
|
||||||
import {
|
import { Container, ContainerModule } from '@theia/core/shared/inversify';
|
||||||
Container,
|
|
||||||
ContainerModule,
|
|
||||||
interfaces,
|
|
||||||
} from '@theia/core/shared/inversify';
|
|
||||||
import { WidgetFactory } from '@theia/core/lib/browser/widget-manager';
|
import { WidgetFactory } from '@theia/core/lib/browser/widget-manager';
|
||||||
import { CommandContribution } from '@theia/core/lib/common/command';
|
import { CommandContribution } from '@theia/core/lib/common/command';
|
||||||
import { bindViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
|
import { bindViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
|
||||||
import { TabBarToolbarContribution } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
import { TabBarToolbarContribution } from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
||||||
import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging/ws-connection-provider';
|
import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging/ws-connection-provider';
|
||||||
import {
|
import { FrontendApplication as TheiaFrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
FrontendApplicationContribution,
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
FrontendApplication as TheiaFrontendApplication,
|
|
||||||
} from '@theia/core/lib/browser/frontend-application';
|
|
||||||
import { LibraryListWidget } from './library/library-list-widget';
|
import { LibraryListWidget } from './library/library-list-widget';
|
||||||
import { ArduinoFrontendContribution } from './arduino-frontend-contribution';
|
import { ArduinoFrontendContribution } from './arduino-frontend-contribution';
|
||||||
import {
|
import {
|
||||||
@ -57,8 +51,6 @@ import {
|
|||||||
DockPanelRenderer as TheiaDockPanelRenderer,
|
DockPanelRenderer as TheiaDockPanelRenderer,
|
||||||
TabBarRendererFactory,
|
TabBarRendererFactory,
|
||||||
ContextMenuRenderer,
|
ContextMenuRenderer,
|
||||||
createTreeContainer,
|
|
||||||
TreeWidget,
|
|
||||||
} from '@theia/core/lib/browser';
|
} from '@theia/core/lib/browser';
|
||||||
import { MenuContribution } from '@theia/core/lib/common/menu';
|
import { MenuContribution } from '@theia/core/lib/common/menu';
|
||||||
import {
|
import {
|
||||||
@ -97,7 +89,6 @@ import {
|
|||||||
ArduinoDaemonPath,
|
ArduinoDaemonPath,
|
||||||
ArduinoDaemon,
|
ArduinoDaemon,
|
||||||
} from '../common/protocol/arduino-daemon';
|
} from '../common/protocol/arduino-daemon';
|
||||||
import { EditorCommandContribution as TheiaEditorCommandContribution } from '@theia/editor/lib/browser';
|
|
||||||
import {
|
import {
|
||||||
FrontendConnectionStatusService,
|
FrontendConnectionStatusService,
|
||||||
ApplicationConnectionStatusContribution,
|
ApplicationConnectionStatusContribution,
|
||||||
@ -186,7 +177,6 @@ import {
|
|||||||
import { About } from './contributions/about';
|
import { About } from './contributions/about';
|
||||||
import { IconThemeService } from '@theia/core/lib/browser/icon-theme-service';
|
import { IconThemeService } from '@theia/core/lib/browser/icon-theme-service';
|
||||||
import { TabBarRenderer } from './theia/core/tab-bars';
|
import { TabBarRenderer } from './theia/core/tab-bars';
|
||||||
import { EditorCommandContribution } from './theia/editor/editor-command';
|
|
||||||
import { NavigatorTabBarDecorator as TheiaNavigatorTabBarDecorator } from '@theia/navigator/lib/browser/navigator-tab-bar-decorator';
|
import { NavigatorTabBarDecorator as TheiaNavigatorTabBarDecorator } from '@theia/navigator/lib/browser/navigator-tab-bar-decorator';
|
||||||
import { NavigatorTabBarDecorator } from './theia/navigator/navigator-tab-bar-decorator';
|
import { NavigatorTabBarDecorator } from './theia/navigator/navigator-tab-bar-decorator';
|
||||||
import { Debug, DebugDisabledStatusMessageSource } from './contributions/debug';
|
import { Debug, DebugDisabledStatusMessageSource } from './contributions/debug';
|
||||||
@ -275,7 +265,7 @@ import {
|
|||||||
IDEUpdaterDialog,
|
IDEUpdaterDialog,
|
||||||
IDEUpdaterDialogProps,
|
IDEUpdaterDialogProps,
|
||||||
} from './dialogs/ide-updater/ide-updater-dialog';
|
} from './dialogs/ide-updater/ide-updater-dialog';
|
||||||
import { ElectronIpcConnectionProvider } from '@theia/core/lib/electron-browser/messaging/electron-ipc-connection-provider';
|
import { ElectronIpcConnectionProvider } from '@theia/core/lib/electron-browser/messaging/electron-ipc-connection-source';
|
||||||
import { MonitorModel } from './monitor-model';
|
import { MonitorModel } from './monitor-model';
|
||||||
import { MonitorManagerProxyClientImpl } from './monitor-manager-proxy-client-impl';
|
import { MonitorManagerProxyClientImpl } from './monitor-manager-proxy-client-impl';
|
||||||
import { EditorManager as TheiaEditorManager } from '@theia/editor/lib/browser/editor-manager';
|
import { EditorManager as TheiaEditorManager } from '@theia/editor/lib/browser/editor-manager';
|
||||||
@ -295,10 +285,6 @@ import { PreferenceTreeGenerator } from './theia/preferences/preference-tree-gen
|
|||||||
import { PreferenceTreeGenerator as TheiaPreferenceTreeGenerator } from '@theia/preferences/lib/browser/util/preference-tree-generator';
|
import { PreferenceTreeGenerator as TheiaPreferenceTreeGenerator } from '@theia/preferences/lib/browser/util/preference-tree-generator';
|
||||||
import { AboutDialog } from './theia/core/about-dialog';
|
import { AboutDialog } from './theia/core/about-dialog';
|
||||||
import { AboutDialog as TheiaAboutDialog } from '@theia/core/lib/browser/about-dialog';
|
import { AboutDialog as TheiaAboutDialog } from '@theia/core/lib/browser/about-dialog';
|
||||||
import {
|
|
||||||
SurveyNotificationService,
|
|
||||||
SurveyNotificationServicePath,
|
|
||||||
} from '../common/protocol/survey-service';
|
|
||||||
import { WindowContribution } from './theia/core/window-contribution';
|
import { WindowContribution } from './theia/core/window-contribution';
|
||||||
import { WindowContribution as TheiaWindowContribution } from '@theia/core/lib/browser/window-contribution';
|
import { WindowContribution as TheiaWindowContribution } from '@theia/core/lib/browser/window-contribution';
|
||||||
import { CoreErrorHandler } from './contributions/core-error-handler';
|
import { CoreErrorHandler } from './contributions/core-error-handler';
|
||||||
@ -381,19 +367,13 @@ import { DebugSessionWidget } from '@theia/debug/lib/browser/view/debug-session-
|
|||||||
import { DebugConfigurationWidget } from './theia/debug/debug-configuration-widget';
|
import { DebugConfigurationWidget } from './theia/debug/debug-configuration-widget';
|
||||||
import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget';
|
import { DebugConfigurationWidget as TheiaDebugConfigurationWidget } from '@theia/debug/lib/browser/view/debug-configuration-widget';
|
||||||
import { DebugToolBar } from '@theia/debug/lib/browser/view/debug-toolbar-widget';
|
import { DebugToolBar } from '@theia/debug/lib/browser/view/debug-toolbar-widget';
|
||||||
import {
|
|
||||||
PluginTree,
|
|
||||||
PluginTreeModel,
|
|
||||||
TreeViewWidgetOptions,
|
|
||||||
VIEW_ITEM_CONTEXT_MENU,
|
|
||||||
} from '@theia/plugin-ext/lib/main/browser/view/tree-view-widget';
|
|
||||||
import { TreeViewDecoratorService } from '@theia/plugin-ext/lib/main/browser/view/tree-view-decorator-service';
|
|
||||||
import { PLUGIN_VIEW_DATA_FACTORY_ID } from '@theia/plugin-ext/lib/main/browser/view/plugin-view-registry';
|
|
||||||
import { TreeViewWidget } from './theia/plugin-ext/tree-view-widget';
|
|
||||||
import {
|
import {
|
||||||
VersionWelcomeDialog,
|
VersionWelcomeDialog,
|
||||||
VersionWelcomeDialogProps,
|
VersionWelcomeDialogProps,
|
||||||
} from './dialogs/version-welcome-dialog';
|
} from './dialogs/version-welcome-dialog';
|
||||||
|
import { TestViewContribution as TheiaTestViewContribution } from '@theia/test/lib/browser/view/test-view-contribution';
|
||||||
|
import { TestViewContribution } from './theia/test/test-view-contribution';
|
||||||
|
|
||||||
// Hack to fix copy/cut/paste issue after electron version update in Theia.
|
// Hack to fix copy/cut/paste issue after electron version update in Theia.
|
||||||
// https://github.com/eclipse-theia/theia/issues/12487
|
// https://github.com/eclipse-theia/theia/issues/12487
|
||||||
@ -574,15 +554,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
WorkspaceVariableContribution
|
WorkspaceVariableContribution
|
||||||
);
|
);
|
||||||
|
|
||||||
bind(SurveyNotificationService)
|
|
||||||
.toDynamicValue((context) => {
|
|
||||||
return ElectronIpcConnectionProvider.createProxy(
|
|
||||||
context.container,
|
|
||||||
SurveyNotificationServicePath
|
|
||||||
);
|
|
||||||
})
|
|
||||||
.inSingletonScope();
|
|
||||||
|
|
||||||
// Layout and shell customizations.
|
// Layout and shell customizations.
|
||||||
rebind(TheiaOutlineViewContribution)
|
rebind(TheiaOutlineViewContribution)
|
||||||
.to(OutlineViewContribution)
|
.to(OutlineViewContribution)
|
||||||
@ -856,13 +827,6 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Workaround for https://github.com/eclipse-theia/theia/issues/8722
|
|
||||||
// Do not trigger a save on IDE startup if `"editor.autoSave": "on"` was set as a preference.
|
|
||||||
// Note: `"editor.autoSave" was renamed to `"files.autoSave" and `"on"` was replaced with three
|
|
||||||
// different cases, but we treat `!== 'off'` as auto save enabled. (https://github.com/eclipse-theia/theia/issues/10812)
|
|
||||||
bind(EditorCommandContribution).toSelf().inSingletonScope();
|
|
||||||
rebind(TheiaEditorCommandContribution).toService(EditorCommandContribution);
|
|
||||||
|
|
||||||
// Silent the badge decoration in the Explorer view.
|
// Silent the badge decoration in the Explorer view.
|
||||||
bind(NavigatorTabBarDecorator).toSelf().inSingletonScope();
|
bind(NavigatorTabBarDecorator).toSelf().inSingletonScope();
|
||||||
rebind(TheiaNavigatorTabBarDecorator).toService(NavigatorTabBarDecorator);
|
rebind(TheiaNavigatorTabBarDecorator).toService(NavigatorTabBarDecorator);
|
||||||
@ -1112,42 +1076,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
TerminalFrontendContribution
|
TerminalFrontendContribution
|
||||||
);
|
);
|
||||||
|
|
||||||
bindViewsWelcome_TheiaGH14309({ bind, widget: TreeViewWidget });
|
// Hides the Test Explorer from the side-bar
|
||||||
|
bind(TestViewContribution).toSelf().inSingletonScope();
|
||||||
|
rebind(TheiaTestViewContribution).toService(TestViewContribution);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Align the viewsWelcome rendering with VS Code (https://github.com/eclipse-theia/theia/issues/14309)
|
|
||||||
// Copied from Theia code but with customized TreeViewWidget with the customized viewsWelcome rendering
|
|
||||||
// https://github.com/eclipse-theia/theia/blob/0c5f69455d9ee355b1a7ca510ffa63d2b20f0c77/packages/plugin-ext/src/main/browser/plugin-ext-frontend-module.ts#L159-L181
|
|
||||||
function bindViewsWelcome_TheiaGH14309({
|
|
||||||
bind,
|
|
||||||
widget,
|
|
||||||
}: {
|
|
||||||
bind: interfaces.Bind;
|
|
||||||
widget: interfaces.Newable<TreeWidget>;
|
|
||||||
}) {
|
|
||||||
bind(WidgetFactory)
|
|
||||||
.toDynamicValue(({ container }) => ({
|
|
||||||
id: PLUGIN_VIEW_DATA_FACTORY_ID,
|
|
||||||
createWidget: (options: TreeViewWidgetOptions) => {
|
|
||||||
const props = {
|
|
||||||
contextMenuPath: VIEW_ITEM_CONTEXT_MENU,
|
|
||||||
expandOnlyOnExpansionToggleClick: true,
|
|
||||||
expansionTogglePadding: 22,
|
|
||||||
globalSelection: true,
|
|
||||||
leftPadding: 8,
|
|
||||||
search: true,
|
|
||||||
multiSelect: options.multiSelect,
|
|
||||||
};
|
|
||||||
const child = createTreeContainer(container, {
|
|
||||||
props,
|
|
||||||
tree: PluginTree,
|
|
||||||
model: PluginTreeModel,
|
|
||||||
widget,
|
|
||||||
decoratorService: TreeViewDecoratorService,
|
|
||||||
});
|
|
||||||
child.bind(TreeViewWidgetOptions).toConstantValue(options);
|
|
||||||
return child.get(TreeWidget);
|
|
||||||
},
|
|
||||||
}))
|
|
||||||
.inSingletonScope();
|
|
||||||
}
|
|
||||||
|
@ -280,14 +280,6 @@ const properties: ArduinoPreferenceSchemaProperties = {
|
|||||||
),
|
),
|
||||||
default: 'https://auth.arduino.cc/login#/register',
|
default: 'https://auth.arduino.cc/login#/register',
|
||||||
},
|
},
|
||||||
'arduino.survey.notification': {
|
|
||||||
type: 'boolean',
|
|
||||||
description: nls.localize(
|
|
||||||
'arduino/preferences/survey.notification',
|
|
||||||
'True if users should be notified if a survey is available. True by default.'
|
|
||||||
),
|
|
||||||
default: true,
|
|
||||||
},
|
|
||||||
'arduino.cli.daemon.debug': {
|
'arduino.cli.daemon.debug': {
|
||||||
type: 'boolean',
|
type: 'boolean',
|
||||||
description: nls.localize(
|
description: nls.localize(
|
||||||
@ -355,7 +347,6 @@ export interface ArduinoConfiguration {
|
|||||||
'arduino.auth.domain': string;
|
'arduino.auth.domain': string;
|
||||||
'arduino.auth.audience': string;
|
'arduino.auth.audience': string;
|
||||||
'arduino.auth.registerUri': string;
|
'arduino.auth.registerUri': string;
|
||||||
'arduino.survey.notification': boolean;
|
|
||||||
'arduino.cli.daemon.debug': boolean;
|
'arduino.cli.daemon.debug': boolean;
|
||||||
'arduino.sketch.inoBlueprint': string;
|
'arduino.sketch.inoBlueprint': string;
|
||||||
'arduino.checkForUpdates': boolean;
|
'arduino.checkForUpdates': boolean;
|
||||||
|
@ -3,7 +3,7 @@ import { Emitter } from '@theia/core/lib/common/event';
|
|||||||
import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory';
|
import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory';
|
||||||
import { WindowService } from '@theia/core/lib/browser/window/window-service';
|
import { WindowService } from '@theia/core/lib/browser/window/window-service';
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import {
|
import {
|
||||||
CommandRegistry,
|
CommandRegistry,
|
||||||
CommandContribution,
|
CommandContribution,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { MessageService } from '@theia/core/lib/common/message-service';
|
import { MessageService } from '@theia/core/lib/common/message-service';
|
||||||
import { MessageType } from '@theia/core/lib/common/message-service-protocol';
|
import { MessageType } from '@theia/core/lib/common/message-service-protocol';
|
||||||
|
@ -98,6 +98,7 @@ export class BoardsConfigDialog extends ReactDialog<BoardsConfigDialogState> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override async open(
|
override async open(
|
||||||
|
disposeOnResolve = true,
|
||||||
params?: EditBoardsConfigActionParams
|
params?: EditBoardsConfigActionParams
|
||||||
): Promise<BoardsConfig | undefined> {
|
): Promise<BoardsConfig | undefined> {
|
||||||
this._searchSet = undefined;
|
this._searchSet = undefined;
|
||||||
@ -119,7 +120,7 @@ export class BoardsConfigDialog extends ReactDialog<BoardsConfigDialogState> {
|
|||||||
this._searchSet = params.searchSet.slice();
|
this._searchSet = params.searchSet.slice();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return super.open();
|
return super.open(disposeOnResolve);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override onAfterAttach(msg: Message): void {
|
protected override onAfterAttach(msg: Message): void {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||||
import { StorageService } from '@theia/core/lib/browser/storage-service';
|
import { StorageService } from '@theia/core/lib/browser/storage-service';
|
||||||
import type {
|
import type {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||||
import { StorageService } from '@theia/core/lib/browser/storage-service';
|
import { StorageService } from '@theia/core/lib/browser/storage-service';
|
||||||
import {
|
import {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { Emitter, Event } from '@theia/core/lib/common/event';
|
import { Emitter, Event } from '@theia/core/lib/common/event';
|
||||||
|
@ -70,7 +70,7 @@ export class CheckForIDEUpdates extends Contribution {
|
|||||||
SKIP_IDE_VERSION
|
SKIP_IDE_VERSION
|
||||||
);
|
);
|
||||||
if (versionToSkip === updateInfo.version) return;
|
if (versionToSkip === updateInfo.version) return;
|
||||||
this.updaterDialog.open(updateInfo);
|
this.updaterDialog.open(true, updateInfo);
|
||||||
})
|
})
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
this.messageService.error(
|
this.messageService.error(
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import { Dialog } from '@theia/core/lib/browser/dialogs';
|
import { Dialog } from '@theia/core/lib/browser/dialogs';
|
||||||
import type {
|
import type { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
FrontendApplication,
|
import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
OnWillStopAction,
|
|
||||||
} from '@theia/core/lib/browser/frontend-application';
|
|
||||||
import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell';
|
import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shell';
|
||||||
import { nls } from '@theia/core/lib/common/nls';
|
import { nls } from '@theia/core/lib/common/nls';
|
||||||
import type { MaybePromise } from '@theia/core/lib/common/types';
|
import type { MaybePromise } from '@theia/core/lib/common/types';
|
||||||
|
@ -779,7 +779,7 @@ export class CompilerErrors
|
|||||||
return undefined;
|
return undefined;
|
||||||
} else {
|
} else {
|
||||||
return this.editorManager
|
return this.editorManager
|
||||||
.getByUri(new URI(uriOrWidget))
|
.getByUri(new URI(uriOrWidget.toString()))
|
||||||
.then((editor) => {
|
.then((editor) => {
|
||||||
if (editor) {
|
if (editor) {
|
||||||
return this.monacoEditor(editor);
|
return this.monacoEditor(editor);
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
||||||
import {
|
import { FrontendApplication } from '@theia/core/lib/browser/frontend-application';
|
||||||
FrontendApplication,
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
FrontendApplicationContribution,
|
|
||||||
} from '@theia/core/lib/browser/frontend-application';
|
|
||||||
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state';
|
||||||
import {
|
import {
|
||||||
KeybindingContribution,
|
KeybindingContribution,
|
||||||
|
@ -1,7 +1,11 @@
|
|||||||
|
import { nls } from '@theia/core/lib/common';
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import { CommonCommands } from '@theia/core/lib/browser/common-frontend-contribution';
|
import { CommonCommands } from '@theia/core/lib/browser/common-frontend-contribution';
|
||||||
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
import { ClipboardService } from '@theia/core/lib/browser/clipboard-service';
|
||||||
import { MonacoEditorService } from '@theia/monaco/lib/browser/monaco-editor-service';
|
import { StandaloneServices } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneServices';
|
||||||
|
import { ICodeEditorService } from '@theia/monaco-editor-core/esm/vs/editor/browser/services/codeEditorService';
|
||||||
|
import type { ICodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/browser/editorBrowser';
|
||||||
|
import type { StandaloneCodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneCodeEditor';
|
||||||
import {
|
import {
|
||||||
Contribution,
|
Contribution,
|
||||||
Command,
|
Command,
|
||||||
@ -10,17 +14,11 @@ import {
|
|||||||
CommandRegistry,
|
CommandRegistry,
|
||||||
} from './contribution';
|
} from './contribution';
|
||||||
import { ArduinoMenus } from '../menu/arduino-menus';
|
import { ArduinoMenus } from '../menu/arduino-menus';
|
||||||
import { nls } from '@theia/core/lib/common';
|
|
||||||
import type { ICodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/browser/editorBrowser';
|
|
||||||
import type { StandaloneCodeEditor } from '@theia/monaco-editor-core/esm/vs/editor/standalone/browser/standaloneCodeEditor';
|
|
||||||
|
|
||||||
// TODO: [macOS]: to remove `Start Dictation...` and `Emoji & Symbol` see this thread: https://github.com/electron/electron/issues/8283#issuecomment-269522072
|
// TODO: [macOS]: to remove `Start Dictation...` and `Emoji & Symbol` see this thread: https://github.com/electron/electron/issues/8283#issuecomment-269522072
|
||||||
// Depends on https://github.com/eclipse-theia/theia/pull/7964
|
// Depends on https://github.com/eclipse-theia/theia/pull/7964
|
||||||
@injectable()
|
@injectable()
|
||||||
export class EditContributions extends Contribution {
|
export class EditContributions extends Contribution {
|
||||||
@inject(MonacoEditorService)
|
|
||||||
private readonly codeEditorService: MonacoEditorService;
|
|
||||||
|
|
||||||
@inject(ClipboardService)
|
@inject(ClipboardService)
|
||||||
private readonly clipboardService: ClipboardService;
|
private readonly clipboardService: ClipboardService;
|
||||||
|
|
||||||
@ -208,9 +206,10 @@ ${value}
|
|||||||
protected async current(): Promise<
|
protected async current(): Promise<
|
||||||
ICodeEditor | StandaloneCodeEditor | undefined
|
ICodeEditor | StandaloneCodeEditor | undefined
|
||||||
> {
|
> {
|
||||||
|
const codeEditorService = StandaloneServices.get(ICodeEditorService);
|
||||||
return (
|
return (
|
||||||
this.codeEditorService.getFocusedCodeEditor() ||
|
codeEditorService.getFocusedCodeEditor() ||
|
||||||
this.codeEditorService.getActiveCodeEditor() ||
|
codeEditorService.getActiveCodeEditor() ||
|
||||||
undefined
|
undefined
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@ export class OpenBoardsConfig extends Contribution {
|
|||||||
override registerCommands(registry: CommandRegistry): void {
|
override registerCommands(registry: CommandRegistry): void {
|
||||||
registry.registerCommand(OpenBoardsConfig.Commands.OPEN_DIALOG, {
|
registry.registerCommand(OpenBoardsConfig.Commands.OPEN_DIALOG, {
|
||||||
execute: async (params?: EditBoardsConfigActionParams) =>
|
execute: async (params?: EditBoardsConfigActionParams) =>
|
||||||
this.boardsConfigDialog.open(params),
|
this.boardsConfigDialog.open(true, params),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,78 +0,0 @@
|
|||||||
import { MessageService } from '@theia/core';
|
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser';
|
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
||||||
import { LocalStorageService } from '@theia/core/lib/browser';
|
|
||||||
import { nls } from '@theia/core/lib/common';
|
|
||||||
import { WindowService } from '@theia/core/lib/browser/window/window-service';
|
|
||||||
import { ArduinoPreferences } from '../arduino-preferences';
|
|
||||||
import { SurveyNotificationService } from '../../common/protocol/survey-service';
|
|
||||||
|
|
||||||
const SURVEY_MESSAGE = nls.localize(
|
|
||||||
'arduino/survey/surveyMessage',
|
|
||||||
'Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better.'
|
|
||||||
);
|
|
||||||
const DO_NOT_SHOW_AGAIN = nls.localize(
|
|
||||||
'arduino/survey/dismissSurvey',
|
|
||||||
"Don't show again"
|
|
||||||
);
|
|
||||||
const GO_TO_SURVEY = nls.localize(
|
|
||||||
'arduino/survey/answerSurvey',
|
|
||||||
'Answer survey'
|
|
||||||
);
|
|
||||||
|
|
||||||
const SURVEY_BASE_URL = 'https://surveys.hotjar.com/';
|
|
||||||
const surveyId = '17887b40-e1f0-4bd6-b9f0-a37f229ccd8b';
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class SurveyNotification implements FrontendApplicationContribution {
|
|
||||||
@inject(MessageService)
|
|
||||||
private readonly messageService: MessageService;
|
|
||||||
|
|
||||||
@inject(LocalStorageService)
|
|
||||||
private readonly localStorageService: LocalStorageService;
|
|
||||||
|
|
||||||
@inject(WindowService)
|
|
||||||
private readonly windowService: WindowService;
|
|
||||||
|
|
||||||
@inject(ArduinoPreferences)
|
|
||||||
private readonly arduinoPreferences: ArduinoPreferences;
|
|
||||||
|
|
||||||
@inject(SurveyNotificationService)
|
|
||||||
private readonly surveyNotificationService: SurveyNotificationService;
|
|
||||||
|
|
||||||
onStart(): void {
|
|
||||||
this.arduinoPreferences.ready.then(async () => {
|
|
||||||
if (
|
|
||||||
(await this.surveyNotificationService.isFirstInstance()) &&
|
|
||||||
this.arduinoPreferences.get('arduino.survey.notification')
|
|
||||||
) {
|
|
||||||
const surveyAnswered = await this.localStorageService.getData(
|
|
||||||
this.surveyKey(surveyId)
|
|
||||||
);
|
|
||||||
if (surveyAnswered !== undefined) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const answer = await this.messageService.info(
|
|
||||||
SURVEY_MESSAGE,
|
|
||||||
DO_NOT_SHOW_AGAIN,
|
|
||||||
GO_TO_SURVEY
|
|
||||||
);
|
|
||||||
switch (answer) {
|
|
||||||
case GO_TO_SURVEY:
|
|
||||||
this.windowService.openNewWindow(SURVEY_BASE_URL + surveyId, {
|
|
||||||
external: true,
|
|
||||||
});
|
|
||||||
this.localStorageService.setData(this.surveyKey(surveyId), true);
|
|
||||||
break;
|
|
||||||
case DO_NOT_SHOW_AGAIN:
|
|
||||||
this.localStorageService.setData(this.surveyKey(surveyId), false);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private surveyKey(id: string): string {
|
|
||||||
return `answered_survey:${id}`;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { Emitter, Event } from '@theia/core/lib/common/event';
|
import { Emitter, Event } from '@theia/core/lib/common/event';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
|
@ -5,7 +5,7 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import {
|
import {
|
||||||
Stat,
|
Stat,
|
||||||
FileType,
|
FileType,
|
||||||
|
@ -261,6 +261,7 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override async open(
|
override async open(
|
||||||
|
disposeOnResolve = true,
|
||||||
data: UpdateInfo | undefined = undefined
|
data: UpdateInfo | undefined = undefined
|
||||||
): Promise<UpdateInfo | undefined> {
|
): Promise<UpdateInfo | undefined> {
|
||||||
if (data && data.version) {
|
if (data && data.version) {
|
||||||
@ -271,7 +272,7 @@ export class IDEUpdaterDialog extends ReactDialog<UpdateInfo | undefined> {
|
|||||||
error: undefined,
|
error: undefined,
|
||||||
});
|
});
|
||||||
this.updateInfo = data;
|
this.updateInfo = data;
|
||||||
return super.open();
|
return super.open(disposeOnResolve);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ export class IDEUpdaterCommands implements CommandContribution {
|
|||||||
try {
|
try {
|
||||||
const updateInfo = await this.updater.checkForUpdates(initialCheck);
|
const updateInfo = await this.updater.checkForUpdates(initialCheck);
|
||||||
if (!!updateInfo) {
|
if (!!updateInfo) {
|
||||||
this.updaterDialog.open(updateInfo);
|
this.updaterDialog.open(true, updateInfo);
|
||||||
} else {
|
} else {
|
||||||
this.messageService.info(
|
this.messageService.info(
|
||||||
nls.localize(
|
nls.localize(
|
||||||
|
@ -6,7 +6,7 @@ import {
|
|||||||
import { Emitter } from '@theia/core/lib/common/event';
|
import { Emitter } from '@theia/core/lib/common/event';
|
||||||
import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory';
|
import { JsonRpcProxy } from '@theia/core/lib/common/messaging/proxy-factory';
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import {
|
import {
|
||||||
IndexUpdateDidCompleteParams,
|
IndexUpdateDidCompleteParams,
|
||||||
IndexUpdateDidFailParams,
|
IndexUpdateDidFailParams,
|
||||||
|
@ -9,7 +9,7 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { Sketch, SketchesService } from '../common/protocol';
|
import { Sketch, SketchesService } from '../common/protocol';
|
||||||
import { ConfigServiceClient } from './config/config-service-client';
|
import { ConfigServiceClient } from './config/config-service-client';
|
||||||
import {
|
import {
|
||||||
@ -74,6 +74,7 @@ export class SketchesServiceClientImpl
|
|||||||
const sketchDirUri = this.configService.tryGetSketchDirUri();
|
const sketchDirUri = this.configService.tryGetSketchDirUri();
|
||||||
this.watchSketchbookDir(sketchDirUri);
|
this.watchSketchbookDir(sketchDirUri);
|
||||||
const refreshCurrentSketch = async () => {
|
const refreshCurrentSketch = async () => {
|
||||||
|
await this.workspaceService.ready;
|
||||||
const currentSketch = await this.loadCurrentSketch();
|
const currentSketch = await this.loadCurrentSketch();
|
||||||
const ideTempFolderUri = await this.getIdeTempFolderUriForSketch(
|
const ideTempFolderUri = await this.getIdeTempFolderUriForSketch(
|
||||||
currentSketch
|
currentSketch
|
||||||
@ -287,7 +288,7 @@ export class SketchesServiceClientImpl
|
|||||||
* `true` if the `uri` is not contained in any of the opened workspaces. Otherwise, `false`.
|
* `true` if the `uri` is not contained in any of the opened workspaces. Otherwise, `false`.
|
||||||
*/
|
*/
|
||||||
isReadOnly(uri: URI | monaco.Uri | string): boolean {
|
isReadOnly(uri: URI | monaco.Uri | string): boolean {
|
||||||
const toCheck = uri instanceof URI ? uri : new URI(uri);
|
const toCheck = uri instanceof URI ? uri : new URI(uri.toString());
|
||||||
if (toCheck.scheme === 'user-storage') {
|
if (toCheck.scheme === 'user-storage') {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -98,16 +98,12 @@
|
|||||||
color: var(--theia-textLink-foreground);
|
color: var(--theia-textLink-foreground);
|
||||||
}
|
}
|
||||||
|
|
||||||
.account-icon {
|
img.arduino-account-picture {
|
||||||
width: var(--theia-private-sidebar-icon-size);
|
width: var(--theia-private-sidebar-icon-size);
|
||||||
height: var(--theia-private-sidebar-icon-size);
|
height: var(--theia-private-sidebar-icon-size);
|
||||||
border-radius: 50%;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.account-icon > img {
|
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
max-height: 100%;
|
max-height: 100%;
|
||||||
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.connected-status-icon {
|
.connected-status-icon {
|
||||||
|
@ -2,7 +2,7 @@ import {
|
|||||||
CommonCommands,
|
CommonCommands,
|
||||||
CommonFrontendContribution as TheiaCommonFrontendContribution,
|
CommonFrontendContribution as TheiaCommonFrontendContribution,
|
||||||
} from '@theia/core/lib/browser/common-frontend-contribution';
|
} from '@theia/core/lib/browser/common-frontend-contribution';
|
||||||
import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application';
|
import type { OnWillStopAction } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import type { KeybindingRegistry } from '@theia/core/lib/browser/keybinding';
|
import type { KeybindingRegistry } from '@theia/core/lib/browser/keybinding';
|
||||||
import type { CommandRegistry } from '@theia/core/lib/common/command';
|
import type { CommandRegistry } from '@theia/core/lib/common/command';
|
||||||
import type { MenuModelRegistry } from '@theia/core/lib/common/menu';
|
import type { MenuModelRegistry } from '@theia/core/lib/common/menu';
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import {
|
import {
|
||||||
ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution,
|
|
||||||
ConnectionStatus,
|
ConnectionStatus,
|
||||||
|
ApplicationConnectionStatusContribution as TheiaApplicationConnectionStatusContribution,
|
||||||
FrontendConnectionStatusService as TheiaFrontendConnectionStatusService,
|
FrontendConnectionStatusService as TheiaFrontendConnectionStatusService,
|
||||||
} from '@theia/core/lib/browser/connection-status-service';
|
} from '@theia/core/lib/browser/connection-status-service';
|
||||||
import type { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import type { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { WebSocketConnectionProvider } from '@theia/core/lib/browser/index';
|
import { WebSocketConnectionSource } from '@theia/core/lib/browser/messaging/ws-connection-source';
|
||||||
import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar';
|
import { StatusBarAlignment } from '@theia/core/lib/browser/status-bar/status-bar';
|
||||||
import { Disposable } from '@theia/core/lib/common/disposable';
|
import { Disposable } from '@theia/core/lib/common/disposable';
|
||||||
import { Emitter, Event } from '@theia/core/lib/common/event';
|
import { Emitter, Event } from '@theia/core/lib/common/event';
|
||||||
@ -114,8 +114,8 @@ export class FrontendConnectionStatusService extends TheiaFrontendConnectionStat
|
|||||||
private readonly daemonPort: DaemonPort;
|
private readonly daemonPort: DaemonPort;
|
||||||
@inject(IsOnline)
|
@inject(IsOnline)
|
||||||
private readonly isOnline: IsOnline;
|
private readonly isOnline: IsOnline;
|
||||||
@inject(WebSocketConnectionProvider)
|
@inject(WebSocketConnectionSource)
|
||||||
private readonly connectionProvider: WebSocketConnectionProvider;
|
private readonly connectionSource: WebSocketConnectionSource;
|
||||||
|
|
||||||
@postConstruct()
|
@postConstruct()
|
||||||
protected override init(): void {
|
protected override init(): void {
|
||||||
@ -128,7 +128,7 @@ export class FrontendConnectionStatusService extends TheiaFrontendConnectionStat
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected override async performPingRequest(): Promise<void> {
|
protected override async performPingRequest(): Promise<void> {
|
||||||
if (!this.connectionProvider['socket'].connected) {
|
if (!this.connectionSource['socket'].connected) {
|
||||||
this.updateStatus(false);
|
this.updateStatus(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -171,8 +171,8 @@ export class ApplicationConnectionStatusContribution extends TheiaApplicationCon
|
|||||||
private readonly notificationManager: NotificationManager;
|
private readonly notificationManager: NotificationManager;
|
||||||
@inject(CreateFeatures)
|
@inject(CreateFeatures)
|
||||||
private readonly createFeatures: CreateFeatures;
|
private readonly createFeatures: CreateFeatures;
|
||||||
@inject(WebSocketConnectionProvider)
|
@inject(WebSocketConnectionSource)
|
||||||
private readonly connectionProvider: WebSocketConnectionProvider;
|
private readonly connectionSource: WebSocketConnectionSource;
|
||||||
|
|
||||||
private readonly offlineStatusDidChangeEmitter = new Emitter<
|
private readonly offlineStatusDidChangeEmitter = new Emitter<
|
||||||
OfflineConnectionStatus | undefined
|
OfflineConnectionStatus | undefined
|
||||||
@ -202,7 +202,7 @@ export class ApplicationConnectionStatusContribution extends TheiaApplicationCon
|
|||||||
const params = <OfflineMessageParams>{
|
const params = <OfflineMessageParams>{
|
||||||
port: this.daemonPort.port,
|
port: this.daemonPort.port,
|
||||||
online: this.isOnline.online,
|
online: this.isOnline.online,
|
||||||
backendConnected: this.connectionProvider['socket'].connected, // https://github.com/arduino/arduino-ide/issues/2081
|
backendConnected: this.connectionSource['socket'].connected, // https://github.com/arduino/arduino-ide/issues/2081
|
||||||
};
|
};
|
||||||
this._offlineStatus = offlineConnectionStatusType(params);
|
this._offlineStatus = offlineConnectionStatusType(params);
|
||||||
const { text, tooltip } = offlineMessage(params);
|
const { text, tooltip } = offlineMessage(params);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { SidebarBottomMenuWidget as TheiaSidebarBottomMenuWidget } from '@theia/core/lib/browser/shell/sidebar-bottom-menu-widget';
|
import { SidebarBottomMenuWidget as TheiaSidebarBottomMenuWidget } from '@theia/core/lib/browser/shell/sidebar-bottom-menu-widget';
|
||||||
import type { SidebarMenu } from '@theia/core/lib/browser/shell/sidebar-menu-widget';
|
import type { SidebarMenuItem } from '@theia/core/lib/browser/shell/sidebar-menu-widget';
|
||||||
import type { MenuPath } from '@theia/core/lib/common/menu';
|
import type { MenuPath } from '@theia/core/lib/common/menu';
|
||||||
import { nls } from '@theia/core/lib/common/nls';
|
import { nls } from '@theia/core/lib/common/nls';
|
||||||
import {
|
import {
|
||||||
@ -46,46 +46,45 @@ export class SidebarBottomMenuWidget extends TheiaSidebarBottomMenuWidget {
|
|||||||
this.contextMenuRenderer.render(options);
|
this.contextMenuRenderer.render(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override render(): React.ReactNode {
|
override renderItem(item: SidebarMenuItem): React.ReactNode {
|
||||||
return (
|
|
||||||
<React.Fragment>
|
|
||||||
{this.menus.map((menu) => this.renderMenu(menu))}
|
|
||||||
</React.Fragment>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private renderMenu(menu: SidebarMenu): React.ReactNode {
|
|
||||||
// Removes the _Settings_ (cog) icon from the left sidebar
|
// Removes the _Settings_ (cog) icon from the left sidebar
|
||||||
if (menu.id === 'settings-menu') {
|
if (item.menu.id === 'settings-menu') {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
const arduinoAccount = menu.id === accountMenu.id;
|
const arduinoAccount = item.menu.id === accountMenu.id;
|
||||||
const picture =
|
const arduinoAccountPicture =
|
||||||
arduinoAccount &&
|
arduinoAccount &&
|
||||||
this.connectionStatue.offlineStatus !== 'internet' &&
|
this.connectionStatue.offlineStatus !== 'internet' &&
|
||||||
this.createFeatures.session?.account.picture;
|
this.createFeatures.session?.account.picture;
|
||||||
const className = typeof picture === 'string' ? undefined : menu.iconClass;
|
|
||||||
return (
|
return (
|
||||||
<i
|
<div
|
||||||
key={menu.id}
|
key={item.menu.id}
|
||||||
className={className}
|
className="theia-sidebar-menu-item"
|
||||||
title={menu.title}
|
title={item.menu.title}
|
||||||
onClick={(e) => this.onClick(e, menu.menuPath)}
|
onClick={(e) => this.onClick(e, item.menu.menuPath)}
|
||||||
onMouseDown={this.onMouseDown}
|
onMouseDown={this.onMouseDown}
|
||||||
|
onMouseEnter={(e) => this.onMouseEnter(e, item.menu.title)}
|
||||||
onMouseOut={this.onMouseOut}
|
onMouseOut={this.onMouseOut}
|
||||||
>
|
>
|
||||||
{picture && (
|
{arduinoAccountPicture ? (
|
||||||
<div className="account-icon">
|
<i>
|
||||||
<img
|
<img
|
||||||
src={picture}
|
className="arduino-account-picture"
|
||||||
|
src={arduinoAccountPicture}
|
||||||
alt={nls.localize(
|
alt={nls.localize(
|
||||||
'arduino/cloud/profilePicture',
|
'arduino/cloud/profilePicture',
|
||||||
'Profile picture'
|
'Profile picture'
|
||||||
)}
|
)}
|
||||||
/>
|
/>
|
||||||
</div>
|
</i>
|
||||||
|
) : (
|
||||||
|
<i className={item.menu.iconClass} />
|
||||||
)}
|
)}
|
||||||
</i>
|
{item.badge && (
|
||||||
|
<div className="theia-badge-decorator-sidebar">{item.badge}</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { injectable } from '@theia/core/shared/inversify';
|
import { injectable } from '@theia/core/shared/inversify';
|
||||||
import { DebugSessionConnection } from '@theia/debug/lib/browser/debug-session-connection';
|
import { DebugSessionConnection } from '@theia/debug/lib/browser/debug-session-connection';
|
||||||
import { DefaultDebugSessionFactory as TheiaDefaultDebugSessionFactory } from '@theia/debug/lib/browser/debug-session-contribution';
|
import { DefaultDebugSessionFactory as TheiaDefaultDebugSessionFactory } from '@theia/debug/lib/browser/debug-session-contribution';
|
||||||
|
import { DebugSessionManager } from '@theia/debug/lib/browser/debug-session-manager';
|
||||||
import { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options';
|
import { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options';
|
||||||
import {
|
import {
|
||||||
DebugAdapterPath,
|
DebugAdapterPath,
|
||||||
@ -12,6 +13,7 @@ import { DebugSession } from './debug-session';
|
|||||||
@injectable()
|
@injectable()
|
||||||
export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory {
|
export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory {
|
||||||
override get(
|
override get(
|
||||||
|
manager: DebugSessionManager,
|
||||||
sessionId: string,
|
sessionId: string,
|
||||||
options: DebugConfigurationSessionOptions,
|
options: DebugConfigurationSessionOptions,
|
||||||
parentSession?: DebugSession
|
parentSession?: DebugSession
|
||||||
@ -20,12 +22,12 @@ export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory
|
|||||||
sessionId,
|
sessionId,
|
||||||
() =>
|
() =>
|
||||||
new Promise<DebugChannel>((resolve) =>
|
new Promise<DebugChannel>((resolve) =>
|
||||||
this.connectionProvider.openChannel(
|
this.connectionProvider.listen(
|
||||||
`${DebugAdapterPath}/${sessionId}`,
|
`${DebugAdapterPath}/${sessionId}`,
|
||||||
(wsChannel) => {
|
(_, wsChannel) => {
|
||||||
resolve(new ForwardingDebugChannel(wsChannel));
|
resolve(new ForwardingDebugChannel(wsChannel));
|
||||||
},
|
},
|
||||||
{ reconnecting: false }
|
false
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
this.getTraceOutputChannel()
|
this.getTraceOutputChannel()
|
||||||
@ -35,6 +37,9 @@ export class DefaultDebugSessionFactory extends TheiaDefaultDebugSessionFactory
|
|||||||
sessionId,
|
sessionId,
|
||||||
options,
|
options,
|
||||||
parentSession,
|
parentSession,
|
||||||
|
this.testService,
|
||||||
|
options.testRun,
|
||||||
|
manager,
|
||||||
connection,
|
connection,
|
||||||
this.terminalService,
|
this.terminalService,
|
||||||
this.editorManager,
|
this.editorManager,
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
import { injectable, postConstruct } from '@theia/core/shared/inversify';
|
|
||||||
import { EditorCommandContribution as TheiaEditorCommandContribution } from '@theia/editor/lib/browser/editor-command';
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class EditorCommandContribution extends TheiaEditorCommandContribution {
|
|
||||||
@postConstruct()
|
|
||||||
protected override init(): void {
|
|
||||||
// Workaround for https://github.com/eclipse-theia/theia/issues/8722.
|
|
||||||
this.editorPreferences.onPreferenceChanged(
|
|
||||||
({ preferenceName, newValue, oldValue }) => {
|
|
||||||
if (preferenceName === 'files.autoSave') {
|
|
||||||
const autoSaveWasOnBeforeChange = !oldValue || oldValue !== 'off';
|
|
||||||
const autoSaveIsOnAfterChange = !newValue || newValue !== 'off';
|
|
||||||
if (!autoSaveWasOnBeforeChange && autoSaveIsOnAfterChange) {
|
|
||||||
this.shell.saveAll();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,19 +1,18 @@
|
|||||||
import { injectable } from '@theia/core/shared/inversify';
|
import { injectable } from '@theia/core/shared/inversify';
|
||||||
import { TextEditor } from '@theia/editor/lib/browser';
|
|
||||||
import { EditorContribution as TheiaEditorContribution } from '@theia/editor/lib/browser/editor-contribution';
|
import { EditorContribution as TheiaEditorContribution } from '@theia/editor/lib/browser/editor-contribution';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class EditorContribution extends TheiaEditorContribution {
|
export class EditorContribution extends TheiaEditorContribution {
|
||||||
protected override updateLanguageStatus(
|
protected override updateLanguageStatus(
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
editor: TextEditor | undefined
|
..._: Parameters<TheiaEditorContribution['updateLanguageStatus']>
|
||||||
): void {
|
): void {
|
||||||
// NOOP
|
// NOOP
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override updateEncodingStatus(
|
protected override updateEncodingStatus(
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars, unused-imports/no-unused-vars
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
editor: TextEditor | undefined
|
..._: Parameters<TheiaEditorContribution['updateEncodingStatus']>
|
||||||
): void {
|
): void {
|
||||||
// https://github.com/arduino/arduino-ide/issues/1393
|
// https://github.com/arduino/arduino-ide/issues/1393
|
||||||
// NOOP
|
// NOOP
|
||||||
|
@ -36,7 +36,7 @@ export class FileResourceResolver extends TheiaFileResourceResolver {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
return new WriteQueuedFileResource(uri, this.fileService, {
|
return new WriteQueuedFileResource(uri, this.fileService, {
|
||||||
isReadonly: stat?.isReadonly ?? false,
|
readOnly: stat?.isReadonly ?? false,
|
||||||
shouldOverwrite: () => this.shouldOverwrite(uri),
|
shouldOverwrite: () => this.shouldOverwrite(uri),
|
||||||
shouldOpenAsText: (error) => this.shouldOpenAsText(uri, error),
|
shouldOpenAsText: (error) => this.shouldOpenAsText(uri, error),
|
||||||
});
|
});
|
||||||
|
@ -117,7 +117,7 @@ export function maybeUpdateReadOnlyState(
|
|||||||
const model = editor.document;
|
const model = editor.document;
|
||||||
const oldReadOnly = model.readOnly;
|
const oldReadOnly = model.readOnly;
|
||||||
const resource = model['resource'];
|
const resource = model['resource'];
|
||||||
const newReadOnly = Boolean(resource.isReadonly) || isReadOnly(resource.uri);
|
const newReadOnly = Boolean(resource.readOnly) || isReadOnly(resource.uri);
|
||||||
if (oldReadOnly !== newReadOnly) {
|
if (oldReadOnly !== newReadOnly) {
|
||||||
editor.getControl().updateOptions({ readOnly: newReadOnly });
|
editor.getControl().updateOptions({ readOnly: newReadOnly });
|
||||||
if (newReadOnly) {
|
if (newReadOnly) {
|
||||||
|
@ -20,7 +20,7 @@ export class MonacoTextModelService extends TheiaMonacoTextModelService {
|
|||||||
.getContributions()
|
.getContributions()
|
||||||
.find(({ scheme }) => resource.uri.scheme === scheme);
|
.find(({ scheme }) => resource.uri.scheme === scheme);
|
||||||
const readOnly =
|
const readOnly =
|
||||||
Boolean(resource.isReadonly) ||
|
Boolean(resource.readOnly) ||
|
||||||
this.sketchesServiceClient.isReadOnly(resource.uri);
|
this.sketchesServiceClient.isReadOnly(resource.uri);
|
||||||
return factory
|
return factory
|
||||||
? factory.createModel(resource)
|
? factory.createModel(resource)
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { ThemeService } from '@theia/core/lib/browser/theming';
|
import { ThemeService } from '@theia/core/lib/browser/theming';
|
||||||
import {
|
import {
|
||||||
Disposable,
|
Disposable,
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import type { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { Emitter, Event } from '@theia/core/lib/common/event';
|
import { Emitter, Event } from '@theia/core/lib/common/event';
|
||||||
import { injectable, interfaces } from '@theia/core/shared/inversify';
|
import { injectable, interfaces } from '@theia/core/shared/inversify';
|
||||||
import {
|
import { HostedPluginSupport as TheiaHostedPluginSupport } from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin';
|
||||||
PluginContributions,
|
import type { PluginContributions } from '@theia/plugin-ext/lib/hosted/common/hosted-plugin';
|
||||||
HostedPluginSupport as TheiaHostedPluginSupport,
|
import type { HostedPluginSupport } from '../../hosted/hosted-plugin-support';
|
||||||
} from '@theia/plugin-ext/lib/hosted/browser/hosted-plugin';
|
|
||||||
import { HostedPluginSupport } from '../../hosted/hosted-plugin-support';
|
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class HostedPluginSupportImpl
|
export class HostedPluginSupportImpl
|
||||||
|
@ -1,241 +0,0 @@
|
|||||||
import { LabelIcon } from '@theia/core/lib/browser/label-parser';
|
|
||||||
import { OpenerService, open } from '@theia/core/lib/browser/opener-service';
|
|
||||||
import { codicon } from '@theia/core/lib/browser/widgets/widget';
|
|
||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
|
||||||
import { URI } from '@theia/core/lib/common/uri';
|
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
||||||
import React from '@theia/core/shared/react';
|
|
||||||
import { URI as CodeUri } from '@theia/core/shared/vscode-uri';
|
|
||||||
import { TreeViewWidget as TheiaTreeViewWidget } from '@theia/plugin-ext/lib/main/browser/view/tree-view-widget';
|
|
||||||
|
|
||||||
// Copied back from https://github.com/eclipse-theia/theia/pull/14391
|
|
||||||
// Remove the patching when Arduino uses Eclipse Theia >1.55.0
|
|
||||||
// https://github.com/eclipse-theia/theia/blob/8d3c5a11af65448b6700bedd096f8d68f0675541/packages/core/src/browser/tree/tree-view-welcome-widget.tsx#L37-L54
|
|
||||||
// https://github.com/eclipse-theia/theia/blob/8d3c5a11af65448b6700bedd096f8d68f0675541/packages/core/src/browser/tree/tree-view-welcome-widget.tsx#L146-L298
|
|
||||||
|
|
||||||
interface ViewWelcome {
|
|
||||||
readonly view: string;
|
|
||||||
readonly content: string;
|
|
||||||
readonly when?: string;
|
|
||||||
readonly enablement?: string;
|
|
||||||
readonly order: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface IItem {
|
|
||||||
readonly welcomeInfo: ViewWelcome;
|
|
||||||
visible: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ILink {
|
|
||||||
readonly label: string;
|
|
||||||
readonly href: string;
|
|
||||||
readonly title?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
type LinkedTextItem = string | ILink;
|
|
||||||
|
|
||||||
@injectable()
|
|
||||||
export class TreeViewWidget extends TheiaTreeViewWidget {
|
|
||||||
@inject(OpenerService)
|
|
||||||
private readonly openerService: OpenerService;
|
|
||||||
|
|
||||||
private readonly toDisposeBeforeUpdateViewWelcomeNodes =
|
|
||||||
new DisposableCollection();
|
|
||||||
|
|
||||||
protected override updateViewWelcomeNodes(): void {
|
|
||||||
this.viewWelcomeNodes = [];
|
|
||||||
this.toDisposeBeforeUpdateViewWelcomeNodes.dispose();
|
|
||||||
const items = this.visibleItems.sort((a, b) => a.order - b.order);
|
|
||||||
|
|
||||||
const enablementKeys: Set<string>[] = [];
|
|
||||||
// the plugin-view-registry will push the changes when there is a change in the `when` prop which controls the visibility
|
|
||||||
// this listener is to update the enablement of the components in the view welcome
|
|
||||||
this.toDisposeBeforeUpdateViewWelcomeNodes.push(
|
|
||||||
this.contextService.onDidChange((event) => {
|
|
||||||
if (enablementKeys.some((keys) => event.affects(keys))) {
|
|
||||||
this.updateViewWelcomeNodes();
|
|
||||||
this.update();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
// Note: VS Code does not support the `renderSecondaryButtons` prop in welcome content either.
|
|
||||||
for (const item of items) {
|
|
||||||
const { content } = item;
|
|
||||||
const enablement = isEnablementAware(item) ? item.enablement : undefined;
|
|
||||||
const itemEnablementKeys = enablement
|
|
||||||
? this.contextService.parseKeys(enablement)
|
|
||||||
: undefined;
|
|
||||||
if (itemEnablementKeys) {
|
|
||||||
enablementKeys.push(itemEnablementKeys);
|
|
||||||
}
|
|
||||||
const lines = content.split('\n');
|
|
||||||
|
|
||||||
for (let line of lines) {
|
|
||||||
line = line.trim();
|
|
||||||
|
|
||||||
if (!line) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const linkedTextItems = this.parseLinkedText_patch14309(line);
|
|
||||||
|
|
||||||
if (
|
|
||||||
linkedTextItems.length === 1 &&
|
|
||||||
typeof linkedTextItems[0] !== 'string'
|
|
||||||
) {
|
|
||||||
const node = linkedTextItems[0];
|
|
||||||
this.viewWelcomeNodes.push(
|
|
||||||
this.renderButtonNode_patch14309(
|
|
||||||
node,
|
|
||||||
this.viewWelcomeNodes.length,
|
|
||||||
enablement
|
|
||||||
)
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
const renderNode = (item: LinkedTextItem, index: number) =>
|
|
||||||
typeof item == 'string'
|
|
||||||
? this.renderTextNode_patch14309(item, index)
|
|
||||||
: this.renderLinkNode_patch14309(item, index, enablement);
|
|
||||||
|
|
||||||
this.viewWelcomeNodes.push(
|
|
||||||
<p key={`p-${this.viewWelcomeNodes.length}`}>
|
|
||||||
{...linkedTextItems.flatMap(renderNode)}
|
|
||||||
</p>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private renderButtonNode_patch14309(
|
|
||||||
node: ILink,
|
|
||||||
lineKey: string | number,
|
|
||||||
enablement: string | undefined
|
|
||||||
): React.ReactNode {
|
|
||||||
return (
|
|
||||||
<div key={`line-${lineKey}`} className="theia-WelcomeViewButtonWrapper">
|
|
||||||
<button
|
|
||||||
title={node.title}
|
|
||||||
className="theia-button theia-WelcomeViewButton"
|
|
||||||
disabled={!this.isEnabledClick_patch14309(enablement)}
|
|
||||||
onClick={(e) => this.openLinkOrCommand_patch14309(e, node.href)}
|
|
||||||
>
|
|
||||||
{node.label}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private renderTextNode_patch14309(
|
|
||||||
node: string,
|
|
||||||
textKey: string | number
|
|
||||||
): React.ReactNode {
|
|
||||||
return (
|
|
||||||
<span key={`text-${textKey}`}>
|
|
||||||
{this.labelParser
|
|
||||||
.parse(node)
|
|
||||||
.map((segment, index) =>
|
|
||||||
LabelIcon.is(segment) ? (
|
|
||||||
<span key={index} className={codicon(segment.name)} />
|
|
||||||
) : (
|
|
||||||
<span key={index}>{segment}</span>
|
|
||||||
)
|
|
||||||
)}
|
|
||||||
</span>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private renderLinkNode_patch14309(
|
|
||||||
node: ILink,
|
|
||||||
linkKey: string | number,
|
|
||||||
enablement: string | undefined
|
|
||||||
): React.ReactNode {
|
|
||||||
return (
|
|
||||||
<a
|
|
||||||
key={`link-${linkKey}`}
|
|
||||||
className={this.getLinkClassName_patch14309(node.href, enablement)}
|
|
||||||
title={node.title || ''}
|
|
||||||
onClick={(e) => this.openLinkOrCommand_patch14309(e, node.href)}
|
|
||||||
>
|
|
||||||
{node.label}
|
|
||||||
</a>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
private getLinkClassName_patch14309(
|
|
||||||
href: string,
|
|
||||||
enablement: string | undefined
|
|
||||||
): string {
|
|
||||||
const classNames = ['theia-WelcomeViewCommandLink'];
|
|
||||||
// Only command-backed links can be disabled. All other, https:, file: remain enabled
|
|
||||||
if (
|
|
||||||
href.startsWith('command:') &&
|
|
||||||
!this.isEnabledClick_patch14309(enablement)
|
|
||||||
) {
|
|
||||||
classNames.push('disabled');
|
|
||||||
}
|
|
||||||
return classNames.join(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
private isEnabledClick_patch14309(enablement: string | undefined): boolean {
|
|
||||||
return typeof enablement === 'string'
|
|
||||||
? this.contextService.match(enablement)
|
|
||||||
: true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private openLinkOrCommand_patch14309 = (
|
|
||||||
event: React.MouseEvent,
|
|
||||||
value: string
|
|
||||||
): void => {
|
|
||||||
event.stopPropagation();
|
|
||||||
|
|
||||||
if (value.startsWith('command:')) {
|
|
||||||
const command = value.replace('command:', '');
|
|
||||||
this.commands.executeCommand(command);
|
|
||||||
} else if (value.startsWith('file:')) {
|
|
||||||
const uri = value.replace('file:', '');
|
|
||||||
open(this.openerService, new URI(CodeUri.file(uri).toString()));
|
|
||||||
} else {
|
|
||||||
this.windowService.openNewWindow(value, { external: true });
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private parseLinkedText_patch14309(text: string): LinkedTextItem[] {
|
|
||||||
const result: LinkedTextItem[] = [];
|
|
||||||
|
|
||||||
const linkRegex =
|
|
||||||
/\[([^\]]+)\]\(((?:https?:\/\/|command:|file:)[^\)\s]+)(?: (["'])(.+?)(\3))?\)/gi;
|
|
||||||
let index = 0;
|
|
||||||
let match: RegExpExecArray | null;
|
|
||||||
|
|
||||||
while ((match = linkRegex.exec(text))) {
|
|
||||||
if (match.index - index > 0) {
|
|
||||||
result.push(text.substring(index, match.index));
|
|
||||||
}
|
|
||||||
|
|
||||||
const [, label, href, , title] = match;
|
|
||||||
|
|
||||||
if (title) {
|
|
||||||
result.push({ label, href, title });
|
|
||||||
} else {
|
|
||||||
result.push({ label, href });
|
|
||||||
}
|
|
||||||
|
|
||||||
index = match.index + match[0].length;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index < text.length) {
|
|
||||||
result.push(text.substring(index));
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface EnablementAware {
|
|
||||||
readonly enablement: string | undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isEnablementAware(arg: unknown): arg is EnablementAware {
|
|
||||||
return !!arg && typeof arg === 'object' && 'enablement' in arg;
|
|
||||||
}
|
|
@ -0,0 +1,9 @@
|
|||||||
|
import { TestViewContribution as TheiaTestViewContribution } from '@theia/test/lib/browser/view/test-view-contribution';
|
||||||
|
import { injectable } from 'inversify';
|
||||||
|
|
||||||
|
@injectable()
|
||||||
|
export class TestViewContribution extends TheiaTestViewContribution {
|
||||||
|
override async initializeLayout(): Promise<void> {
|
||||||
|
// NOOP
|
||||||
|
}
|
||||||
|
}
|
@ -4,6 +4,7 @@ import {
|
|||||||
TabBarToolbarRegistry,
|
TabBarToolbarRegistry,
|
||||||
TabBarToolbarItem,
|
TabBarToolbarItem,
|
||||||
ReactTabBarToolbarItem,
|
ReactTabBarToolbarItem,
|
||||||
|
RenderedToolbarItem,
|
||||||
} from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
} from '@theia/core/lib/browser/shell/tab-bar-toolbar';
|
||||||
import { CommandRegistry } from '@theia/core/lib/common/command';
|
import { CommandRegistry } from '@theia/core/lib/common/command';
|
||||||
import { ReactWidget } from '@theia/core/lib/browser';
|
import { ReactWidget } from '@theia/core/lib/browser';
|
||||||
@ -14,7 +15,7 @@ export const ARDUINO_TOOLBAR_ITEM_CLASS = 'arduino-tool-item';
|
|||||||
export namespace ArduinoToolbarComponent {
|
export namespace ArduinoToolbarComponent {
|
||||||
export interface Props {
|
export interface Props {
|
||||||
side: 'left' | 'right';
|
side: 'left' | 'right';
|
||||||
items: (TabBarToolbarItem | ReactTabBarToolbarItem)[];
|
items: TabBarToolbarItem[];
|
||||||
commands: CommandRegistry;
|
commands: CommandRegistry;
|
||||||
labelParser: LabelParser;
|
labelParser: LabelParser;
|
||||||
commandIsEnabled: (id: string) => boolean;
|
commandIsEnabled: (id: string) => boolean;
|
||||||
@ -34,7 +35,7 @@ export class ArduinoToolbarComponent extends React.Component<
|
|||||||
this.state = { tooltip: '' };
|
this.state = { tooltip: '' };
|
||||||
}
|
}
|
||||||
|
|
||||||
protected renderItem = (item: TabBarToolbarItem) => {
|
protected renderItem = (item: RenderedToolbarItem) => {
|
||||||
let innerText = '';
|
let innerText = '';
|
||||||
let className = `arduino-tool-icon ${item.id}-icon`;
|
let className = `arduino-tool-icon ${item.id}-icon`;
|
||||||
if (item.text) {
|
if (item.text) {
|
||||||
@ -46,7 +47,8 @@ export class ArduinoToolbarComponent extends React.Component<
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const command = this.props.commands.getCommand(item.command);
|
const command =
|
||||||
|
item.command && this.props.commands.getCommand(item.command);
|
||||||
const cls = `${ARDUINO_TOOLBAR_ITEM_CLASS} ${
|
const cls = `${ARDUINO_TOOLBAR_ITEM_CLASS} ${
|
||||||
TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM
|
TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM
|
||||||
} ${command && this.props.commandIsEnabled(command.id) ? 'enabled' : ''} ${
|
} ${command && this.props.commandIsEnabled(command.id) ? 'enabled' : ''} ${
|
||||||
@ -80,7 +82,9 @@ export class ArduinoToolbarComponent extends React.Component<
|
|||||||
const items = [
|
const items = [
|
||||||
<React.Fragment key={this.props.side + '-arduino-toolbar-tooltip'}>
|
<React.Fragment key={this.props.side + '-arduino-toolbar-tooltip'}>
|
||||||
{[...this.props.items].map((item) =>
|
{[...this.props.items].map((item) =>
|
||||||
TabBarToolbarItem.is(item) ? this.renderItem(item) : item.render()
|
ReactTabBarToolbarItem.is(item)
|
||||||
|
? item.render()
|
||||||
|
: this.renderItem(item)
|
||||||
)}
|
)}
|
||||||
</React.Fragment>,
|
</React.Fragment>,
|
||||||
];
|
];
|
||||||
@ -94,10 +98,7 @@ export class ArduinoToolbarComponent extends React.Component<
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class ArduinoToolbar extends ReactWidget {
|
export class ArduinoToolbar extends ReactWidget {
|
||||||
protected items = new Map<
|
protected items = new Map<string, TabBarToolbarItem>();
|
||||||
string,
|
|
||||||
TabBarToolbarItem | ReactTabBarToolbarItem
|
|
||||||
>();
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
protected readonly tabBarToolbarRegistry: TabBarToolbarRegistry,
|
protected readonly tabBarToolbarRegistry: TabBarToolbarRegistry,
|
||||||
@ -112,9 +113,7 @@ export class ArduinoToolbar extends ReactWidget {
|
|||||||
this.tabBarToolbarRegistry.onDidChange(() => this.updateToolbar());
|
this.tabBarToolbarRegistry.onDidChange(() => this.updateToolbar());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected updateItems(
|
protected updateItems(items: Array<TabBarToolbarItem>): void {
|
||||||
items: Array<TabBarToolbarItem | ReactTabBarToolbarItem>
|
|
||||||
): void {
|
|
||||||
this.items.clear();
|
this.items.clear();
|
||||||
const revItems = items
|
const revItems = items
|
||||||
.sort(TabBarToolbarItem.PRIORITY_COMPARATOR)
|
.sort(TabBarToolbarItem.PRIORITY_COMPARATOR)
|
||||||
@ -163,7 +162,7 @@ export class ArduinoToolbar extends ReactWidget {
|
|||||||
|
|
||||||
protected executeCommand = (e: React.MouseEvent<HTMLElement>) => {
|
protected executeCommand = (e: React.MouseEvent<HTMLElement>) => {
|
||||||
const item = this.items.get(e.currentTarget.id);
|
const item = this.items.get(e.currentTarget.id);
|
||||||
if (TabBarToolbarItem.is(item)) {
|
if (item && item.command) {
|
||||||
this.commands.executeCommand(item.command, this, e.target);
|
this.commands.executeCommand(item.command, this, e.target);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import {
|
import {
|
||||||
OpenerOptions,
|
OpenerOptions,
|
||||||
OpenHandler,
|
OpenHandler,
|
||||||
|
@ -3,7 +3,7 @@ import { CommandRegistry } from '@theia/core/lib/common/command';
|
|||||||
import { MenuModelRegistry } from '@theia/core/lib/common/menu';
|
import { MenuModelRegistry } from '@theia/core/lib/common/menu';
|
||||||
import { PreferenceService } from '@theia/core/lib/browser/preferences/preference-service';
|
import { PreferenceService } from '@theia/core/lib/browser/preferences/preference-service';
|
||||||
import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
|
import { AbstractViewContribution } from '@theia/core/lib/browser/shell/view-contribution';
|
||||||
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application';
|
import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application-contribution';
|
||||||
import { MainMenuManager } from '../../../common/main-menu-manager';
|
import { MainMenuManager } from '../../../common/main-menu-manager';
|
||||||
import { ArduinoPreferences } from '../../arduino-preferences';
|
import { ArduinoPreferences } from '../../arduino-preferences';
|
||||||
import { SketchbookWidget } from './sketchbook-widget';
|
import { SketchbookWidget } from './sketchbook-widget';
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
export const SurveyNotificationServicePath =
|
|
||||||
'/services/survey-notification-service';
|
|
||||||
export const SurveyNotificationService = Symbol('SurveyNotificationService');
|
|
||||||
|
|
||||||
export interface SurveyNotificationService {
|
|
||||||
isFirstInstance(): Promise<boolean>;
|
|
||||||
}
|
|
@ -38,33 +38,33 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory {
|
|||||||
this.preferencesService.onPreferenceChanged(
|
this.preferencesService.onPreferenceChanged(
|
||||||
debounce((e) => {
|
debounce((e) => {
|
||||||
if (e.preferenceName === 'window.menuBarVisibility') {
|
if (e.preferenceName === 'window.menuBarVisibility') {
|
||||||
this.setMenuBar();
|
this.doSetMenuBar();
|
||||||
}
|
}
|
||||||
if (this._menu) {
|
if (this.menu) {
|
||||||
for (const cmd of this._toggledCommands) {
|
for (const cmd of this.toggledCommands) {
|
||||||
const menuItem = this.findMenuById(this._menu, cmd);
|
const menuItem = this.findMenuById(this.menu, cmd);
|
||||||
if (menuItem) {
|
if (menuItem) {
|
||||||
menuItem.checked = this.commandRegistry.isToggled(cmd);
|
menuItem.checked = this.commandRegistry.isToggled(cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
window.electronArduino.setMenu(this._menu); // calls the IDE2-specific implementation
|
window.electronArduino.setMenu(this.menu); // calls the IDE2-specific implementation
|
||||||
}
|
}
|
||||||
}, 10)
|
}, 10)
|
||||||
);
|
);
|
||||||
this.keybindingRegistry.onKeybindingsChanged(() => {
|
this.keybindingRegistry.onKeybindingsChanged(() => {
|
||||||
this.setMenuBar();
|
this.doSetMenuBar();
|
||||||
});
|
});
|
||||||
// #endregion Theia `postConstruct`
|
// #endregion Theia `postConstruct`
|
||||||
this.appStateService.reachedState('ready').then(() => {
|
this.appStateService.reachedState('ready').then(() => {
|
||||||
this.appReady = true;
|
this.appReady = true;
|
||||||
if (this.updateWhenReady) {
|
if (this.updateWhenReady) {
|
||||||
this.setMenuBar();
|
this.doSetMenuBar();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
override createElectronMenuBar(): MenuDto[] {
|
override createElectronMenuBar(): MenuDto[] {
|
||||||
this._toggledCommands.clear(); // https://github.com/eclipse-theia/theia/issues/8977
|
this.toggledCommands.clear(); // https://github.com/eclipse-theia/theia/issues/8977
|
||||||
const menuModel = this.menuProvider.getMenu(MAIN_MENU_BAR);
|
const menuModel = this.menuProvider.getMenu(MAIN_MENU_BAR);
|
||||||
const menu = this.fillMenuTemplate([], menuModel, [], {
|
const menu = this.fillMenuTemplate([], menuModel, [], {
|
||||||
rootMenuPath: MAIN_MENU_BAR,
|
rootMenuPath: MAIN_MENU_BAR,
|
||||||
@ -73,11 +73,11 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory {
|
|||||||
menu.unshift(this.createOSXMenu());
|
menu.unshift(this.createOSXMenu());
|
||||||
}
|
}
|
||||||
const escapedMenu = this.escapeAmpersand(menu);
|
const escapedMenu = this.escapeAmpersand(menu);
|
||||||
this._menu = escapedMenu;
|
this.menu = escapedMenu;
|
||||||
return escapedMenu;
|
return escapedMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
override async setMenuBar(): Promise<void> {
|
override async doSetMenuBar(): Promise<void> {
|
||||||
// Avoid updating menu items when the app is not ready.
|
// Avoid updating menu items when the app is not ready.
|
||||||
// Getting the current electron window is not free and synchronous.
|
// Getting the current electron window is not free and synchronous.
|
||||||
// Here, we defer all menu update requests, and fire one when the app is ready.
|
// Here, we defer all menu update requests, and fire one when the app is ready.
|
||||||
@ -124,17 +124,17 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory {
|
|||||||
...args
|
...args
|
||||||
);
|
);
|
||||||
if (
|
if (
|
||||||
this._menu &&
|
this.menu &&
|
||||||
this.menuCommandExecutor.isVisible(menuPath, commandId, ...args)
|
this.menuCommandExecutor.isVisible(menuPath, commandId, ...args)
|
||||||
) {
|
) {
|
||||||
const item = this.findMenuById(this._menu, commandId);
|
const item = this.findMenuById(this.menu, commandId);
|
||||||
if (item) {
|
if (item) {
|
||||||
item.checked = this.menuCommandExecutor.isToggled(
|
item.checked = this.menuCommandExecutor.isToggled(
|
||||||
menuPath,
|
menuPath,
|
||||||
commandId,
|
commandId,
|
||||||
...args
|
...args
|
||||||
);
|
);
|
||||||
window.electronArduino.setMenu(this._menu); // overridden to call the IDE2-specific implementation.
|
window.electronArduino.setMenu(this.menu); // overridden to call the IDE2-specific implementation.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -342,7 +342,7 @@ export class ElectronMainMenuFactory extends TheiaElectronMainMenuFactory {
|
|||||||
parentItems.push(menuItem);
|
parentItems.push(menuItem);
|
||||||
|
|
||||||
if (this.commandRegistry.getToggledHandler(commandId, ...args)) {
|
if (this.commandRegistry.getToggledHandler(commandId, ...args)) {
|
||||||
this._toggledCommands.add(commandId);
|
this.toggledCommands.add(commandId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return parentItems;
|
return parentItems;
|
||||||
|
@ -7,6 +7,7 @@ import {
|
|||||||
hasStartupTasks,
|
hasStartupTasks,
|
||||||
StartupTasks,
|
StartupTasks,
|
||||||
} from '../../../electron-common/startup-task';
|
} from '../../../electron-common/startup-task';
|
||||||
|
import { WindowReloadOptions } from '@theia/core/lib/browser/window/window-service';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class ElectronWindowService
|
export class ElectronWindowService
|
||||||
@ -17,8 +18,12 @@ export class ElectronWindowService
|
|||||||
|
|
||||||
@postConstruct()
|
@postConstruct()
|
||||||
protected override init(): void {
|
protected override init(): void {
|
||||||
// NOOP
|
// Overridden to avoid calling the zoom level listener in super.
|
||||||
// IDE2 listens on the zoom level changes in `ArduinoFrontendContribution#onStart`
|
// IDE2 listens on the zoom level changes in `ArduinoFrontendContribution#onStart`
|
||||||
|
|
||||||
|
window.electronTheiaCore.onAboutToClose(() => {
|
||||||
|
this.connectionCloseService.markForClose(this.frontendIdProvider.getId());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async isFirstWindow(): Promise<boolean> {
|
async isFirstWindow(): Promise<boolean> {
|
||||||
@ -38,11 +43,11 @@ export class ElectronWindowService
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Overridden to support optional task owner params and make `tsc` happy.
|
// Overridden to support optional task owner params and make `tsc` happy.
|
||||||
override reload(options?: StartupTasks): void {
|
override reload(options?: StartupTasks | WindowReloadOptions): void {
|
||||||
if (hasStartupTasks(options)) {
|
if (hasStartupTasks(options)) {
|
||||||
window.electronArduino.requestReload(options);
|
window.electronArduino.requestReload(options);
|
||||||
} else {
|
} else {
|
||||||
window.electronTheiaCore.requestReload();
|
super.reload(options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
|
import { ConnectionHandler } from '@theia/core/lib/common/messaging/handler';
|
||||||
import { JsonRpcConnectionHandler } from '@theia/core/lib/common/messaging/proxy-factory';
|
import { JsonRpcConnectionHandler } from '@theia/core/lib/common/messaging/proxy-factory';
|
||||||
import { ElectronMainWindowService } from '@theia/core/lib/electron-common/electron-main-window-service';
|
import { ElectronMainWindowService } from '@theia/core/lib/electron-common/electron-main-window-service';
|
||||||
import { ElectronConnectionHandler } from '@theia/core/lib/electron-common/messaging/electron-connection-handler';
|
|
||||||
import { TheiaMainApi } from '@theia/core/lib/electron-main/electron-api-main';
|
import { TheiaMainApi } from '@theia/core/lib/electron-main/electron-api-main';
|
||||||
import {
|
import {
|
||||||
ElectronMainApplication as TheiaElectronMainApplication,
|
|
||||||
ElectronMainApplicationContribution,
|
ElectronMainApplicationContribution,
|
||||||
|
ElectronMainApplication as TheiaElectronMainApplication,
|
||||||
} from '@theia/core/lib/electron-main/electron-main-application';
|
} from '@theia/core/lib/electron-main/electron-main-application';
|
||||||
import { TheiaElectronWindow as DefaultTheiaElectronWindow } from '@theia/core/lib/electron-main/theia-electron-window';
|
import { TheiaElectronWindow as DefaultTheiaElectronWindow } from '@theia/core/lib/electron-main/theia-electron-window';
|
||||||
import { ContainerModule } from '@theia/core/shared/inversify';
|
import { ContainerModule } from '@theia/core/shared/inversify';
|
||||||
@ -33,7 +33,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
bind(IDEUpdaterImpl).toSelf().inSingletonScope();
|
bind(IDEUpdaterImpl).toSelf().inSingletonScope();
|
||||||
bind(IDEUpdater).toService(IDEUpdaterImpl);
|
bind(IDEUpdater).toService(IDEUpdaterImpl);
|
||||||
bind(ElectronMainApplicationContribution).toService(IDEUpdater);
|
bind(ElectronMainApplicationContribution).toService(IDEUpdater);
|
||||||
bind(ElectronConnectionHandler)
|
bind(ConnectionHandler)
|
||||||
.toDynamicValue(
|
.toDynamicValue(
|
||||||
(context) =>
|
(context) =>
|
||||||
new JsonRpcConnectionHandler<IDEUpdaterClient>(
|
new JsonRpcConnectionHandler<IDEUpdaterClient>(
|
||||||
|
@ -11,16 +11,16 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { isOSX } from '@theia/core/lib/common/os';
|
import { isOSX } from '@theia/core/lib/common/os';
|
||||||
import { Deferred } from '@theia/core/lib/common/promise-util';
|
import { Deferred } from '@theia/core/lib/common/promise-util';
|
||||||
import { isObject, MaybePromise, Mutable } from '@theia/core/lib/common/types';
|
import { isObject, MaybePromise, Mutable } from '@theia/core/lib/common/types';
|
||||||
import { ElectronSecurityToken } from '@theia/core/lib/electron-common/electron-token';
|
import { ElectronSecurityToken } from '@theia/core/lib/electron-common/electron-token';
|
||||||
import {
|
import {
|
||||||
ElectronMainExecutionParams,
|
ElectronMainCommandOptions,
|
||||||
ElectronMainApplication as TheiaElectronMainApplication,
|
ElectronMainApplication as TheiaElectronMainApplication,
|
||||||
} from '@theia/core/lib/electron-main/electron-main-application';
|
} from '@theia/core/lib/electron-main/electron-main-application';
|
||||||
import type { TheiaBrowserWindowOptions } from '@theia/core/lib/electron-main/theia-electron-window';
|
import type { TheiaBrowserWindowOptions } from '@theia/core/lib/electron-main/theia-electron-window';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import { URI } from '@theia/core/shared/vscode-uri';
|
import { URI } from '@theia/core/shared/vscode-uri';
|
||||||
import { log as logToFile, setup as setupFileLog } from 'node-log-rotate';
|
import { log as logToFile, setup as setupFileLog } from 'node-log-rotate';
|
||||||
@ -28,6 +28,7 @@ import { fork } from 'node:child_process';
|
|||||||
import { promises as fs, readFileSync, rm, rmSync } from 'node:fs';
|
import { promises as fs, readFileSync, rm, rmSync } from 'node:fs';
|
||||||
import type { AddressInfo } from 'node:net';
|
import type { AddressInfo } from 'node:net';
|
||||||
import { isAbsolute, join, resolve } from 'node:path';
|
import { isAbsolute, join, resolve } from 'node:path';
|
||||||
|
import type { Argv } from 'yargs';
|
||||||
import { Sketch } from '../../common/protocol';
|
import { Sketch } from '../../common/protocol';
|
||||||
import {
|
import {
|
||||||
AppInfo,
|
AppInfo,
|
||||||
@ -129,6 +130,11 @@ const APP_STARTED_WITH_CONTENT_TRACE =
|
|||||||
typeof process !== 'undefined' &&
|
typeof process !== 'undefined' &&
|
||||||
process.argv.indexOf('--content-trace') !== -1;
|
process.argv.indexOf('--content-trace') !== -1;
|
||||||
|
|
||||||
|
const createYargs: (
|
||||||
|
argv?: string[],
|
||||||
|
cwd?: string
|
||||||
|
) => Argv = require('yargs/yargs');
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class ElectronMainApplication extends TheiaElectronMainApplication {
|
export class ElectronMainApplication extends TheiaElectronMainApplication {
|
||||||
@inject(IsTempSketch)
|
@inject(IsTempSketch)
|
||||||
@ -171,29 +177,59 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
private readonly scheduledDeletions: Disposable[] = [];
|
private readonly scheduledDeletions: Disposable[] = [];
|
||||||
|
|
||||||
override async start(config: FrontendApplicationConfig): Promise<void> {
|
override async start(config: FrontendApplicationConfig): Promise<void> {
|
||||||
// Explicitly set the app name to have better menu items on macOS. ("About", "Hide", and "Quit")
|
createYargs(this.argv, process.cwd())
|
||||||
// See: https://github.com/electron-userland/electron-builder/issues/2468
|
.command(
|
||||||
// Regression in Theia: https://github.com/eclipse-theia/theia/issues/8701
|
'$0 [file]',
|
||||||
console.log(`${config.applicationName} ${app.getVersion()}`);
|
false,
|
||||||
app.on('ready', () => app.setName(config.applicationName));
|
(cmd) =>
|
||||||
const cwd = process.cwd();
|
cmd
|
||||||
this.attachFileAssociations(cwd);
|
.option('electronUserData', {
|
||||||
this.useNativeWindowFrame = this.getTitleBarStyle(config) === 'native';
|
type: 'string',
|
||||||
this._config = await updateFrontendApplicationConfigFromPackageJson(config);
|
describe:
|
||||||
this._appInfo = updateAppInfo(this._appInfo, this._config);
|
'The area where the electron main process puts its data',
|
||||||
this.hookApplicationEvents();
|
})
|
||||||
const [port] = await Promise.all([this.startBackend(), app.whenReady()]);
|
.positional('file', { type: 'string' }),
|
||||||
this.startContentTracing();
|
async (args) => {
|
||||||
this._backendPort.resolve(port);
|
if (args.electronUserData) {
|
||||||
await Promise.all([
|
console.info(
|
||||||
this.attachElectronSecurityToken(port),
|
`using electron user data area : '${args.electronUserData}'`
|
||||||
this.startContributions(),
|
);
|
||||||
]);
|
await fs.mkdir(args.electronUserData, { recursive: true });
|
||||||
return this.launch({
|
app.setPath('userData', args.electronUserData);
|
||||||
secondInstance: false,
|
}
|
||||||
argv: this.processArgv.getProcessArgvWithoutBin(process.argv),
|
// Explicitly set the app name to have better menu items on macOS. ("About", "Hide", and "Quit")
|
||||||
cwd,
|
// See: https://github.com/electron-userland/electron-builder/issues/2468
|
||||||
});
|
// Regression in Theia: https://github.com/eclipse-theia/theia/issues/8701
|
||||||
|
console.log(`${config.applicationName} ${app.getVersion()}`);
|
||||||
|
app.on('ready', () => app.setName(config.applicationName));
|
||||||
|
const cwd = process.cwd();
|
||||||
|
this.attachFileAssociations(cwd);
|
||||||
|
this.useNativeWindowFrame =
|
||||||
|
this.getTitleBarStyle(config) === 'native';
|
||||||
|
this._config = await updateFrontendApplicationConfigFromPackageJson(
|
||||||
|
config
|
||||||
|
);
|
||||||
|
this._appInfo = updateAppInfo(this._appInfo, this._config);
|
||||||
|
this.hookApplicationEvents();
|
||||||
|
this.showInitialWindow(undefined);
|
||||||
|
const [port] = await Promise.all([
|
||||||
|
this.startBackend(),
|
||||||
|
app.whenReady(),
|
||||||
|
]);
|
||||||
|
this.startContentTracing();
|
||||||
|
this._backendPort.resolve(port);
|
||||||
|
await Promise.all([
|
||||||
|
this.attachElectronSecurityToken(port),
|
||||||
|
this.startContributions(),
|
||||||
|
]);
|
||||||
|
this.handleMainCommand({
|
||||||
|
file: args.file,
|
||||||
|
cwd,
|
||||||
|
secondInstance: false,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.parse();
|
||||||
}
|
}
|
||||||
|
|
||||||
private startContentTracing(): void {
|
private startContentTracing(): void {
|
||||||
@ -284,8 +320,8 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async launch(
|
protected override async handleMainCommand(
|
||||||
params: ElectronMainExecutionParams
|
options: ElectronMainCommandOptions
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
try {
|
try {
|
||||||
// When running on MacOS, we either have to wait until
|
// When running on MacOS, we either have to wait until
|
||||||
@ -300,7 +336,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (await this.launchFromArgs(params)) {
|
if (await this.launchFromArgs(options)) {
|
||||||
// Application has received a file in its arguments and will skip the default application launch
|
// Application has received a file in its arguments and will skip the default application launch
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -314,7 +350,10 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
`Restoring workspace roots: ${workspaces.map(({ file }) => file)}`
|
`Restoring workspace roots: ${workspaces.map(({ file }) => file)}`
|
||||||
);
|
);
|
||||||
for (const workspace of workspaces) {
|
for (const workspace of workspaces) {
|
||||||
const resolvedPath = await this.resolvePath(workspace.file, params.cwd);
|
const resolvedPath = await this.resolvePath(
|
||||||
|
workspace.file,
|
||||||
|
options.cwd
|
||||||
|
);
|
||||||
if (!resolvedPath) {
|
if (!resolvedPath) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -337,15 +376,19 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
}
|
}
|
||||||
this.startup = false;
|
this.startup = false;
|
||||||
if (useDefault) {
|
if (useDefault) {
|
||||||
super.launch(params);
|
super.handleMainCommand(options);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private get argv(): string[] {
|
||||||
|
return this.processArgv.getProcessArgvWithoutBin(process.argv).slice();
|
||||||
|
}
|
||||||
|
|
||||||
private async launchFromArgs(
|
private async launchFromArgs(
|
||||||
params: ElectronMainExecutionParams
|
params: ElectronMainCommandOptions
|
||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
// Copy to prevent manipulation of original array
|
// Copy to prevent manipulation of original array
|
||||||
const argCopy = [...params.argv];
|
const argCopy = [...this.argv];
|
||||||
let path: string | undefined;
|
let path: string | undefined;
|
||||||
for (const maybePath of argCopy) {
|
for (const maybePath of argCopy) {
|
||||||
const resolvedPath = await this.resolvePath(maybePath, params.cwd);
|
const resolvedPath = await this.resolvePath(maybePath, params.cwd);
|
||||||
@ -383,7 +426,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
}
|
}
|
||||||
const [uri, electronWindow] = await Promise.all([
|
const [uri, electronWindow] = await Promise.all([
|
||||||
this.createWindowUri(),
|
this.createWindowUri(),
|
||||||
this.createWindow(options),
|
this.reuseOrCreateWindow(options),
|
||||||
]);
|
]);
|
||||||
electronWindow.loadURL(uri.withFragment(encodeURI(file)).toString(true));
|
electronWindow.loadURL(uri.withFragment(encodeURI(file)).toString(true));
|
||||||
return electronWindow;
|
return electronWindow;
|
||||||
@ -483,7 +526,7 @@ export class ElectronMainApplication extends TheiaElectronMainApplication {
|
|||||||
argv: string[],
|
argv: string[],
|
||||||
cwd: string
|
cwd: string
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
if (await this.launchFromArgs({ cwd, argv, secondInstance: true })) {
|
if (await this.launchFromArgs({ cwd, secondInstance: true })) {
|
||||||
// Application has received a file in its arguments
|
// Application has received a file in its arguments
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -779,7 +822,7 @@ class InterruptWorkspaceRestoreError extends Error {
|
|||||||
// but it's the `package.json` inside the `resources/app/` folder if it's the final bundled app.
|
// but it's the `package.json` inside the `resources/app/` folder if it's the final bundled app.
|
||||||
// See https://github.com/arduino/arduino-ide/pull/2144#pullrequestreview-1556343430.
|
// See https://github.com/arduino/arduino-ide/pull/2144#pullrequestreview-1556343430.
|
||||||
async function updateFrontendApplicationConfigFromPackageJson(
|
async function updateFrontendApplicationConfigFromPackageJson(
|
||||||
config: FrontendApplicationConfig
|
config: Mutable<FrontendApplicationConfig>
|
||||||
): Promise<FrontendApplicationConfig> {
|
): Promise<FrontendApplicationConfig> {
|
||||||
if (!isProductionMode) {
|
if (!isProductionMode) {
|
||||||
console.debug(
|
console.debug(
|
||||||
@ -846,7 +889,8 @@ const fallbackFrontendAppConfig: FrontendApplicationConfig = {
|
|||||||
defaultIconTheme: 'none',
|
defaultIconTheme: 'none',
|
||||||
validatePreferencesSchema: false,
|
validatePreferencesSchema: false,
|
||||||
defaultLocale: '',
|
defaultLocale: '',
|
||||||
electron: {},
|
electron: { showWindowEarly: true, uriScheme: 'custom://arduino-ide' },
|
||||||
|
reloadOnReconnect: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
// When the package.json must go from `./lib/backend/electron-main.js` to `./package.json` when the app is webpacked.
|
// When the package.json must go from `./lib/backend/electron-main.js` to `./package.json` when the app is webpacked.
|
||||||
|
@ -8,7 +8,7 @@ import { ElectronArduinoRenderer } from '../electron-arduino';
|
|||||||
@injectable()
|
@injectable()
|
||||||
export class TheiaElectronWindow extends DefaultTheiaElectronWindow {
|
export class TheiaElectronWindow extends DefaultTheiaElectronWindow {
|
||||||
protected override reload(args?: unknown): void {
|
protected override reload(args?: unknown): void {
|
||||||
this.handleStopRequest(() => {
|
this.handleStopRequest(async () => {
|
||||||
this.applicationState = 'init';
|
this.applicationState = 'init';
|
||||||
if (hasStartupTasks(args)) {
|
if (hasStartupTasks(args)) {
|
||||||
const { webContents } = this._window;
|
const { webContents } = this._window;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { join } from 'node:path';
|
import { join } from 'node:path';
|
||||||
import { inject, injectable, named } from '@theia/core/shared/inversify';
|
import { inject, injectable, named } from '@theia/core/shared/inversify';
|
||||||
import { spawn, ChildProcess } from 'node:child_process';
|
import { spawn, ChildProcess } from 'node:child_process';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { ILogger } from '@theia/core/lib/common/logger';
|
import { ILogger } from '@theia/core/lib/common/logger';
|
||||||
import { Deferred, retry } from '@theia/core/lib/common/promise-util';
|
import { Deferred, retry } from '@theia/core/lib/common/promise-util';
|
||||||
import {
|
import {
|
||||||
|
@ -105,14 +105,8 @@ import { ClangFormatter } from './clang-formatter';
|
|||||||
import { FormatterPath } from '../common/protocol/formatter';
|
import { FormatterPath } from '../common/protocol/formatter';
|
||||||
import { HostedPluginLocalizationService } from './theia/plugin-ext/hosted-plugin-localization-service';
|
import { HostedPluginLocalizationService } from './theia/plugin-ext/hosted-plugin-localization-service';
|
||||||
import { HostedPluginLocalizationService as TheiaHostedPluginLocalizationService } from '@theia/plugin-ext/lib/hosted/node/hosted-plugin-localization-service';
|
import { HostedPluginLocalizationService as TheiaHostedPluginLocalizationService } from '@theia/plugin-ext/lib/hosted/node/hosted-plugin-localization-service';
|
||||||
import { SurveyNotificationServiceImpl } from './survey-service-impl';
|
|
||||||
import {
|
|
||||||
SurveyNotificationService,
|
|
||||||
SurveyNotificationServicePath,
|
|
||||||
} from '../common/protocol/survey-service';
|
|
||||||
import { IsTempSketch } from './is-temp-sketch';
|
import { IsTempSketch } from './is-temp-sketch';
|
||||||
import { rebindNsfwFileSystemWatcher } from './theia/filesystem/nsfw-bindings';
|
import { WebsocketEndpoint } from './theia/core/websocket-endpoint';
|
||||||
import { MessagingContribution } from './theia/core/messaging-contribution';
|
|
||||||
import { MessagingService } from '@theia/core/lib/node/messaging/messaging-service';
|
import { MessagingService } from '@theia/core/lib/node/messaging/messaging-service';
|
||||||
import { HostedPluginReader } from './theia/plugin-ext/plugin-reader';
|
import { HostedPluginReader } from './theia/plugin-ext/plugin-reader';
|
||||||
import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext/lib/hosted/node/plugin-reader';
|
import { HostedPluginReader as TheiaHostedPluginReader } from '@theia/plugin-ext/lib/hosted/node/plugin-reader';
|
||||||
@ -126,6 +120,7 @@ import {
|
|||||||
} from './theia/plugin-ext/plugin-deployer';
|
} from './theia/plugin-ext/plugin-deployer';
|
||||||
import { SettingsReader } from './settings-reader';
|
import { SettingsReader } from './settings-reader';
|
||||||
import { VsCodePluginScanner } from './theia/plugin-ext-vscode/scanner-vscode';
|
import { VsCodePluginScanner } from './theia/plugin-ext-vscode/scanner-vscode';
|
||||||
|
import { rebindParcelFileSystemWatcher } from './theia/filesystem/parcel-bindings';
|
||||||
|
|
||||||
export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
||||||
bind(BackendApplication).toSelf().inSingletonScope();
|
bind(BackendApplication).toSelf().inSingletonScope();
|
||||||
@ -305,7 +300,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
.inSingletonScope();
|
.inSingletonScope();
|
||||||
rebindNsfwFileSystemWatcher(rebind);
|
rebindParcelFileSystemWatcher(rebind);
|
||||||
|
|
||||||
// Output service per connection.
|
// Output service per connection.
|
||||||
bind(ConnectionContainerModule).toConstantValue(
|
bind(ConnectionContainerModule).toConstantValue(
|
||||||
@ -383,23 +378,8 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|||||||
HostedPluginLocalizationService
|
HostedPluginLocalizationService
|
||||||
);
|
);
|
||||||
|
|
||||||
// Survey notification bindings
|
|
||||||
// It's currently unused. https://github.com/arduino/arduino-ide/pull/1150
|
|
||||||
bind(SurveyNotificationServiceImpl).toSelf().inSingletonScope();
|
|
||||||
bind(SurveyNotificationService).toService(SurveyNotificationServiceImpl);
|
|
||||||
bind(ConnectionHandler)
|
|
||||||
.toDynamicValue(
|
|
||||||
({ container }) =>
|
|
||||||
new JsonRpcConnectionHandler(SurveyNotificationServicePath, () =>
|
|
||||||
container.get<SurveyNotificationService>(SurveyNotificationService)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
.inSingletonScope();
|
|
||||||
|
|
||||||
bind(IsTempSketch).toSelf().inSingletonScope();
|
bind(IsTempSketch).toSelf().inSingletonScope();
|
||||||
rebind(MessagingService.Identifier)
|
rebind(MessagingService.Identifier).to(WebsocketEndpoint).inSingletonScope();
|
||||||
.to(MessagingContribution)
|
|
||||||
.inSingletonScope();
|
|
||||||
|
|
||||||
// Removed undesired contributions from VS Code extensions
|
// Removed undesired contributions from VS Code extensions
|
||||||
// Such as the RTOS view from the `cortex-debug` extension
|
// Such as the RTOS view from the `cortex-debug` extension
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
||||||
import { MaybePromise } from '@theia/core/lib/common/types';
|
import { MaybePromise } from '@theia/core/lib/common/types';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import { constants, promises as fs } from 'node:fs';
|
import { constants, promises as fs } from 'node:fs';
|
||||||
import { join } from 'node:path';
|
import { join } from 'node:path';
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { notEmpty } from '@theia/core/lib/common/objects';
|
import { notEmpty } from '@theia/core/lib/common/objects';
|
||||||
import { nls } from '@theia/core/lib/common/nls';
|
import { nls } from '@theia/core/lib/common/nls';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import {
|
import {
|
||||||
Range,
|
Range,
|
||||||
Position,
|
Position,
|
||||||
|
@ -4,7 +4,7 @@ import yaml from 'js-yaml';
|
|||||||
import { injectable, inject, named } from '@theia/core/shared/inversify';
|
import { injectable, inject, named } from '@theia/core/shared/inversify';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
import { ILogger } from '@theia/core/lib/common/logger';
|
import { ILogger } from '@theia/core/lib/common/logger';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { Event, Emitter } from '@theia/core/lib/common/event';
|
import { Event, Emitter } from '@theia/core/lib/common/event';
|
||||||
import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application';
|
import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application';
|
||||||
import {
|
import {
|
||||||
|
@ -5,12 +5,13 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { nls } from '@theia/core/lib/common/nls';
|
import { nls } from '@theia/core/lib/common/nls';
|
||||||
import type { Mutable } from '@theia/core/lib/common/types';
|
import type { Mutable } from '@theia/core/lib/common/types';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import * as jspb from 'google-protobuf';
|
import * as jspb from 'google-protobuf';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
|
import { userAbort } from '../common/nls';
|
||||||
import {
|
import {
|
||||||
UploadResponse as ApiUploadResponse,
|
UploadResponse as ApiUploadResponse,
|
||||||
OutputMessage,
|
OutputMessage,
|
||||||
@ -26,6 +27,7 @@ import {
|
|||||||
isCompileSummary,
|
isCompileSummary,
|
||||||
isUploadResponse,
|
isUploadResponse,
|
||||||
} from '../common/protocol/core-service';
|
} from '../common/protocol/core-service';
|
||||||
|
import { UserAbortApplicationError } from '../common/protocol/progressible';
|
||||||
import { ResponseService } from '../common/protocol/response-service';
|
import { ResponseService } from '../common/protocol/response-service';
|
||||||
import { firstToUpperCase, notEmpty } from '../common/utils';
|
import { firstToUpperCase, notEmpty } from '../common/utils';
|
||||||
import { BoardDiscovery, createApiPort } from './board-discovery';
|
import { BoardDiscovery, createApiPort } from './board-discovery';
|
||||||
@ -52,8 +54,6 @@ import { ExecuteWithProgress, ProgressResponse } from './grpc-progressible';
|
|||||||
import { MonitorManager } from './monitor-manager';
|
import { MonitorManager } from './monitor-manager';
|
||||||
import { ServiceError } from './service-error';
|
import { ServiceError } from './service-error';
|
||||||
import { AutoFlushingBuffer } from './utils/buffers';
|
import { AutoFlushingBuffer } from './utils/buffers';
|
||||||
import { userAbort } from '../common/nls';
|
|
||||||
import { UserAbortApplicationError } from '../common/protocol/progressible';
|
|
||||||
|
|
||||||
namespace Uploadable {
|
namespace Uploadable {
|
||||||
export type Request = UploadRequest | UploadUsingProgrammerRequest;
|
export type Request = UploadRequest | UploadUsingProgrammerRequest;
|
||||||
|
@ -5,7 +5,7 @@ import {
|
|||||||
} from '@theia/core/shared/inversify';
|
} from '@theia/core/shared/inversify';
|
||||||
import { join } from 'node:path';
|
import { join } from 'node:path';
|
||||||
import fs from 'node:fs';
|
import fs from 'node:fs';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import {
|
import {
|
||||||
SketchRef,
|
SketchRef,
|
||||||
SketchContainer,
|
SketchContainer,
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { injectable } from '@theia/core/shared/inversify';
|
import { injectable } from '@theia/core/shared/inversify';
|
||||||
import { ExecutableService } from '../common/protocol/executable-service';
|
import { ExecutableService } from '../common/protocol/executable-service';
|
||||||
import {
|
import {
|
||||||
|
@ -6,7 +6,7 @@ import {
|
|||||||
postConstruct,
|
postConstruct,
|
||||||
} from '@theia/core/shared/inversify';
|
} from '@theia/core/shared/inversify';
|
||||||
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { promisify } from 'util';
|
import { promisify } from 'util';
|
||||||
import { MonitorSettingsProvider } from './monitor-settings-provider';
|
import { MonitorSettingsProvider } from './monitor-settings-provider';
|
||||||
import { Deferred } from '@theia/core/lib/common/promise-util';
|
import { Deferred } from '@theia/core/lib/common/promise-util';
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { injectable } from '@theia/core/shared/inversify';
|
import { injectable } from '@theia/core/shared/inversify';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { FileSystemExt } from '../common/protocol/filesystem-ext';
|
import { FileSystemExt } from '../common/protocol/filesystem-ext';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
import { EnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { inject, injectable } from '@theia/core/shared/inversify';
|
import { inject, injectable } from '@theia/core/shared/inversify';
|
||||||
import { promises as fs } from 'node:fs';
|
import { promises as fs } from 'node:fs';
|
||||||
import {
|
import {
|
||||||
|
@ -6,7 +6,7 @@ import { Deferred } from '@theia/core/lib/common/promise-util';
|
|||||||
import { escapeRegExpCharacters } from '@theia/core/lib/common/strings';
|
import { escapeRegExpCharacters } from '@theia/core/lib/common/strings';
|
||||||
import type { Mutable } from '@theia/core/lib/common/types';
|
import type { Mutable } from '@theia/core/lib/common/types';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { inject, injectable, named } from '@theia/core/shared/inversify';
|
import { inject, injectable, named } from '@theia/core/shared/inversify';
|
||||||
import { glob } from 'glob';
|
import { glob } from 'glob';
|
||||||
import crypto from 'node:crypto';
|
import crypto from 'node:crypto';
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
import { injectable } from '@theia/core/shared/inversify';
|
|
||||||
import { SurveyNotificationService } from '../common/protocol/survey-service';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Service for checking if it is the first instance of the IDE, in this case it sets a flag to true.
|
|
||||||
* This flag is used to prevent the survey notification from being visible in every open window. It must only be shown on one window.
|
|
||||||
*/
|
|
||||||
@injectable()
|
|
||||||
export class SurveyNotificationServiceImpl
|
|
||||||
implements SurveyNotificationService
|
|
||||||
{
|
|
||||||
private surveyDidShow = false;
|
|
||||||
async isFirstInstance(): Promise<boolean> {
|
|
||||||
if (this.surveyDidShow) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
this.surveyDidShow = true;
|
|
||||||
return this.surveyDidShow;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +1,8 @@
|
|||||||
import { MessagingContribution as TheiaMessagingContribution } from '@theia/core/lib/node/messaging/messaging-contribution';
|
import { WebsocketEndpoint as TheiaWebsocketEndpoint } from '@theia/core/lib/node/messaging/websocket-endpoint';
|
||||||
import { injectable } from '@theia/core/shared/inversify';
|
import { injectable } from '@theia/core/shared/inversify';
|
||||||
|
|
||||||
@injectable()
|
@injectable()
|
||||||
export class MessagingContribution extends TheiaMessagingContribution {
|
export class WebsocketEndpoint extends TheiaWebsocketEndpoint {
|
||||||
// https://github.com/eclipse-theia/theia/discussions/11543
|
// https://github.com/eclipse-theia/theia/discussions/11543
|
||||||
protected override checkAliveTimeout = process.argv.includes(
|
protected override checkAliveTimeout = process.argv.includes(
|
||||||
'--no-ping-timeout'
|
'--no-ping-timeout'
|
@ -5,7 +5,7 @@ import {
|
|||||||
import { isWindows } from '@theia/core/lib/common/os';
|
import { isWindows } from '@theia/core/lib/common/os';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
import { BackendApplicationConfigProvider } from '@theia/core/lib/node/backend-application-config-provider';
|
import { BackendApplicationConfigProvider } from '@theia/core/lib/node/backend-application-config-provider';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import {
|
import {
|
||||||
inject,
|
inject,
|
||||||
injectable,
|
injectable,
|
||||||
|
@ -1,42 +0,0 @@
|
|||||||
import { join } from 'node:path';
|
|
||||||
import { interfaces } from '@theia/core/shared/inversify';
|
|
||||||
import {
|
|
||||||
NsfwFileSystemWatcherServiceProcessOptions,
|
|
||||||
NSFW_SINGLE_THREADED,
|
|
||||||
spawnNsfwFileSystemWatcherServiceProcess,
|
|
||||||
} from '@theia/filesystem/lib/node/filesystem-backend-module';
|
|
||||||
import { FileSystemWatcherService } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
|
||||||
import { NsfwFileSystemWatcherServerOptions } from '@theia/filesystem/lib/node/nsfw-watcher/nsfw-filesystem-service';
|
|
||||||
import { FileSystemWatcherServiceDispatcher } from '@theia/filesystem/lib/node/filesystem-watcher-dispatcher';
|
|
||||||
import { NoDelayDisposalTimeoutNsfwFileSystemWatcherService } from './nsfw-watcher/nsfw-filesystem-service';
|
|
||||||
|
|
||||||
export function rebindNsfwFileSystemWatcher(rebind: interfaces.Rebind): void {
|
|
||||||
rebind<NsfwFileSystemWatcherServiceProcessOptions>(
|
|
||||||
NsfwFileSystemWatcherServiceProcessOptions
|
|
||||||
).toConstantValue({
|
|
||||||
entryPoint: join(__dirname, 'nsfw-watcher'),
|
|
||||||
});
|
|
||||||
rebind<FileSystemWatcherService>(FileSystemWatcherService)
|
|
||||||
.toDynamicValue((context) =>
|
|
||||||
NSFW_SINGLE_THREADED
|
|
||||||
? createNsfwFileSystemWatcherService(context)
|
|
||||||
: spawnNsfwFileSystemWatcherServiceProcess(context)
|
|
||||||
)
|
|
||||||
.inSingletonScope();
|
|
||||||
}
|
|
||||||
|
|
||||||
function createNsfwFileSystemWatcherService({
|
|
||||||
container,
|
|
||||||
}: interfaces.Context): FileSystemWatcherService {
|
|
||||||
const options = container.get<NsfwFileSystemWatcherServerOptions>(
|
|
||||||
NsfwFileSystemWatcherServerOptions
|
|
||||||
);
|
|
||||||
const dispatcher = container.get<FileSystemWatcherServiceDispatcher>(
|
|
||||||
FileSystemWatcherServiceDispatcher
|
|
||||||
);
|
|
||||||
const server = new NoDelayDisposalTimeoutNsfwFileSystemWatcherService(
|
|
||||||
options
|
|
||||||
);
|
|
||||||
server.setClient(dispatcher);
|
|
||||||
return server;
|
|
||||||
}
|
|
@ -0,0 +1,42 @@
|
|||||||
|
import { join } from 'node:path';
|
||||||
|
import { interfaces } from '@theia/core/shared/inversify';
|
||||||
|
import {
|
||||||
|
FileSystemWatcherServiceProcessOptions,
|
||||||
|
WATCHER_SINGLE_THREADED,
|
||||||
|
spawnParcelFileSystemWatcherServiceProcess,
|
||||||
|
} from '@theia/filesystem/lib/node/filesystem-backend-module';
|
||||||
|
import { FileSystemWatcherService } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
||||||
|
import { ParcelFileSystemWatcherServerOptions } from '@theia/filesystem/lib/node/parcel-watcher/parcel-filesystem-service';
|
||||||
|
import { FileSystemWatcherServiceDispatcher } from '@theia/filesystem/lib/node/filesystem-watcher-dispatcher';
|
||||||
|
import { NoDelayDisposalTimeoutParcelFileSystemWatcherService } from './parcel-watcher/parcel-filesystem-service';
|
||||||
|
|
||||||
|
export function rebindParcelFileSystemWatcher(rebind: interfaces.Rebind): void {
|
||||||
|
rebind<FileSystemWatcherServiceProcessOptions>(
|
||||||
|
FileSystemWatcherServiceProcessOptions
|
||||||
|
).toConstantValue({
|
||||||
|
entryPoint: join(__dirname, 'parcel-watcher'),
|
||||||
|
});
|
||||||
|
rebind<FileSystemWatcherService>(FileSystemWatcherService)
|
||||||
|
.toDynamicValue((context) =>
|
||||||
|
WATCHER_SINGLE_THREADED
|
||||||
|
? createParcelFileSystemWatcherService(context)
|
||||||
|
: spawnParcelFileSystemWatcherServiceProcess(context)
|
||||||
|
)
|
||||||
|
.inSingletonScope();
|
||||||
|
}
|
||||||
|
|
||||||
|
function createParcelFileSystemWatcherService({
|
||||||
|
container,
|
||||||
|
}: interfaces.Context): FileSystemWatcherService {
|
||||||
|
const options = container.get<ParcelFileSystemWatcherServerOptions>(
|
||||||
|
ParcelFileSystemWatcherServerOptions
|
||||||
|
);
|
||||||
|
const dispatcher = container.get<FileSystemWatcherServiceDispatcher>(
|
||||||
|
FileSystemWatcherServiceDispatcher
|
||||||
|
);
|
||||||
|
const server = new NoDelayDisposalTimeoutParcelFileSystemWatcherService(
|
||||||
|
options
|
||||||
|
);
|
||||||
|
server.setClient(dispatcher);
|
||||||
|
return server;
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
import * as yargs from '@theia/core/shared/yargs';
|
import * as yargs from '@theia/core/shared/yargs';
|
||||||
import { JsonRpcProxyFactory } from '@theia/core/lib/common/messaging/proxy-factory';
|
import { JsonRpcProxyFactory } from '@theia/core/lib/common/messaging/proxy-factory';
|
||||||
import { NoDelayDisposalTimeoutNsfwFileSystemWatcherService } from './nsfw-filesystem-service';
|
import { NoDelayDisposalTimeoutParcelFileSystemWatcherService } from './parcel-filesystem-service';
|
||||||
import type { IPCEntryPoint } from '@theia/core/lib/node/messaging/ipc-protocol';
|
import type { IPCEntryPoint } from '@theia/core/lib/node/messaging/ipc-protocol';
|
||||||
import type { FileSystemWatcherServiceClient } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
import type { FileSystemWatcherServiceClient } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
||||||
|
|
||||||
@ -20,7 +20,7 @@ const options: {
|
|||||||
}).argv as any;
|
}).argv as any;
|
||||||
|
|
||||||
export default <IPCEntryPoint>((connection) => {
|
export default <IPCEntryPoint>((connection) => {
|
||||||
const server = new NoDelayDisposalTimeoutNsfwFileSystemWatcherService(
|
const server = new NoDelayDisposalTimeoutParcelFileSystemWatcherService(
|
||||||
options
|
options
|
||||||
);
|
);
|
||||||
const factory = new JsonRpcProxyFactory<FileSystemWatcherServiceClient>(
|
const factory = new JsonRpcProxyFactory<FileSystemWatcherServiceClient>(
|
@ -1,26 +1,26 @@
|
|||||||
import { Minimatch } from 'minimatch';
|
import { Minimatch } from 'minimatch';
|
||||||
import type { WatchOptions } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
import type { WatchOptions } from '@theia/filesystem/lib/common/filesystem-watcher-protocol';
|
||||||
import {
|
import {
|
||||||
NsfwFileSystemWatcherService,
|
ParcelFileSystemWatcherService,
|
||||||
NsfwWatcher,
|
ParcelWatcher,
|
||||||
} from '@theia/filesystem/lib/node/nsfw-watcher/nsfw-filesystem-service';
|
} from '@theia/filesystem/lib/node/parcel-watcher/parcel-filesystem-service';
|
||||||
|
|
||||||
// Dispose the watcher immediately when the last reference is removed. By default, Theia waits 10 sec.
|
// Dispose the watcher immediately when the last reference is removed. By default, Theia waits 10 sec.
|
||||||
// https://github.com/eclipse-theia/theia/issues/11639#issuecomment-1238980708
|
// https://github.com/eclipse-theia/theia/issues/11639#issuecomment-1238980708
|
||||||
const NoDelay = 0;
|
const NoDelay = 0;
|
||||||
|
|
||||||
export class NoDelayDisposalTimeoutNsfwFileSystemWatcherService extends NsfwFileSystemWatcherService {
|
export class NoDelayDisposalTimeoutParcelFileSystemWatcherService extends ParcelFileSystemWatcherService {
|
||||||
protected override createWatcher(
|
protected override createWatcher(
|
||||||
clientId: number,
|
clientId: number,
|
||||||
fsPath: string,
|
fsPath: string,
|
||||||
options: WatchOptions
|
options: WatchOptions
|
||||||
): NsfwWatcher {
|
): ParcelWatcher {
|
||||||
const watcherOptions = {
|
const watcherOptions = {
|
||||||
ignored: options.ignored.map(
|
ignored: options.ignored.map(
|
||||||
(pattern) => new Minimatch(pattern, { dot: true })
|
(pattern) => new Minimatch(pattern, { dot: true })
|
||||||
),
|
),
|
||||||
};
|
};
|
||||||
return new NsfwWatcher(
|
return new ParcelWatcher(
|
||||||
clientId,
|
clientId,
|
||||||
fsPath,
|
fsPath,
|
||||||
watcherOptions,
|
watcherOptions,
|
@ -83,7 +83,9 @@ const cortexDebugMapper: PluginContributionMapper = (
|
|||||||
}
|
}
|
||||||
for (const _debugger of contribution.debuggers ?? []) {
|
for (const _debugger of contribution.debuggers ?? []) {
|
||||||
if (_debugger.type === 'cortex-debug') {
|
if (_debugger.type === 'cortex-debug') {
|
||||||
for (const attributes of _debugger.configurationAttributes ?? []) {
|
for (const attributes of Object.values(
|
||||||
|
_debugger.configurationAttributes ?? {}
|
||||||
|
)) {
|
||||||
if (attributes.properties) {
|
if (attributes.properties) {
|
||||||
// Patch the cortex-debug debug config schema to allow the in-house `configId`.
|
// Patch the cortex-debug debug config schema to allow the in-house `configId`.
|
||||||
attributes.properties['configId'] = {
|
attributes.properties['configId'] = {
|
||||||
|
@ -2,7 +2,7 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
import { promises as fs } from 'node:fs';
|
import { promises as fs } from 'node:fs';
|
||||||
import path from 'node:path';
|
import path from 'node:path';
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import type { MaybePromise } from '@theia/core/lib/common/types';
|
import type { MaybePromise } from '@theia/core/lib/common/types';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { Container } from '@theia/core/shared/inversify';
|
import { Container } from '@theia/core/shared/inversify';
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
import { dump, load } from 'js-yaml';
|
import { dump, load } from 'js-yaml';
|
||||||
import { promises as fs } from 'node:fs';
|
import { promises as fs } from 'node:fs';
|
||||||
import { join } from 'node:path';
|
import { join } from 'node:path';
|
||||||
import { sync as deleteSync } from 'rimraf';
|
import { rimrafSync } from 'rimraf';
|
||||||
import {
|
import {
|
||||||
BoardsService,
|
BoardsService,
|
||||||
CoreService,
|
CoreService,
|
||||||
@ -65,7 +65,7 @@ describe('core-client-provider', () => {
|
|||||||
it("should recover when the 'directories.data' folder is missing", async function () {
|
it("should recover when the 'directories.data' folder is missing", async function () {
|
||||||
this.timeout(timeout);
|
this.timeout(timeout);
|
||||||
const configDirPath = await prepareTestConfigDir();
|
const configDirPath = await prepareTestConfigDir();
|
||||||
deleteSync(join(configDirPath, 'data'));
|
rimrafSync(join(configDirPath, 'data'));
|
||||||
|
|
||||||
const container = await startCli(configDirPath, toDispose);
|
const container = await startCli(configDirPath, toDispose);
|
||||||
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
||||||
@ -84,7 +84,7 @@ describe('core-client-provider', () => {
|
|||||||
'Arduino15',
|
'Arduino15',
|
||||||
'package_index.json'
|
'package_index.json'
|
||||||
);
|
);
|
||||||
deleteSync(primaryPackageIndexPath);
|
rimrafSync(primaryPackageIndexPath);
|
||||||
|
|
||||||
const container = await startCli(configDirPath, toDispose);
|
const container = await startCli(configDirPath, toDispose);
|
||||||
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
||||||
@ -118,7 +118,7 @@ describe('core-client-provider', () => {
|
|||||||
'tools',
|
'tools',
|
||||||
tool
|
tool
|
||||||
);
|
);
|
||||||
deleteSync(builtinToolsPath);
|
rimrafSync(builtinToolsPath);
|
||||||
|
|
||||||
const container = await startCli(configDirPath, toDispose);
|
const container = await startCli(configDirPath, toDispose);
|
||||||
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
||||||
@ -140,7 +140,7 @@ describe('core-client-provider', () => {
|
|||||||
'Arduino15',
|
'Arduino15',
|
||||||
'library_index.json'
|
'library_index.json'
|
||||||
);
|
);
|
||||||
deleteSync(libraryPackageIndexPath);
|
rimrafSync(libraryPackageIndexPath);
|
||||||
|
|
||||||
const container = await startCli(configDirPath, toDispose);
|
const container = await startCli(configDirPath, toDispose);
|
||||||
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
await assertFunctionalCli(container, ({ coreClientProvider }) => {
|
||||||
@ -176,7 +176,7 @@ describe('core-client-provider', () => {
|
|||||||
'Arduino15',
|
'Arduino15',
|
||||||
'package_teensy_index.json'
|
'package_teensy_index.json'
|
||||||
);
|
);
|
||||||
deleteSync(thirdPartyPackageIndexPath);
|
rimrafSync(thirdPartyPackageIndexPath);
|
||||||
|
|
||||||
const container = await startCli(configDirPath, toDispose);
|
const container = await startCli(configDirPath, toDispose);
|
||||||
await assertFunctionalCli(
|
await assertFunctionalCli(
|
||||||
@ -193,7 +193,7 @@ describe('core-client-provider', () => {
|
|||||||
it("should recover when invalid 3rd package URL is defined in the CLI config and the 'directories.data' folder is missing", async function () {
|
it("should recover when invalid 3rd package URL is defined in the CLI config and the 'directories.data' folder is missing", async function () {
|
||||||
this.timeout(timeout);
|
this.timeout(timeout);
|
||||||
const configDirPath = await prepareTestConfigDir();
|
const configDirPath = await prepareTestConfigDir();
|
||||||
deleteSync(join(configDirPath, 'data'));
|
rimrafSync(join(configDirPath, 'data'));
|
||||||
|
|
||||||
// set an invalid URL so the CLI will try to download it
|
// set an invalid URL so the CLI will try to download it
|
||||||
const cliConfigPath = join(configDirPath, 'arduino-cli.yaml');
|
const cliConfigPath = join(configDirPath, 'arduino-cli.yaml');
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
import { DisposableCollection } from '@theia/core/lib/common/disposable';
|
||||||
import { isWindows } from '@theia/core/lib/common/os';
|
import { isWindows } from '@theia/core/lib/common/os';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { Container } from '@theia/core/shared/inversify';
|
import { Container } from '@theia/core/shared/inversify';
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
import {
|
import {
|
||||||
|
@ -5,7 +5,7 @@ import {
|
|||||||
import { EnvVariablesServer as TheiaEnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
import { EnvVariablesServer as TheiaEnvVariablesServer } from '@theia/core/lib/common/env-variables';
|
||||||
import { waitForEvent } from '@theia/core/lib/common/promise-util';
|
import { waitForEvent } from '@theia/core/lib/common/promise-util';
|
||||||
import URI from '@theia/core/lib/common/uri';
|
import URI from '@theia/core/lib/common/uri';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { ProcessUtils } from '@theia/core/lib/node/process-utils';
|
import { ProcessUtils } from '@theia/core/lib/node/process-utils';
|
||||||
import {
|
import {
|
||||||
Container,
|
Container,
|
||||||
|
@ -2,15 +2,15 @@ import {
|
|||||||
Disposable,
|
Disposable,
|
||||||
DisposableCollection,
|
DisposableCollection,
|
||||||
} from '@theia/core/lib/common/disposable';
|
} from '@theia/core/lib/common/disposable';
|
||||||
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import { isWindows } from '@theia/core/lib/common/os';
|
import { isWindows } from '@theia/core/lib/common/os';
|
||||||
import { URI } from '@theia/core/lib/common/uri';
|
import { URI } from '@theia/core/lib/common/uri';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
|
||||||
import { Container } from '@theia/core/shared/inversify';
|
import { Container } from '@theia/core/shared/inversify';
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
import { rejects } from 'node:assert/strict';
|
import { rejects } from 'node:assert/strict';
|
||||||
import { promises as fs } from 'node:fs';
|
import { promises as fs } from 'node:fs';
|
||||||
import path, { basename, join } from 'node:path';
|
import path, { basename, join } from 'node:path';
|
||||||
import { sync as rimrafSync } from 'rimraf';
|
import { rimrafSync } from 'rimraf';
|
||||||
import temp from 'temp';
|
import temp from 'temp';
|
||||||
import { Sketch, SketchesError, SketchesService } from '../../common/protocol';
|
import { Sketch, SketchesError, SketchesService } from '../../common/protocol';
|
||||||
import {
|
import {
|
||||||
@ -574,7 +574,7 @@ function disposeSketch(...sketch: Sketch[]): Disposable {
|
|||||||
function disposeFolder(...paths: string[]): Disposable {
|
function disposeFolder(...paths: string[]): Disposable {
|
||||||
return new DisposableCollection(
|
return new DisposableCollection(
|
||||||
...paths.map((path) =>
|
...paths.map((path) =>
|
||||||
Disposable.create(() => rimrafSync(path, { maxBusyTries: 5 }))
|
Disposable.create(() => rimrafSync(path, { maxRetries: 5 }))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import type { Mutable } from '@theia/core/lib/common/types';
|
import type { Mutable } from '@theia/core/lib/common/types';
|
||||||
import { FileUri } from '@theia/core/lib/node/file-uri';
|
import { FileUri } from '@theia/core/lib/common/file-uri';
|
||||||
import stableJsonStringify from 'fast-json-stable-stringify';
|
import stableJsonStringify from 'fast-json-stable-stringify';
|
||||||
import assert from 'node:assert/strict';
|
import assert from 'node:assert/strict';
|
||||||
import { basename, join } from 'node:path';
|
import { basename, join } from 'node:path';
|
||||||
|
@ -20,5 +20,4 @@
|
|||||||
"skipLibCheck": true
|
"skipLibCheck": true
|
||||||
},
|
},
|
||||||
"include": ["src"],
|
"include": ["src"],
|
||||||
"files": ["../node_modules/nsfw/index.d.ts"]
|
|
||||||
}
|
}
|
||||||
|
@ -5,30 +5,30 @@
|
|||||||
"license": "AGPL-3.0-or-later",
|
"license": "AGPL-3.0-or-later",
|
||||||
"main": "./src-gen/backend/electron-main.js",
|
"main": "./src-gen/backend/electron-main.js",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@theia/core": "1.41.0",
|
"@theia/core": "1.57.0",
|
||||||
"@theia/debug": "1.41.0",
|
"@theia/debug": "1.57.0",
|
||||||
"@theia/editor": "1.41.0",
|
"@theia/editor": "1.57.0",
|
||||||
"@theia/electron": "1.41.0",
|
"@theia/electron": "1.57.0",
|
||||||
"@theia/filesystem": "1.41.0",
|
"@theia/filesystem": "1.57.0",
|
||||||
"@theia/keymaps": "1.41.0",
|
"@theia/keymaps": "1.57.0",
|
||||||
"@theia/messages": "1.41.0",
|
"@theia/messages": "1.57.0",
|
||||||
"@theia/monaco": "1.41.0",
|
"@theia/monaco": "1.57.0",
|
||||||
"@theia/navigator": "1.41.0",
|
"@theia/navigator": "1.57.0",
|
||||||
"@theia/plugin-ext": "1.41.0",
|
"@theia/plugin-ext": "1.57.0",
|
||||||
"@theia/plugin-ext-vscode": "1.41.0",
|
"@theia/plugin-ext-vscode": "1.57.0",
|
||||||
"@theia/preferences": "1.41.0",
|
"@theia/preferences": "1.57.0",
|
||||||
"@theia/terminal": "1.41.0",
|
"@theia/terminal": "1.57.0",
|
||||||
"@theia/workspace": "1.41.0",
|
"@theia/workspace": "1.57.0",
|
||||||
"arduino-ide-extension": "2.3.5"
|
"arduino-ide-extension": "2.3.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@theia/cli": "1.41.0",
|
"@theia/cli": "1.57.0",
|
||||||
"7zip-min": "^1.4.4",
|
"7zip-min": "^1.4.4",
|
||||||
"chmodr": "^1.2.0",
|
"chmodr": "^1.2.0",
|
||||||
"compression-webpack-plugin": "^9.0.0",
|
"compression-webpack-plugin": "^9.0.0",
|
||||||
"copy-webpack-plugin": "^8.1.1",
|
"copy-webpack-plugin": "^8.1.1",
|
||||||
"dateformat": "^5.0.3",
|
"dateformat": "^5.0.3",
|
||||||
"electron": "^27.0.3",
|
"electron": "30.1.2",
|
||||||
"electron-builder": "^24.6.4",
|
"electron-builder": "^24.6.4",
|
||||||
"electron-notarize": "^1.1.1",
|
"electron-notarize": "^1.1.1",
|
||||||
"execa": "^7.1.1",
|
"execa": "^7.1.1",
|
||||||
@ -36,7 +36,7 @@
|
|||||||
"glob": "^10.3.3",
|
"glob": "^10.3.3",
|
||||||
"is-ci": "^2.0.0",
|
"is-ci": "^2.0.0",
|
||||||
"resolve-package-path": "^4.0.3",
|
"resolve-package-path": "^4.0.3",
|
||||||
"rimraf": "^2.6.1",
|
"rimraf": "^5.0.0",
|
||||||
"semver": "^7.3.2",
|
"semver": "^7.3.2",
|
||||||
"temp": "^0.9.1",
|
"temp": "^0.9.1",
|
||||||
"yaml": "^1.10.2"
|
"yaml": "^1.10.2"
|
||||||
@ -53,7 +53,7 @@
|
|||||||
"prepackage": "rimraf dist",
|
"prepackage": "rimraf dist",
|
||||||
"package": "node ./scripts/package.js",
|
"package": "node ./scripts/package.js",
|
||||||
"postpackage": "node ./scripts/post-package.js",
|
"postpackage": "node ./scripts/post-package.js",
|
||||||
"rebuild": "theia rebuild:browser --cacheRoot ../.. && theia rebuild:electron --cacheRoot ../.."
|
"rebuild": "theia rebuild:browser --cacheRoot .. && theia rebuild:electron --cacheRoot .."
|
||||||
},
|
},
|
||||||
"theia": {
|
"theia": {
|
||||||
"target": "electron",
|
"target": "electron",
|
||||||
@ -66,6 +66,10 @@
|
|||||||
},
|
},
|
||||||
"defaultIconTheme": "none",
|
"defaultIconTheme": "none",
|
||||||
"validatePreferencesSchema": false,
|
"validatePreferencesSchema": false,
|
||||||
|
"electron": {
|
||||||
|
"showWindowEarly": true
|
||||||
|
},
|
||||||
|
"reloadOnReconnect": true,
|
||||||
"preferences": {
|
"preferences": {
|
||||||
"window.title": "${rootName}${activeEditorShort}${appName}",
|
"window.title": "${rootName}${activeEditorShort}${appName}",
|
||||||
"files.autoSave": "afterDelay",
|
"files.autoSave": "afterDelay",
|
||||||
@ -195,29 +199,29 @@
|
|||||||
},
|
},
|
||||||
"theiaPluginsDir": "plugins",
|
"theiaPluginsDir": "plugins",
|
||||||
"theiaPlugins": {
|
"theiaPlugins": {
|
||||||
"vscode-builtin-cpp": "https://open-vsx.org/api/vscode/cpp/1.52.1/file/vscode.cpp-1.52.1.vsix",
|
"vscode-builtin-cpp": "https://open-vsx.org/api/vscode/cpp/1.88.1/file/vscode.cpp-1.88.1.vsix",
|
||||||
"vscode-arduino-api": "https://github.com/dankeboy36/vscode-arduino-api/releases/download/0.1.2/vscode-arduino-api-0.1.2.vsix",
|
"vscode-arduino-api": "https://github.com/dankeboy36/vscode-arduino-api/releases/download/0.1.2/vscode-arduino-api-0.1.2.vsix",
|
||||||
"vscode-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.1.3.vsix",
|
"vscode-arduino-tools": "https://downloads.arduino.cc/vscode-arduino-tools/vscode-arduino-tools-0.1.3.vsix",
|
||||||
"vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.46.1/file/vscode.json-1.46.1.vsix",
|
"vscode-builtin-json": "https://open-vsx.org/api/vscode/json/1.88.1/file/vscode.json-1.88.1.vsix",
|
||||||
"vscode-builtin-json-language-features": "https://open-vsx.org/api/vscode/json-language-features/1.46.1/file/vscode.json-language-features-1.46.1.vsix",
|
"vscode-builtin-json-language-features": "https://open-vsx.org/api/vscode/json-language-features/1.88.1/file/vscode.json-language-features-1.88.1.vsix",
|
||||||
"cortex-debug": "https://downloads.arduino.cc/marus25.cortex-debug/marus25.cortex-debug-1.5.1.vsix",
|
"cortex-debug": "https://downloads.arduino.cc/marus25.cortex-debug/marus25.cortex-debug-1.5.1.vsix",
|
||||||
"vscode-language-pack-bg": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-bg/1.48.3/file/MS-CEINTL.vscode-language-pack-bg-1.48.3.vsix",
|
"vscode-language-pack-bg": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-bg/1.48.3/file/MS-CEINTL.vscode-language-pack-bg-1.48.3.vsix",
|
||||||
"vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.80.0/file/MS-CEINTL.vscode-language-pack-cs-1.80.0.vsix",
|
"vscode-language-pack-cs": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-cs/1.96.0/file/MS-CEINTL.vscode-language-pack-cs-1.96.0.vsix",
|
||||||
"vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.80.0/file/MS-CEINTL.vscode-language-pack-de-1.80.0.vsix",
|
"vscode-language-pack-de": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-de/1.96.0/file/MS-CEINTL.vscode-language-pack-de-1.96.0.vsix",
|
||||||
"vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.80.0/file/MS-CEINTL.vscode-language-pack-es-1.80.0.vsix",
|
"vscode-language-pack-es": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-es/1.96.0/file/MS-CEINTL.vscode-language-pack-es-1.96.0.vsix",
|
||||||
"vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.80.0/file/MS-CEINTL.vscode-language-pack-fr-1.80.0.vsix",
|
"vscode-language-pack-fr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-fr/1.96.0/file/MS-CEINTL.vscode-language-pack-fr-1.96.0.vsix",
|
||||||
"vscode-language-pack-hu": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-hu/1.48.3/file/MS-CEINTL.vscode-language-pack-hu-1.48.3.vsix",
|
"vscode-language-pack-hu": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-hu/1.48.3/file/MS-CEINTL.vscode-language-pack-hu-1.48.3.vsix",
|
||||||
"vscode-language-pack-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.80.0/file/MS-CEINTL.vscode-language-pack-it-1.80.0.vsix",
|
"vscode-language-pack-it": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-it/1.96.0/file/MS-CEINTL.vscode-language-pack-it-1.96.0.vsix",
|
||||||
"vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.80.0/file/MS-CEINTL.vscode-language-pack-ja-1.80.0.vsix",
|
"vscode-language-pack-ja": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ja/1.96.0/file/MS-CEINTL.vscode-language-pack-ja-1.96.0.vsix",
|
||||||
"vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.80.0/file/MS-CEINTL.vscode-language-pack-ko-1.80.0.vsix",
|
"vscode-language-pack-ko": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ko/1.96.0/file/MS-CEINTL.vscode-language-pack-ko-1.96.0.vsix",
|
||||||
"vscode-language-pack-nl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-nl/1.48.3/file/MS-CEINTL.vscode-language-pack-nl-1.48.3.vsix",
|
"vscode-language-pack-nl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-nl/1.48.3/file/MS-CEINTL.vscode-language-pack-nl-1.48.3.vsix",
|
||||||
"vscode-language-pack-pl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pl/1.80.0/file/MS-CEINTL.vscode-language-pack-pl-1.80.0.vsix",
|
"vscode-language-pack-pl": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pl/1.96.0/file/MS-CEINTL.vscode-language-pack-pl-1.96.0.vsix",
|
||||||
"vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.80.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.80.0.vsix",
|
"vscode-language-pack-pt-BR": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-pt-BR/1.96.0/file/MS-CEINTL.vscode-language-pack-pt-BR-1.96.0.vsix",
|
||||||
"vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.80.0/file/MS-CEINTL.vscode-language-pack-ru-1.80.0.vsix",
|
"vscode-language-pack-ru": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-ru/1.96.0/file/MS-CEINTL.vscode-language-pack-ru-1.96.0.vsix",
|
||||||
"vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.80.0/file/MS-CEINTL.vscode-language-pack-tr-1.80.0.vsix",
|
"vscode-language-pack-tr": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-tr/1.96.0/file/MS-CEINTL.vscode-language-pack-tr-1.96.0.vsix",
|
||||||
"vscode-language-pack-uk": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-uk/1.48.3/file/MS-CEINTL.vscode-language-pack-uk-1.48.3.vsix",
|
"vscode-language-pack-uk": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-uk/1.48.3/file/MS-CEINTL.vscode-language-pack-uk-1.48.3.vsix",
|
||||||
"vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.80.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.80.0.vsix",
|
"vscode-language-pack-zh-hans": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hans/1.96.0/file/MS-CEINTL.vscode-language-pack-zh-hans-1.96.0.vsix",
|
||||||
"vscode-language-pack-zh-hant": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hant/1.80.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.80.0.vsix"
|
"vscode-language-pack-zh-hant": "https://open-vsx.org/api/MS-CEINTL/vscode-language-pack-zh-hant/1.96.0/file/MS-CEINTL.vscode-language-pack-zh-hant-1.96.0.vsix"
|
||||||
},
|
},
|
||||||
"mocha": {
|
"mocha": {
|
||||||
"reporter": "spec",
|
"reporter": "spec",
|
||||||
|
@ -18,7 +18,7 @@ async function run() {
|
|||||||
'--publish',
|
'--publish',
|
||||||
'never',
|
'never',
|
||||||
'-c.electronVersion',
|
'-c.electronVersion',
|
||||||
electronVersion.slice(1), // removes the leading ^ from the version. TODO: user `semver` to clean it.
|
semver.clean(electronVersion.replace(/^\^/, '')),
|
||||||
'-c.extraMetadata.version',
|
'-c.extraMetadata.version',
|
||||||
version,
|
version,
|
||||||
// overrides the `name` in the `package.json` to keep the `localStorage` location. (https://github.com/arduino/arduino-ide/pull/2144#pullrequestreview-1554005028)
|
// overrides the `name` in the `package.json` to keep the `localStorage` location. (https://github.com/arduino/arduino-ide/pull/2144#pullrequestreview-1554005028)
|
||||||
|
@ -30,9 +30,9 @@ backend.config.plugins.unshift(
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Override the default entry from Theia as IDE2 has a customization of the module.
|
// Override the default entry from Theia as IDE2 has a customization of the module.
|
||||||
backend.config.entry['nsfw-watcher'] = {
|
backend.config.entry['parcel-watcher'] = {
|
||||||
import: require.resolve(
|
import: require.resolve(
|
||||||
'arduino-ide-extension/lib/node/theia/filesystem/nsfw-watcher'
|
'arduino-ide-extension/lib/node/theia/filesystem/parcel-watcher'
|
||||||
),
|
),
|
||||||
library: {
|
library: {
|
||||||
type: 'commonjs2',
|
type: 'commonjs2',
|
||||||
|
@ -415,7 +415,6 @@
|
|||||||
},
|
},
|
||||||
"sketchbook.location": "Sketchbook location",
|
"sketchbook.location": "Sketchbook location",
|
||||||
"sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.",
|
"sketchbook.showAllFiles": "True to show all sketch files inside the sketch. It is false by default.",
|
||||||
"survey.notification": "True if users should be notified if a survey is available. True by default.",
|
|
||||||
"unofficialBoardSupport": "Click for a list of unofficial board support URLs",
|
"unofficialBoardSupport": "Click for a list of unofficial board support URLs",
|
||||||
"upload": "upload",
|
"upload": "upload",
|
||||||
"upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.",
|
"upload.autoVerify": "True if the IDE should automatically verify the code before the upload. True by default. When this value is false, IDE does not recompile the code before uploading the binary to the board. It's highly advised to only set this value to false if you know what you are doing.",
|
||||||
@ -490,11 +489,6 @@
|
|||||||
"newCloudSketch": "New Cloud Sketch",
|
"newCloudSketch": "New Cloud Sketch",
|
||||||
"newSketch": "New Sketch"
|
"newSketch": "New Sketch"
|
||||||
},
|
},
|
||||||
"survey": {
|
|
||||||
"answerSurvey": "Answer survey",
|
|
||||||
"dismissSurvey": "Don't show again",
|
|
||||||
"surveyMessage": "Please help us improve by answering this super short survey. We value our community and would like to get to know our supporters a little better."
|
|
||||||
},
|
|
||||||
"theme": {
|
"theme": {
|
||||||
"currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.",
|
"currentThemeNotFound": "Could not find the currently selected theme: {0}. Arduino IDE has picked a built-in theme compatible with the missing one.",
|
||||||
"dark": "Dark",
|
"dark": "Dark",
|
||||||
|
15
package.json
15
package.json
@ -12,12 +12,17 @@
|
|||||||
"resolutions": {
|
"resolutions": {
|
||||||
"@theia/cli/@babel/traverse": "^7.23.2",
|
"@theia/cli/@babel/traverse": "^7.23.2",
|
||||||
"@theia/cli/@theia/application-package/nano": "^10.1.3",
|
"@theia/cli/@theia/application-package/nano": "^10.1.3",
|
||||||
|
"**/@theia/application-manager/node-abi": "^3.0.0",
|
||||||
"**/@theia/core/msgpackr": "^1.10.1",
|
"**/@theia/core/msgpackr": "^1.10.1",
|
||||||
"nx/axios": "^1.6.7",
|
"**/@types/react-dom": "18.3.1",
|
||||||
"**/ip": "^2.0.1"
|
"**/@types/react": "18.3.1",
|
||||||
|
"**/inversify": "6.0.2",
|
||||||
|
"**/ip": "^2.0.1",
|
||||||
|
"**/perfect-scrollbar": "1.5.5",
|
||||||
|
"nx/axios": "^1.6.7"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@theia/cli": "1.41.0",
|
"@theia/cli": "1.57.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.59.0",
|
"@typescript-eslint/eslint-plugin": "^5.59.0",
|
||||||
"@typescript-eslint/parser": "^5.59.0",
|
"@typescript-eslint/parser": "^5.59.0",
|
||||||
"@xhmikosr/downloader": "^13.0.1",
|
"@xhmikosr/downloader": "^13.0.1",
|
||||||
@ -36,10 +41,10 @@
|
|||||||
"node-gyp": "^9.3.0",
|
"node-gyp": "^9.3.0",
|
||||||
"prettier": "^2.3.1",
|
"prettier": "^2.3.1",
|
||||||
"reflect-metadata": "^0.1.10",
|
"reflect-metadata": "^0.1.10",
|
||||||
"rimraf": "^2.6.1",
|
"rimraf": "^5.0.0",
|
||||||
"semver": "^7.3.2",
|
"semver": "^7.3.2",
|
||||||
"style-dictionary": "^3.7.0",
|
"style-dictionary": "^3.7.0",
|
||||||
"typescript": "^4.9.3",
|
"typescript": "^5.4.5",
|
||||||
"xhr2": "^0.2.1"
|
"xhr2": "^0.2.1"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user