/* Copyright 2026 Marimo. All rights reserved. */ import { type EditorState, StateEffect, StateField } from "@codemirror/state"; import type { EditorView } from "@codemirror/view"; /** * Metadata for language adapters */ // oxlint-disable-next-line typescript/no-explicit-any export type LanguageMetadata = Record; /** * Effect to set language metadata */ export const setLanguageMetadata = StateEffect.define(); /** * Effect to update language metadata (partial update) */ export const updateLanguageMetadata = StateEffect.define>(); /** * State field for language metadata */ export const languageMetadataField = StateField.define({ create: () => ({}), update: (value, tr) => { for (const effect of tr.effects) { if (effect.is(setLanguageMetadata)) { return effect.value; } if (effect.is(updateLanguageMetadata)) { return { ...value, ...effect.value }; } } return value; }, }); /** * Get language metadata from editor state */ export function getLanguageMetadata(state: EditorState): LanguageMetadata { return state.field(languageMetadataField); } /** * Set language metadata in editor view */ export function setLanguageMetadataCommand( view: EditorView, metadata: LanguageMetadata, ): boolean { view.dispatch({ effects: setLanguageMetadata.of(metadata), }); return true; } /** * Update language metadata in editor view (partial update) */ export function updateLanguageMetadataCommand( view: EditorView, metadata: Partial, ): boolean { view.dispatch({ effects: updateLanguageMetadata.of(metadata), }); return true; }