MCPcopy Index your code
hub / github.com/CodinGame/monaco-vscode-api

github.com/CodinGame/monaco-vscode-api @v34.1.3

Chat with this repo
repository ↗ · DeepWiki ↗ · release v34.1.3 ↗ · + Follow
1,844 symbols 2,951 edges 165 files 54 documented · 3% 2 cross-repo links
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

@codingame/monaco-vscode-api · monthly downloads npm version PRs welcome

This NPM module allows to integrate full VSCode functionality into your monaco-editor.

For more information, please checkout the project's wiki.

Installation

npm install @codingame/monaco-vscode-api
# Optionally install the extension api and the editor api
npm install vscode@npm:@codingame/monaco-vscode-extension-api
npm install monaco-editor@npm:@codingame/monaco-vscode-editor-api

@codingame/monaco-vscode-extension-api is installed as an alias to vscode to be able to run import * as vscode from 'vscode', similar to what is done inside a VSCode extension

@codingame/monaco-vscode-editor-api is installed as an alias to monaco-editor because it provides the same api as the official monaco-editor

Usage

If you are just starting with monaco-editor and monaco-vscode-api you may find helpful the Getting Started Guide in the wiki.

Monaco service override

Most of VSCode functionality implemented as "services", e.g.

  • theme service, providing support for VSCode themes
  • languages service, providing support for different language features.

By default, Monaco uses a simplified versions of the VSCode services, called standalone services. This package allows to

  1. override them with fully-functional alternatives from VSCode
  2. add new services that were not included in Monaco

Here is an example usage that overrides Monaco default configuration with VSCode json-based settings:

// default monaco-editor imports
import * as monaco from 'monaco-editor'
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'

// utilities to override Monaco services
import { initialize } from '@codingame/monaco-vscode-api'
import getConfigurationServiceOverride, {
  updateUserConfiguration
} from '@codingame/monaco-vscode-configuration-service-override'

window.MonacoEnvironment = {
  getWorker: (_moduleId, _label) => new editorWorker()
}

// overriding Monaco service with VSCode
await initialize({
  ...getConfigurationServiceOverride()
})

// json config like in vscode settings.json
updateUserConfiguration(`{
    "editor.fontSize": 30,
    "editor.lineHeight": 30,
    "editor.fontFamily": "monospace",
    "editor.fontWeight": "bold",
    "editor.letterSpacing": 0,
}`)

// creating an editor with VSCode configuration
monaco.editor.create(document.getElementById('editor')!, {
  value: 'Editor with VSCode config and large bold fonts'
})

[!NOTE] initialize can only be called once (and it should be called BEFORE creating your first editor).

Each get<service-name>ServiceOverride contains the service and some glue to make VSCode service work with Monaco.

List of service overrides

Some basic service overrides are coming with this package as dependencies:

  • Base: @codingame/monaco-vscode-base-service-override
  • Contains some general-use services that are mandatory to most of the other features
  • Host: @codingame/monaco-vscode-host-service-override
  • Interaction with the host/browser (shutdown veto, focus/active management, window opening, fullscreen...)
  • Extensions: @codingame/monaco-vscode-extensions-service-override
  • Support for VSCode extensions.
  • A worker configuration can be provided to it:
    • Then, the webworker extension host will be available, allowing to run extensions in a worker which runs in an iframe
  • Files: @codingame/monaco-vscode-files-service-override
  • It adds the overlay filesystem for file:// files, but also adds the support for lazy loaded extension files. It adds separate memory user files (e.g. config, keybindings), cache files and log files
  • It supports adding overlay filesystems for file:// files
  • QuickAccess: @codingame/monaco-vscode-quickaccess-service-override
  • Enables the quickaccess menu in the editor (press F1 or ctrl+shift+p)
  • Search: @codingame/monaco-vscode-search-service-override
  • Provides workspace search functionality for both Command Palette file search (Ctrl+P) and Search panel (Ctrl+Shift+F)
  • Enables searching through files and text content within your workspace

However, most of the services are separated into different modules, so they can be imported as required. You can find a full list of services in the corresponding wiki page.

Default vscode extensions

VSCode uses a bunch of default extensions. Most of them are used to load the default languages and grammars (see https://github.com/microsoft/vscode/tree/main/extensions).

This library bundles and publishes them as separate packages, which allows to use the ones you want. To use an extension, just install the corresponding package and import it in the beginning of the file:

import '@codingame/monaco-vscode-javascript-default-extension'
import '@codingame/monaco-vscode-json-default-extension'
...

Here is an example of usage of default VSCode theme extension with theme service override:

// importing default VSCode theme extension
import '@codingame/monaco-vscode-theme-defaults-default-extension'

// default monaco-editor imports
import * as monaco from 'monaco-editor'
import editorWorker from 'monaco-editor/esm/vs/editor/editor.worker?worker'

// utilities to override Monaco services
import { initialize } from '@codingame/monaco-vscode-api'
import getThemeServiceOverride from '@codingame/monaco-vscode-theme-service-override'

window.MonacoEnvironment = {
  getWorker: function (_moduleId, _label) {
    return new editorWorker()
  }
}

// overriding Monaco service with VSCode
await initialize({
  ...getThemeServiceOverride()
})

// creating an editor with VSCode theme
monaco.editor.create(document.getElementById('editor')!, {
  value: 'Editor with VSCode Theme Support'
})

See the full list of ported default extensions

Loading vsix file

VSCode extensions are bundled as vsix files. This library publishes a rollup plugin (vite-compatible) that allows to load a vsix file.

  • rollup/vite config:
import vsixPlugin from '@codingame/monaco-vscode-rollup-vsix-plugin'
...
plugins: [
  ...,
  vsixPlugin()
]
  • code:
import './extension.vsix'

Localization

This library also offers the possibility to localize vscode and the extensions in the supported languages. To do so, import one of the following packages before anything else:

  • @codingame/monaco-vscode-language-pack-cs
  • @codingame/monaco-vscode-language-pack-de
  • @codingame/monaco-vscode-language-pack-es
  • @codingame/monaco-vscode-language-pack-fr
  • @codingame/monaco-vscode-language-pack-it
  • @codingame/monaco-vscode-language-pack-ja
  • @codingame/monaco-vscode-language-pack-ko
  • @codingame/monaco-vscode-language-pack-pl
  • @codingame/monaco-vscode-language-pack-pt-br
  • @codingame/monaco-vscode-language-pack-qps-ploc
  • @codingame/monaco-vscode-language-pack-ru
  • @codingame/monaco-vscode-language-pack-tr
  • @codingame/monaco-vscode-language-pack-zh-hans
  • @codingame/monaco-vscode-language-pack-zh-hant

⚠️ The language pack should be imported and loaded BEFORE anything else from this library is loaded. Otherwise, some translations would be missing and an error would be displayed in the console. ⚠️

Model creation

The official monaco-editor package provides a function to create models: monaco.editor.createModel.

This method creates a standalone model that cannot be found or used by any VSCode services.

The recommended way is to used the createModelReference method instead (added on top of the official monaco-editor api) which returns instead a reference to a model.

It has some pros:

  • The model reference can be used by VSCode services, allowing for instance following links between files (ctrl+click)
  • The returned model is bound to a filesystem file, and you have access to methods allowing to control the file lifecycle (saving the file, accessing the dirty state...)
  • It is possible to call the method multiple times on the same file to get multiple references. The model is disposed when there is no reference left

To work, it needs the file to exist on the virtual filesystem. It can be achieved either by:

  • using the registerFileSystemOverlay from the files service override, which can be cleaned when not needed anymore (recommended)
  • by using the second argument of the createModelReference function, which writes the file content to the virtual filesystem before creating the model

before:

import * as monaco from 'monaco-editor'
const model = monaco.editor.createModel(...)
const editor = monaco.editor.create({ model, ... })

...

model.dispose()
editor.dispose()

after:

import * as monaco from 'monaco-editor'
import { RegisteredFileSystemProvider, RegisteredMemoryFile, registerFileSystemOverlay } from '@codingame/monaco-vscode-files-service-override'

const fileUri = monaco.Uri.file(<file uri>);

const fileSystemProvider = new RegisteredFileSystemProvider(false)
fileSystemProvider.registerFile(new RegisteredMemoryFile(fileUri, <file content>))
const overlayDisposable = registerFileSystemOverlay(1, fileSystemProvider)

const modelRef = await monaco.editor.createModelReference(fileUri)

const editor = monaco.editor.create({ model: modelRef.object.textEditorModel })

...

await modelRef.object.save()

...

modelRef.dispose()
editor.dispose()
overlayDisposable.dispose()

createModelReference return a reference to a model. The value is fetched from the memory filesystem. The reference can then be disposed, the model will only be disposed if there is no remaining references.

VSCode api usage

To be able to use the VSCode api directly from your code, you need to import vscode/localExtensionHost and wait for the services to be initialized.

You will then be able to import it as if you were in a VSCode extension:

import * as vscode from 'vscode'
import 'vscode/localExtensionHost'

const range = new vscode.Range(...)
vscode.languages.registerCompletionItemProvider(...)

You can also register a new extension from its manifest:

import { registerExtension, initialize, ExtensionHostKind } from '@codingame/monaco-vscode-api/extensions'

await initialize()

const { registerFileUrl, getApi } = registerExtension({
  name: 'my-extension',
  publisher: 'someone',
  version: '1.0.0',
  engines: {
      vscode: '*'
  },
  contributes: {
  }
}, ExtensionHostKind.LocalProcess)

registerFileUrl('/file-extension-path.json', new URL('./file-real-path.json', import.meta.url).toString())

const vscode = await getApi()

vscode.languages.registerCompletionItemProvider(...)

Demo

Try it out on https://monaco-vscode-api.netlify.app/

There is a demo that showcases the service-override features. It includes:

  • Languages
  • VSCode themes
  • Textmate grammars (requires VSCode themes)
  • Notifications/Dialogs
  • Model/Editor services
  • Configuration service, with user configuration editor
  • Keybinding service, with user keybindings editor
  • Debuggers
  • Remote agent
  • and much more

From CLI run:

# build monaco-vscode-api (the demo use it as a local dependency)
npm ci
npm run build
# start demo
cd demo
npm ci
npm start
# OR: for vite debug output
npm run start:debug

For the debug feature, also run:

npm run start:debugServer

⚠️ Building monaco-vscode-api is only supported on Linux or Mac. It you use Windows, have a look at WSL ⚠️

Remote agent

See the VSCode Server wiki page.

Shadow dom (⚠️ beta ⚠️)

The library supports shadow-dom.

⚠️ VSCode itself doesn't support shadow dom, and there are multiple parts that needed to be patched in order for it to work.

There are multiple benefits of using it:

  • Your custom global style won't impact the VSCode workbench style (for instance if you did override the default box-sizing)
  • The VSCode styles won't impact other parts of your app
  • You page head won't be polluted with dozen of css files from VSCode

How to use it

If the provided container element is a child of a shadow dom element, the styles will be injected in both the main page and the shadow root. That's it.

Prerequisites

In order to be able to load the static css files in the shadow dom as well. Your bundler configuration needs to be adapted so that importing css files doesn't load their content in the page head, but instead just returns the file content as default (either as a string or a CSSStyleSheet). It can be achieved with most bundlers with some configurations.

Note that the bundler should still resolve referenced assets in the css files, so you can't just use the raw loader, or the assets/source webpack module type.

Webpack

Add this rule in your configuration:

```typescript { test: /node_modules\/(@codingame\/monaco-vscode|vscode|monaco-editor).*.css$/, use: [ { loader: 'css-loader', options: { esModule: false, exportType: 'css-style-sheet', // or 'string', both are working

Extension points exported contracts — how you extend this code

DynamicKeybindingService (Interface)
(no doc) [2 implementers]
src/monaco.ts
RegisteredDirectoryNode (Interface)
(no doc) [2 implementers]
src/service-override/files.ts
Package (Interface)
(no doc)
rollup/rollup.monaco.ts
DependencyImporter (Interface)
(no doc)
rollup/tools/configuredSubpackagePlugin.ts
SubPackageModule (Interface)
(no doc)
rollup/plugins/rollup-subpackage-plugin.ts
ExtensionResource (Interface)
(no doc)
src/extension-tools.ts
RegisterExtensionParams (Interface)
(no doc)
src/extensions.ts
Options (Interface)
(no doc)
src/rollup-extension-directory-plugin.ts

Core symbols most depended-on inside this repo

get
called by 87
src/service-override/storage.ts
get
called by 69
src/missing-services.ts
unsupported
called by 54
src/missing-services.ts
set
called by 50
src/missing-services.ts
error
called by 35
src/service-override/files.ts
readFile
called by 23
src/service-override/files.ts
delete
called by 22
src/service-override/files.ts
createProxy
called by 19
src/extension.api.ts

Shape

Class 813
Method 503
Function 461
Interface 67

Languages

TypeScript100%

Modules by API surface

src/missing-services.ts713 symbols
src/service-override/files.ts139 symbols
src/service-override/tools/editor.ts82 symbols
src/service-override/layout.ts50 symbols
src/service-override/tools/views.ts39 symbols
src/monaco.ts36 symbols
src/service-override/views.ts34 symbols
src/service-override/quickaccess.ts28 symbols
src/service-override/tools/search-utils/base-provider.ts27 symbols
rollup/plugins/rollup-subpackage-plugin.ts27 symbols
demo/src/features/testing.ts26 symbols
src/extensions.ts24 symbols

Used by 2 indexed graphs manifest dependencies, hub-wide

For agents

$ claude mcp add monaco-vscode-api \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact