Skip to content

Minimal example with extension support #465

Closed as not planned
Closed as not planned
@julian-baumann

Description

@julian-baumann

I am trying to set up a minimal code editor with support for extensions, themes, and LSP. Despite being aware of #444, I’m still struggling to understand how to load a local VSCode extension from a vsix file and get it functioning.

I would greatly appreciate any help to get me started in the right direction :)

Here is a simplified example of what I've already come up with. I am trying to load the Swift extension and get LSP working. Especially with webpack.

import "vscode/localExtensionHost";

import { AfterViewInit, Component, ElementRef, ViewChild } from "@angular/core";
import getExtensionServiceOverride, { WorkerConfig } from "@codingame/monaco-vscode-extensions-service-override";
import getLanguagesServiceOverride from "@codingame/monaco-vscode-languages-service-override";
import getModelServiceOverride from "@codingame/monaco-vscode-model-service-override";
import getTextmateServiceOverride from "@codingame/monaco-vscode-textmate-service-override";
import getThemeServiceOverride from "@codingame/monaco-vscode-theme-service-override";
import { editor } from "monaco-editor";
import { extensions } from "vscode";
import { initialize as initializeMonacoService} from "vscode/services";

export type WorkerLoader = () => Worker;

export const workerConfig: WorkerConfig = {
    url: new URL("vscode/workers/extensionHost.worker", import.meta.url).toString(),
    options: { type: "module" }
};
const value = `func test() -> String {
    print("Hello World")
    return "Test"
}`;

const workerLoaders: Partial<Record<string, WorkerLoader>> = {
    editorWorkerService: () => new Worker(new URL("monaco-editor/esm/vs/editor/editor.worker.js", import.meta.url), { type: "module" }),
    textMateWorker: () => new Worker(new URL("@codingame/monaco-vscode-textmate-service-override/worker", import.meta.url), { type: "module" })
};

window.MonacoEnvironment = {
    getWorker: function (moduleId, label): Worker {
        const workerFactory = workerLoaders[label];
        if (workerFactory != null) {
            return workerFactory();
        }
        throw new Error(`Unimplemented worker ${label} (${moduleId})`);
    }
};

await initializeMonacoService({
    ...getModelServiceOverride(),
    ...getExtensionServiceOverride(workerConfig),
    ...getThemeServiceOverride(),
    ...getLanguagesServiceOverride(),
    ...getTextmateServiceOverride()
});

// Not sure about this one. Doesn't work either
const extension = extensions.getExtension("sswg.swift-lang");
extension?.activate();

editor.create(this.editorRef?.nativeElement, {
    value: value,
    language: "swift"
});

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions