From 864c813c6df67fdc34d193a61725cd124a057da7 Mon Sep 17 00:00:00 2001 From: xfy Date: Tue, 21 Jul 2026 15:23:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(code-runner):=20=E9=AB=98=E4=BA=AE?= =?UTF-8?q?=E5=B1=82=E8=A1=A5=20bun=20=E5=88=AB=E5=90=8D=E3=80=81CodeMirro?= =?UTF-8?q?r=20=E5=8A=A0=20TS=20=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit syntect 高亮别名表(highlight.rs)加 ('bun','ts'):bun 运行器跑的是 TypeScript,归一化后用 ts 扩展名命中 TypeScript.sublime-syntax。 CodeMirror buildLanguageExtension(codemirror-editor/editor.ts)新增 bun/typescript/ts 分支 → javascript({ typescript: true }),让 bun 代码块 在阅读器侧编辑器获得 TS 类型感知高亮。归一化后 CodeRunner 实际只传 canonical key,但保留别名分支作防御(CodeMirror 也在 SQL 控制台等场景用)。 两边都补了测试:highlight_code_resolves_bun_alias_to_typescript 锁定 'bun' 与 'ts' 输出一致;CodeMirror 经 tsc --noEmit + vite build 通过。 --- libs/codemirror-editor/src/editor.ts | 11 ++++++++++- src/highlight.rs | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/libs/codemirror-editor/src/editor.ts b/libs/codemirror-editor/src/editor.ts index 92a8435..a09949f 100644 --- a/libs/codemirror-editor/src/editor.ts +++ b/libs/codemirror-editor/src/editor.ts @@ -107,9 +107,14 @@ export class EditorOptions { /** * 把语言标识映射成 CodeMirror 语言 Extension。 * - `python` → @codemirror/lang-python - * - `node` / `javascript` / `js` → @codemirror/lang-javascript + * - `node` / `javascript` / `js` → @codemirror/lang-javascript(JS 模式) + * - `bun` / `typescript` / `ts` → @codemirror/lang-javascript(TypeScript 模式) * - `sql` / 缺省 → @codemirror/lang-sql(PostgreSQL 方言 + schema 补全) * + * 归一化后(src/api/code_runner/languages.rs::normalize_lang)CodeRunner 只会 + * 传来 canonical key(node/bun/python/go/rust),但这里仍保留别名分支作防御—— + * CodeMirror 也用在 SQL 控制台等场景,调用方可能直接传别名。 + * * SQL 分支使用 schema 补全;非 SQL 语言忽略 schema(补全仅对 SQL 有意义)。 */ function buildLanguageExtension(lang: string, schema: SqlSchema): Extension { @@ -120,6 +125,10 @@ function buildLanguageExtension(lang: string, schema: SqlSchema): Extension { if (normalized === 'node' || normalized === 'javascript' || normalized === 'js') { return javascript(); } + if (normalized === 'bun' || normalized === 'typescript' || normalized === 'ts') { + // bun 跑 TypeScript,编辑器用 TS 模式获得类型感知高亮(接口/类型注解等)。 + return javascript({ typescript: true }); + } // sql / 缺省:保留原有 PostgreSQL + schema 补全行为 return sql({ dialect: PostgreSQL, diff --git a/src/highlight.rs b/src/highlight.rs index 11c12e5..f0622fa 100644 --- a/src/highlight.rs +++ b/src/highlight.rs @@ -85,6 +85,8 @@ pub mod server { ("js", "js"), ("javascript", "js"), ("typescript", "ts"), + // bun 运行器跑的是 TypeScript,归一化后用 ts 语法高亮。 + ("bun", "ts"), ("py", "py"), ("python", "py"), ("rb", "rb"), @@ -486,4 +488,21 @@ const message = ref('Hello Vue!') // 大写标识经别名表 eq_ignore_ascii_case 回退,输出须与小写一致。 assert_eq!(by_alias, by_upper); } + + #[test] + fn highlight_code_resolves_bun_alias_to_typescript() { + // bun 运行器跑 TypeScript;别名表把 "bun" 归一为 "ts" 扩展名。 + // 用类型注解(TS 特有语法)验证命中的是 TypeScript 语法而非纯 JS。 + let code = "const x: number = 1;"; + let result = highlight_code(code, Some("bun")); + // 不应回退纯文本(纯文本无 高亮 span)。 + assert!( + result.contains("