// @ts-check require('reflect-metadata'); const { performance } = require('perf_hooks'); const startupLog = (milestone) => console.debug(`Backend server: ${milestone} [${(performance.now() / 1000).toFixed(3)} s since backend process start]`); startupLog('loading modules...'); // Erase the ELECTRON_RUN_AS_NODE variable from the environment, else Electron apps started using Theia will pick it up. if ('ELECTRON_RUN_AS_NODE' in process.env) { delete process.env.ELECTRON_RUN_AS_NODE; } const path = require('path'); process.env.THEIA_APP_PROJECT_PATH = path.resolve(__dirname, '..', '..') const express = require('@theia/core/shared/express'); const { Container } = require('@theia/core/shared/inversify'); const { BackendApplication, BackendApplicationServer, CliManager } = require('@theia/core/lib/node'); const { backendApplicationModule } = require('@theia/core/lib/node/backend-application-module'); const { messagingBackendModule } = require('@theia/core/lib/node/messaging/messaging-backend-module'); const { loggerBackendModule } = require('@theia/core/lib/node/logger-backend-module'); const container = new Container(); container.load(backendApplicationModule); container.load(messagingBackendModule); container.load(loggerBackendModule); startupLog('container created'); function defaultServeStatic(app) { app.use(express.static(path.resolve(__dirname, '../../lib/frontend'))) } function load(raw) { return Promise.resolve(raw).then( module => container.load(module.default) ); } async function start(port, host, argv = process.argv) { if (!container.isBound(BackendApplicationServer)) { container.bind(BackendApplicationServer).toConstantValue({ configure: defaultServeStatic }); } let result = undefined; await container.get(CliManager).initializeCli(argv.slice(2), () => { startupLog('resolving application'); const application = container.get(BackendApplication); startupLog('application resolved'); return application.configured; }, async () => { result = container.get(BackendApplication).start(port, host); }); if (result) { return result; } else { return Promise.reject(0); } } module.exports = async (port, host, argv) => { try { await load(require('@theia/core/lib/node/i18n/i18n-backend-module')); await load(require('@theia/core/lib/node/hosting/backend-hosting-module')); await load(require('@theia/core/lib/node/request/backend-request-module')); await load(require('@git.zone/ide-extension-remote/lib/node/gitzone-remote-backend-module')); await load(require('@theia/editor/lib/node/editor-backend-module')); await load(require('@theia/filesystem/lib/node/filesystem-backend-module')); await load(require('@theia/filesystem/lib/node/download/file-download-backend-module')); await load(require('@theia/workspace/lib/node/workspace-backend-module')); await load(require('@theia/markers/lib/node/problem-backend-module')); await load(require('@theia/messages/lib/node/messages-backend-module')); await load(require('@theia/navigator/lib/node/navigator-backend-module')); await load(require('@theia/output/lib/node/output-backend-module')); await load(require('@theia/ai-core/lib/node/ai-core-backend-module')); await load(require('@theia/ai-mcp/lib/node/mcp-backend-module')); await load(require('@theia/process/lib/common/process-common-module')); await load(require('@theia/process/lib/node/process-backend-module')); await load(require('@theia/file-search/lib/node/file-search-backend-module')); await load(require('@theia/terminal/lib/node/terminal-backend-module')); await load(require('@theia/preferences/lib/node/preference-backend-module')); await load(require('@theia/task/lib/node/task-backend-module')); await load(require('@theia/test/lib/node/test-backend-module')); await load(require('@theia/debug/lib/node/debug-backend-module')); await load(require('@theia/editor-preview/lib/node/editor-preview-backend-module')); await load(require('@theia/notebook/lib/node/notebook-backend-module')); await load(require('@theia/scm/lib/node/scm-backend-module')); await load(require('@theia/search-in-workspace/lib/node/search-in-workspace-backend-module')); await load(require('@theia/plugin-ext/lib/plugin-ext-backend-module')); await load(require('@theia/plugin-ext-vscode/lib/node/plugin-vscode-backend-module')); await load(require('@theia/vsx-registry/lib/common/vsx-registry-common-module')); await load(require('@theia/vsx-registry/lib/node/vsx-registry-backend-module')); startupLog('modules loaded'); return await start(port, host, argv); } catch (error) { if (typeof error !== 'number') { console.error('Failed to start the backend application:'); console.error(error); process.exitCode = 1; } throw error; } }