Skip to content
This repository was archived by the owner on Mar 22, 2024. It is now read-only.

Commit 955e0c8

Browse files
committed
Ensure vscode editor always comes with themes and textmate enabled.
1 parent 4399a6f commit 955e0c8

13 files changed

+58
-84
lines changed

Diff for: package-lock.json

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: packages/examples/package.json

-3
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@
99
"@codingame/monaco-vscode-json-default-extension": "~1.82.3",
1010
"@codingame/monaco-vscode-keybindings-service-override": "~1.82.3",
1111
"@codingame/monaco-vscode-python-default-extension": "~1.82.3",
12-
"@codingame/monaco-vscode-textmate-service-override": "~1.82.3",
13-
"@codingame/monaco-vscode-theme-defaults-default-extension": "~1.82.3",
14-
"@codingame/monaco-vscode-theme-service-override": "~1.82.3",
1512
"@typefox/monaco-editor-react": "~2.2.4",
1613
"http-server": "~14.1.1",
1714
"langium": "~2.0.2",

Diff for: packages/examples/src/langium/config/wrapperLangiumVscode.ts

-10
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
1-
import { Uri } from 'vscode';
2-
import getConfigurationServiceOverride from '@codingame/monaco-vscode-configuration-service-override';
31
import getEditorServiceOverride from '@codingame/monaco-vscode-editor-service-override';
42
import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
5-
import getThemeServiceOverride from '@codingame/monaco-vscode-theme-service-override';
6-
import getTextmateServiceOverride from '@codingame/monaco-vscode-textmate-service-override';
7-
import { whenReady as whenReadyThemes } from '@codingame/monaco-vscode-theme-defaults-default-extension';
83
import { useOpenEditorStub } from 'monaco-languageclient';
94
import { UserConfig } from 'monaco-editor-wrapper';
105
import { getTextContent } from '../../common.js';
@@ -25,9 +20,6 @@ export const setupLangiumClientVscodeApi = async (): Promise<UserConfig> => {
2520
wrapperConfig: {
2621
serviceConfig: {
2722
userServices: {
28-
...getThemeServiceOverride(),
29-
...getTextmateServiceOverride(),
30-
...getConfigurationServiceOverride(Uri.file('/workspace')),
3123
...getEditorServiceOverride(useOpenEditorStub),
3224
...getKeybindingsServiceOverride()
3325
},
@@ -38,8 +30,6 @@ export const setupLangiumClientVscodeApi = async (): Promise<UserConfig> => {
3830
languageId: 'langium',
3931
code: code,
4032
useDiffEditor: false,
41-
// Ensure all required extensions are loaded before setting up the language extension
42-
awaitExtensionReadiness: [whenReadyThemes],
4333
extensions: [{
4434
config: {
4535
name: 'langium-example',

Diff for: packages/examples/src/langium/config/wrapperStatemachineConfig.ts

-10
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
1-
import getConfigurationServiceOverride from '@codingame/monaco-vscode-configuration-service-override';
21
import getEditorServiceOverride from '@codingame/monaco-vscode-editor-service-override';
32
import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
4-
import getThemeServiceOverride from '@codingame/monaco-vscode-theme-service-override';
5-
import getTextmateServiceOverride from '@codingame/monaco-vscode-textmate-service-override';
6-
import { whenReady as whenReadyThemes } from '@codingame/monaco-vscode-theme-defaults-default-extension';
7-
import { Uri } from 'vscode';
83
import { useOpenEditorStub } from 'monaco-languageclient';
94
import { UserConfig } from 'monaco-editor-wrapper';
105
import { loadStatemachinWorker } from '../wrapperStatemachine.js';
@@ -25,9 +20,6 @@ export const createLangiumGlobalConfig = async (): Promise<UserConfig> => {
2520
wrapperConfig: {
2621
serviceConfig: {
2722
userServices: {
28-
...getThemeServiceOverride(),
29-
...getTextmateServiceOverride(),
30-
...getConfigurationServiceOverride(Uri.file('/workspace')),
3123
...getEditorServiceOverride(useOpenEditorStub),
3224
...getKeybindingsServiceOverride()
3325
},
@@ -38,8 +30,6 @@ export const createLangiumGlobalConfig = async (): Promise<UserConfig> => {
3830
languageId: 'statemachine',
3931
code: code,
4032
useDiffEditor: false,
41-
// Ensure all required extensions are loaded before setting up the language extension
42-
awaitExtensionReadiness: [whenReadyThemes],
4333
extensions: [{
4434
config: {
4535
name: 'statemachine-example',

Diff for: packages/examples/src/reactPython.tsx

+1-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
import getConfigurationServiceOverride from '@codingame/monaco-vscode-configuration-service-override';
21
import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
3-
import getThemeServiceOverride from '@codingame/monaco-vscode-theme-service-override';
4-
import getTextmateServiceOverride from '@codingame/monaco-vscode-textmate-service-override';
5-
import { whenReady as whenReadyThemes } from '@codingame/monaco-vscode-theme-defaults-default-extension';
62
import { whenReady as whenReadyPython } from '@codingame/monaco-vscode-python-default-extension';
73
import React from 'react';
84
import ReactDOM from 'react-dom/client';
@@ -56,9 +52,6 @@ const userConfig: UserConfig = {
5652
wrapperConfig: {
5753
serviceConfig: {
5854
userServices: {
59-
...getThemeServiceOverride(),
60-
...getTextmateServiceOverride(),
61-
...getConfigurationServiceOverride(Uri.file('/workspace')),
6255
...getKeybindingsServiceOverride()
6356
},
6457
debugLogging: true
@@ -67,7 +60,7 @@ const userConfig: UserConfig = {
6760
$type: 'vscodeApi',
6861
languageId: 'python',
6962
codeUri: '/workspace/python.py',
70-
awaitExtensionReadiness: [whenReadyThemes, whenReadyPython],
63+
awaitExtensionReadiness: [whenReadyPython],
7164
extensions: [{
7265
config: {
7366
name: 'python-client',

Diff for: packages/examples/src/wrapperWs.ts

+8-25
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
11
import getKeybindingsServiceOverride from '@codingame/monaco-vscode-keybindings-service-override';
2-
import getThemeServiceOverride from '@codingame/monaco-vscode-theme-service-override';
3-
import getTextmateServiceOverride from '@codingame/monaco-vscode-textmate-service-override';
4-
import { whenReady as whenReadyTheme } from '@codingame/monaco-vscode-theme-defaults-default-extension';
52
import { whenReady as whenReadyJson } from '@codingame/monaco-vscode-json-default-extension';
63
import { disposeEditor, startEditor, swapEditors } from './common.js';
74
import { UserConfig } from 'monaco-editor-wrapper';
@@ -19,42 +16,28 @@ const codeOrg = `{
1916
"line_endings": {"value": "unix"}
2017
}`;
2118

22-
const monacoEditorConfig = {
23-
glyphMargin: true,
24-
guides: {
25-
bracketPairs: true
26-
},
27-
lightbulb: {
28-
enabled: true
29-
},
30-
};
31-
3219
const userConfig: UserConfig = {
3320
wrapperConfig: {
3421
serviceConfig: {
3522
userServices: {
36-
...getThemeServiceOverride(),
37-
...getTextmateServiceOverride(),
3823
...getKeybindingsServiceOverride(),
3924
},
4025
debugLogging: true
4126
},
4227
editorAppConfig: {
43-
$type: 'classic',
28+
$type: 'vscodeApi',
4429
languageId: languageId,
4530
code: codeMain,
4631
useDiffEditor: false,
4732
codeOriginal: codeOrg,
48-
editorOptions: monacoEditorConfig,
49-
diffEditorOptions: monacoEditorConfig,
50-
theme: 'vs-dark',
5133
// Ensure all required extensions are loaded before setting up the language extension
52-
awaitExtensionReadiness: [whenReadyTheme, whenReadyJson],
53-
languageExtensionConfig: {
54-
id: 'json',
55-
extensions: ['.json', '.jsonc'],
56-
aliases: ['JSON', 'json'],
57-
mimetypes: ['application/json']
34+
awaitExtensionReadiness: [whenReadyJson],
35+
userConfiguration: {
36+
json: JSON.stringify({
37+
'workbench.colorTheme': 'Default Dark Modern',
38+
'editor.guides.bracketPairsHorizontal': 'active',
39+
'editor.lightbulb.enabled': true
40+
})
5841
}
5942
}
6043
},

Diff for: packages/monaco-editor-wrapper/package.json

+3
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@
5959
},
6060
"dependencies": {
6161
"@codingame/monaco-vscode-configuration-service-override": "~1.82.3",
62+
"@codingame/monaco-vscode-textmate-service-override": "~1.82.3",
63+
"@codingame/monaco-vscode-theme-defaults-default-extension": "~1.82.3",
64+
"@codingame/monaco-vscode-theme-service-override": "~1.82.3",
6265
"monaco-languageclient": "~6.5.1"
6366
},
6467
"peerDependencies": {

Diff for: packages/monaco-editor-wrapper/src/editorAppBase.ts

+1
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ export abstract class EditorAppBase {
230230

231231
abstract getAppType(): string;
232232
abstract init(): Promise<void>;
233+
abstract specifyService(): editor.IEditorOverrideServices;
233234
abstract createEditors(container: HTMLElement): Promise<void>;
234235
abstract getConfig(): EditorAppConfigClassic | EditorAppConfigVscodeApi;
235236
abstract disposeApp(): void;

Diff for: packages/monaco-editor-wrapper/src/editorAppClassic.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { EditorAppBase, EditorAppBaseConfig, EditorAppType } from './editorAppBase.js';
21
import { editor, languages } from 'monaco-editor';
2+
import { EditorAppBase, EditorAppBaseConfig, EditorAppType } from './editorAppBase.js';
33
import { UserConfig } from './wrapper.js';
44
import { Logger } from './logger.js';
55
/**
@@ -76,6 +76,10 @@ export class EditorAppClassic extends EditorAppBase {
7676
return this.config;
7777
}
7878

79+
override specifyService(): editor.IEditorOverrideServices {
80+
return {};
81+
}
82+
7983
async createEditors(container: HTMLElement): Promise<void> {
8084
if (this.config.useDiffEditor) {
8185
await this.createDiffEditor(container, this.diffEditorOptions);

Diff for: packages/monaco-editor-wrapper/src/editorAppVscodeApi.ts

+16-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
import type * as vscode from 'vscode';
2+
import { IDisposable, editor } from 'monaco-editor';
3+
import getThemeServiceOverride from '@codingame/monaco-vscode-theme-service-override';
4+
import getTextmateServiceOverride from '@codingame/monaco-vscode-textmate-service-override';
5+
import { whenReady as whenReadyTheme } from '@codingame/monaco-vscode-theme-defaults-default-extension';
26
import { EditorAppBase, EditorAppBaseConfig, EditorAppType } from './editorAppBase.js';
37
import { registerExtension, IExtensionManifest, ExtensionHostKind } from 'vscode/extensions';
48
import { UserConfig } from './wrapper.js';
59
import { verifyUrlorCreateDataUrl } from './utils.js';
6-
import { IDisposable } from 'monaco-editor';
710
import { Logger } from './logger.js';
811

912
export type ExtensionConfig = {
@@ -60,6 +63,13 @@ export class EditorAppVscodeApi extends EditorAppBase {
6063
return this.extensionRegisterResults.get(extensionName);
6164
}
6265

66+
override specifyService(): editor.IEditorOverrideServices {
67+
return {
68+
...getThemeServiceOverride(),
69+
...getTextmateServiceOverride()
70+
};
71+
}
72+
6373
async createEditors(container: HTMLElement): Promise<void> {
6474
if (this.config.useDiffEditor) {
6575
await this.createDiffEditor(container);
@@ -68,9 +78,11 @@ export class EditorAppVscodeApi extends EditorAppBase {
6878
}
6979
}
7080

71-
async init() {
72-
// await all extenson that should be ready beforehand
73-
await this.awaitReadiness(this.config.awaitExtensionReadiness);
81+
override async init() {
82+
// await all extensions that should be ready beforehand
83+
// always await theme extension
84+
const awaitReadiness = (this.config.awaitExtensionReadiness ?? []).concat(whenReadyTheme);
85+
await this.awaitReadiness(awaitReadiness);
7486

7587
if (this.config.extensions) {
7688
const allPromises: Array<Promise<void>> = [];

Diff for: packages/monaco-editor-wrapper/src/languageClientWrapper.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,12 @@ export class LanguageClientWrapper {
7272
private languageClient: MonacoLanguageClient | undefined;
7373
private languageClientConfig?: LanguageClientConfig;
7474
private worker: Worker | undefined;
75-
private languageId: string | undefined;
75+
private languageId: string;
7676
private name;
7777
private logger: Logger | undefined;
7878

79-
constructor(languageClientConfig?: LanguageClientConfig, logger?: Logger) {
79+
constructor(languageId: string, languageClientConfig?: LanguageClientConfig, logger?: Logger) {
80+
this.languageId = languageId;
8081
if (languageClientConfig) {
8182
this.languageClientConfig = languageClientConfig;
8283
this.name = this.languageClientConfig.options.name ?? 'unnamed';
@@ -104,10 +105,6 @@ export class LanguageClientWrapper {
104105
return this.languageClient !== undefined && this.languageClient?.isRunning();
105106
}
106107

107-
init(languageId: string) {
108-
this.languageId = languageId;
109-
}
110-
111108
async start() {
112109
if (this.languageClientConfig) {
113110
return this.startLanguageClientConnection();

Diff for: packages/monaco-editor-wrapper/src/wrapper.ts

+12-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { editor } from 'monaco-editor';
2-
import { Uri } from 'vscode';
1+
import { editor, Uri } from 'monaco-editor';
32
import getConfigurationServiceOverride from '@codingame/monaco-vscode-configuration-service-override';
43
import { initServices, wasVscodeApiInitialized, InitializeServiceConfig, MonacoLanguageClient, mergeServices } from 'monaco-languageclient';
54
import { EditorAppVscodeApi, EditorAppConfigVscodeApi } from './editorAppVscodeApi.js';
@@ -34,15 +33,17 @@ export class MonacoEditorLanguageClientWrapper {
3433
private serviceConfig: InitializeServiceConfig;
3534
private logger: Logger;
3635

37-
private async init(userConfig: UserConfig) {
36+
private init(userConfig: UserConfig) {
3837
if (userConfig.wrapperConfig.editorAppConfig.useDiffEditor && !userConfig.wrapperConfig.editorAppConfig.codeOriginal) {
3938
throw new Error('Use diff editor was used without a valid config.');
4039
}
4140

4241
this.id = userConfig.id ?? Math.floor(Math.random() * 101).toString();
4342
this.logger = new Logger(userConfig.loggerConfig);
4443
this.serviceConfig = userConfig.wrapperConfig.serviceConfig ?? {};
44+
}
4545

46+
private async initServices() {
4647
// always set required services if not configure
4748
this.serviceConfig.userServices = this.serviceConfig.userServices ?? {};
4849
const configureService = this.serviceConfig.userServices.configure;
@@ -53,6 +54,7 @@ export class MonacoEditorLanguageClientWrapper {
5354
};
5455
mergeServices(mlcDefautServices, this.serviceConfig.userServices);
5556
}
57+
mergeServices(this.editorApp?.specifyService() ?? {}, this.serviceConfig.userServices);
5658

5759
// overrule debug log flag
5860
this.serviceConfig.debugLogging = this.logger.isEnabled() && (this.serviceConfig.debugLogging || this.logger.isDebugEnabled());
@@ -63,26 +65,28 @@ export class MonacoEditorLanguageClientWrapper {
6365
this.logger.debug('Init Services', this.serviceConfig.debugLogging);
6466
await initServices(this.serviceConfig);
6567
}
66-
this.languageClientWrapper = new LanguageClientWrapper(userConfig.languageClientConfig, this.logger);
6768
}
6869

6970
async start(userConfig: UserConfig, htmlElement: HTMLElement | null) {
7071
if (!htmlElement) {
7172
throw new Error('No HTMLElement provided for monaco-editor.');
7273
}
73-
await this.init(userConfig);
74-
7574
// Always dispose old instances before start
7675
this.editorApp?.disposeApp();
7776

77+
this.init(userConfig);
78+
7879
if (isVscodeApiEditorApp(userConfig.wrapperConfig)) {
7980
this.editorApp = new EditorAppVscodeApi(this.id, userConfig, this.logger);
8081
} else {
8182
this.editorApp = new EditorAppClassic(this.id, userConfig, this.logger);
8283
}
83-
this.languageClientWrapper.init(this.editorApp.getConfig().languageId);
84-
this.logger.info(`Starting monaco-editor (${this.id})`);
84+
await this.initServices();
85+
86+
this.languageClientWrapper = new LanguageClientWrapper(this.editorApp.getConfig().languageId,
87+
userConfig.languageClientConfig, this.logger);
8588

89+
this.logger.info(`Starting monaco-editor (${this.id})`);
8690
await this.editorApp?.init();
8791
await this.editorApp.createEditors(htmlElement);
8892

0 commit comments

Comments
 (0)