@prosemark/vscode-extension-integrator
v0.0.5
Published
Utilities for building **ProseMark VS Code companion extensions** that register sub-extensions against the main [ProseMark](https://marketplace.visualstudio.com/items?itemName=jsimonrichard.vscode-prosemark) editor: typed RPC between the extension host an
Readme
@prosemark/vscode-extension-integrator
Utilities for building ProseMark VS Code companion extensions that register sub-extensions against the main ProseMark editor: typed RPC between the extension host and the CodeMirror webview, shared bundling of CodeMirror externals, and helpers to append CodeMirror extensions at runtime.
Published on npm: @prosemark/vscode-extension-integrator.
Subpath exports
| Import | Purpose |
| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| @prosemark/vscode-extension-integrator | SubExtensionManager, SubExtensionCallbackManager (extension host) |
| @prosemark/vscode-extension-integrator/webview | Webview message handlers, appendToExtraCodeMirrorExtensions |
| @prosemark/vscode-extension-integrator/types | ProseMarkExtensionApi, SubExtensionCallback, SubExtensionCallbackContext, proc maps, Change, … |
| @prosemark/vscode-extension-integrator/rolldown-plugin | Rolldown/Vite plugin for webview bundles |
Architecture
- The core ProseMark extension exposes
registerSubExtension(extId, callback)on its API. - A companion extension (cSpell, LaTeX, etc.) calls that API from
activate. - The callback receives a typed bridge to register webview procedures and push CodeMirror extensions into
window.proseMark.extraCodeMirrorExtensions.
Extension IDs must not contain : (used as a namespace separator in messages).
Extension host example
import * as vscode from 'vscode';
import type { ProseMarkExtensionApi } from '@prosemark/vscode-extension-integrator/types';
import { createMyIntegration, extId } from './sub-extension';
export function activate(context: vscode.ExtensionContext): void {
const proseMark = vscode.extensions.getExtension<ProseMarkExtensionApi>(
'jsimonrichard.vscode-prosemark',
);
if (!proseMark) throw new Error('ProseMark extension not found');
proseMark.exports.registerSubExtension(
extId,
createMyIntegration(context.extensionUri),
);
}Webview example
import {
registerWebviewMessageHandler,
appendToExtraCodeMirrorExtensions,
} from '@prosemark/vscode-extension-integrator/webview';
import { myEditorExtensions } from './extensions';
// After the editor is ready:
appendToExtraCodeMirrorExtensions(view, myEditorExtensions);
registerWebviewMessageHandler(
extId,
{
someProc: (arg) => {
/* ... */
},
},
vscode,
);When adding CodeMirror extensions from a sub-extension, use appendToExtraCodeMirrorExtensions rather than StateEffect.appendConfig.
Bundling (Rolldown / Vite)
The default plugin keeps a single copy of shared modules on window.proseMark.externalModules:
@codemirror/state@codemirror/view@prosemark/core
import proseMarkVSCodeExtensionIntegratorPlugin from '@prosemark/vscode-extension-integrator/rolldown-plugin';
export default defineConfig({
plugins: [proseMarkVSCodeExtensionIntegratorPlugin()],
// ...
});Your webview bundle should treat those modules as externals (the plugin configures this); at runtime they resolve from window.proseMark.externalModules in the ProseMark editor webview.
