diff --git a/.eslintrc.js b/.eslintrc.js index 4bb67da9e..f01e4eff6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -14,6 +14,7 @@ module.exports = { '.browser_modules/*', 'docs/*', 'scripts/*', + 'browser-app/*', 'electron-app/lib/*', 'electron-app/src-gen/*', 'electron-app/gen-webpack*.js', diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 000000000..3c032078a --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +18 diff --git a/.vscode/launch.json b/.vscode/launch.json index 2a8081fb8..37a9d9af2 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -80,6 +80,37 @@ "port": 9222, "webRoot": "${workspaceFolder}/electron-app" }, + { + "type": "node", + "request": "launch", + "name": "App (Browser)", + "program": "${workspaceRoot}/browser-app/src-gen/backend/main.js", + "args": [ + "--hostname=0.0.0.0", + "--port=3000", + "--no-cluster", + "--no-app-auto-install", + "--plugins=local-dir:plugins" + ], + "windows": { + "env": { + "NODE_ENV": "development", + "NODE_PRESERVE_SYMLINKS": "1" + } + }, + "env": { + "NODE_ENV": "development" + }, + "sourceMaps": true, + "outFiles": [ + "${workspaceRoot}/browser-app/src-gen/backend/*.js", + "${workspaceRoot}/browser-app/lib/**/*.js", + "${workspaceRoot}/arduino-ide-extension/lib/**/*.js" + ], + "smartStep": true, + "internalConsoleOptions": "openOnSessionStart", + "outputCapture": "std" + }, { "type": "node", "request": "launch", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index b53773f8b..1425237aa 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -15,6 +15,17 @@ "clear": false } }, + { + "label": "Arduino IDE - Start Browser App", + "type": "shell", + "command": "yarn --cwd ./browser-app start", + "group": "build", + "presentation": { + "reveal": "always", + "panel": "new", + "clear": true + } + }, { "label": "Watch Extension", "type": "shell", @@ -26,6 +37,17 @@ "clear": false } }, + { + "label": "Arduino IDE - Watch Browser App", + "type": "shell", + "command": "yarn --cwd ./browser-app watch", + "group": "build", + "presentation": { + "reveal": "always", + "panel": "new", + "clear": false + } + }, { "label": "Watch App", "type": "shell", @@ -37,6 +59,14 @@ "clear": false } }, + { + "label": "Arduino IDE - Watch All [Browser]", + "type": "shell", + "dependsOn": [ + "Arduino IDE - Watch IDE Extension", + "Arduino IDE - Watch Browser App" + ] + }, { "label": "Watch All", "type": "shell", diff --git a/arduino-ide-extension/package.json b/arduino-ide-extension/package.json index 45e852988..407589056 100644 --- a/arduino-ide-extension/package.json +++ b/arduino-ide-extension/package.json @@ -158,16 +158,8 @@ "frontend": "lib/browser/arduino-ide-frontend-module" }, { + "frontend": "lib/browser/theia/core/browser-menu-module", "frontendElectron": "lib/electron-browser/theia/core/electron-menu-module" - }, - { - "frontendElectron": "lib/electron-browser/theia/core/electron-window-module" - }, - { - "frontendElectron": "lib/electron-browser/electron-arduino-module" - }, - { - "electronMain": "lib/electron-main/arduino-electron-main-module" } ], "arduino": { diff --git a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx index 9ca0a9c61..d0defff6a 100644 --- a/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx +++ b/arduino-ide-extension/src/browser/arduino-frontend-contribution.tsx @@ -2,7 +2,6 @@ import { ColorContribution } from '@theia/core/lib/browser/color-application-con import { ColorRegistry } from '@theia/core/lib/browser/color-registry'; import { CommonMenus } from '@theia/core/lib/browser/common-frontend-contribution'; import { FrontendApplicationContribution } from '@theia/core/lib/browser/frontend-application'; -import { FrontendApplicationStateService } from '@theia/core/lib/browser/frontend-application-state'; import { TabBarToolbarContribution, TabBarToolbarRegistry, @@ -24,7 +23,6 @@ import { import { MessageService } from '@theia/core/lib/common/message-service'; import { nls } from '@theia/core/lib/common/nls'; import { isHighContrast } from '@theia/core/lib/common/theme'; -import { ElectronWindowPreferences } from '@theia/core/lib/electron-browser/window/electron-window-preferences'; import { inject, injectable, @@ -62,11 +60,11 @@ export class ArduinoFrontendContribution @inject(CommandRegistry) private readonly commandRegistry: CommandRegistry; - @inject(ElectronWindowPreferences) - private readonly electronWindowPreferences: ElectronWindowPreferences; + // @inject(ElectronWindowPreferences) + // private readonly electronWindowPreferences: ElectronWindowPreferences; - @inject(FrontendApplicationStateService) - private readonly appStateService: FrontendApplicationStateService; + // @inject(FrontendApplicationStateService) + // private readonly appStateService: FrontendApplicationStateService; @postConstruct() protected init(): void { @@ -82,24 +80,24 @@ export class ArduinoFrontendContribution } onStart(): void { - this.electronWindowPreferences.onPreferenceChanged((event) => { - if (event.newValue !== event.oldValue) { - switch (event.preferenceName) { - case 'window.zoomLevel': - if (typeof event.newValue === 'number') { - window.electronTheiaCore.setZoomLevel(event.newValue || 0); - } - break; - } - } - }); - this.appStateService.reachedState('ready').then(() => - this.electronWindowPreferences.ready.then(() => { - const zoomLevel = - this.electronWindowPreferences.get('window.zoomLevel'); - window.electronTheiaCore.setZoomLevel(zoomLevel); - }) - ); + // this.electronWindowPreferences.onPreferenceChanged((event) => { + // if (event.newValue !== event.oldValue) { + // switch (event.preferenceName) { + // case 'window.zoomLevel': + // if (typeof event.newValue === 'number') { + // window.electronTheiaCore.setZoomLevel(event.newValue || 0); + // } + // break; + // } + // } + // }); + // this.appStateService.reachedState('ready').then(() => + // this.electronWindowPreferences.ready.then(() => { + // const zoomLevel = + // this.electronWindowPreferences.get('window.zoomLevel'); + // window.electronTheiaCore.setZoomLevel(zoomLevel); + // }) + // ); } registerToolbarItems(registry: TabBarToolbarRegistry): void { diff --git a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts index 342516c0d..0647fc1fa 100644 --- a/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts +++ b/arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts @@ -265,17 +265,12 @@ import { } from './dialogs/user-fields/user-fields-dialog'; import { nls } from '@theia/core/lib/common'; import { IDEUpdaterCommands } from './ide-updater/ide-updater-commands'; -import { - IDEUpdater, - IDEUpdaterClient, - IDEUpdaterPath, -} from '../common/protocol/ide-updater'; +import { IDEUpdater, IDEUpdaterClient } from '../common/protocol/ide-updater'; import { IDEUpdaterClientImpl } from './ide-updater/ide-updater-client-impl'; import { IDEUpdaterDialog, IDEUpdaterDialogProps, } from './dialogs/ide-updater/ide-updater-dialog'; -import { ElectronIpcConnectionProvider } from '@theia/core/lib/electron-browser/messaging/electron-ipc-connection-provider'; import { MonitorModel } from './monitor-model'; import { MonitorManagerProxyClientImpl } from './monitor-manager-proxy-client-impl'; import { EditorManager as TheiaEditorManager } from '@theia/editor/lib/browser/editor-manager'; @@ -295,10 +290,7 @@ import { PreferenceTreeGenerator } from './theia/preferences/preference-tree-gen import { PreferenceTreeGenerator as TheiaPreferenceTreeGenerator } from '@theia/preferences/lib/browser/util/preference-tree-generator'; import { AboutDialog } from './theia/core/about-dialog'; import { AboutDialog as TheiaAboutDialog } from '@theia/core/lib/browser/about-dialog'; -import { - SurveyNotificationService, - SurveyNotificationServicePath, -} from '../common/protocol/survey-service'; +import { SurveyNotificationService } from '../common/protocol/survey-service'; import { WindowContribution } from './theia/core/window-contribution'; import { WindowContribution as TheiaWindowContribution } from '@theia/core/lib/browser/window-contribution'; import { CoreErrorHandler } from './contributions/core-error-handler'; @@ -394,6 +386,8 @@ import { VersionWelcomeDialog, VersionWelcomeDialogProps, } from './dialogs/version-welcome-dialog'; +import { DialogService } from './dialog-service'; +import { AppInfo, AppService } from './app-service'; // Hack to fix copy/cut/paste issue after electron version update in Theia. // https://github.com/eclipse-theia/theia/issues/12487 @@ -574,14 +568,15 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { WorkspaceVariableContribution ); - bind(SurveyNotificationService) - .toDynamicValue((context) => { - return ElectronIpcConnectionProvider.createProxy( - context.container, - SurveyNotificationServicePath - ); - }) - .inSingletonScope(); + bind(SurveyNotificationService).toConstantValue( + {} as SurveyNotificationService + ); + // return ElectronIpcConnectionProvider.createProxy( + // context.container, + // SurveyNotificationServicePath + // ); + // }) + // .inSingletonScope(); // Layout and shell customizations. rebind(TheiaOutlineViewContribution) @@ -1039,16 +1034,16 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { // Frontend binding for the IDE Updater service bind(IDEUpdaterClientImpl).toSelf().inSingletonScope(); bind(IDEUpdaterClient).toService(IDEUpdaterClientImpl); - bind(IDEUpdater) - .toDynamicValue((context) => { - const client = context.container.get(IDEUpdaterClientImpl); - return ElectronIpcConnectionProvider.createProxy( - context.container, - IDEUpdaterPath, - client - ); - }) - .inSingletonScope(); + bind(IDEUpdater).toConstantValue({} as IDEUpdater); + // .toDynamicValue((context) => { + // const client = context.container.get(IDEUpdaterClientImpl); + // return ElectronIpcConnectionProvider.createProxy( + // context.container, + // IDEUpdaterPath, + // client + // ); + // }) + // .inSingletonScope(); bind(HostedPluginSupportImpl).toSelf().inSingletonScope(); bind(HostedPluginSupport).toService(HostedPluginSupportImpl); @@ -1113,6 +1108,32 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => { ); bindViewsWelcome_TheiaGH14309({ bind, widget: TreeViewWidget }); + + bind(DialogService).toConstantValue({}); + bind(AppService).toConstantValue({ + quit() { + console.log('Quitting application...'); + // Implement quit logic here + }, + async info() { + return { + name: 'MyApp', + version: '1.0.0', + description: 'An example application', + appVersion: '1.0.0', + cliVersion: '1.0.0', + buildDate: new Date().toISOString(), + } as AppInfo; + }, + registerStartupTasksHandler(_) { + console.log('registerStartupTasksHandler', _); + return { dispose: () => {} }; + }, + scheduleDeletion(_) { + console.log(`Scheduled deletion for sketch}`, _); + // Implement deletion logic + }, + }); }); // Align the viewsWelcome rendering with VS Code (https://github.com/eclipse-theia/theia/issues/14309) diff --git a/arduino-ide-extension/src/browser/contributions/check-for-updates.ts b/arduino-ide-extension/src/browser/contributions/check-for-updates.ts index d305f9db2..1b28d44de 100644 --- a/arduino-ide-extension/src/browser/contributions/check-for-updates.ts +++ b/arduino-ide-extension/src/browser/contributions/check-for-updates.ts @@ -15,7 +15,6 @@ import { Installable } from '../../common/protocol/installable'; import { ExecuteWithProgress } from '../../common/protocol/progressible'; import { BoardsListWidgetFrontendContribution } from '../boards/boards-widget-frontend-contribution'; import { LibraryListWidgetFrontendContribution } from '../library/library-widget-frontend-contribution'; -import { WindowServiceExt } from '../theia/core/window-service-ext'; import type { ListWidget } from '../widgets/component-list/list-widget'; import { Command, CommandRegistry, Contribution } from './contribution'; @@ -53,8 +52,8 @@ const Updatable = { type: 'Updatable' } as const; @injectable() export class CheckForUpdates extends Contribution { - @inject(WindowServiceExt) - private readonly windowService: WindowServiceExt; + // @inject(WindowServiceExt) + // private readonly windowService: WindowServiceExt; @inject(ResponseServiceClient) private readonly responseService: ResponseServiceClient; @inject(BoardsService) @@ -72,16 +71,16 @@ export class CheckForUpdates extends Contribution { }); } - override async onReady(): Promise { - const checkForUpdates = this.preferences['arduino.checkForUpdates']; - if (checkForUpdates) { - this.windowService.isFirstWindow().then((firstWindow) => { - if (firstWindow) { - this.checkForUpdates(); - } - }); - } - } + // override async onReady(): Promise { + // const checkForUpdates = this.preferences['arduino.checkForUpdates']; + // if (checkForUpdates) { + // this.windowService.isFirstWindow().then((firstWindow) => { + // if (firstWindow) { + // this.checkForUpdates(); + // } + // }); + // } + // } private async checkForUpdates(silent = true) { const [boardsPackages, libraryPackages] = await Promise.all([ diff --git a/arduino-ide-extension/src/browser/contributions/close.ts b/arduino-ide-extension/src/browser/contributions/close.ts index c5bab561f..619d89298 100644 --- a/arduino-ide-extension/src/browser/contributions/close.ts +++ b/arduino-ide-extension/src/browser/contributions/close.ts @@ -7,11 +7,10 @@ import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shel import { nls } from '@theia/core/lib/common/nls'; import type { MaybePromise } from '@theia/core/lib/common/types'; import { toArray } from '@theia/core/shared/@phosphor/algorithm'; -import { inject, injectable } from '@theia/core/shared/inversify'; +import { injectable } from '@theia/core/shared/inversify'; import { MonacoEditor } from '@theia/monaco/lib/browser/monaco-editor'; import { ArduinoMenus } from '../menu/arduino-menus'; import { CurrentSketch } from '../sketches-service-client-impl'; -import { WindowServiceExt } from '../theia/core/window-service-ext'; import { Command, CommandRegistry, @@ -28,8 +27,8 @@ import { SaveAsSketch } from './save-as-sketch'; */ @injectable() export class Close extends SketchContribution { - @inject(WindowServiceExt) - private readonly windowServiceExt: WindowServiceExt; + // @inject(WindowServiceExt) + // private readonly windowServiceExt: WindowServiceExt; private shell: ApplicationShell | undefined; @@ -59,7 +58,7 @@ export class Close extends SketchContribution { } } } - return this.windowServiceExt.close(); + // return this.windowServiceExt.close(); }, }); } diff --git a/arduino-ide-extension/src/browser/contributions/update-indexes.ts b/arduino-ide-extension/src/browser/contributions/update-indexes.ts index fc4e6d078..34577da1b 100644 --- a/arduino-ide-extension/src/browser/contributions/update-indexes.ts +++ b/arduino-ide-extension/src/browser/contributions/update-indexes.ts @@ -3,13 +3,12 @@ import { nls } from '@theia/core/lib/common/nls'; import { inject, injectable } from '@theia/core/shared/inversify'; import { CoreService, IndexType } from '../../common/protocol'; import { NotificationCenter } from '../notification-center'; -import { WindowServiceExt } from '../theia/core/window-service-ext'; import { Command, CommandRegistry, Contribution } from './contribution'; @injectable() export class UpdateIndexes extends Contribution { - @inject(WindowServiceExt) - private readonly windowService: WindowServiceExt; + // @inject(WindowServiceExt) + // private readonly windowService: WindowServiceExt; @inject(LocalStorageService) private readonly localStorage: LocalStorageService; @inject(CoreService) @@ -53,30 +52,28 @@ export class UpdateIndexes extends Contribution { return; } - if (await this.windowService.isFirstWindow()) { - const summary = await this.coreService.indexUpdateSummaryBeforeInit(); - if (summary.message) { - this.messageService.error(summary.message); - } - const typesToCheck = IndexType.All.filter((type) => !(type in summary)); - if (Object.keys(summary).length) { - console.debug( - `[update-indexes]: Detected an index update summary before the core gRPC client initialization. Updating local storage with ${JSON.stringify( - summary - )}` - ); - } else { - console.debug( - '[update-indexes]: No index update summary was available before the core gRPC client initialization. Checking the status of the all the index types.' - ); - } - await Promise.allSettled([ - ...Object.entries(summary).map(([type, updatedAt]) => - this.setLastUpdateDateTime(type as IndexType, updatedAt) - ), - this.updateIndexes(typesToCheck), - ]); + const summary = await this.coreService.indexUpdateSummaryBeforeInit(); + if (summary.message) { + this.messageService.error(summary.message); } + const typesToCheck = IndexType.All.filter((type) => !(type in summary)); + if (Object.keys(summary).length) { + console.debug( + `[update-indexes]: Detected an index update summary before the core gRPC client initialization. Updating local storage with ${JSON.stringify( + summary + )}` + ); + } else { + console.debug( + '[update-indexes]: No index update summary was available before the core gRPC client initialization. Checking the status of the all the index types.' + ); + } + await Promise.allSettled([ + ...Object.entries(summary).map(([type, updatedAt]) => + this.setLastUpdateDateTime(type as IndexType, updatedAt) + ), + this.updateIndexes(typesToCheck), + ]); } private async updateIndexes( diff --git a/arduino-ide-extension/src/browser/theia/core/browser-main-menu-factory.ts b/arduino-ide-extension/src/browser/theia/core/browser-main-menu-factory.ts new file mode 100644 index 000000000..869be3e33 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/core/browser-main-menu-factory.ts @@ -0,0 +1,26 @@ +import { injectable } from '@theia/core/shared/inversify'; +import { + BrowserMainMenuFactory as TheiaBrowserMainMenuFactory, + MenuBarWidget, +} from '@theia/core/lib/browser/menu/browser-menu-plugin'; +import { MainMenuManager } from '../../../common/main-menu-manager'; + +@injectable() +export class BrowserMainMenuFactory + extends TheiaBrowserMainMenuFactory + implements MainMenuManager +{ + protected menuBar: MenuBarWidget | undefined; + + override createMenuBar(): MenuBarWidget { + this.menuBar = super.createMenuBar(); + return this.menuBar; + } + + update(): void { + if (this.menuBar) { + this.menuBar.clearMenus(); + this.fillMenuBar(this.menuBar); + } + } +} \ No newline at end of file diff --git a/arduino-ide-extension/src/browser/theia/core/browser-menu-module.ts b/arduino-ide-extension/src/browser/theia/core/browser-menu-module.ts new file mode 100644 index 000000000..fb887142f --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/core/browser-menu-module.ts @@ -0,0 +1,18 @@ +import '../../../../src/browser/style/browser-menu.css'; +import { ContainerModule } from '@theia/core/shared/inversify'; +import { + BrowserMenuBarContribution, + BrowserMainMenuFactory as TheiaBrowserMainMenuFactory, +} from '@theia/core/lib/browser/menu/browser-menu-plugin'; +import { MainMenuManager } from '../../../common/main-menu-manager'; +import { ArduinoMenuContribution } from './browser-menu-plugin'; +import { BrowserMainMenuFactory } from './browser-main-menu-factory'; + +export default new ContainerModule((bind, unbind, isBound, rebind) => { + bind(BrowserMainMenuFactory).toSelf().inSingletonScope(); + bind(MainMenuManager).toService(BrowserMainMenuFactory); + rebind(TheiaBrowserMainMenuFactory).toService(BrowserMainMenuFactory); + rebind(BrowserMenuBarContribution) + .to(ArduinoMenuContribution) + .inSingletonScope(); +}); diff --git a/arduino-ide-extension/src/browser/theia/core/browser-window-module.ts b/arduino-ide-extension/src/browser/theia/core/browser-window-module.ts new file mode 100644 index 000000000..fe61baf3d --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/core/browser-window-module.ts @@ -0,0 +1,20 @@ +import { DefaultWindowService as TheiaDefaultWindowService } from '@theia/core/lib/browser/window/default-window-service'; +import { injectable } from '@theia/core/shared/inversify'; +import { WindowServiceExt } from './window-service-ext'; + +@injectable() +export class DefaultWindowService + extends TheiaDefaultWindowService + implements WindowServiceExt +{ + close(): void { + throw new Error('Method not implemented.'); + } + /** + * The default implementation always resolves to `true`. + * IDE2 does not use it. It's currently an electron-only app. + */ + async isFirstWindow(): Promise { + return true; + } +} diff --git a/arduino-ide-extension/src/browser/theia/core/default-window-service.ts b/arduino-ide-extension/src/browser/theia/core/default-window-service.ts new file mode 100644 index 000000000..2d318f5e8 --- /dev/null +++ b/arduino-ide-extension/src/browser/theia/core/default-window-service.ts @@ -0,0 +1,21 @@ +import { DefaultWindowService as TheiaDefaultWindowService } from '@theia/core/lib/browser/window/default-window-service'; +import { injectable } from '@theia/core/shared/inversify'; +import { WindowServiceExt } from './window-service-ext'; + +@injectable() +export class DefaultWindowService + extends TheiaDefaultWindowService + implements WindowServiceExt +{ + /** + * The default implementation always resolves to `true`. + * IDE2 does not use it. It's currently an electron-only app. + */ + async isFirstWindow(): Promise { + return true; + } + + close() { + console.log('close'); + } +} diff --git a/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts b/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts index 2604c3caf..3ed83aff2 100644 --- a/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts +++ b/arduino-ide-extension/src/browser/theia/monaco/monaco-theming-service.ts @@ -22,7 +22,6 @@ import { MonacoThemeRegistry as TheiaMonacoThemeRegistry } from '@theia/monaco/l import type { ThemeMix } from '@theia/monaco/lib/browser/textmate/monaco-theme-types'; import { HostedPluginSupport } from '../../hosted/hosted-plugin-support'; import { ArduinoThemes, compatibleBuiltInTheme } from '../core/theming'; -import { WindowServiceExt } from '../core/window-service-ext'; type MonacoThemeRegistrationSource = /** @@ -156,8 +155,8 @@ export class CleanupObsoleteThemes implements FrontendApplicationContribution { private readonly themeService: ThemeService; @inject(MessageService) private readonly messageService: MessageService; - @inject(WindowServiceExt) - private readonly windowService: WindowServiceExt; + // @inject(WindowServiceExt) + // private readonly windowService: WindowServiceExt; onStart(): void { this.hostedPlugin.didStart.then(() => this.cleanupObsoleteThemes()); @@ -172,7 +171,7 @@ export class CleanupObsoleteThemes implements FrontendApplicationContribution { if (!obsoleteThemeIds.length) { return; } - const firstWindow = await this.windowService.isFirstWindow(); + const firstWindow = true; // await this.windowService.isFirstWindow(); if (firstWindow) { await this.removeObsoleteThemesFromIndexedDB(obsoleteThemeIds); this.unregisterObsoleteThemes(obsoleteThemeIds); diff --git a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts index f039d5816..186359ebc 100644 --- a/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts +++ b/arduino-ide-extension/src/browser/theia/workspace/workspace-service.ts @@ -19,14 +19,13 @@ import { hasStartupTasks, StartupTask, } from '../../../electron-common/startup-task'; -import { WindowServiceExt } from '../core/window-service-ext'; @injectable() export class WorkspaceService extends TheiaWorkspaceService { @inject(SketchesService) private readonly sketchesService: SketchesService; - @inject(WindowServiceExt) - private readonly windowServiceExt: WindowServiceExt; + // @inject(WindowServiceExt) + // private readonly windowServiceExt: WindowServiceExt; @inject(ContributionProvider) @named(StartupTaskProvider) private readonly providers: ContributionProvider; @@ -104,7 +103,8 @@ export class WorkspaceService extends TheiaWorkspaceService { protected override reloadWindow(options?: WorkspaceInput): void { const tasks = this.tasks(options); this.setURLFragment(this._workspace?.resource.path.toString() || ''); - this.windowServiceExt.reload({ tasks }); + console.log(tasks); + // this.windowServiceExt.reload({ tasks }); } protected override openNewWindow( diff --git a/arduino-ide-extension/src/common/main-menu-manager.ts b/arduino-ide-extension/src/common/main-menu-manager.ts index 37970c9b3..be11ae6d3 100644 --- a/arduino-ide-extension/src/common/main-menu-manager.ts +++ b/arduino-ide-extension/src/common/main-menu-manager.ts @@ -1,8 +1,10 @@ -export const MainMenuManager = Symbol('MainMenuManager'); -export interface MainMenuManager { +// export const MainMenuManager = Symbol('MainMenuManager'); +export class MainMenuManager { /** * Call this method if you have changed the content of the main menu (updated a toggle flag, removed/added new groups or menu items) * and you want to re-render it from scratch. Works for electron too. */ - update(): void; + update() { + console.warn('MainMenuManager.update() is not implemented'); + } } diff --git a/browser-app/package.json b/browser-app/package.json new file mode 100644 index 000000000..eaf981e0c --- /dev/null +++ b/browser-app/package.json @@ -0,0 +1,64 @@ +{ + "private": true, + "name": "browser-app", + "version": "2.0.0", + "license": "AGPL-3.0-or-later", + "dependencies": { + "@theia/core": "1.41.0", + "@theia/debug": "1.41.0", + "@theia/editor": "1.41.0", + "@theia/file-search": "1.41.0", + "@theia/filesystem": "1.41.0", + "@theia/keymaps": "1.41.0", + "@theia/messages": "1.41.0", + "@theia/monaco": "1.41.0", + "@theia/navigator": "1.41.0", + "@theia/plugin-ext": "1.41.0", + "@theia/plugin-ext-vscode": "1.41.0", + "@theia/preferences": "1.41.0", + "@theia/process": "1.41.0", + "@theia/terminal": "1.41.0", + "@theia/workspace": "1.41.0", + "arduino-ide-extension": "2.3.5" + }, + "devDependencies": { + "@theia/cli": "1.41.0" + }, + "scripts": { + "build:dev": "theia build --config webpack.config.js --mode development", + "prepare": "theia build --mode development", + "start": "theia start", + "watch": "theia build --watch --mode development" + }, + "theia": { + "frontend": { + "config": { + "applicationName": "Arduino IDE", + "defaultTheme": "arduino-theme", + "preferences": { + "files.autoSave": "afterDelay", + "editor.minimap.enabled": false, + "editor.tabSize": 2, + "editor.scrollBeyondLastLine": false, + "editor.quickSuggestions": { + "other": false, + "comments": false, + "strings": false + }, + "breadcrumbs.enabled": false + } + } + }, + "backend": { + "config": { + "configDirName": ".arduinoIDE" + } + }, + "generator": { + "config": { + "preloadTemplate": "
" + } + } + } + } + \ No newline at end of file diff --git a/browser-app/webpack.config.js b/browser-app/webpack.config.js new file mode 100644 index 000000000..4bf3b8497 --- /dev/null +++ b/browser-app/webpack.config.js @@ -0,0 +1,20 @@ +/** + * This file can be edited to customize webpack configuration. + * To reset delete this file and rerun theia build again. + */ +// @ts-check +const config = require('./gen-webpack.config.js'); + +config[0].resolve.fallback['http'] = false; +config[0].resolve.fallback['fs'] = false; + +/** + * Expose bundled modules on window.theia.moduleName namespace, e.g. + * window['theia']['@theia/core/lib/common/uri']. + * Such syntax can be used by external code, for instance, for testing. +config.module.rules.push({ + test: /\.js$/, + loader: require.resolve('@theia/application-manager/lib/expose-loader') +}); */ + +module.exports = config; \ No newline at end of file diff --git a/package.json b/package.json index 6f66bf55a..19abe81c9 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ }, "scripts": { "prepare": "lerna run prepare", - "cleanup": "rimraf ./**/node_modules && rm -rf ./node_modules ./.browser_modules ./arduino-ide-extension/build ./arduino-ide-extension/downloads ./arduino-ide-extension/Examples ./arduino-ide-extension/lib ./electron-app/lib ./electron-app/src-gen ./electron-app/gen-webpack.config.js", + "cleanup": "rimraf ./**/node_modules && rm -rf ./node_modules ./.browser_modules ./arduino-ide-extension/build ./arduino-ide-extension/downloads ./arduino-ide-extension/Examples ./arduino-ide-extension/lib ./electron-app/lib ./electron-app/src-gen ./electron-app/gen-webpack.config.js ./browser-app/lib ./browser-app/src-gen ./browser-app/gen-webpack.config.js", "rebuild:browser": "theia rebuild:browser", "rebuild:electron": "theia rebuild:electron", "start": "yarn --cwd ./electron-app start", @@ -54,7 +54,7 @@ "test": "lerna run test", "test:slow": "lerna run test:slow", "update:version": "node ./scripts/update-version.js", - "i18n:generate": "theia nls-extract -e vscode -f \"+(arduino-ide-extension|electron-app|plugins)/**/*.ts?(x)\" -o ./i18n/en.json", + "i18n:generate": "theia nls-extract -e vscode -f \"+(arduino-ide-extension|browser-app|electron-app|plugins)/**/*.ts?(x)\" -o ./i18n/en.json", "i18n:check": "yarn i18n:generate && git add -N ./i18n && git diff --exit-code ./i18n", "i18n:push": "node ./scripts/i18n/transifex-push.js ./i18n/en.json", "i18n:pull": "node ./scripts/i18n/transifex-pull.js ./i18n/", @@ -74,6 +74,7 @@ }, "workspaces": [ "arduino-ide-extension", - "electron-app" + "electron-app", + "browser-app" ] } diff --git a/scripts/update-version.js b/scripts/update-version.js index e787dba44..be0de261c 100644 --- a/scripts/update-version.js +++ b/scripts/update-version.js @@ -38,6 +38,7 @@ console.log( for (const toUpdate of [ path.join(repoRootPath, 'package.json'), path.join(repoRootPath, 'electron-app', 'package.json'), + path.join(repoRootPath, 'browser-app', 'package.json'), path.join(repoRootPath, 'arduino-ide-extension', 'package.json'), ]) { process.stdout.write(` Updating ${toUpdate}'...`);