/** file or fence → grammar, as sorcery's */ import languages from "./languages.json" with { type: "json" }; const filenames = new Map(Object.entries(languages.filenames)); const aliases = new Map(Object.entries(languages.aliases)); /** By file name, then by extension. */ export function detectLanguage(path: string): string | null { const name = path.split(/[/\\]/).at(-1)!.toLowerCase(); return filenames.get(name) ?? aliases.get(name) ?? aliases.get(name.split(".").at(-1)!) ?? null; } /** A name such as a markdown fence's: `ts`, `typescript`, `sh`. */ export const languageNamed = (name: string): string | null => aliases.get(name.toLowerCase()) ?? null;