/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { URI } from 'vs/base/common/uri'; import * as browser from 'vs/base/browser/browser'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { Event } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { IGalleryExtension, IExtensionIdentifier, IReportedExtension, IExtensionManagementService, ILocalExtension, IGalleryMetadata } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IExtensionTipsService, ExtensionRecommendationReason, IExtensionRecommendation } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { ExtensionType, ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IURLHandler, IURLService } from 'vs/platform/url/common/url'; import { ConsoleLogService, ILogService } from 'vs/platform/log/common/log'; import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IUpdateService, State } from 'vs/platform/update/common/update'; import { IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen, IMessageBoxResult, IWindowsService, IOpenSettings, IWindowSettings } from 'vs/platform/windows/common/windows'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesService } from 'vs/platform/workspaces/common/workspaces'; import { IRecentlyOpened, IRecent, isRecentFile, isRecentFolder } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common/workspaceEditing'; import { ITunnelService } from 'vs/platform/remote/common/tunnel'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; // tslint:disable-next-line: import-patterns import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { addDisposableListener, EventType } from 'vs/base/browser/dom'; import { IEditorService, IResourceEditor } from 'vs/workbench/services/editor/common/editorService'; import { pathsToEditors } from 'vs/workbench/common/editor'; import { IFileService } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ParsedArgs, IEnvironmentService } from 'vs/platform/environment/common/environment'; import { IProcessEnvironment } from 'vs/base/common/platform'; import { toStoreData, restoreRecentlyOpened } from 'vs/platform/history/common/historyStorage'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; // tslint:disable-next-line: import-patterns import { IExperimentService, IExperiment, ExperimentActionType, ExperimentState } from 'vs/workbench/contrib/experiments/common/experimentService'; import { ExtensionHostDebugChannelClient, ExtensionHostDebugBroadcastChannel } from 'vs/platform/debug/common/extensionHostDebugIpc'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; //#region Extension Tips export class SimpleExtensionTipsService implements IExtensionTipsService { _serviceBrand: any; onRecommendationChange = Event.None; getAllRecommendationsWithReason(): { [id: string]: { reasonId: ExtensionRecommendationReason; reasonText: string; }; } { return Object.create(null); } getFileBasedRecommendations(): IExtensionRecommendation[] { return []; } getOtherRecommendations(): Promise { return Promise.resolve([]); } getWorkspaceRecommendations(): Promise { return Promise.resolve([]); } getKeymapRecommendations(): IExtensionRecommendation[] { return []; } toggleIgnoredRecommendation(extensionId: string, shouldIgnore: boolean): void { } getAllIgnoredRecommendations(): { global: string[]; workspace: string[]; } { return { global: [], workspace: [] }; } // {{SQL CARBON EDIT}} getRecommendedExtensionsByScenario(scenarioType: string): Promise { return Promise.resolve([]); } promptRecommendedExtensionsByScenario(scenarioType: string): void { return; } // {{SQL CARBON EDIT}} - End } registerSingleton(IExtensionTipsService, SimpleExtensionTipsService, true); //#endregion export class SimpleExtensionManagementService implements IExtensionManagementService { _serviceBrand: any; onInstallExtension = Event.None; onDidInstallExtension = Event.None; onUninstallExtension = Event.None; onDidUninstallExtension = Event.None; zip(extension: ILocalExtension): Promise { // @ts-ignore return Promise.resolve(undefined); } unzip(zipLocation: URI, type: ExtensionType): Promise { // @ts-ignore return Promise.resolve(undefined); } install(vsix: URI): Promise { // @ts-ignore return Promise.resolve(undefined); } installFromGallery(extension: IGalleryExtension): Promise { // @ts-ignore return Promise.resolve(undefined); } uninstall(extension: ILocalExtension, force?: boolean): Promise { return Promise.resolve(undefined); } reinstallFromGallery(extension: ILocalExtension): Promise { return Promise.resolve(undefined); } getInstalled(type?: ExtensionType): Promise { // @ts-ignore return Promise.resolve([]); } getExtensionsReport(): Promise { // @ts-ignore return Promise.resolve([]); } updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): Promise { // @ts-ignore return Promise.resolve(local); } } registerSingleton(IExtensionManagementService, SimpleExtensionManagementService); //#endregion //#region Extension URL Handler export const IExtensionUrlHandler = createDecorator('inactiveExtensionUrlHandler'); export interface IExtensionUrlHandler { readonly _serviceBrand: any; registerExtensionHandler(extensionId: ExtensionIdentifier, handler: IURLHandler): void; unregisterExtensionHandler(extensionId: ExtensionIdentifier): void; } export class SimpleExtensionURLHandler implements IExtensionUrlHandler { _serviceBrand: any; registerExtensionHandler(extensionId: ExtensionIdentifier, handler: IURLHandler): void { } unregisterExtensionHandler(extensionId: ExtensionIdentifier): void { } } registerSingleton(IExtensionUrlHandler, SimpleExtensionURLHandler, true); //#endregion //#region Log export class SimpleLogService extends ConsoleLogService { } //#endregion //#region Multi Extension Management export class SimpleMultiExtensionsManagementService implements IExtensionManagementService { _serviceBrand: any; onInstallExtension = Event.None; onDidInstallExtension = Event.None; onUninstallExtension = Event.None; onDidUninstallExtension = Event.None; zip(extension: ILocalExtension): Promise { // @ts-ignore return Promise.resolve(undefined); } unzip(zipLocation: URI, type: ExtensionType): Promise { // @ts-ignore return Promise.resolve(undefined); } install(vsix: URI): Promise { // @ts-ignore return Promise.resolve(undefined); } installFromGallery(extension: IGalleryExtension): Promise { // @ts-ignore return Promise.resolve(undefined); } uninstall(extension: ILocalExtension, force?: boolean): Promise { return Promise.resolve(undefined); } reinstallFromGallery(extension: ILocalExtension): Promise { return Promise.resolve(undefined); } getInstalled(type?: ExtensionType): Promise { // @ts-ignore return Promise.resolve(undefined); } getExtensionsReport(): Promise { // @ts-ignore return Promise.resolve(undefined); } updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): Promise { // @ts-ignore return Promise.resolve(undefined); } } //#endregion //#region Update export class SimpleUpdateService implements IUpdateService { _serviceBrand: any; onStateChange = Event.None; state: State; checkForUpdates(context: any): Promise { return Promise.resolve(undefined); } downloadUpdate(): Promise { return Promise.resolve(undefined); } applyUpdate(): Promise { return Promise.resolve(undefined); } quitAndInstall(): Promise { return Promise.resolve(undefined); } isLatestVersion(): Promise { return Promise.resolve(true); } } registerSingleton(IUpdateService, SimpleUpdateService); //#endregion //#region URL export class SimpleURLService implements IURLService { _serviceBrand: any; open(url: URI): Promise { return Promise.resolve(false); } registerHandler(handler: IURLHandler): IDisposable { return Disposable.None; } } registerSingleton(IURLService, SimpleURLService); //#endregion //#region Window export class SimpleWindowService extends Disposable implements IWindowService { _serviceBrand: any; readonly onDidChangeFocus: Event = Event.None; readonly onDidChangeMaximize: Event = Event.None; readonly hasFocus = true; readonly windowId = 0; static readonly RECENTLY_OPENED_KEY = 'recently.opened'; constructor( @IEditorService private readonly editorService: IEditorService, @IFileService private readonly fileService: IFileService, @IConfigurationService private readonly configurationService: IConfigurationService, @IStorageService private readonly storageService: IStorageService, @IWorkspaceContextService private readonly workspaceService: IWorkspaceContextService, @ILogService private readonly logService: ILogService, @IWorkbenchEnvironmentService private readonly workbenchEnvironmentService: IWorkbenchEnvironmentService ) { super(); this.addWorkspaceToRecentlyOpened(); this.registerListeners(); } private addWorkspaceToRecentlyOpened(): void { const workspace = this.workspaceService.getWorkspace(); switch (this.workspaceService.getWorkbenchState()) { case WorkbenchState.FOLDER: this.addRecentlyOpened([{ folderUri: workspace.folders[0].uri }]); break; case WorkbenchState.WORKSPACE: this.addRecentlyOpened([{ workspace: { id: workspace.id, configPath: workspace.configuration! } }]); break; } } private registerListeners(): void { this._register(addDisposableListener(document, EventType.FULLSCREEN_CHANGE, () => { if (document.fullscreenElement || (document).webkitFullscreenElement) { browser.setFullscreen(true); } else { browser.setFullscreen(false); } })); this._register(addDisposableListener(document, EventType.WK_FULLSCREEN_CHANGE, () => { if (document.fullscreenElement || (document).webkitFullscreenElement || (document).webkitIsFullScreen) { browser.setFullscreen(true); } else { browser.setFullscreen(false); } })); } isFocused(): Promise { return Promise.resolve(this.hasFocus); } isMaximized(): Promise { return Promise.resolve(false); } pickFileFolderAndOpen(_options: INativeOpenDialogOptions): Promise { return Promise.resolve(); } pickFileAndOpen(_options: INativeOpenDialogOptions): Promise { return Promise.resolve(); } pickFolderAndOpen(_options: INativeOpenDialogOptions): Promise { return Promise.resolve(); } pickWorkspaceAndOpen(_options: INativeOpenDialogOptions): Promise { return Promise.resolve(); } reloadWindow(): Promise { window.location.reload(); return Promise.resolve(); } openDevTools(): Promise { return Promise.resolve(); } toggleDevTools(): Promise { return Promise.resolve(); } closeWorkspace(): Promise { return Promise.resolve(); } enterWorkspace(_path: URI): Promise { return Promise.resolve(undefined); } toggleFullScreen(target?: HTMLElement): Promise { if (!target) { return Promise.resolve(); } // Chromium if ((document).fullscreen !== undefined) { if (!(document).fullscreen) { return (target).requestFullscreen().catch(() => { // if it fails, chromium throws an exception with error undefined. // re https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullscreen console.warn('Toggle Full Screen failed'); }); } else { return document.exitFullscreen().catch(() => { console.warn('Exit Full Screen failed'); }); } } // Safari and Edge 14 are all using webkit prefix if ((document).webkitIsFullScreen !== undefined) { try { if (!(document).webkitIsFullScreen) { (target).webkitRequestFullscreen(); // it's async, but doesn't return a real promise. } else { (document).webkitExitFullscreen(); // it's async, but doesn't return a real promise. } } catch { console.warn('Enter/Exit Full Screen failed'); } } return Promise.resolve(); } setRepresentedFilename(_fileName: string): Promise { return Promise.resolve(); } async getRecentlyOpened(): Promise { const recentlyOpenedRaw = this.storageService.get(SimpleWindowService.RECENTLY_OPENED_KEY, StorageScope.GLOBAL); if (recentlyOpenedRaw) { return restoreRecentlyOpened(JSON.parse(recentlyOpenedRaw), this.logService); } return { workspaces: [], files: [] }; } async addRecentlyOpened(recents: IRecent[]): Promise { const recentlyOpened = await this.getRecentlyOpened(); recents.forEach(recent => { if (isRecentFile(recent)) { this.doRemoveFromRecentlyOpened(recentlyOpened, [recent.fileUri]); recentlyOpened.files.unshift(recent); } else if (isRecentFolder(recent)) { this.doRemoveFromRecentlyOpened(recentlyOpened, [recent.folderUri]); recentlyOpened.workspaces.unshift(recent); } else { this.doRemoveFromRecentlyOpened(recentlyOpened, [recent.workspace.configPath]); recentlyOpened.workspaces.unshift(recent); } }); return this.saveRecentlyOpened(recentlyOpened); } async removeFromRecentlyOpened(paths: URI[]): Promise { const recentlyOpened = await this.getRecentlyOpened(); this.doRemoveFromRecentlyOpened(recentlyOpened, paths); return this.saveRecentlyOpened(recentlyOpened); } private doRemoveFromRecentlyOpened(recentlyOpened: IRecentlyOpened, paths: URI[]): void { recentlyOpened.files = recentlyOpened.files.filter(file => { return !paths.some(path => path.toString() === file.fileUri.toString()); }); recentlyOpened.workspaces = recentlyOpened.workspaces.filter(workspace => { return !paths.some(path => path.toString() === (isRecentFolder(workspace) ? workspace.folderUri.toString() : workspace.workspace.configPath.toString())); }); } private async saveRecentlyOpened(data: IRecentlyOpened): Promise { return this.storageService.store(SimpleWindowService.RECENTLY_OPENED_KEY, JSON.stringify(toStoreData(data)), StorageScope.GLOBAL); } focusWindow(): Promise { return Promise.resolve(); } maximizeWindow(): Promise { return Promise.resolve(); } unmaximizeWindow(): Promise { return Promise.resolve(); } minimizeWindow(): Promise { return Promise.resolve(); } async openWindow(_uris: IURIToOpen[], _options?: IOpenSettings): Promise { const { openFolderInNewWindow } = this.shouldOpenNewWindow(_options); for (let i = 0; i < _uris.length; i++) { const uri = _uris[i]; if ('folderUri' in uri) { const newAddress = `${document.location.origin}/?folder=${uri.folderUri.path}${this.workbenchEnvironmentService.configuration.connectionToken ? `&tkn=${this.workbenchEnvironmentService.configuration.connectionToken}` : ''}`; if (openFolderInNewWindow) { window.open(newAddress); } else { window.location.href = newAddress; } } if ('workspaceUri' in uri) { const newAddress = `${document.location.origin}/?workspace=${uri.workspaceUri.path}`; if (openFolderInNewWindow) { window.open(newAddress); } else { window.location.href = newAddress; } } if ('fileUri' in uri) { const inputs: IResourceEditor[] = await pathsToEditors([uri], this.fileService); this.editorService.openEditors(inputs); } } return Promise.resolve(); } private shouldOpenNewWindow(_options: IOpenSettings = {}): { openFolderInNewWindow: boolean } { const windowConfig = this.configurationService.getValue('window'); const openFolderInNewWindowConfig = (windowConfig && windowConfig.openFoldersInNewWindow) || 'default' /* default */; let openFolderInNewWindow = !!_options.forceNewWindow && !_options.forceReuseWindow; if (!_options.forceNewWindow && !_options.forceReuseWindow && (openFolderInNewWindowConfig === 'on' || openFolderInNewWindowConfig === 'off')) { openFolderInNewWindow = (openFolderInNewWindowConfig === 'on'); } return { openFolderInNewWindow }; } closeWindow(): Promise { return Promise.resolve(); } setDocumentEdited(_flag: boolean): Promise { return Promise.resolve(); } onWindowTitleDoubleClick(): Promise { return Promise.resolve(); } showMessageBox(_options: Electron.MessageBoxOptions): Promise { return Promise.resolve({ button: 0 }); } showSaveDialog(_options: Electron.SaveDialogOptions): Promise { throw new Error('not implemented'); } showOpenDialog(_options: Electron.OpenDialogOptions): Promise { throw new Error('not implemented'); } updateTouchBar(_items: ISerializableCommandAction[][]): Promise { return Promise.resolve(); } resolveProxy(url: string): Promise { return Promise.resolve(undefined); } } registerSingleton(IWindowService, SimpleWindowService); //#endregion //#region ExtensionHostDebugService export class SimpleExtensionHostDebugService extends ExtensionHostDebugChannelClient { constructor( @IRemoteAgentService remoteAgentService: IRemoteAgentService, //@IWindowService windowService: IWindowService, @IEnvironmentService environmentService: IEnvironmentService ) { const connection = remoteAgentService.getConnection(); if (!connection) { throw new Error('Missing agent connection'); } super(connection.getChannel(ExtensionHostDebugBroadcastChannel.ChannelName)); this._register(this.onReload(event => { if (environmentService.isExtensionDevelopment && environmentService.debugExtensionHost.debugId === event.sessionId) { //windowService.reloadWindow(); window.location.reload(); } })); this._register(this.onClose(event => { if (environmentService.isExtensionDevelopment && environmentService.debugExtensionHost.debugId === event.sessionId) { //this._windowService.closeWindow(); window.close(); } })); } } registerSingleton(IExtensionHostDebugService, SimpleExtensionHostDebugService); //#endregion //#region Window export class SimpleWindowsService implements IWindowsService { _serviceBrand: any; windowCount = 1; readonly onWindowOpen: Event = Event.None; readonly onWindowFocus: Event = Event.None; readonly onWindowBlur: Event = Event.None; readonly onWindowMaximize: Event = Event.None; readonly onWindowUnmaximize: Event = Event.None; readonly onRecentlyOpenedChange: Event = Event.None; constructor( @IWorkbenchEnvironmentService private readonly workbenchEnvironmentService: IWorkbenchEnvironmentService ) { } isFocused(_windowId: number): Promise { return Promise.resolve(true); } pickFileFolderAndOpen(_options: INativeOpenDialogOptions): Promise { return Promise.resolve(); } pickFileAndOpen(_options: INativeOpenDialogOptions): Promise { return Promise.resolve(); } pickFolderAndOpen(_options: INativeOpenDialogOptions): Promise { return Promise.resolve(); } pickWorkspaceAndOpen(_options: INativeOpenDialogOptions): Promise { return Promise.resolve(); } reloadWindow(_windowId: number): Promise { return Promise.resolve(); } openDevTools(_windowId: number): Promise { return Promise.resolve(); } toggleDevTools(_windowId: number): Promise { return Promise.resolve(); } closeWorkspace(_windowId: number): Promise { return Promise.resolve(); } enterWorkspace(_windowId: number, _path: URI): Promise { return Promise.resolve(undefined); } toggleFullScreen(_windowId: number): Promise { return Promise.resolve(); } setRepresentedFilename(_windowId: number, _fileName: string): Promise { return Promise.resolve(); } addRecentlyOpened(recents: IRecent[]): Promise { return Promise.resolve(); } removeFromRecentlyOpened(_paths: URI[]): Promise { return Promise.resolve(); } clearRecentlyOpened(): Promise { return Promise.resolve(); } getRecentlyOpened(_windowId: number): Promise { return Promise.resolve({ workspaces: [], files: [] }); } focusWindow(_windowId: number): Promise { return Promise.resolve(); } closeWindow(_windowId: number): Promise { return Promise.resolve(); } isMaximized(_windowId: number): Promise { return Promise.resolve(false); } maximizeWindow(_windowId: number): Promise { return Promise.resolve(); } minimizeWindow(_windowId: number): Promise { return Promise.resolve(); } unmaximizeWindow(_windowId: number): Promise { return Promise.resolve(); } onWindowTitleDoubleClick(_windowId: number): Promise { return Promise.resolve(); } setDocumentEdited(_windowId: number, _flag: boolean): Promise { return Promise.resolve(); } quit(): Promise { return Promise.resolve(); } relaunch(_options: { addArgs?: string[], removeArgs?: string[] }): Promise { return Promise.resolve(); } whenSharedProcessReady(): Promise { return Promise.resolve(); } toggleSharedProcess(): Promise { return Promise.resolve(); } // Global methods openWindow(_windowId: number, _uris: IURIToOpen[], _options: IOpenSettings): Promise { return Promise.resolve(); } openNewWindow(): Promise { return Promise.resolve(); } openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise { // we pass the "ParsedArgs" as query parameters of the URL let newAddress = `${document.location.origin}/?`; const f = args['folder-uri']; if (f) { let u: URI | undefined; if (Array.isArray(f)) { if (f.length > 0) { u = URI.parse(f[0]); } } else { u = URI.parse(f); } if (u) { newAddress += `folder=${encodeURIComponent(u.path)}`; } } const ep = args['extensionDevelopmentPath']; if (ep) { let u: string | undefined; if (Array.isArray(ep)) { if (ep.length > 0) { u = ep[0]; } } else { u = ep; } if (u) { newAddress += `&edp=${encodeURIComponent(u)}`; } } const di = args['debugId']; if (di) { newAddress += `&di=${encodeURIComponent(di)}`; } const ibe = args['inspect-brk-extensions']; if (ibe) { newAddress += `&ibe=${encodeURIComponent(ibe)}`; } // add connection token newAddress += `${this.workbenchEnvironmentService.configuration.connectionToken ? `tkn=${this.workbenchEnvironmentService.configuration.connectionToken}` : ''}`; window.open(newAddress); return Promise.resolve(); } getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> { return Promise.resolve([]); } getWindowCount(): Promise { return Promise.resolve(this.windowCount); } log(_severity: string, _args: string[]): Promise { return Promise.resolve(); } showItemInFolder(_path: URI): Promise { return Promise.resolve(); } newWindowTab(): Promise { return Promise.resolve(); } showPreviousWindowTab(): Promise { return Promise.resolve(); } showNextWindowTab(): Promise { return Promise.resolve(); } moveWindowTabToNewWindow(): Promise { return Promise.resolve(); } mergeAllWindowTabs(): Promise { return Promise.resolve(); } toggleWindowTabsBar(): Promise { return Promise.resolve(); } updateTouchBar(_windowId: number, _items: ISerializableCommandAction[][]): Promise { return Promise.resolve(); } getActiveWindowId(): Promise { return Promise.resolve(undefined); } // This needs to be handled from browser process to prevent // foreground ordering issues on Windows openExternal(_url: string): Promise { return Promise.resolve(true); } // TODO: this is a bit backwards startCrashReporter(_config: Electron.CrashReporterStartOptions): Promise { return Promise.resolve(); } showMessageBox(_windowId: number, _options: Electron.MessageBoxOptions): Promise { throw new Error('not implemented'); } showSaveDialog(_windowId: number, _options: Electron.SaveDialogOptions): Promise { throw new Error('not implemented'); } showOpenDialog(_windowId: number, _options: Electron.OpenDialogOptions): Promise { throw new Error('not implemented'); } openAboutDialog(): Promise { return Promise.resolve(); } resolveProxy(windowId: number, url: string): Promise { return Promise.resolve(undefined); } } registerSingleton(IWindowsService, SimpleWindowsService); //#endregion //#region Workspace Editing export class SimpleWorkspaceEditingService implements IWorkspaceEditingService { _serviceBrand: any; addFolders(folders: IWorkspaceFolderCreationData[], donotNotifyError?: boolean): Promise { return Promise.resolve(undefined); } removeFolders(folders: URI[], donotNotifyError?: boolean): Promise { return Promise.resolve(undefined); } updateFolders(index: number, deleteCount?: number, foldersToAdd?: IWorkspaceFolderCreationData[], donotNotifyError?: boolean): Promise { return Promise.resolve(undefined); } enterWorkspace(path: URI): Promise { return Promise.resolve(undefined); } createAndEnterWorkspace(folders: IWorkspaceFolderCreationData[], path?: URI): Promise { return Promise.resolve(undefined); } saveAndEnterWorkspace(path: URI): Promise { return Promise.resolve(undefined); } copyWorkspaceSettings(toWorkspace: IWorkspaceIdentifier): Promise { return Promise.resolve(undefined); } pickNewWorkspacePath(): Promise { // @ts-ignore return Promise.resolve(undefined); } } registerSingleton(IWorkspaceEditingService, SimpleWorkspaceEditingService, true); //#endregion //#region Workspaces export class SimpleWorkspacesService implements IWorkspacesService { _serviceBrand: any; createUntitledWorkspace(folders?: IWorkspaceFolderCreationData[], remoteAuthority?: string): Promise { // @ts-ignore return Promise.resolve(undefined); } deleteUntitledWorkspace(workspace: IWorkspaceIdentifier): Promise { return Promise.resolve(undefined); } getWorkspaceIdentifier(workspacePath: URI): Promise { // @ts-ignore return Promise.resolve(undefined); } } registerSingleton(IWorkspacesService, SimpleWorkspacesService); //#endregion //#region remote class SimpleTunnelService implements ITunnelService { _serviceBrand: any; openTunnel(remotePort: number) { return undefined; } } registerSingleton(ITunnelService, SimpleTunnelService); //#endregion //#region experiments class ExperimentService implements IExperimentService { _serviceBrand: any; async getExperimentById(id: string): Promise { return { enabled: false, id: '', state: ExperimentState.NoRun }; } async getExperimentsByType(type: ExperimentActionType): Promise { return []; } async getCuratedExtensionsList(curatedExtensionsKey: string): Promise { return []; } markAsCompleted(experimentId: string): void { } onExperimentEnabled: Event = Event.None; } registerSingleton(IExperimentService, ExperimentService); //#endregion