208 lines
5.8 KiB
TypeScript
208 lines
5.8 KiB
TypeScript
import type { SimpleIcon } from "simple-icons";
|
|
import {
|
|
siAstro,
|
|
siBun,
|
|
siC,
|
|
siClojure,
|
|
siCmake,
|
|
siCplusplus,
|
|
siCss,
|
|
siDart,
|
|
siDeno,
|
|
siDocker,
|
|
siDotnet,
|
|
siEditorconfig,
|
|
siElixir,
|
|
siErlang,
|
|
siEslint,
|
|
siFortran,
|
|
siFsharp,
|
|
siGit,
|
|
siGitignoredotio,
|
|
siGnubash,
|
|
siGo,
|
|
siGradle,
|
|
siGraphql,
|
|
siHaskell,
|
|
siHtml5,
|
|
siJavascript,
|
|
siJson,
|
|
siJulia,
|
|
siKotlin,
|
|
siLua,
|
|
siMake,
|
|
siMarkdown,
|
|
siNodedotjs,
|
|
siNpm,
|
|
siOcaml,
|
|
siOpenjdk,
|
|
siPerl,
|
|
siPhp,
|
|
siPnpm,
|
|
siPrettier,
|
|
siPython,
|
|
siR,
|
|
siReact,
|
|
siRuby,
|
|
siRust,
|
|
siSass,
|
|
siScala,
|
|
siShell,
|
|
siSqlite,
|
|
siSvelte,
|
|
siSvg,
|
|
siSwift,
|
|
siTailwindcss,
|
|
siTauri,
|
|
siTerraform,
|
|
siToml,
|
|
siTypescript,
|
|
siVite,
|
|
siVuedotjs,
|
|
siYaml,
|
|
siYarn,
|
|
siZig,
|
|
siZsh,
|
|
} from "simple-icons";
|
|
|
|
export interface LanguageIconSpec {
|
|
icon: SimpleIcon;
|
|
title: string;
|
|
}
|
|
|
|
function spec(icon: SimpleIcon, title = icon.title): LanguageIconSpec {
|
|
return { icon, title };
|
|
}
|
|
|
|
const fileNameIcons = new Map<string, LanguageIconSpec>([
|
|
["dockerfile", spec(siDocker, "Docker")],
|
|
["docker-compose.yml", spec(siDocker, "Docker Compose")],
|
|
["docker-compose.yaml", spec(siDocker, "Docker Compose")],
|
|
["compose.yml", spec(siDocker, "Docker Compose")],
|
|
["compose.yaml", spec(siDocker, "Docker Compose")],
|
|
["package.json", spec(siNodedotjs, "Node package")],
|
|
["package-lock.json", spec(siNpm, "npm lockfile")],
|
|
["pnpm-lock.yaml", spec(siPnpm, "pnpm lockfile")],
|
|
["yarn.lock", spec(siYarn, "Yarn lockfile")],
|
|
["bun.lockb", spec(siBun, "Bun lockfile")],
|
|
["deno.json", spec(siDeno, "Deno")],
|
|
["deno.jsonc", spec(siDeno, "Deno")],
|
|
["cargo.toml", spec(siRust, "Cargo")],
|
|
["cargo.lock", spec(siRust, "Cargo lockfile")],
|
|
["tauri.conf.json", spec(siTauri, "Tauri")],
|
|
["svelte.config.js", spec(siSvelte, "Svelte config")],
|
|
["svelte.config.ts", spec(siSvelte, "Svelte config")],
|
|
["vite.config.js", spec(siVite, "Vite config")],
|
|
["vite.config.ts", spec(siVite, "Vite config")],
|
|
["tailwind.config.js", spec(siTailwindcss, "Tailwind CSS config")],
|
|
["tailwind.config.ts", spec(siTailwindcss, "Tailwind CSS config")],
|
|
["eslint.config.js", spec(siEslint, "ESLint config")],
|
|
["eslint.config.mjs", spec(siEslint, "ESLint config")],
|
|
[".eslintrc", spec(siEslint, "ESLint config")],
|
|
[".eslintrc.js", spec(siEslint, "ESLint config")],
|
|
[".eslintrc.cjs", spec(siEslint, "ESLint config")],
|
|
[".prettierrc", spec(siPrettier, "Prettier config")],
|
|
[".prettierrc.json", spec(siPrettier, "Prettier config")],
|
|
[".prettierrc.js", spec(siPrettier, "Prettier config")],
|
|
[".gitignore", spec(siGitignoredotio, "gitignore")],
|
|
[".gitattributes", spec(siGit, "Git attributes")],
|
|
[".gitmodules", spec(siGit, "Git modules")],
|
|
[".editorconfig", spec(siEditorconfig, "EditorConfig")],
|
|
["cmakelists.txt", spec(siCmake, "CMake")],
|
|
["makefile", spec(siMake, "Makefile")],
|
|
["justfile", spec(siShell, "Justfile")],
|
|
["rakefile", spec(siRuby, "Rakefile")],
|
|
["gemfile", spec(siRuby, "Gemfile")],
|
|
]);
|
|
|
|
const extensionIcons = new Map<string, LanguageIconSpec>([
|
|
["js", spec(siJavascript)],
|
|
["mjs", spec(siJavascript)],
|
|
["cjs", spec(siJavascript)],
|
|
["jsx", spec(siReact, "React JSX")],
|
|
["ts", spec(siTypescript)],
|
|
["mts", spec(siTypescript)],
|
|
["cts", spec(siTypescript)],
|
|
["tsx", spec(siReact, "React TSX")],
|
|
["svelte", spec(siSvelte)],
|
|
["vue", spec(siVuedotjs, "Vue")],
|
|
["astro", spec(siAstro)],
|
|
["rs", spec(siRust)],
|
|
["go", spec(siGo)],
|
|
["py", spec(siPython)],
|
|
["pyw", spec(siPython)],
|
|
["java", spec(siOpenjdk, "Java")],
|
|
["kt", spec(siKotlin)],
|
|
["kts", spec(siKotlin)],
|
|
["cs", spec(siDotnet, "C#")],
|
|
["cpp", spec(siCplusplus, "C++")],
|
|
["cxx", spec(siCplusplus, "C++")],
|
|
["cc", spec(siCplusplus, "C++")],
|
|
["hpp", spec(siCplusplus, "C++")],
|
|
["hh", spec(siCplusplus, "C++")],
|
|
["c", spec(siC)],
|
|
["h", spec(siC)],
|
|
["swift", spec(siSwift)],
|
|
["php", spec(siPhp, "PHP")],
|
|
["rb", spec(siRuby)],
|
|
["lua", spec(siLua)],
|
|
["dart", spec(siDart)],
|
|
["scala", spec(siScala)],
|
|
["zig", spec(siZig)],
|
|
["ex", spec(siElixir)],
|
|
["exs", spec(siElixir)],
|
|
["erl", spec(siErlang)],
|
|
["hrl", spec(siErlang)],
|
|
["fs", spec(siFsharp, "F#")],
|
|
["fsx", spec(siFsharp, "F#")],
|
|
["fsi", spec(siFsharp, "F#")],
|
|
["clj", spec(siClojure)],
|
|
["cljs", spec(siClojure)],
|
|
["hs", spec(siHaskell)],
|
|
["lhs", spec(siHaskell)],
|
|
["ml", spec(siOcaml, "OCaml")],
|
|
["mli", spec(siOcaml, "OCaml")],
|
|
["jl", spec(siJulia)],
|
|
["r", spec(siR, "R")],
|
|
["pl", spec(siPerl)],
|
|
["pm", spec(siPerl)],
|
|
["f", spec(siFortran)],
|
|
["f90", spec(siFortran)],
|
|
["f95", spec(siFortran)],
|
|
["html", spec(siHtml5, "HTML")],
|
|
["htm", spec(siHtml5, "HTML")],
|
|
["css", spec(siCss, "CSS")],
|
|
["scss", spec(siSass, "Sass")],
|
|
["sass", spec(siSass, "Sass")],
|
|
["svg", spec(siSvg, "SVG")],
|
|
["json", spec(siJson, "JSON")],
|
|
["jsonc", spec(siJson, "JSONC")],
|
|
["json5", spec(siJson, "JSON5")],
|
|
["yaml", spec(siYaml, "YAML")],
|
|
["yml", spec(siYaml, "YAML")],
|
|
["toml", spec(siToml, "TOML")],
|
|
["tf", spec(siTerraform, "Terraform")],
|
|
["tfvars", spec(siTerraform, "Terraform variables")],
|
|
["graphql", spec(siGraphql, "GraphQL")],
|
|
["gql", spec(siGraphql, "GraphQL")],
|
|
["md", spec(siMarkdown, "Markdown")],
|
|
["mdx", spec(siMarkdown, "MDX")],
|
|
["sh", spec(siGnubash, "Shell script")],
|
|
["bash", spec(siGnubash, "Bash")],
|
|
["zsh", spec(siZsh, "Zsh")],
|
|
["fish", spec(siShell, "Fish shell")],
|
|
["sql", spec(siSqlite, "SQL")],
|
|
["sqlite", spec(siSqlite, "SQLite")],
|
|
["sqlite3", spec(siSqlite, "SQLite")],
|
|
]);
|
|
|
|
export function languageIconForPath(path: string): LanguageIconSpec | null {
|
|
const name = path.split(/[\\/]/).pop()?.toLowerCase() ?? "";
|
|
const byName = fileNameIcons.get(name);
|
|
if (byName) return byName;
|
|
|
|
const index = name.lastIndexOf(".");
|
|
if (index <= 0) return null;
|
|
return extensionIcons.get(name.slice(index + 1)) ?? null;
|
|
}
|