Skip to content

Commit eb97e60

Browse files
authored
feat: expose codemirror packages for plugins (#1924)
1 parent d0ca77e commit eb97e60

File tree

2 files changed

+82
-11
lines changed

2 files changed

+82
-11
lines changed

src/lib/acode.js

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
11
import fsOperation from "fileSystem";
22
import sidebarApps from "sidebarApps";
3-
import { HighlightStyle, syntaxHighlighting } from "@codemirror/language";
4-
import { Compartment, EditorState, Prec, StateEffect } from "@codemirror/state";
5-
import { EditorView } from "@codemirror/view";
3+
import * as cmAutocomplete from "@codemirror/autocomplete";
4+
import * as cmCommands from "@codemirror/commands";
5+
import * as cmLanguage from "@codemirror/language";
6+
import * as cmLint from "@codemirror/lint";
7+
import * as cmSearch from "@codemirror/search";
8+
import * as cmState from "@codemirror/state";
9+
import * as cmView from "@codemirror/view";
610
import ajax from "@deadlyjack/ajax";
7-
import { tags } from "@lezer/highlight";
11+
import * as lezerHighlight from "@lezer/highlight";
812
import {
913
getRegisteredCommands as listRegisteredCommands,
1014
refreshCommandKeymap,
@@ -150,7 +154,7 @@ export default class Acode {
150154

151155
const createHighlightStyle = (spec) => {
152156
if (!spec) return null;
153-
if (Array.isArray(spec)) return HighlightStyle.define(spec);
157+
if (Array.isArray(spec)) return cmLanguage.HighlightStyle.define(spec);
154158
return spec;
155159
};
156160

@@ -163,12 +167,12 @@ export default class Acode {
163167
const ext = [];
164168

165169
if (styles && typeof styles === "object") {
166-
ext.push(EditorView.theme(styles, { dark: !!dark }));
170+
ext.push(cmView.EditorView.theme(styles, { dark: !!dark }));
167171
}
168172

169173
const resolvedHighlight = createHighlightStyle(highlightStyle);
170174
if (resolvedHighlight) {
171-
ext.push(syntaxHighlighting(resolvedHighlight));
175+
ext.push(cmLanguage.syntaxHighlighting(resolvedHighlight));
172176
}
173177

174178
if (Array.isArray(extensions)) {
@@ -213,10 +217,10 @@ export default class Acode {
213217
createTheme,
214218
createHighlightStyle,
215219
cm: {
216-
EditorView,
217-
HighlightStyle,
218-
syntaxHighlighting,
219-
tags,
220+
EditorView: cmView.EditorView,
221+
HighlightStyle: cmLanguage.HighlightStyle,
222+
syntaxHighlighting: cmLanguage.syntaxHighlighting,
223+
tags: lezerHighlight.tags,
220224
},
221225
};
222226

@@ -314,6 +318,17 @@ export default class Acode {
314318
},
315319
};
316320

321+
const codemirrorModule = Object.freeze({
322+
autocomplete: cmAutocomplete,
323+
commands: cmCommands,
324+
language: cmLanguage,
325+
lezer: lezerHighlight,
326+
lint: cmLint,
327+
search: cmSearch,
328+
state: cmState,
329+
view: cmView,
330+
});
331+
317332
this.define("Url", Url);
318333
this.define("page", Page);
319334
this.define("Color", Color);
@@ -356,6 +371,15 @@ export default class Acode {
356371
this.define("selectionMenu", selectionMenu);
357372
this.define("sidebarApps", sidebarAppsModule);
358373
this.define("terminal", terminalModule);
374+
this.define("codemirror", codemirrorModule);
375+
this.define("@codemirror/autocomplete", cmAutocomplete);
376+
this.define("@codemirror/commands", cmCommands);
377+
this.define("@codemirror/language", cmLanguage);
378+
this.define("@codemirror/lint", cmLint);
379+
this.define("@codemirror/search", cmSearch);
380+
this.define("@codemirror/state", cmState);
381+
this.define("@codemirror/view", cmView);
382+
this.define("@lezer/highlight", lezerHighlight);
359383
this.define("createKeyboardEvent", KeyboardEvent);
360384
this.define("toInternalUrl", helpers.toInternalUri);
361385
this.define("commands", this.#createCommandApi());

src/test/editor.tests.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,53 @@ 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 lezer = acode.require("@lezer/highlight");
72+
const state = acode.require("@codemirror/state");
73+
const view = acode.require("@codemirror/view");
74+
75+
test.assert(codemirror != null, "codemirror namespace should exist");
76+
test.assert(language != null, "@codemirror/language should exist");
77+
test.assert(lezer != null, "@lezer/highlight should exist");
78+
test.assert(state != null, "@codemirror/state should exist");
79+
test.assert(view != null, "@codemirror/view should exist");
80+
test.assert(
81+
language.StreamLanguage != null,
82+
"@codemirror/language should export StreamLanguage",
83+
);
84+
test.assert(lezer.tags != null, "@lezer/highlight should export tags");
85+
test.assert(
86+
state.EditorState != null,
87+
"@codemirror/state should export EditorState",
88+
);
89+
test.assert(
90+
view.EditorView != null,
91+
"@codemirror/view should export EditorView",
92+
);
93+
test.assertEqual(
94+
language.StreamLanguage,
95+
codemirror.language.StreamLanguage,
96+
"language exports should share the same singleton instance",
97+
);
98+
test.assertEqual(
99+
lezer.tags,
100+
codemirror.lezer.tags,
101+
"lezer exports should share the same singleton instance",
102+
);
103+
test.assertEqual(
104+
state.EditorState,
105+
codemirror.state.EditorState,
106+
"state exports should share the same singleton instance",
107+
);
108+
test.assertEqual(
109+
view.EditorView,
110+
codemirror.view.EditorView,
111+
"view exports should share the same singleton instance",
112+
);
113+
});
114+
68115
runner.test("Editor creation", async (test) => {
69116
const { view, container } = createEditor();
70117
test.assert(view != null, "EditorView instance should be created");

0 commit comments

Comments
 (0)