Skip to content

Commit 877eb66

Browse files
committed
feat: expose codemirror packaages for plugins
1 parent d0ca77e commit 877eb66

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/lib/acode.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
import fsOperation from "fileSystem";
22
import sidebarApps from "sidebarApps";
3+
import * as cmAutocomplete from "@codemirror/autocomplete";
4+
import * as cmCommands from "@codemirror/commands";
5+
import * as cmLanguage from "@codemirror/language";
36
import { HighlightStyle, syntaxHighlighting } from "@codemirror/language";
7+
import * as cmLint from "@codemirror/lint";
8+
import * as cmSearch from "@codemirror/search";
9+
import * as cmState from "@codemirror/state";
410
import { Compartment, EditorState, Prec, StateEffect } from "@codemirror/state";
11+
import * as cmView from "@codemirror/view";
512
import { EditorView } from "@codemirror/view";
613
import ajax from "@deadlyjack/ajax";
714
import { tags } from "@lezer/highlight";
@@ -314,6 +321,16 @@ export default class Acode {
314321
},
315322
};
316323

324+
const codemirrorModule = Object.freeze({
325+
autocomplete: cmAutocomplete,
326+
commands: cmCommands,
327+
language: cmLanguage,
328+
lint: cmLint,
329+
search: cmSearch,
330+
state: cmState,
331+
view: cmView,
332+
});
333+
317334
this.define("Url", Url);
318335
this.define("page", Page);
319336
this.define("Color", Color);
@@ -356,6 +373,14 @@ export default class Acode {
356373
this.define("selectionMenu", selectionMenu);
357374
this.define("sidebarApps", sidebarAppsModule);
358375
this.define("terminal", terminalModule);
376+
this.define("codemirror", codemirrorModule);
377+
this.define("@codemirror/autocomplete", cmAutocomplete);
378+
this.define("@codemirror/commands", cmCommands);
379+
this.define("@codemirror/language", cmLanguage);
380+
this.define("@codemirror/lint", cmLint);
381+
this.define("@codemirror/search", cmSearch);
382+
this.define("@codemirror/state", cmState);
383+
this.define("@codemirror/view", cmView);
359384
this.define("createKeyboardEvent", KeyboardEvent);
360385
this.define("toInternalUrl", helpers.toInternalUri);
361386
this.define("commands", this.#createCommandApi());

src/test/editor.tests.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,33 @@ export async function runCodeMirrorTests(writeOutput) {
6565
);
6666
});
6767

68+
runner.test("Acode exposes shared CodeMirror modules", async (test) => {
69+
const codemirror = acode.require("codemirror");
70+
const language = acode.require("@codemirror/language");
71+
const state = acode.require("@codemirror/state");
72+
const view = acode.require("@codemirror/view");
73+
74+
test.assert(codemirror != null, "codemirror namespace should exist");
75+
test.assert(language != null, "@codemirror/language should exist");
76+
test.assert(state != null, "@codemirror/state should exist");
77+
test.assert(view != null, "@codemirror/view should exist");
78+
test.assertEqual(
79+
language.StreamLanguage,
80+
codemirror.language.StreamLanguage,
81+
"language exports should share the same singleton instance",
82+
);
83+
test.assertEqual(
84+
state.EditorState,
85+
codemirror.state.EditorState,
86+
"state exports should share the same singleton instance",
87+
);
88+
test.assertEqual(
89+
view.EditorView,
90+
codemirror.view.EditorView,
91+
"view exports should share the same singleton instance",
92+
);
93+
});
94+
6895
runner.test("Editor creation", async (test) => {
6996
const { view, container } = createEditor();
7097
test.assert(view != null, "EditorView instance should be created");

0 commit comments

Comments
 (0)