diff --git a/bun.lock b/bun.lock index 9f463d45..88c3e0f0 100644 --- a/bun.lock +++ b/bun.lock @@ -48,6 +48,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", + "codemirror-lang-elixir": "^4.0.0", "electron-context-menu": "^4.1.1", "electron-store": "^11.0.2", "express": "^5.1.0", @@ -95,7 +96,7 @@ }, "packages/desktop": { "name": "@openchamber/desktop", - "version": "1.6.1", + "version": "1.6.3", "dependencies": { "@openchamber/ui": "workspace:*", "@tauri-apps/plugin-notification": "^2.3.3", @@ -118,7 +119,7 @@ }, "packages/ui": { "name": "@openchamber/ui", - "version": "1.6.1", + "version": "1.6.3", "dependencies": { "@codemirror/autocomplete": "^6.20.0", "@codemirror/commands": "^6.10.1", @@ -212,7 +213,7 @@ }, "packages/vscode": { "name": "openchamber", - "version": "1.6.1", + "version": "1.6.3", "dependencies": { "@openchamber/ui": "workspace:*", "@opencode-ai/sdk": "^1.1.48", @@ -235,7 +236,7 @@ }, "packages/web": { "name": "@openchamber/web", - "version": "1.6.1", + "version": "1.6.3", "bin": { "openchamber": "./bin/cli.js", }, @@ -1512,6 +1513,8 @@ "cockatiel": ["cockatiel@3.2.1", "", {}, "sha512-gfrHV6ZPkquExvMh9IOkKsBzNDk6sDuZ6DdBGUBkvFnTCqCxzpuq48RySgP0AnaqQkw2zynOFj9yly6T1Q2G5Q=="], + "codemirror-lang-elixir": ["codemirror-lang-elixir@4.0.0", "", { "dependencies": { "@codemirror/language": "^6.0.0", "lezer-elixir": "^1.0.0" } }, "sha512-mzFesxo/t6KOxwnkqVd34R/q7yk+sMtHh6vUKGAvjwHmpL7bERHB+vQAsmU/nqrndkwVeJEHWGw/z/ybfdiudA=="], + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], @@ -2228,6 +2231,8 @@ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + "lezer-elixir": ["lezer-elixir@1.1.2", "", { "dependencies": { "@lezer/highlight": "^1.2.0", "@lezer/lr": "^1.3.0" } }, "sha512-K3yPMJcNhqCL6ugr5NkgOC1g37rcOM38XZezO9lBXy0LwWFd8zdWXfmRbY829vZVk0OGCQoI02yDWp9FF2OWZA=="], + "lightningcss": ["lightningcss@1.30.2", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.30.2", "lightningcss-darwin-arm64": "1.30.2", "lightningcss-darwin-x64": "1.30.2", "lightningcss-freebsd-x64": "1.30.2", "lightningcss-linux-arm-gnueabihf": "1.30.2", "lightningcss-linux-arm64-gnu": "1.30.2", "lightningcss-linux-arm64-musl": "1.30.2", "lightningcss-linux-x64-gnu": "1.30.2", "lightningcss-linux-x64-musl": "1.30.2", "lightningcss-win32-arm64-msvc": "1.30.2", "lightningcss-win32-x64-msvc": "1.30.2" } }, "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ=="], "lightningcss-android-arm64": ["lightningcss-android-arm64@1.30.2", "", { "os": "android", "cpu": "arm64" }, "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A=="], diff --git a/package.json b/package.json index b5a4f4b0..883e8605 100644 --- a/package.json +++ b/package.json @@ -101,6 +101,7 @@ "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", + "codemirror-lang-elixir": "^4.0.0", "electron-context-menu": "^4.1.1", "electron-store": "^11.0.2", "express": "^5.1.0", diff --git a/packages/ui/src/lib/codemirror/languageByExtension.ts b/packages/ui/src/lib/codemirror/languageByExtension.ts index 00d9c935..608532f2 100644 --- a/packages/ui/src/lib/codemirror/languageByExtension.ts +++ b/packages/ui/src/lib/codemirror/languageByExtension.ts @@ -11,6 +11,7 @@ import { sql } from '@codemirror/lang-sql'; import { xml } from '@codemirror/lang-xml'; import { yaml as yamlLanguage } from '@codemirror/lang-yaml'; import { rust } from '@codemirror/lang-rust'; +import { elixir } from 'codemirror-lang-elixir'; import { Language, LanguageDescription, StreamLanguage, HighlightStyle, syntaxHighlighting } from '@codemirror/language'; import { tags as t } from '@lezer/highlight'; @@ -20,6 +21,7 @@ import { diff } from '@codemirror/legacy-modes/mode/diff'; import { dockerFile } from '@codemirror/legacy-modes/mode/dockerfile'; import { ruby } from '@codemirror/legacy-modes/mode/ruby'; import { properties } from '@codemirror/legacy-modes/mode/properties'; +import { erlang } from '@codemirror/legacy-modes/mode/erlang'; const shellLanguage = StreamLanguage.define(shell); const tomlLanguage = StreamLanguage.define(toml); @@ -27,6 +29,9 @@ const diffLanguage = StreamLanguage.define(diff); const dockerfileLanguage = StreamLanguage.define(dockerFile); const rubyLanguage = StreamLanguage.define(ruby); const propertiesLanguage = StreamLanguage.define(properties); +const elixirSupport = elixir(); +const elixirLanguage = elixirSupport.language; +const erlangLanguage = StreamLanguage.define(erlang); function codeBlockLanguageResolver(info: string): Language | LanguageDescription | null { const normalized = info.trim().toLowerCase(); @@ -76,6 +81,18 @@ function codeBlockLanguageResolver(info: string): Language | LanguageDescription case 'rs': case 'rust': return rust().language; + case 'ex': + case 'exs': + case 'elixir': + return elixirLanguage; + case 'erl': + case 'hrl': + case 'erlang': + return erlangLanguage; + case 'heex': + case 'eex': + case 'leex': + return html().language; default: return LanguageDescription.matchLanguageName(languages, normalized, true); } @@ -201,6 +218,18 @@ export function languageByExtension(filePath: string): Extension | null { case 'gemspec': return rubyLanguage; + case 'ex': + case 'exs': + return elixirSupport; + case 'erl': + case 'hrl': + return erlangLanguage; + + case 'eex': + case 'leex': + case 'heex': + return html(); + default: return null; } diff --git a/packages/ui/src/lib/toolHelpers.ts b/packages/ui/src/lib/toolHelpers.ts index b3269ad1..0d7013dc 100644 --- a/packages/ui/src/lib/toolHelpers.ts +++ b/packages/ui/src/lib/toolHelpers.ts @@ -473,9 +473,9 @@ export function getLanguageFromExtension(filePath: string): string | null { // Elixir/Erlang 'ex': 'elixir', 'exs': 'elixir', - 'eex': 'elixir', - 'heex': 'elixir', - 'leex': 'elixir', + 'eex': 'html', + 'heex': 'html', + 'leex': 'html', 'erl': 'erlang', 'hrl': 'erlang',