diff --git a/README.md b/README.md index a16ab050..eafed3f3 100644 --- a/README.md +++ b/README.md @@ -120,9 +120,10 @@ await initialize({ }) ``` -Additionally, this library exposes 22 modules that include the vscode version of some services (with some glue to make it work with monaco): +Additionally, this library exposes 23 modules that include the vscode version of some services (with some glue to make it work with monaco): - Extensions (included by default): `vscode/service-override/extensions` +- Files (included by default): `vscode/service-override/files` - Notifications: `vscode/service-override/notifications` - Dialogs: `vscode/service-override/dialogs` - Model: `vscode/service-override/model` @@ -135,7 +136,6 @@ Additionally, this library exposes 22 modules that include the vscode version of - VSCode themes: `vscode/service-override/theme` - Audio cue: `vscode/service-override/audioCue` - Debug: `vscode/service-override/debug` -- Files: `vscode/service-override/files` - Preferences: `vscode/service-override/preferences` - Views: `vscode/service-override/views` (Is exclusive with `editor`, do not use both at the same time) - QuickAccess: `vscode/service-override/quickaccess` @@ -144,6 +144,7 @@ Additionally, this library exposes 22 modules that include the vscode version of - Search: `vscode/service-override/search` - Markers: `vscode/service-override/markers` - Language detection worker: `vscode/service-override/languageDetectionWorker` +- Storage: `vscode/service-override/storage` Usage: @@ -295,8 +296,6 @@ It includes: - Keybinding service, with user keybindings editor - Debuggers -It also uses the `synchronizeJsonSchemas` function to register them on the monaco json worker and have autocomplete/hover on settings and keybindings. - From CLI run: ```bash diff --git a/demo/index.html b/demo/index.html index fc3e844d..97b6b635 100644 --- a/demo/index.html +++ b/demo/index.html @@ -20,6 +20,7 @@

Editor

+ @@ -29,10 +30,10 @@

Editor

Settings

-
+

Keybindings

-
+
diff --git a/demo/package-lock.json b/demo/package-lock.json index f408f32d..bbc886ed 100644 --- a/demo/package-lock.json +++ b/demo/package-lock.json @@ -36,7 +36,7 @@ }, "..": { "name": "@codingame/monaco-vscode-api", - "version": "1.81.0-next.0", + "version": "0.0.0-semantic-release", "license": "MIT", "bin": { "monaco-treemending": "monaco-treemending.js" diff --git a/demo/src/features/output.ts b/demo/src/features/output.ts index d7a544de..66d6c830 100644 --- a/demo/src/features/output.ts +++ b/demo/src/features/output.ts @@ -1,8 +1,17 @@ -import * as vscode from 'vscode' -import { onExtHostInitialized } from 'vscode/extensions' +import { ExtensionHostKind, onExtHostInitialized, registerExtension } from 'vscode/extensions' await new Promise(resolve => onExtHostInitialized(resolve)) +const { getApi } = registerExtension({ + name: 'outputDemo', + publisher: 'codingame', + version: '1.0.0', + engines: { + vscode: '*' + } +}, ExtensionHostKind.LocalProcess) + +const vscode = await getApi() const fakeOutputChannel = vscode.window.createOutputChannel('Fake output') const anotherFakeOutputChannel = vscode.window.createOutputChannel('Your code', 'javascript') diff --git a/demo/src/main.ts b/demo/src/main.ts index 3df5ce09..cde09852 100644 --- a/demo/src/main.ts +++ b/demo/src/main.ts @@ -1,13 +1,11 @@ import './style.css' -import 'monaco-editor/esm/vs/editor/editor.all.js' -import * as monaco from 'monaco-editor/esm/vs/editor/editor.api.js' -import 'monaco-editor/esm/vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard.js' -import './setup' +import * as monaco from 'monaco-editor' import { createConfiguredEditor, createModelReference } from 'vscode/monaco' import { registerFileSystemOverlay, HTMLFileSystemProvider } from 'vscode/service-override/files' import * as vscode from 'vscode' import { ILogService, StandaloneServices, IPreferencesService, IEditorService, IDialogService } from 'vscode/services' import { ConfirmResult } from 'vscode/service-override/views' +import { clearStorage } from './setup' import { CustomEditorInput } from './features/customView' import './features/debugger' import './features/search' @@ -80,7 +78,7 @@ await vscode.window.showTextDocument(mainDocument, { anotherFakeOutputChannel.replace(mainDocument.getText()) vscode.workspace.onDidChangeTextDocument((e) => { - if (e.document === mainDocument) { + if (e.document === mainDocument && e.contentChanges.length > 0) { anotherFakeOutputChannel.replace(e.document.getText()) } }) @@ -191,3 +189,7 @@ document.querySelector('#customEditorPanel')!.addEventListener('click', async () pinned: true }) }) + +document.querySelector('#clearStorage')!.addEventListener('click', async () => { + clearStorage() +}) diff --git a/demo/src/setup.ts b/demo/src/setup.ts index f4932b6f..2cae6a30 100644 --- a/demo/src/setup.ts +++ b/demo/src/setup.ts @@ -16,10 +16,11 @@ import getSnippetServiceOverride from 'vscode/service-override/snippets' import getQuickAccessServiceOverride from 'vscode/service-override/quickaccess' import getOutputServiceOverride from 'vscode/service-override/output' import getTerminalServiceOverride from 'vscode/service-override/terminal' -import getSearchAccessServiceOverride from 'vscode/service-override/search' -import getMarkersAccessServiceOverride from 'vscode/service-override/markers' -import getAccessibilityAccessServiceOverride from 'vscode/service-override/accessibility' +import getSearchServiceOverride from 'vscode/service-override/search' +import getMarkersServiceOverride from 'vscode/service-override/markers' +import getAccessibilityServiceOverride from 'vscode/service-override/accessibility' import getLanguageDetectionWorkerServiceOverride from 'vscode/service-override/languageDetectionWorker' +import getStorageServiceOverride, { IStorageItemsChangeEvent, StorageScope } from 'vscode/service-override/storage' import getExtensionServiceOverride from 'vscode/service-override/extensions' import EditorWorker from 'monaco-editor/esm/vs/editor/editor.worker.js?worker' import TextMateWorker from 'vscode/workers/textMate.worker?worker' @@ -49,6 +50,8 @@ window.MonacoEnvironment = { } } +const onStorageChange = new monaco.Emitter() + // Override services await initializeMonacoService({ ...getExtensionServiceOverride(toWorkerConfig(ExtensionHostWorker)), @@ -71,13 +74,33 @@ await initializeMonacoService({ }), ...getOutputServiceOverride(), ...getTerminalServiceOverride(new TerminalBackend()), - ...getSearchAccessServiceOverride(), - ...getMarkersAccessServiceOverride(), - ...getAccessibilityAccessServiceOverride(), - ...getLanguageDetectionWorkerServiceOverride() + ...getSearchServiceOverride(), + ...getMarkersServiceOverride(), + ...getAccessibilityServiceOverride(), + ...getLanguageDetectionWorkerServiceOverride(), + ...getStorageServiceOverride({ + read (scope) { + return new Map(Object.entries(JSON.parse(localStorage.getItem(`storage-${scope}`) ?? '{}'))) + }, + async write (scope, data) { + localStorage.setItem(`storage-${scope}`, JSON.stringify(Object.fromEntries(data.entries()))) + }, + onDidChange: onStorageChange.event + }) }) StandaloneServices.get(ILogService).setLevel(LogLevel.Off) +export function clearStorage (): void { + const allKeys = new Set([StorageScope.APPLICATION, StorageScope.PROFILE, StorageScope.WORKSPACE].flatMap(scope => Object.keys(JSON.parse(localStorage.getItem(`storage-${scope}`) ?? '{}')))) + localStorage.removeItem(`storage-${StorageScope.APPLICATION}`) + localStorage.removeItem(`storage-${StorageScope.PROFILE}`) + localStorage.removeItem(`storage-${StorageScope.WORKSPACE}`) + onStorageChange.fire({ + deleted: allKeys, + changed: new Map() + }) +} + await initializeVscodeExtensions() renderSidebarPart(document.querySelector('#sidebar')!) diff --git a/demo/src/style.css b/demo/src/style.css index e7c1f84f..bfd83a6f 100644 --- a/demo/src/style.css +++ b/demo/src/style.css @@ -33,7 +33,7 @@ body { height: 30vh; } -.editor { +.standalone-editor { width: 100%; height: 55vh; } diff --git a/demo/vite.config.ts b/demo/vite.config.ts index 1fff3671..f6b963d9 100644 --- a/demo/vite.config.ts +++ b/demo/vite.config.ts @@ -42,7 +42,7 @@ export default defineConfig({ 'vscode/service-override/keybindings', 'vscode/service-override/textmate', 'vscode/service-override/theme', 'vscode/service-override/languages', 'vscode/service-override/audioCue', 'vscode/service-override/views', 'vscode/service-override/quickaccess', 'vscode/service-override/debug', 'vscode/service-override/preferences', 'vscode/service-override/snippets', 'vscode/service-override/files', 'vscode/service-override/output', - 'vscode/service-override/terminal', 'vscode/service-override/search', 'vscode/service-override/markers', 'vscode/service-override/accessibility', + 'vscode/service-override/terminal', 'vscode/service-override/search', 'vscode/service-override/markers', 'vscode/service-override/accessibility', 'vscode/service-override/storage', 'vscode/service-override/languageDetectionWorker', 'vscode/default-extensions/clojure', 'vscode/default-extensions/coffeescript', 'vscode/default-extensions/cpp', 'vscode/default-extensions/csharp', 'vscode/default-extensions/css', 'vscode/default-extensions/diff', 'vscode/default-extensions/fsharp', 'vscode/default-extensions/go', 'vscode/default-extensions/groovy', 'vscode/default-extensions/html', 'vscode/default-extensions/java', 'vscode/default-extensions/javascript', diff --git a/package-lock.json b/package-lock.json index b32d0131..d06f8fd7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@codingame/monaco-vscode-api", - "version": "1.81.0-next.0", + "version": "0.0.0-semantic-release", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@codingame/monaco-vscode-api", - "version": "1.81.0-next.0", + "version": "0.0.0-semantic-release", "license": "MIT", "bin": { "monaco-treemending": "monaco-treemending.js" diff --git a/package.json b/package.json index c34490e6..006a03f8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@codingame/monaco-vscode-api", - "version": "1.81.0-next.0", + "version": "0.0.0-semantic-release", "private": false, "description": "VSCode public API plugged on the monaco editor", "keywords": [], diff --git a/rollup/rollup.default-extensions.ts b/rollup/rollup.default-extensions.ts index 6e8ce857..3631f9cb 100644 --- a/rollup/rollup.default-extensions.ts +++ b/rollup/rollup.default-extensions.ts @@ -23,7 +23,13 @@ export default rollup.defineConfig(defaultExtensions.map(name => ( { + if (chunkInfo.name != null && chunkInfo.name.endsWith('d.ts')) { + // append .txt at the end of d.ts files: those file are required by the typescript extension and are just expected to be loaded as simple text + return `default-extensions/${name}/[name][extname].txt` + } + return `default-extensions/${name}/[name][extname]` + }, format: 'esm', dir: 'dist', entryFileNames: `default-extensions/${name}.js`, diff --git a/scripts/vscode.patch b/scripts/vscode.patch index 01c79cd4..4e8f013e 100644 --- a/scripts/vscode.patch +++ b/scripts/vscode.patch @@ -235,6 +235,23 @@ index fc197da1d57..a4d9573979f 100644 public static validateOptions(options: IEditorOptions): ValidatedEditorOptions { const result = new ValidatedEditorOptions(); +diff --git a/src/vs/editor/editor.main.ts b/src/vs/editor/editor.main.ts +index 23d547570e9..31dfb4fd8d4 100644 +--- a/src/vs/editor/editor.main.ts ++++ b/src/vs/editor/editor.main.ts +@@ -5,12 +5,5 @@ + + import 'vs/editor/editor.all'; + import 'vs/editor/standalone/browser/iPadShowKeyboard/iPadShowKeyboard'; +-import 'vs/editor/standalone/browser/inspectTokens/inspectTokens'; +-import 'vs/editor/standalone/browser/quickAccess/standaloneHelpQuickAccess'; +-import 'vs/editor/standalone/browser/quickAccess/standaloneGotoLineQuickAccess'; +-import 'vs/editor/standalone/browser/quickAccess/standaloneGotoSymbolQuickAccess'; +-import 'vs/editor/standalone/browser/quickAccess/standaloneCommandsQuickAccess'; +-import 'vs/editor/standalone/browser/referenceSearch/standaloneReferenceSearch'; +-import 'vs/editor/standalone/browser/toggleHighContrast/toggleHighContrast'; + + export * from 'vs/editor/editor.api'; diff --git a/src/vs/platform/assignment/common/assignmentService.ts b/src/vs/platform/assignment/common/assignmentService.ts index 67e34826627..7c5287d6a32 100644 --- a/src/vs/platform/assignment/common/assignmentService.ts @@ -526,7 +543,7 @@ index b83a462131d..5555f431ba0 100644 performance.mark('code/extHost/didInitAPI'); diff --git a/src/vs/workbench/api/worker/extensionHostWorker.ts b/src/vs/workbench/api/worker/extensionHostWorker.ts -index 6e6f8845da5..74ecefe68f1 100644 +index 6e6f8845da5..89cab1e16da 100644 --- a/src/vs/workbench/api/worker/extensionHostWorker.ts +++ b/src/vs/workbench/api/worker/extensionHostWorker.ts @@ -15,7 +15,6 @@ import * as performance from 'vs/base/common/performance'; @@ -537,7 +554,16 @@ index 6e6f8845da5..74ecefe68f1 100644 import { URI } from 'vs/base/common/uri'; //#region --- Define, capture, and override some globals -@@ -89,66 +88,155 @@ self.addEventListener = () => console.trace(`'addEventListener' has been blocked +@@ -47,7 +46,7 @@ function shouldTransformUri(uri: string): boolean { + // In principle, we could convert any URI, but we have concerns + // that parsing https URIs might end up decoding escape characters + // and result in an unintended transformation +- return /^(file|vscode-remote):/i.test(uri); ++ return /^(file|extension|vscode-remote):/i.test(uri); + } + + const nativeFetch = fetch.bind(self); +@@ -89,66 +88,167 @@ self.addEventListener = () => console.trace(`'addEventListener' has been blocked (self)['webkitResolveLocalFileSystemSyncURL'] = undefined; (self)['webkitResolveLocalFileSystemURL'] = undefined; @@ -603,8 +629,20 @@ index 6e6f8845da5..74ecefe68f1 100644 + return nativeFetch(asWorkerBrowserUrl(input), init); + }; + self.XMLHttpRequest = class extends XMLHttpRequest { ++ private notFound = false; + override open(method: string, url: string | URL, async?: boolean, username?: string | null, password?: string | null): void { -+ return super.open(method, asWorkerBrowserUrl(url), async ?? true, username, password); ++ const transformedUrl = asWorkerBrowserUrl(url); ++ this.notFound = transformedUrl.startsWith('extension:'); ++ return super.open(method, transformedUrl, async ?? true, username, password); ++ } ++ override send(body?: Document | XMLHttpRequestBodyInit | null | undefined): void { ++ if (this.notFound) { ++ return; ++ } ++ super.send(body); ++ } ++ override get status() { ++ return this.notFound ? 404 : super.status; + } + }; + const nativeImportScripts = importScripts.bind(self); @@ -747,7 +785,7 @@ index 6e6f8845da5..74ecefe68f1 100644 } //#endregion --- -@@ -255,6 +343,7 @@ export function create(): { onmessage: (message: any) => void } { +@@ -255,6 +355,7 @@ export function create(): { onmessage: (message: any) => void } { ); patchFetching(uri => extHostMain.asBrowserUri(uri)); diff --git a/src/missing-services.ts b/src/missing-services.ts index 5968091c..5d4faeba 100644 --- a/src/missing-services.ts +++ b/src/missing-services.ts @@ -163,6 +163,8 @@ import { ITestProfileService } from 'vs/workbench/contrib/testing/common/testPro import { IEncryptionService } from 'vs/platform/encryption/common/encryptionService' import { ITestResultService } from 'vs/workbench/contrib/testing/common/testResultService' import { IDiagnosticsService, NullDiagnosticsService } from 'vs/platform/diagnostics/common/diagnostics' +import { INotebookSearchService } from 'vs/workbench/contrib/search/browser/notebookSearch' +import { ResourceSet } from 'vs/base/common/map' import { unsupported } from './tools' class NullLoggerService extends AbstractLoggerService { @@ -2086,3 +2088,16 @@ registerSingleton(IUserDataInitializationService, class UserDataInitializationSe }, InstantiationType.Delayed) registerSingleton(IDiagnosticsService, NullDiagnosticsService, InstantiationType.Delayed) + +registerSingleton(INotebookSearchService, class NotebookSearchService implements INotebookSearchService { + _serviceBrand: undefined + async notebookSearch () { + return { + completeData: { + messages: [], + results: [] + }, + scannedFiles: new ResourceSet() + } + } +}, InstantiationType.Delayed) diff --git a/src/service-override/accessibility.ts b/src/service-override/accessibility.ts index 7c0ea240..d27cfa57 100644 --- a/src/service-override/accessibility.ts +++ b/src/service-override/accessibility.ts @@ -7,6 +7,6 @@ import 'vs/workbench/contrib/codeEditor/browser/accessibility/accessibility' export default function getServiceOverride (): IEditorOverrideServices { return { - [IAccessibleViewService.toString()]: new SyncDescriptor(AccessibleViewService, []) + [IAccessibleViewService.toString()]: new SyncDescriptor(AccessibleViewService, [], true) } } diff --git a/src/service-override/audioCue.ts b/src/service-override/audioCue.ts index 26ce8b65..264e66aa 100644 --- a/src/service-override/audioCue.ts +++ b/src/service-override/audioCue.ts @@ -11,6 +11,6 @@ registerAssets(audioAssets) export default function getServiceOverride (): IEditorOverrideServices { return { - [IAudioCueService.toString()]: new SyncDescriptor(AudioCueService) + [IAudioCueService.toString()]: new SyncDescriptor(AudioCueService, [], true) } } diff --git a/src/service-override/bulkEdit.ts b/src/service-override/bulkEdit.ts index c87a15c9..78caa800 100644 --- a/src/service-override/bulkEdit.ts +++ b/src/service-override/bulkEdit.ts @@ -6,6 +6,6 @@ import { BulkEditService } from 'vs/workbench/contrib/bulkEdit/browser/bulkEditS export default function getServiceOverride (): IEditorOverrideServices { return { - [IBulkEditService.toString()]: new SyncDescriptor(BulkEditService) + [IBulkEditService.toString()]: new SyncDescriptor(BulkEditService, [], true) } } diff --git a/src/service-override/configuration.ts b/src/service-override/configuration.ts index abcea477..59d0a5c8 100644 --- a/src/service-override/configuration.ts +++ b/src/service-override/configuration.ts @@ -35,7 +35,7 @@ import 'vs/workbench/api/common/configurationExtensionPoint' import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService' import getFileServiceOverride from './files' import { memoizedConstructor, unsupported } from '../tools' -import { registerServiceInitializeParticipant } from '../services' +import { registerServiceInitializePreParticipant } from '../services' async function updateUserConfiguration (configurationJson: string): Promise { const userDataProfilesService = StandaloneServices.get(IUserDataProfilesService) @@ -79,7 +79,7 @@ class MonacoWorkspaceEditingService extends AbstractWorkspaceEditingService { } let _defaultWorkspaceUri = URI.file('/workspace') -registerServiceInitializeParticipant(async (accessor) => { +registerServiceInitializePreParticipant(async (accessor) => { const workspaceService = accessor.get(IWorkspaceContextService) as WorkspaceService workspaceService.acquireInstantiationService(accessor.get(IInstantiationService)) @@ -113,10 +113,10 @@ export default function getServiceOverride (defaultWorkspaceUri: URI): IEditorOv return { ...getFileServiceOverride(), [ILabelService.toString()]: new SyncDescriptor(LabelService, undefined, true), - [IConfigurationService.toString()]: new SyncDescriptor(MemoizedInjectedConfigurationService), - [IWorkspaceContextService.toString()]: new SyncDescriptor(MemoizedInjectedConfigurationService), - [ITextResourceConfigurationService.toString()]: new SyncDescriptor(TextResourceConfigurationService), - [IWorkspaceEditingService.toString()]: new SyncDescriptor(MonacoWorkspaceEditingService), + [IConfigurationService.toString()]: new SyncDescriptor(MemoizedInjectedConfigurationService, [], true), + [IWorkspaceContextService.toString()]: new SyncDescriptor(MemoizedInjectedConfigurationService, [], true), + [ITextResourceConfigurationService.toString()]: new SyncDescriptor(TextResourceConfigurationService, [], true), + [IWorkspaceEditingService.toString()]: new SyncDescriptor(MonacoWorkspaceEditingService, [], true), [IWorkspacesService.toString()]: new SyncDescriptor(BrowserWorkspacesService, undefined, true) } } diff --git a/src/service-override/debug.ts b/src/service-override/debug.ts index d0776e89..49b48e16 100644 --- a/src/service-override/debug.ts +++ b/src/service-override/debug.ts @@ -22,8 +22,8 @@ DebugService.prototype['showError'] = function (message: string, errorActions?: export default function getServiceOverride (): IEditorOverrideServices { return { ...getLayoutServiceOverride(), - [ILanguageFeaturesService.toString()]: new SyncDescriptor(LanguageFeaturesService), // To restore inlineValuesProvider + [ILanguageFeaturesService.toString()]: new SyncDescriptor(LanguageFeaturesService, [], true), // To restore inlineValuesProvider [IDebugService.toString()]: new SyncDescriptor(DebugService, [], true), - [IConfigurationResolverService.toString()]: new SyncDescriptor(ConfigurationResolverService) + [IConfigurationResolverService.toString()]: new SyncDescriptor(ConfigurationResolverService, [], true) } } diff --git a/src/service-override/editor.ts b/src/service-override/editor.ts index f754f35c..acef1cfc 100644 --- a/src/service-override/editor.ts +++ b/src/service-override/editor.ts @@ -106,8 +106,8 @@ Registry.as(EditorExtensions.EditorFactory).registerFile export default function getServiceOverride (openEditor: OpenEditor): IEditorOverrideServices { return { [ICodeEditorService.toString()]: new SyncDescriptor(CodeEditorService, undefined, true), - [IEditorService.toString()]: new SyncDescriptor(SimpleEditorService, [openEditor]), - [ITextEditorService.toString()]: new SyncDescriptor(TextEditorService) + [IEditorService.toString()]: new SyncDescriptor(SimpleEditorService, [openEditor], true), + [ITextEditorService.toString()]: new SyncDescriptor(TextEditorService, [], false) } } diff --git a/src/service-override/environment.ts b/src/service-override/environment.ts index 08835f1f..24fa3401 100644 --- a/src/service-override/environment.ts +++ b/src/service-override/environment.ts @@ -14,7 +14,7 @@ class InjectedBrowserWorkbenchEnvironmentService extends BrowserWorkbenchEnviron export default function getServiceOverride (): IEditorOverrideServices { return { - [IEnvironmentService.toString()]: new SyncDescriptor(InjectedBrowserWorkbenchEnvironmentService, []), - [IBrowserWorkbenchEnvironmentService.toString()]: new SyncDescriptor(InjectedBrowserWorkbenchEnvironmentService, []) + [IEnvironmentService.toString()]: new SyncDescriptor(InjectedBrowserWorkbenchEnvironmentService, [], true), + [IBrowserWorkbenchEnvironmentService.toString()]: new SyncDescriptor(InjectedBrowserWorkbenchEnvironmentService, [], true) } } diff --git a/src/service-override/extensions.ts b/src/service-override/extensions.ts index f712e6d5..eb086e73 100644 --- a/src/service-override/extensions.ts +++ b/src/service-override/extensions.ts @@ -480,8 +480,8 @@ export default function getServiceOverride (workerConfig?: WorkerConfig, _iframe return { ...getOutputServiceOverride(), - [IExtensionService.toString()]: new SyncDescriptor(SimpleExtensionService, [_workerConfig]), - [IExtensionManifestPropertiesService.toString()]: new SyncDescriptor(ExtensionManifestPropertiesService) + [IExtensionService.toString()]: new SyncDescriptor(SimpleExtensionService, [_workerConfig], false), + [IExtensionManifestPropertiesService.toString()]: new SyncDescriptor(ExtensionManifestPropertiesService, [], true) } } diff --git a/src/service-override/files.ts b/src/service-override/files.ts index b7e83bc0..3f8898fa 100644 --- a/src/service-override/files.ts +++ b/src/service-override/files.ts @@ -430,7 +430,7 @@ class MemoryFileService extends FileService { export default function getServiceOverride (): IEditorOverrideServices { return { - [IFileService.toString()]: new SyncDescriptor(MemoryFileService) + [IFileService.toString()]: new SyncDescriptor(MemoryFileService, [], true) } } diff --git a/src/service-override/keybindings.ts b/src/service-override/keybindings.ts index bca45d7a..c72d1e9c 100644 --- a/src/service-override/keybindings.ts +++ b/src/service-override/keybindings.ts @@ -22,9 +22,9 @@ async function updateUserKeybindings (keybindingsJson: string): Promise { export default function getServiceOverride (): IEditorOverrideServices { return { ...getFileServiceOverride(), - [IKeybindingService.toString()]: new SyncDescriptor(WorkbenchKeybindingService), + [IKeybindingService.toString()]: new SyncDescriptor(WorkbenchKeybindingService, [], false), [IKeyboardLayoutService.toString()]: new SyncDescriptor(BrowserKeyboardLayoutService, undefined, true), - [ICommandService.toString()]: new SyncDescriptor(CommandService) + [ICommandService.toString()]: new SyncDescriptor(CommandService, [], true) } } diff --git a/src/service-override/languageDetectionWorker.ts b/src/service-override/languageDetectionWorker.ts index 1e8dcc31..e65e8f33 100644 --- a/src/service-override/languageDetectionWorker.ts +++ b/src/service-override/languageDetectionWorker.ts @@ -12,6 +12,6 @@ registerAssets({ export default function getServiceOverride (): IEditorOverrideServices { return { - [ILanguageDetectionService.toString()]: new SyncDescriptor(LanguageDetectionService) + [ILanguageDetectionService.toString()]: new SyncDescriptor(LanguageDetectionService, [], false) } } diff --git a/src/service-override/languages.ts b/src/service-override/languages.ts index c3e2ee28..60a7580d 100644 --- a/src/service-override/languages.ts +++ b/src/service-override/languages.ts @@ -23,6 +23,6 @@ Registry.as(WorkbenchExtensions.Workbench).regi export default function getServiceOverride (): IEditorOverrideServices { return { ...getFileServiceOverride(), - [ILanguageService.toString()]: new SyncDescriptor(WorkbenchLanguageService) + [ILanguageService.toString()]: new SyncDescriptor(WorkbenchLanguageService, [], false) } } diff --git a/src/service-override/layout.ts b/src/service-override/layout.ts index 8f432fd8..595c38f9 100644 --- a/src/service-override/layout.ts +++ b/src/service-override/layout.ts @@ -58,7 +58,7 @@ export class LayoutService implements ILayoutService, Pick { - return true + return false } let shouldUseGlobalPicker = () => { - return true + return false } // eslint-disable-next-line dot-notation @@ -122,6 +122,6 @@ export default function getServiceOverride ({ shouldUseGlobalPicker = _shouldUseGlobalPicker } return { - [IQuickInputService.toString()]: new SyncDescriptor(DelegateQuickInputService) + [IQuickInputService.toString()]: new SyncDescriptor(DelegateQuickInputService, [], true) } } diff --git a/src/service-override/search.ts b/src/service-override/search.ts index 1367923f..213b9719 100644 --- a/src/service-override/search.ts +++ b/src/service-override/search.ts @@ -12,9 +12,9 @@ import 'vs/workbench/contrib/searchEditor/browser/searchEditor.contribution' export default function getServiceOverride (): IEditorOverrideServices { return { - [ISearchService.toString()]: new SyncDescriptor(SearchService), - [ISearchWorkbenchService.toString()]: new SyncDescriptor(SearchWorkbenchService), - [ISearchHistoryService.toString()]: new SyncDescriptor(SearchHistoryService), - [IReplaceService.toString()]: new SyncDescriptor(ReplaceService) + [ISearchService.toString()]: new SyncDescriptor(SearchService, [], true), + [ISearchWorkbenchService.toString()]: new SyncDescriptor(SearchWorkbenchService, [], true), + [ISearchHistoryService.toString()]: new SyncDescriptor(SearchHistoryService, [], true), + [IReplaceService.toString()]: new SyncDescriptor(ReplaceService, [], true) } } diff --git a/src/service-override/snippets.ts b/src/service-override/snippets.ts index 433b83f8..ee91af50 100644 --- a/src/service-override/snippets.ts +++ b/src/service-override/snippets.ts @@ -23,7 +23,7 @@ registerServiceInitializeParticipant(async (accessor) => { export default function getServiceOverride (): IEditorOverrideServices { return { ...getFileServiceOverride(), - [ISnippetsService.toString()]: new SyncDescriptor(SnippetsService) + [ISnippetsService.toString()]: new SyncDescriptor(SnippetsService, [], true) } } diff --git a/src/service-override/storage.ts b/src/service-override/storage.ts index bfcb56bd..e0990f28 100644 --- a/src/service-override/storage.ts +++ b/src/service-override/storage.ts @@ -6,6 +6,7 @@ import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors' import { AbstractStorageService, IStorageService, StorageScope as VSStorageScope } from 'vs/platform/storage/common/storage' import { IUserDataProfile } from 'vs/platform/userDataProfile/common/userDataProfile' import { IAnyWorkspaceIdentifier } from 'vs/platform/workspace/common/workspace' +import { registerServiceInitializePreParticipant } from '../services' export enum StorageScope { APPLICATION = VSStorageScope.APPLICATION, @@ -71,7 +72,9 @@ class ExternalStorageService extends AbstractStorageService { private readonly workspaceStorage = this._register(new ExternalStorage(StorageScope.WORKSPACE, this.provider)) constructor (protected readonly provider: IStorageProvider) { - super() + super({ + flushInterval: 5000 + }) this._register(this.workspaceStorage.onDidChangeStorage(key => this.emitDidChangeValue(VSStorageScope.WORKSPACE, key))) this._register(this.profileStorage.onDidChangeStorage(key => this.emitDidChangeValue(VSStorageScope.PROFILE, key))) @@ -117,9 +120,13 @@ class ExternalStorageService extends AbstractStorageService { } } +registerServiceInitializePreParticipant(async (accessor) => { + await (accessor.get(IStorageService) as ExternalStorageService).initialize() +}) + export default function getStorageServiceOverride (provider: IStorageProvider): IEditorOverrideServices { return { - [IStorageService.toString()]: new SyncDescriptor(ExternalStorageService, [provider]) + [IStorageService.toString()]: new SyncDescriptor(ExternalStorageService, [provider], true) } } diff --git a/src/service-override/terminal.ts b/src/service-override/terminal.ts index a043dc2f..ebb26662 100644 --- a/src/service-override/terminal.ts +++ b/src/service-override/terminal.ts @@ -127,17 +127,17 @@ abstract class SimpleTerminalProcess implements ITerminalChildProcess { export default function getServiceOverride (backend: ITerminalBackend): IEditorOverrideServices { Registry.as(TerminalExtensions.Backend).registerTerminalBackend(backend) return { - [ITerminalService.toString()]: new SyncDescriptor(TerminalService), - [ITerminalLogService.toString()]: new SyncDescriptor(TerminalLogService), - [ITerminalEditorService.toString()]: new SyncDescriptor(TerminalEditorService), - [ITerminalGroupService.toString()]: new SyncDescriptor(TerminalGroupService), - [ITerminalInstanceService.toString()]: new SyncDescriptor(TerminalInstanceService), - [ITerminalProfileService.toString()]: new SyncDescriptor(TerminalProfileService), - [ITerminalContributionService.toString()]: new SyncDescriptor(TerminalContributionService), - [ITerminalLinkProviderService.toString()]: new SyncDescriptor(TerminalLinkProviderService), - [ITerminalProfileResolverService.toString()]: new SyncDescriptor(ElectronTerminalProfileResolverService), - [IEnvironmentVariableService.toString()]: new SyncDescriptor(EnvironmentVariableService), - [ITerminalQuickFixService.toString()]: new SyncDescriptor(TerminalQuickFixService) + [ITerminalService.toString()]: new SyncDescriptor(TerminalService, [], true), + [ITerminalLogService.toString()]: new SyncDescriptor(TerminalLogService, [], true), + [ITerminalEditorService.toString()]: new SyncDescriptor(TerminalEditorService, [], true), + [ITerminalGroupService.toString()]: new SyncDescriptor(TerminalGroupService, [], true), + [ITerminalInstanceService.toString()]: new SyncDescriptor(TerminalInstanceService, [], true), + [ITerminalProfileService.toString()]: new SyncDescriptor(TerminalProfileService, [], true), + [ITerminalContributionService.toString()]: new SyncDescriptor(TerminalContributionService, [], true), + [ITerminalLinkProviderService.toString()]: new SyncDescriptor(TerminalLinkProviderService, [], true), + [ITerminalProfileResolverService.toString()]: new SyncDescriptor(ElectronTerminalProfileResolverService, [], true), + [IEnvironmentVariableService.toString()]: new SyncDescriptor(EnvironmentVariableService, [], true), + [ITerminalQuickFixService.toString()]: new SyncDescriptor(TerminalQuickFixService, [], true) } } diff --git a/src/service-override/textmate.ts b/src/service-override/textmate.ts index d1abf1a2..1ea854db 100644 --- a/src/service-override/textmate.ts +++ b/src/service-override/textmate.ts @@ -37,7 +37,7 @@ Registry.as(WorkbenchExtensions.Workbench).regi export default function getServiceOverride (): IEditorOverrideServices { return { ...getFileServiceOverride(), - [ITextMateTokenizationService.toString()]: new SyncDescriptor(TextMateTokenizationFeature) + [ITextMateTokenizationService.toString()]: new SyncDescriptor(TextMateTokenizationFeature, [], false) } } diff --git a/src/service-override/theme.ts b/src/service-override/theme.ts index 4a7623a4..9906e0f9 100644 --- a/src/service-override/theme.ts +++ b/src/service-override/theme.ts @@ -33,7 +33,7 @@ type PartialIThemeExtensionPoint = Partial & Pick() -const paneCompositeSelectorParts = new Map() - -class PaneCompositePartService implements IPaneCompositePartService { - _serviceBrand: undefined - onDidPaneCompositeOpen = Event.None - onDidPaneCompositeClose = Event.None - async openPaneComposite (id: string | undefined, viewContainerLocation: ViewContainerLocation, focus?: boolean): Promise { - return this.getPartByLocation(viewContainerLocation)?.openPaneComposite(id, focus) - } - - getActivePaneComposite (viewContainerLocation: ViewContainerLocation) { - return this.getPartByLocation(viewContainerLocation)?.getActivePaneComposite() - } - - getPaneComposite (id: string, viewContainerLocation: ViewContainerLocation) { - return this.getPartByLocation(viewContainerLocation)?.getPaneComposite(id) - } - - getPaneComposites (viewContainerLocation: ViewContainerLocation) { - return this.getPartByLocation(viewContainerLocation)?.getPaneComposites() ?? [] - } - - getPinnedPaneCompositeIds (viewContainerLocation: ViewContainerLocation): string[] { - return this.getSelectorPartByLocation(viewContainerLocation)?.getPinnedPaneCompositeIds() ?? [] - } - - getVisiblePaneCompositeIds (viewContainerLocation: ViewContainerLocation): string[] { - return this.getSelectorPartByLocation(viewContainerLocation)?.getVisiblePaneCompositeIds() ?? [] - } - - getProgressIndicator (id: string, viewContainerLocation: ViewContainerLocation): IProgressIndicator | undefined { - return this.getPartByLocation(viewContainerLocation)?.getProgressIndicator(id) - } - - hideActivePaneComposite (viewContainerLocation: ViewContainerLocation): void { - this.getPartByLocation(viewContainerLocation)?.hideActivePaneComposite() - } - - getLastActivePaneCompositeId (viewContainerLocation: ViewContainerLocation): string { - return this.getPartByLocation(viewContainerLocation)!.getLastActivePaneCompositeId() - } - - showActivity (id: string, viewContainerLocation: ViewContainerLocation, badge: IBadge, clazz?: string, priority?: number): IDisposable { - return this.getSelectorPartByLocation(viewContainerLocation)!.showActivity(id, badge, clazz, priority) - } - - private getPartByLocation (viewContainerLocation: ViewContainerLocation): IPaneCompositePart | undefined { - return paneCompositeParts.get(viewContainerLocation) - } - - private getSelectorPartByLocation (viewContainerLocation: ViewContainerLocation): IPaneCompositeSelectorPart | undefined { - return paneCompositeSelectorParts.get(viewContainerLocation) - } -} +import { registerServiceInitializePostParticipant } from '../services' function createPart (id: string, role: string, classes: string[]): HTMLElement { const part = document.createElement(role === 'status' ? 'footer' /* Use footer element for status bar #98376 */ : 'div') @@ -172,17 +116,22 @@ function createPart (id: string, role: string, classes: string[]): HTMLElement { return part } -function renderPart (id: string, role: string, classes: string[], part: Part, container: HTMLElement): IDisposable { - const partContainer = createPart(id, role, classes) - container.append(partContainer) +function layoutPart (part: Part) { + const parent = part.getContainer()?.parentNode + if (parent == null) { + return + } + part.layout( + Math.max(part.minimumWidth, Math.min(part.maximumWidth, (parent as HTMLElement).offsetWidth)), + Math.max(part.minimumHeight, Math.min(part.maximumHeight, (parent as HTMLElement).offsetHeight)), + 0, 0 + ) +} + +function renderPart (partContainer: HTMLElement, part: Part): void { partContainer.oncontextmenu = () => false - part.create(partContainer) function layout () { - part.layout( - Math.max(part.minimumWidth, Math.min(part.maximumWidth, container.offsetWidth)), - Math.max(part.minimumHeight, Math.min(part.maximumHeight, container.offsetHeight)), - 0, 0 - ) + layoutPart(part) } part.onDidVisibilityChange((visible) => { if (visible) { @@ -190,7 +139,15 @@ function renderPart (id: string, role: string, classes: string[], part: Part, co } }) layout() - const observer = new ResizeObserver(layout) +} + +function getPart (part: Parts): Part { + return (StandaloneServices.get(ILayoutService) as LayoutService).getPart(part) +} + +function attachPart (part: Part, container: HTMLElement) { + container.append(part.getContainer()!) + const observer = new ResizeObserver(() => layoutPart(part)) observer.observe(container) return { @@ -201,54 +158,27 @@ function renderPart (id: string, role: string, classes: string[], part: Part, co } function renderActivitybarPar (container: HTMLElement): IDisposable { - const activitybarPart = StandaloneServices.get(IInstantiationService).createInstance(ActivitybarPart, paneCompositeParts.get(ViewContainerLocation.Sidebar)!) - paneCompositeSelectorParts.set(ViewContainerLocation.Sidebar, activitybarPart) - - // eslint-disable-next-line dot-notation - activitybarPart['_register'](renderPart(Parts.ACTIVITYBAR_PART, 'none', ['activitybar', 'left'], activitybarPart, container)) - - return activitybarPart + return attachPart(getPart(Parts.ACTIVITYBAR_PART), container) } function renderSidebarPart (container: HTMLElement): IDisposable { - const sidebarPart = StandaloneServices.get(IInstantiationService).createInstance(SidebarPart) - paneCompositeParts.set(ViewContainerLocation.Sidebar, sidebarPart) - - // eslint-disable-next-line dot-notation - sidebarPart['_register'](renderPart(Parts.SIDEBAR_PART, 'none', ['sidebar', 'left'], sidebarPart, container)) - - if (sidebarPart.getPaneComposites().length > 0) { - void sidebarPart.openPaneComposite(sidebarPart.getPaneComposites()[0]!.id) - } - - return sidebarPart + return attachPart(getPart(Parts.SIDEBAR_PART), container) } function renderPanelPart (container: HTMLElement): IDisposable { - const panelPart = StandaloneServices.get(IInstantiationService).createInstance(PanelPart) - paneCompositeSelectorParts.set(ViewContainerLocation.Panel, panelPart) - paneCompositeParts.set(ViewContainerLocation.Panel, panelPart) - - // eslint-disable-next-line dot-notation - panelPart['_register'](renderPart(Parts.PANEL_PART, 'none', ['panel', 'basepanel', positionToString(Position.LEFT)], panelPart, container)) - - if (panelPart.getPaneComposites().length > 0) { - void panelPart.openPaneComposite(panelPart.getPaneComposites()[0]!.id) - } + return attachPart(getPart(Parts.PANEL_PART), container) +} - return panelPart +function renderAuxiliaryPart (container: HTMLElement): IDisposable { + return attachPart(getPart(Parts.AUXILIARYBAR_PART), container) } function renderEditorPart (container: HTMLElement): IDisposable { - const editorPart = StandaloneServices.get(IEditorGroupsService) as EditorPart - - return renderPart(Parts.EDITOR_PART, 'main', ['editor'], editorPart, container) + return attachPart(getPart(Parts.EDITOR_PART), container) } function renderStatusBarPart (container: HTMLElement): IDisposable { - const statusBarPart = StandaloneServices.get(IStatusbarService) as StatusbarPart - - return renderPart(Parts.STATUSBAR_PART, 'status', ['statusbar'], statusBarPart, container) + return attachPart(getPart(Parts.STATUSBAR_PART), container) } type Label = string | { @@ -568,6 +498,44 @@ registerAssets({ 'vs/workbench/contrib/webview/browser/pre/fake.html': () => changeUrlDomain(new URL('../../vscode/vs/workbench/contrib/webview/browser/pre/fake.html', import.meta.url).href, webviewIframeAlternateDomains) }) +registerServiceInitializePostParticipant(async (accessor) => { + const paneCompositePartService = accessor.get(IPaneCompositePartService) + const viewDescriptorService = accessor.get(IViewDescriptorService) + + // force service instantiation + accessor.get(IStatusbarService) + paneCompositePartService.getPaneComposites(ViewContainerLocation.Panel) + + const layoutService = accessor.get(ILayoutService) as LayoutService + + const invisibleContainer = document.createElement('div') + invisibleContainer.style.display = 'none' + document.body.append(invisibleContainer) + + // Create Parts + for (const { id, role, classes, options } of [ + { id: Parts.ACTIVITYBAR_PART, role: 'none', classes: ['activitybar', 'left'] }, + { id: Parts.SIDEBAR_PART, role: 'none', classes: ['sidebar', 'left'] }, + { id: Parts.EDITOR_PART, role: 'main', classes: ['editor'], options: { restorePreviousState: false } }, + { id: Parts.PANEL_PART, role: 'none', classes: ['panel', 'basepanel', positionToString(Position.BOTTOM)] }, + { id: Parts.AUXILIARYBAR_PART, role: 'none', classes: ['auxiliarybar', 'basepanel', 'right'] }, + { id: Parts.STATUSBAR_PART, role: 'status', classes: ['statusbar'] } + ]) { + const partContainer = createPart(id, role, classes) + + const part = layoutService.getPart(id) + part.create(partContainer, options) + renderPart(partContainer, part) + + // We need the container to be attached for some views to work (like xterm) + invisibleContainer.append(partContainer) + } + + await paneCompositePartService.openPaneComposite(viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Sidebar)?.id, ViewContainerLocation.Sidebar) + await paneCompositePartService.openPaneComposite(viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.Panel)?.id, ViewContainerLocation.Panel) + await paneCompositePartService.openPaneComposite(viewDescriptorService.getDefaultViewContainer(ViewContainerLocation.AuxiliaryBar)?.id, ViewContainerLocation.AuxiliaryBar) +}) + export default function getServiceOverride (openEditorFallback?: OpenEditor, _webviewIframeAlternateDomains?: string): IEditorOverrideServices { if (_webviewIframeAlternateDomains != null) { webviewIframeAlternateDomains = _webviewIframeAlternateDomains @@ -575,30 +543,34 @@ export default function getServiceOverride (openEditorFallback?: OpenEditor, _we return { ...getLayoutServiceOverride(), ...getBulkEditServiceOverride(), - [IViewsService.toString()]: new SyncDescriptor(ViewsService), - [IViewDescriptorService.toString()]: new SyncDescriptor(ViewDescriptorService), - [IActivityService.toString()]: new SyncDescriptor(ActivityService), - [IPaneCompositePartService.toString()]: new SyncDescriptor(PaneCompositePartService), - [IHoverService.toString()]: new SyncDescriptor(HoverService), - [IExplorerService.toString()]: new SyncDescriptor(ExplorerService), - - [ICodeEditorService.toString()]: new SyncDescriptor(CodeEditorService), - [ITextEditorService.toString()]: new SyncDescriptor(TextEditorService), - [IEditorGroupsService.toString()]: new SyncDescriptor(EditorPart), - [IStatusbarService.toString()]: new SyncDescriptor(StatusbarPart), - [IEditorDropService.toString()]: new SyncDescriptor(EditorDropService), - [IEditorService.toString()]: new SyncDescriptor(MonacoEditorService, [openEditorFallback]), - [IEditorResolverService.toString()]: new SyncDescriptor(EditorResolverService), - [IBreadcrumbsService.toString()]: new SyncDescriptor(BreadcrumbsService), - [IContextViewService.toString()]: new SyncDescriptor(ContextViewService), - [IUntitledTextEditorService.toString()]: new SyncDescriptor(UntitledTextEditorService), - [ISemanticSimilarityService.toString()]: new SyncDescriptor(SemanticSimilarityService), - [IHistoryService.toString()]: new SyncDescriptor(HistoryService), - [IOutlineService.toString()]: new SyncDescriptor(OutlineService), - [ICustomEditorService.toString()]: new SyncDescriptor(CustomEditorService), - [IWebviewService.toString()]: new SyncDescriptor(WebviewService), - [IWebviewViewService.toString()]: new SyncDescriptor(WebviewViewService), - [IWebviewWorkbenchService.toString()]: new SyncDescriptor(WebviewEditorService) + ...getQuickAccessOverride({ + isKeybindingConfigurationVisible: isEditorPartVisible, + shouldUseGlobalPicker: isEditorPartVisible + }), + [IViewsService.toString()]: new SyncDescriptor(ViewsService, [], false), + [IViewDescriptorService.toString()]: new SyncDescriptor(ViewDescriptorService, [], true), + [IActivityService.toString()]: new SyncDescriptor(ActivityService, [], true), + [IPaneCompositePartService.toString()]: new SyncDescriptor(PaneCompositeParts, [], true), + [IHoverService.toString()]: new SyncDescriptor(HoverService, [], true), + [IExplorerService.toString()]: new SyncDescriptor(ExplorerService, [], true), + + [ICodeEditorService.toString()]: new SyncDescriptor(CodeEditorService, [], true), + [ITextEditorService.toString()]: new SyncDescriptor(TextEditorService, [], false), + [IEditorGroupsService.toString()]: new SyncDescriptor(EditorPart, [], false), + [IStatusbarService.toString()]: new SyncDescriptor(StatusbarPart, [], false), + [IEditorDropService.toString()]: new SyncDescriptor(EditorDropService, [], true), + [IEditorService.toString()]: new SyncDescriptor(MonacoEditorService, [openEditorFallback], false), + [IEditorResolverService.toString()]: new SyncDescriptor(EditorResolverService, [], false), + [IBreadcrumbsService.toString()]: new SyncDescriptor(BreadcrumbsService, [], true), + [IContextViewService.toString()]: new SyncDescriptor(ContextViewService, [], true), + [IUntitledTextEditorService.toString()]: new SyncDescriptor(UntitledTextEditorService, [], true), + [ISemanticSimilarityService.toString()]: new SyncDescriptor(SemanticSimilarityService, [], true), + [IHistoryService.toString()]: new SyncDescriptor(HistoryService, [], false), + [IOutlineService.toString()]: new SyncDescriptor(OutlineService, [], true), + [ICustomEditorService.toString()]: new SyncDescriptor(CustomEditorService, [], true), + [IWebviewService.toString()]: new SyncDescriptor(WebviewService, [], true), + [IWebviewViewService.toString()]: new SyncDescriptor(WebviewViewService, [], true), + [IWebviewWorkbenchService.toString()]: new SyncDescriptor(WebviewEditorService, [], true) } } @@ -612,6 +584,7 @@ export { registerEditorPane, renderSidebarPart, renderActivitybarPar, + renderAuxiliaryPart, renderPanelPart, renderEditorPart, renderStatusBarPart, diff --git a/src/services.ts b/src/services.ts index f93bca61..66549fdc 100644 --- a/src/services.ts +++ b/src/services.ts @@ -15,14 +15,23 @@ import getLayoutServiceOverride from './service-override/layout' import getEnvironmentServiceOverride from './service-override/environment' import getExtensionsServiceOverride from './service-override/extensions' import getFileServiceOverride from './service-override/files' +import getQuickAccessOverride from './service-override/quickaccess' interface ServiceInitializeParticipant { (accessor: ServicesAccessor): Promise } +const serviceInitializePreParticipants: ServiceInitializeParticipant[] = [] const serviceInitializeParticipants: ServiceInitializeParticipant[] = [] +const serviceInitializePostParticipants: ServiceInitializeParticipant[] = [] +export function registerServiceInitializePreParticipant (participant: ServiceInitializeParticipant): void { + serviceInitializePreParticipants.push(participant) +} export function registerServiceInitializeParticipant (participant: ServiceInitializeParticipant): void { serviceInitializeParticipants.push(participant) } +export function registerServiceInitializePostParticipant (participant: ServiceInitializeParticipant): void { + serviceInitializePostParticipants.push(participant) +} async function initServices (overrides: IEditorOverrideServices): Promise { const instantiationService = StandaloneServices.initialize({ @@ -30,9 +39,14 @@ async function initServices (overrides: IEditorOverrideServices): Promise { + await Promise.all(serviceInitializePreParticipants.map(participant => participant(accessor))) + }) + await instantiationService.invokeFunction(async accessor => { const lifecycleService = accessor.get(ILifecycleService) @@ -42,6 +56,10 @@ async function initServices (overrides: IEditorOverrideServices): Promise { + await Promise.all(serviceInitializePostParticipants.map(participant => participant(accessor))) + }) + return instantiationService }