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',