From 7ba433209cbdb6d95d1bfa8a3e71a051174524d0 Mon Sep 17 00:00:00 2001 From: TaeHwan Jung Date: Fri, 31 Jul 2026 05:30:07 +0900 Subject: [PATCH] fix(editor): map .cts/.mts to the typescript language id (#11294) * fix(editor): map .cts/.mts to the typescript language id The comment above EXT_TO_LANGUAGE already documents that Monaco maps .tsx/.cts/.mts onto the typescript language id, but only .tsx was in the table, so .cts/.mts files opened as plaintext. * fix(mobile): map cts and mts to typescript --------- Co-authored-by: OrcaWin <293788423+OrcaWin@users.noreply.github.com> --- mobile/src/session/mobile-file-language.ts | 2 ++ mobile/src/session/mobile-file-syntax.test.ts | 3 +++ src/renderer/src/lib/language-detect.test.ts | 12 ++++++++++++ src/renderer/src/lib/language-detect.ts | 2 ++ 4 files changed, 19 insertions(+) diff --git a/mobile/src/session/mobile-file-language.ts b/mobile/src/session/mobile-file-language.ts index 30e4656c0..03b368c94 100644 --- a/mobile/src/session/mobile-file-language.ts +++ b/mobile/src/session/mobile-file-language.ts @@ -10,6 +10,8 @@ function extname(filePath: string): string { const EXT_TO_LANGUAGE: Record = { '.ts': 'typescript', '.tsx': 'typescript', + '.cts': 'typescript', + '.mts': 'typescript', '.js': 'javascript', '.jsx': 'javascript', '.mjs': 'javascript', diff --git a/mobile/src/session/mobile-file-syntax.test.ts b/mobile/src/session/mobile-file-syntax.test.ts index 595097425..f01a240e1 100644 --- a/mobile/src/session/mobile-file-syntax.test.ts +++ b/mobile/src/session/mobile-file-syntax.test.ts @@ -11,9 +11,12 @@ import type { MobileDiffLine } from './mobile-diff-lines' describe('mobile file syntax highlighting', () => { it('detects common source languages from file paths', () => { expect(detectMobileFileLanguage('src/App.tsx')).toBe('typescript') + expect(detectMobileFileLanguage('config/vitest.config.mts')).toBe('typescript') + expect(detectMobileFileLanguage('C:\\repo\\scripts\\postinstall.CTS')).toBe('typescript') expect(detectMobileFileLanguage('scripts/deploy.sh')).toBe('shell') expect(detectMobileFileLanguage('Dockerfile')).toBe('dockerfile') expect(resolveMobileSyntaxLanguage('src/App.tsx')).toBe('typescript') + expect(resolveMobileSyntaxLanguage('worktrees/feature/build.cts')).toBe('typescript') expect(resolveMobileSyntaxLanguage('Dockerfile')).toBe('plaintext') }) diff --git a/src/renderer/src/lib/language-detect.test.ts b/src/renderer/src/lib/language-detect.test.ts index 0bb81a5c7..8fd253c97 100644 --- a/src/renderer/src/lib/language-detect.test.ts +++ b/src/renderer/src/lib/language-detect.test.ts @@ -47,6 +47,18 @@ describe('detectLanguage', () => { expect(detectLanguage('C:\\Users\\alice\\.codex\\LOG.JSONL')).toBe('jsonl') }) + it('maps .cts/.mts files to the Monaco built-in typescript language id (case-insensitive)', () => { + expect(detectLanguage('config/vitest.config.mts')).toBe('typescript') + expect(detectLanguage('scripts/postinstall.cts')).toBe('typescript') + expect(detectLanguage('types/global.d.mts')).toBe('typescript') + expect(detectLanguage('C:\\repo\\config\\BUILD.MTS')).toBe('typescript') + }) + + it('keeps .mjs/.cjs on the Monaco built-in javascript language id', () => { + expect(detectLanguage('scripts/build.mjs')).toBe('javascript') + expect(detectLanguage('scripts/legacy.cjs')).toBe('javascript') + }) + it('keeps .json/.jsonc on the built-in json language and unknown on plaintext', () => { expect(detectLanguage('config/settings.json')).toBe('json') expect(detectLanguage('config/tsconfig.jsonc')).toBe('json') diff --git a/src/renderer/src/lib/language-detect.ts b/src/renderer/src/lib/language-detect.ts index fabf6c314..fc918dd43 100644 --- a/src/renderer/src/lib/language-detect.ts +++ b/src/renderer/src/lib/language-detect.ts @@ -14,6 +14,8 @@ const EXT_TO_LANGUAGE: Record = { // is what gives .tsx/.jsx files syntax highlighting in the editor. '.ts': 'typescript', '.tsx': 'typescript', + '.cts': 'typescript', + '.mts': 'typescript', '.js': 'javascript', '.jsx': 'javascript', '.mjs': 'javascript',