Skip to content

Commit

Permalink
Merge pull request #26 from CodinGame/add-more-api
Browse files Browse the repository at this point in the history
Add more apis
  • Loading branch information
CGNonofr committed Jul 20, 2022
2 parents f9b3f17 + adf55b7 commit 314125c
Show file tree
Hide file tree
Showing 13 changed files with 254 additions and 39 deletions.
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,22 +46,25 @@ StandaloneService.initialize({
})
```

Additionally, this library exposes 2 modules that include the vscode version of some services (with some glue to make it work with monaco):
Additionally, this library exposes 3 modules that include the vscode version of some services (with some glue to make it work with monaco):
- Notification / Dialog: `vscode/service-override/messages`
- Model / Editor: `vscode/service-override/modelEditor`
- Configuration: `vscode/service-override/configuration`

Usage:
```typescript
import { StandaloneService } from 'vscode/services'
import getModelEditorServiceOverride from 'vscode/service-override/modelEditor'
import getMessageServiceOverride from 'vscode/service-override/messages'
import getConfigurationServiceOverride from 'vscode/service-override/configuration'

StandaloneServices.initialize({
...getModelEditorServiceOverride((model, input, sideBySide) => {
// Open a new editor here and return it
// It will be called when for instance the user ctrl+click on an import
}),
...getMessageServiceOverride(document.body)
...getMessageServiceOverride(document.body),
...getConfigurationServiceOverride(readConfiguration, configurationChangeEvent)
})
```

Expand Down
7 changes: 7 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,10 @@
"./service-override/modelEditor": {
"types": "./dist/modelEditor.d.ts",
"default": "./dist/modelEditor.js"
},
"./service-override/configuration": {
"types": "./dist/configuration.d.ts",
"default": "./dist/configuration.js"
}
},
"typesVersions": {
Expand All @@ -43,6 +47,9 @@
],
"service-override/modelEditor": [
"./dist/modelEditor.d.ts"
],
"service-override/configuration": [
"./dist/configuration.d.ts"
]
}
},
Expand Down
3 changes: 2 additions & 1 deletion rollup/rollup.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,8 @@ export default (args: Record<string, string>): rollup.RollupOptions => {
api: './src/api.ts',
services: './src/services.ts',
messages: './src/service-override/messages.ts',
modelEditor: './src/service-override/modelEditor.ts'
modelEditor: './src/service-override/modelEditor.ts',
configuration: './src/service-override/configuration.ts'
},
plugins: [
{
Expand Down
3 changes: 2 additions & 1 deletion rollup/rollup.types.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ interfaceOverride.set('vs/editor/common/config/editorOptions:IEditorOptions', 'm
export default rollup.defineConfig([
'./dist/types/src/services.d.ts',
'./dist/types/src/service-override/messages.d.ts',
'./dist/types/src/service-override/modelEditor.d.ts'
'./dist/types/src/service-override/modelEditor.d.ts',
'./dist/types/src/service-override/configuration.d.ts'
].map((input): rollup.RollupOptions => ({
input,
output: {
Expand Down
4 changes: 2 additions & 2 deletions src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import * as uri from 'vs/base/common/uri'
import customLanguages from './vscode-services/languages'
import customCommands from './vscode-services/commands'
import customWorkspace from './vscode-services/workspace'
import customWindow from './vscode-services/window'
import customWindow, { TextTabInput } from './vscode-services/window'
import customEnv from './vscode-services/env'

// eslint-disable-next-line @typescript-eslint/no-explicit-any
Expand Down Expand Up @@ -173,7 +173,7 @@ const api: typeof vscode = {
DataTransferItem: unsupported,
LanguageStatusSeverity: extHostTypes.LanguageStatusSeverity,
QuickPickItemKind: extHostTypes.QuickPickItemKind,
TabInputText: unsupported,
TabInputText: TextTabInput,
TabInputTextDiff: unsupported,
TabInputCustom: unsupported,
TabInputNotebook: unsupported,
Expand Down
15 changes: 12 additions & 3 deletions src/polyfill.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ import { LanguageService as VScodeLanguageService } from 'vscode/vs/editor/commo
// @ts-ignore Creating a d.ts is not worth it
import { NoOpNotification as MonacoNoOpNotification } from 'monaco-editor/esm/vs/platform/notification/common/notification.js'
import { NoOpNotification as VScodeNoOpNotification } from 'vscode/vs/platform/notification/common/notification.js'
import { Registry } from 'vs/platform/registry/common/platform'
import { Extensions, IConfigurationRegistry } from 'vs/platform/configuration/common/configurationRegistry'

const configurationRegistry = Registry.as<IConfigurationRegistry>(Extensions.Configuration)
// @ts-ignore Override of a readonly property
// eslint-disable-next-line @typescript-eslint/no-explicit-any
configurationRegistry.onDidUpdateConfiguration ??= (configurationRegistry as any)._onDidUpdateConfiguration.event

// @ts-ignore Override of a readonly property
MonacoNoOpNotification.prototype.onDidClose ??= Event.None
Expand Down Expand Up @@ -73,9 +80,11 @@ function toMonacoVSBuffer (value: unknown) {

for (const key of Object.getOwnPropertyNames(VScodeVSBuffer)) {
if (!Object.hasOwnProperty.call(MonacoVSBuffer, key)) {
MonacoVSBuffer[key] = function (...args: any[]) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return toMonacoVSBuffer((VScodeVSBuffer as any)[key].call(MonacoVSBuffer, ...args.map(toVSCodeVSBuffer)))
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const method = (VScodeVSBuffer as any)[key];
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(VScodeVSBuffer as any)[key] = MonacoVSBuffer[key] = function (...args: any[]) {
return toMonacoVSBuffer(method.call(MonacoVSBuffer, ...args.map(toVSCodeVSBuffer)))
}
}
}
Expand Down
74 changes: 74 additions & 0 deletions src/service-override/configuration.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import '../polyfill'
import '../vscode-services/missing-services'
import { IEditorOverrideServices, StandaloneServices } from 'vs/editor/standalone/browser/standaloneServices'
import { ConfigurationService } from 'vs/platform/configuration/common/configurationService'
import { IConfigurationService } from 'vs/platform/configuration/common/configuration'
import { URI } from 'vs/base/common/uri'
import { Emitter, Event } from 'vs/base/common/event'
import { FileChangeType, FileSystemProviderCapabilities, FileType, IFileChange, IFileSystemProviderWithFileReadWriteCapability } from 'vs/platform/files/common/files'
import { FileService } from 'vs/platform/files/common/fileService'
import { ILogService } from 'vs/platform/log/common/log'
import { Schemas } from 'vs/base/common/network'
import { unsupported } from '../tools'

function createConfigurationFileSystemProvider (settingsResource: URI, readConfiguration: () => string, onChange: Event<void>) {
const onDidFilesChange = new Emitter<IFileChange[]>()
onChange(() => {
onDidFilesChange.fire([{
type: FileChangeType.UPDATED,
resource: settingsResource
}])
})

const textEncoder = new TextEncoder()

const provider: IFileSystemProviderWithFileReadWriteCapability = {
capabilities: FileSystemProviderCapabilities.FileReadWrite,
onDidChangeCapabilities: Event.None,
onDidChangeFile: onDidFilesChange.event,
watch: function () {
// Ignore, the file will always be watched
return {
dispose () { }
}
},
stat: async (resource) => {
if (resource.toString() !== settingsResource.toString()) {
unsupported()
}
return {
type: FileType.File,
mtime: 0,
ctime: 0,
size: textEncoder.encode(readConfiguration()).length
}
},
mkdir: unsupported,
readdir: unsupported,
delete: unsupported,
rename: unsupported,
writeFile: unsupported,
readFile: async (resource) => {
if (resource.toString() !== settingsResource.toString()) {
unsupported()
}
return textEncoder.encode(readConfiguration())
}
}
return provider
}

export default function getServiceOverride (readConfiguration: () => string, onChange: Event<void>, settingsResource: URI = URI.file('/userSettings.json')): IEditorOverrideServices {
const logService = StandaloneServices.get(ILogService)
const fileService = new FileService(logService)
fileService.registerProvider(Schemas.file, createConfigurationFileSystemProvider(settingsResource, readConfiguration, onChange))

const configurationService = new ConfigurationService(settingsResource, fileService)
configurationService.initialize().catch(error => {
logService.error(error)
})

return {
[IConfigurationService.toString()]: configurationService
}
}
2 changes: 1 addition & 1 deletion src/service-override/messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { unsupported } from '../tools'
class LayoutService implements ILayoutService, Pick<IWorkbenchLayoutService, 'isVisible'> {
declare readonly _serviceBrand: undefined

constructor (public container: HTMLElement, private _codeEditorService: ICodeEditorService) {
constructor (public container: HTMLElement, @ICodeEditorService private _codeEditorService: ICodeEditorService) {
window.addEventListener('resize', () => this.layout())
this.layout()
}
Expand Down
7 changes: 4 additions & 3 deletions src/services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type * as vscode from 'vscode'
import type { IProgressService } from 'vs/platform/progress/common/progress'
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'
import { NotificationsFilter } from 'vs/platform/notification/common/notification'
import { IConfigurationChangeEvent } from 'vs/platform/configuration/common/configuration'

export {
Severity
Expand All @@ -18,8 +19,6 @@ export interface Workspace {
workspaceFolders?: typeof vscode.workspace.workspaceFolders
updateWorkspaceFolders?: typeof vscode.workspace.updateWorkspaceFolders
onDidChangeWorkspaceFolders?: typeof vscode.workspace.onDidChangeWorkspaceFolders
getConfiguration?: typeof vscode.workspace.getConfiguration
onDidChangeConfiguration?: vscode.Event<vscode.ConfigurationChangeEvent>
onWillSaveTextDocument?: vscode.Event<vscode.TextDocumentWillSaveEvent>
onDidSaveTextDocument?: vscode.Event<vscode.TextDocument>
createFileSystemWatcher?: typeof vscode.workspace.createFileSystemWatcher
Expand Down Expand Up @@ -85,7 +84,9 @@ export { IPaneCompositePartService } from 'vs/workbench/services/panecomposite/b
export { IPathService } from 'vs/workbench/services/path/common/pathService'
export { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'
export { IWorkingCopyFileService } from 'vs/workbench/services/workingCopy/common/workingCopyFileService'
export { IConfigurationService } from 'vs/platform/configuration/common/configuration'

export {
NotificationsFilter
NotificationsFilter,
IConfigurationChangeEvent
}
79 changes: 74 additions & 5 deletions src/vscode-services/extHost.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { ExtHostCommands } from 'vs/workbench/api/common/extHostCommands'
import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'
import { ConsoleMainLogger, LogService } from 'vs/platform/log/common/log'
import { ConsoleMainLogger, ILogService, LogLevel, LogService } from 'vs/platform/log/common/log'
import { MainThreadCommands } from 'vs/workbench/api/browser/mainThreadCommands'
import { IExtHostContext } from 'vs/workbench/services/extensions/common/extHostCustomers'
import { ExtensionHostKind, NullExtensionService } from 'vs/workbench/services/extensions/common/extensions'
import { Event } from 'vs/base/common/event'
import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'
import { URI } from 'vs/base/common/uri'
import { ExtHostApiDeprecationService } from 'vs/workbench/api/common/extHostApiDeprecationService'
import { ExtHostContext, IMainContext, MainContext } from 'vs/workbench/api/common/extHost.protocol'
import { ExtHostConfigurationShape, ExtHostContext, IConfigurationInitData, IMainContext, MainContext, MainThreadConfigurationShape } from 'vs/workbench/api/common/extHost.protocol'
import { ExtHostDiagnostics } from 'vs/workbench/api/common/extHostDiagnostics'
import { ExtHostFileSystemInfo } from 'vs/workbench/api/common/extHostFileSystemInfo'
import * as monaco from 'monaco-editor'
Expand All @@ -19,7 +19,7 @@ import { VSBuffer } from 'vs/base/common/buffer'
import { Proxied, ProxyIdentifier } from 'vs/workbench/services/extensions/common/proxyIdentifier'
import { ExtHostDocuments } from 'vs/workbench/api/common/extHostDocuments'
import { createExtHostQuickOpen } from 'vs/workbench/api/common/extHostQuickOpen'
import { IExtHostWorkspaceProvider } from 'vs/workbench/api/common/extHostWorkspace'
import { ExtHostWorkspace, IExtHostWorkspace, IExtHostWorkspaceProvider } from 'vs/workbench/api/common/extHostWorkspace'
import { MainThreadQuickOpen } from 'vs/workbench/api/browser/mainThreadQuickOpen'
import { ExtHostMessageService } from 'vs/workbench/api/common/extHostMessageService'
import { MainThreadMessageService } from 'vs/workbench/api/browser/mainThreadMessageService'
Expand Down Expand Up @@ -75,7 +75,14 @@ import { ExtHostLanguageFeatures } from 'vs/workbench/api/common/extHostLanguage
import { MainThreadLanguageFeatures } from 'vs/workbench/api/browser/mainThreadLanguageFeatures'
import { ILanguageConfigurationService } from 'vs/editor/common/languages/languageConfigurationRegistry'
import { ILanguageFeaturesService } from 'vs/editor/common/services/languageFeatures'
import { IConfigurationService } from 'vs/platform/configuration/common/configuration'
import { IConfigurationChange, IConfigurationService } from 'vs/platform/configuration/common/configuration'
import { ExtHostConfigProvider } from 'vs/workbench/api/common/extHostConfiguration'
import { IExtHostInitDataService } from 'vs/workbench/api/common/extHostInitDataService'
import { MainThreadConfiguration } from 'vs/workbench/api/browser/mainThreadConfiguration'
import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'
import { UIKind } from 'vs/workbench/services/extensions/common/extensionHostProtocol'
import { unsupported } from '../tools'
import { Services } from '../services'

export const DEFAULT_EXTENSION: IExtensionDescription = {
identifier: new ExtensionIdentifier('monaco'),
Expand Down Expand Up @@ -137,6 +144,41 @@ class MainThreadMessageServiceWithoutSource extends MainThreadMessageService {
}
}

/**
* The vscode ExtHostConfiguration use a barrier and its getConfigProvider returns a promise, let's use a simpler version
*/
export class SyncExtHostConfiguration implements ExtHostConfigurationShape {
readonly _serviceBrand: undefined

private readonly _proxy: MainThreadConfigurationShape
private readonly _logService: ILogService
private readonly _extHostWorkspace: ExtHostWorkspace
private _actual: ExtHostConfigProvider | null

constructor (
@IExtHostRpcService extHostRpc: IExtHostRpcService,
@IExtHostWorkspace extHostWorkspace: IExtHostWorkspace,
@ILogService logService: ILogService
) {
this._proxy = extHostRpc.getProxy(MainContext.MainThreadConfiguration)
this._extHostWorkspace = extHostWorkspace
this._logService = logService
this._actual = null
}

public getConfigProvider (): ExtHostConfigProvider {
return this._actual!
}

$initializeConfiguration (data: IConfigurationInitData): void {
this._actual = new ExtHostConfigProvider(this._proxy, this._extHostWorkspace, data, this._logService)
}

$acceptConfigurationChanged (data: IConfigurationInitData, change: IConfigurationChange): void {
this.getConfigProvider().$acceptConfigurationChanged(data, change)
}
}

function createExtHostServices () {
const commandsService = StandaloneServices.get(ICommandService)
const notificationService = StandaloneServices.get(INotificationService)
Expand Down Expand Up @@ -168,6 +210,7 @@ function createExtHostServices () {
const languageConfigurationService = StandaloneServices.get(ILanguageConfigurationService)
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService)
const configurationService = StandaloneServices.get(IConfigurationService)
const workspaceContextService = StandaloneServices.get(IWorkspaceContextService)

const imessagePassingProtocol = new SimpleMessagePassingProtocol()

Expand All @@ -193,6 +236,27 @@ function createExtHostServices () {
}
}

const initData: IExtHostInitDataService = {
_serviceBrand: undefined,
version: '1.0.0',
parentPid: 0,
get environment () { return unsupported() },
resolvedExtensions: [],
hostExtensions: [],
extensions: [Services.get().extension ?? DEFAULT_EXTENSION],
get telemetryInfo () { return unsupported() },
logLevel: LogLevel.Trace,
get logsLocation () { return unsupported() },
get logFile () { return unsupported() },
autoStart: false,
remote: {
isRemote: false,
authority: undefined,
connectionData: null
},
uiKind: UIKind.Web
}

const extHostLogService = new LogService(new ConsoleMainLogger())
const extensionService = new NullExtensionService()
const extHostApiDeprecationService = new ExtHostApiDeprecationService(mainContext, extHostLogService)
Expand All @@ -215,6 +279,8 @@ function createExtHostServices () {
const extHostEditors = rpcProtocol.set(ExtHostContext.ExtHostEditors, new ExtHostEditors(mainContext, extHostDocumentsAndEditors))
const extHostClipboard = new ExtHostClipboard(mainContext)
const extHostLanguageFeatures = rpcProtocol.set(ExtHostContext.ExtHostLanguageFeatures, new ExtHostLanguageFeatures(rpcProtocol, uriTransformerService, extHostDocuments, extHostCommands, extHostDiagnostics, extHostLogService, extHostApiDeprecationService))
const extHostWorkspace = rpcProtocol.set(ExtHostContext.ExtHostWorkspace, new ExtHostWorkspace(mainContext, initData, extHostFileSystemInfo, extHostLogService))
const extHostConfiguration = rpcProtocol.set(ExtHostContext.ExtHostConfiguration, new SyncExtHostConfiguration(mainContext, extHostWorkspace, extHostLogService))

rpcProtocol.set(ExtHostContext.ExtHostTelemetry, new ExtHostTelemetry())
rpcProtocol.set(MainContext.MainThreadMessageService, new MainThreadMessageServiceWithoutSource(mainContext, notificationService, commandsService, dialogService))
Expand All @@ -227,6 +293,7 @@ function createExtHostServices () {
rpcProtocol.set(MainContext.MainThreadLanguages, new MainThreadLanguages(mainContext, languageService, modelService, textModelService, languageStatusService))
rpcProtocol.set(MainContext.MainThreadClipboard, new MainThreadClipboard(mainContext, clipboardService))
rpcProtocol.set(MainContext.MainThreadLanguageFeatures, new MainThreadLanguageFeatures(mainContext, languageService, languageConfigurationService, languageFeaturesService))
rpcProtocol.set(MainContext.MainThreadConfiguration, new MainThreadConfiguration(mainContext, workspaceContextService, configurationService, workbenchEnvironmentService))

// eslint-disable-next-line no-new
new MainThreadDocumentsAndEditors(
Expand Down Expand Up @@ -265,7 +332,9 @@ function createExtHostServices () {
extHostLanguages,
extHostWindow,
extHostClipboard,
extHostLanguageFeatures
extHostLanguageFeatures,
extHostWorkspace,
extHostConfiguration
}
}

Expand Down
Loading

0 comments on commit 314125c

Please sign in to comment.