// One-off copy from GitHub Linguist languages.yml (e9fe3c9f230cd9220afcd057f75702de4d7700c9), plus common lockfile suffixes.
// Normalized to lower-case; numeric manpage-style extensions are excluded so versions like `1.2` stay plain code.
const pathExtensions = new Set([
  "a51",
  "abap",
  "abnf",
  "action",
  "ada",
  "adb",
  "adml",
  "admx",
  "ado",
  "adoc",
  "adp",
  "ads",
  "afm",
  "agc",
  "agda",
  "ahk",
  "ahkl",
  "aidl",
  "aj",
  "ak",
  "al",
  "alg",
  "als",
  "ampl",
  "angelscript",
  "anim",
  "ant",
  "antlers.html",
  "antlers.php",
  "antlers.xml",
  "apacheconf",
  "apex",
  "apib",
  "apl",
  "app",
  "app.src",
  "applescript",
  "arc",
  "arpa",
  "arr",
  "as",
  "asax",
  "asc",
  "asciidoc",
  "ascx",
  "asd",
  "asddls",
  "ash",
  "ashx",
  "asl",
  "asm",
  "asmx",
  "asn",
  "asn1",
  "asp",
  "aspx",
  "asset",
  "astro",
  "asy",
  "au3",
  "aug",
  "auk",
  "aux",
  "avdl",
  "avsc",
  "aw",
  "awk",
  "axaml",
  "axd",
  "axi",
  "axi.erb",
  "axml",
  "axs",
  "axs.erb",
  "b",
  "bal",
  "baml",
  "bas",
  "bash",
  "bat",
  "bats",
  "bb",
  "bbappend",
  "bbclass",
  "bbx",
  "bdf",
  "bdy",
  "be",
  "befunge",
  "bf",
  "bi",
  "bib",
  "bibtex",
  "bicep",
  "bicepparam",
  "bison",
  "blade",
  "blade.php",
  "blp",
  "bmx",
  "bones",
  "boo",
  "boot",
  "bpl",
  "bqn",
  "brd",
  "bro",
  "brs",
  "bru",
  "bs",
  "bsl",
  "bst",
  "bsv",
  "builder",
  "builds",
  "bzl",
  "c",
  "c++",
  "c++-objdump",
  "c++objdump",
  "c-objdump",
  "c3",
  "cabal",
  "caddyfile",
  "cairo",
  "cake",
  "capnp",
  "carbon",
  "cats",
  "cbl",
  "cbx",
  "cc",
  "ccp",
  "ccproj",
  "ccxml",
  "cdc",
  "cdf",
  "cds",
  "ceylon",
  "cfc",
  "cfg",
  "cfm",
  "cfml",
  "cgi",
  "cginc",
  "ch",
  "chem",
  "chpl",
  "chs",
  "cil",
  "circom",
  "cirru",
  "cj",
  "cjs",
  "cjsx",
  "ck",
  "cl",
  "cl2",
  "clar",
  "click",
  "clixml",
  "clj",
  "cljc",
  "cljs",
  "cljs.hl",
  "cljscm",
  "cljx",
  "clp",
  "cls",
  "clue",
  "clw",
  "cmake",
  "cmake.in",
  "cmd",
  "cmp",
  "cnc",
  "cnf",
  "cob",
  "cobol",
  "cocci",
  "code-snippets",
  "code-workspace",
  "coffee",
  "coffee.md",
  "com",
  "command",
  "conll",
  "conllu",
  "container",
  "containerfile",
  "cook",
  "coq",
  "cp",
  "cpp",
  "cpp-objdump",
  "cppm",
  "cppobjdump",
  "cproject",
  "cps",
  "cpy",
  "cql",
  "cr",
  "crc32",
  "creole",
  "cs",
  "cs.pp",
  "csc",
  "cscfg",
  "csd",
  "csdef",
  "csh",
  "cshtml",
  "csl",
  "cson",
  "csproj",
  "css",
  "csv",
  "csx",
  "ct",
  "ctl",
  "ctp",
  "cts",
  "cu",
  "cue",
  "cuh",
  "curry",
  "cw",
  "cwl",
  "cxx",
  "cxx-objdump",
  "cy",
  "cylc",
  "cyp",
  "cypher",
  "d",
  "d-objdump",
  "d2",
  "dae",
  "darcspatch",
  "dart",
  "das",
  "dats",
  "db2",
  "dcl",
  "ddl",
  "decls",
  "depproj",
  "desktop",
  "desktop.in",
  "dfm",
  "dfy",
  "dhall",
  "di",
  "diff",
  "dircolors",
  "dita",
  "ditamap",
  "ditaval",
  "djs",
  "dll.config",
  "dlm",
  "dm",
  "do",
  "dockerfile",
  "dof",
  "doh",
  "dot",
  "dotsettings",
  "dpatch",
  "dpr",
  "druby",
  "dsc",
  "dsl",
  "dsp",
  "dsr",
  "dtx",
  "duby",
  "dwl",
  "dyalog",
  "dyl",
  "dylan",
  "dzn",
  "e",
  "eam.fs",
  "eb",
  "ebnf",
  "ebuild",
  "ec",
  "ecl",
  "eclass",
  "eclxml",
  "ecr",
  "ect",
  "edc",
  "edge",
  "edgeql",
  "editorconfig",
  "edn",
  "eh",
  "ejs",
  "ejs.t",
  "el",
  "eliom",
  "eliomi",
  "elm",
  "elv",
  "em",
  "emacs",
  "emacs.desktop",
  "emberscript",
  "eml",
  "env",
  "epj",
  "eps",
  "epsi",
  "eq",
  "erb",
  "erb.deface",
  "erl",
  "es",
  "es6",
  "escript",
  "esdl",
  "ex",
  "exs",
  "eye",
  "f",
  "f03",
  "f08",
  "f77",
  "f90",
  "f95",
  "factor",
  "fan",
  "fancypack",
  "fbs",
  "fcgi",
  "fea",
  "feature",
  "filters",
  "fir",
  "fish",
  "flex",
  "flf",
  "flix",
  "flux",
  "fnc",
  "fnl",
  "for",
  "forth",
  "fp",
  "fpp",
  "fr",
  "frag",
  "frg",
  "frm",
  "frt",
  "fs",
  "fsh",
  "fshader",
  "fsi",
  "fsproj",
  "fst",
  "fsti",
  "fsx",
  "fth",
  "ftl",
  "ftlh",
  "fun",
  "fut",
  "fx",
  "fxh",
  "fxml",
  "fy",
  "g",
  "g4",
  "gaml",
  "gap",
  "gawk",
  "gbl",
  "gbo",
  "gbp",
  "gbr",
  "gbs",
  "gco",
  "gcode",
  "gd",
  "gdb",
  "gdbinit",
  "gdnlib",
  "gdns",
  "gdshader",
  "gdshaderinc",
  "ged",
  "gemspec",
  "geo",
  "geojson",
  "geom",
  "gf",
  "gi",
  "gitconfig",
  "gitignore",
  "gjs",
  "gko",
  "glade",
  "gleam",
  "glf",
  "glsl",
  "glslf",
  "glslv",
  "gltf",
  "glyphs",
  "gmi",
  "gml",
  "gms",
  "gmx",
  "gn",
  "gni",
  "gnu",
  "gnuplot",
  "go",
  "god",
  "gohtml",
  "golo",
  "gotmpl",
  "gp",
  "gpb",
  "gpt",
  "gpx",
  "gql",
  "grace",
  "gradle",
  "gradle.kts",
  "graphql",
  "graphqls",
  "groovy",
  "grt",
  "grxml",
  "gs",
  "gsc",
  "gsh",
  "gshader",
  "gsp",
  "gst",
  "gsx",
  "gtkrc",
  "gtl",
  "gto",
  "gtp",
  "gtpl",
  "gts",
  "gv",
  "gvy",
  "gyp",
  "gypi",
  "h",
  "h++",
  "h.in",
  "ha",
  "hack",
  "haml",
  "haml.deface",
  "handlebars",
  "har",
  "hats",
  "hb",
  "hbs",
  "hc",
  "hcl",
  "heex",
  "hh",
  "hhi",
  "hic",
  "hip",
  "hlean",
  "hlsl",
  "hlsli",
  "hocon",
  "hoon",
  "hpp",
  "hqf",
  "hql",
  "hrl",
  "hs",
  "hs-boot",
  "hsc",
  "hta",
  "htm",
  "html",
  "html.eex",
  "html.hl",
  "html.tmpl",
  "http",
  "hurl",
  "hx",
  "hxml",
  "hxsl",
  "hxx",
  "hy",
  "hzp",
  "i",
  "i3",
  "i7x",
  "ical",
  "ice",
  "iced",
  "icl",
  "icls",
  "ics",
  "idc",
  "idr",
  "ig",
  "ihlp",
  "ijm",
  "ijs",
  "ik",
  "il",
  "ily",
  "imba",
  "iml",
  "inc",
  "ini",
  "ink",
  "inl",
  "ino",
  "ins",
  "intr",
  "io",
  "iol",
  "ipf",
  "ipp",
  "ipynb",
  "irclog",
  "isl",
  "ispc",
  "iss",
  "iuml",
  "ivy",
  "ixx",
  "j",
  "j2",
  "jac",
  "jade",
  "jai",
  "jake",
  "janet",
  "jav",
  "java",
  "javascript",
  "jbuilder",
  "jcl",
  "jelly",
  "jflex",
  "jinja",
  "jinja2",
  "jison",
  "jisonlex",
  "jl",
  "jq",
  "js",
  "js.erb",
  "jsb",
  "jscad",
  "jsfl",
  "jsh",
  "jslib",
  "jsm",
  "json",
  "json-tmlanguage",
  "json.example",
  "json5",
  "jsonc",
  "jsonl",
  "jsonld",
  "jsonnet",
  "jsp",
  "jspre",
  "jsproj",
  "jss",
  "jst",
  "jsx",
  "jte",
  "just",
  "k",
  "kak",
  "kdl",
  "kicad_mod",
  "kicad_pcb",
  "kicad_sch",
  "kicad_sym",
  "kicad_wks",
  "kid",
  "kit",
  "kk",
  "kml",
  "kojo",
  "kql",
  "krl",
  "ks",
  "ksh",
  "ksy",
  "kt",
  "ktm",
  "kts",
  "kv",
  "l",
  "lagda",
  "langium",
  "lark",
  "las",
  "lasso",
  "lasso8",
  "lasso9",
  "latte",
  "launch",
  "lbx",
  "ld",
  "lds",
  "lean",
  "leex",
  "lektorproject",
  "leo",
  "less",
  "lex",
  "lfe",
  "lgt",
  "lhs",
  "libsonnet",
  "lid",
  "lidr",
  "ligo",
  "linq",
  "liq",
  "liquid",
  "lisp",
  "litcoffee",
  "livecodescript",
  "livemd",
  "lkml",
  "ll",
  "lmi",
  "lock",
  "lockb",
  "logtalk",
  "lol",
  "lookml",
  "lp",
  "lpr",
  "ls",
  "lsl",
  "lslp",
  "lsp",
  "ltx",
  "lua",
  "luau",
  "lvclass",
  "lvlib",
  "lvproj",
  "ly",
  "m",
  "m2",
  "m3",
  "m3u",
  "m3u8",
  "m4",
  "ma",
  "mak",
  "make",
  "makefile",
  "mako",
  "man",
  "mao",
  "markdown",
  "marko",
  "mask",
  "mat",
  "mata",
  "matah",
  "mathematica",
  "matlab",
  "mawk",
  "maxhelp",
  "maxpat",
  "maxproj",
  "mbox",
  "mbt",
  "mc",
  "mcfunction",
  "mch",
  "mcmeta",
  "mcr",
  "md",
  "md2",
  "md4",
  "md5",
  "mdoc",
  "mdown",
  "mdpolicy",
  "mdwn",
  "mdx",
  "me",
  "mediawiki",
  "mermaid",
  "meta",
  "metal",
  "metta",
  "mg",
  "minid",
  "mint",
  "mir",
  "mirah",
  "mjml",
  "mjs",
  "mk",
  "mkd",
  "mkdn",
  "mkdown",
  "mkfile",
  "mkii",
  "mkiv",
  "mkvi",
  "ml",
  "ml4",
  "mli",
  "mligo",
  "mlir",
  "mll",
  "mly",
  "mm",
  "mmd",
  "mmk",
  "mms",
  "mo",
  "mod",
  "mojo",
  "monkey",
  "monkey2",
  "moo",
  "moon",
  "mount",
  "move",
  "mpl",
  "mps",
  "mq4",
  "mq5",
  "mqh",
  "mrc",
  "ms",
  "msd",
  "msg",
  "mspec",
  "mss",
  "mt",
  "mtl",
  "mtml",
  "mts",
  "mu",
  "mud",
  "muf",
  "mumps",
  "muse",
  "mustache",
  "mxml",
  "mxt",
  "mysql",
  "myt",
  "mzn",
  "n",
  "nanorc",
  "nas",
  "nasl",
  "nasm",
  "natvis",
  "nawk",
  "nb",
  "nbp",
  "nc",
  "ncl",
  "ndproj",
  "ne",
  "nearley",
  "ned",
  "neon",
  "network",
  "nf",
  "nginx",
  "nginxconf",
  "ni",
  "nim",
  "nim.cfg",
  "nimble",
  "nimrod",
  "nims",
  "ninja",
  "nit",
  "nix",
  "njk",
  "njs",
  "nl",
  "nlogo",
  "no",
  "nomad",
  "nproj",
  "nqp",
  "nr",
  "nse",
  "nsh",
  "nsi",
  "nss",
  "nu",
  "numpy",
  "numpyw",
  "numsc",
  "nuspec",
  "nut",
  "ny",
  "ob2",
  "obj",
  "objdump",
  "odd",
  "odin",
  "ol",
  "omgrofl",
  "ooc",
  "opa",
  "opal",
  "opencl",
  "opy",
  "orc",
  "org",
  "os",
  "osm",
  "outjob",
  "overpassql",
  "owl",
  "ox",
  "oxh",
  "oxo",
  "oxygene",
  "oz",
  "p",
  "p4",
  "p6",
  "p6l",
  "p6m",
  "p8",
  "pac",
  "pact",
  "pan",
  "parrot",
  "pas",
  "pascal",
  "pasm",
  "pat",
  "patch",
  "pb",
  "pbi",
  "pbt",
  "pbtxt",
  "pc",
  "pc.in",
  "pcbdoc",
  "pck",
  "pcss",
  "pd",
  "pd_lua",
  "pddl",
  "pde",
  "peggy",
  "pegjs",
  "pep",
  "per",
  "perl",
  "pfa",
  "pgsql",
  "ph",
  "php",
  "php3",
  "php4",
  "php5",
  "phps",
  "phpt",
  "phtml",
  "pic",
  "pig",
  "pike",
  "pir",
  "pkb",
  "pkgproj",
  "pkl",
  "pks",
  "pl",
  "pl6",
  "plantuml",
  "plb",
  "plist",
  "plot",
  "pls",
  "plsql",
  "plt",
  "pluginspec",
  "plx",
  "pm",
  "pm6",
  "pml",
  "pmod",
  "po",
  "pod",
  "pod6",
  "podsl",
  "podspec",
  "pogo",
  "polar",
  "pony",
  "por",
  "postcss",
  "pot",
  "pov",
  "pp",
  "pprx",
  "pq",
  "praat",
  "prawn",
  "prc",
  "prefab",
  "prefs",
  "prg",
  "pri",
  "prisma",
  "prjpcb",
  "pro",
  "proj",
  "prolog",
  "properties",
  "props",
  "proto",
  "prw",
  "ps",
  "ps1",
  "ps1xml",
  "psc",
  "psc1",
  "psd1",
  "psgi",
  "psm1",
  "pt",
  "pub",
  "pubxml",
  "pug",
  "puml",
  "purs",
  "pwn",
  "pxd",
  "pxi",
  "py",
  "py3",
  "pyde",
  "pyi",
  "pyp",
  "pyt",
  "pytb",
  "pyw",
  "pyx",
  "q",
  "qasm",
  "qbs",
  "qc",
  "qhelp",
  "ql",
  "qll",
  "qmd",
  "qml",
  "qnt",
  "qs",
  "r",
  "r2",
  "r3",
  "rabl",
  "rake",
  "raku",
  "rakumod",
  "raml",
  "rascript",
  "raw",
  "razor",
  "rb",
  "rbbas",
  "rbfrm",
  "rbi",
  "rbmnu",
  "rbres",
  "rbs",
  "rbtbar",
  "rbuild",
  "rbuistate",
  "rbw",
  "rbx",
  "rbxs",
  "rchit",
  "rd",
  "rdf",
  "rdoc",
  "re",
  "reb",
  "rebol",
  "red",
  "reds",
  "reek",
  "reg",
  "regex",
  "regexp",
  "rego",
  "rei",
  "religo",
  "res",
  "resi",
  "resource",
  "rest",
  "rest.txt",
  "resx",
  "rex",
  "rexx",
  "rg",
  "rhtml",
  "ring",
  "riot",
  "rkt",
  "rktd",
  "rktl",
  "rl",
  "rmd",
  "rmiss",
  "rnh",
  "rno",
  "rnw",
  "robot",
  "roc",
  "rockspec",
  "roff",
  "ron",
  "ronn",
  "rpgle",
  "rpy",
  "rq",
  "rs",
  "rs.in",
  "rsc",
  "rsh",
  "rss",
  "rst",
  "rst.txt",
  "rsx",
  "rtf",
  "ru",
  "ruby",
  "rviz",
  "s",
  "sage",
  "sagews",
  "sail",
  "sarif",
  "sas",
  "sass",
  "sats",
  "sbatch",
  "sbt",
  "sc",
  "scad",
  "scala",
  "scaml",
  "scd",
  "sce",
  "scenic",
  "sch",
  "schdoc",
  "sci",
  "scm",
  "sco",
  "scpt",
  "scrbl",
  "scss",
  "scxml",
  "sdc",
  "sed",
  "self",
  "service",
  "sexp",
  "sfd",
  "sfproj",
  "sfv",
  "sh",
  "sh-session",
  "sh.in",
  "sha1",
  "sha2",
  "sha224",
  "sha256",
  "sha256sum",
  "sha3",
  "sha384",
  "sha512",
  "shader",
  "shen",
  "shproj",
  "sieve",
  "sig",
  "sj",
  "sjs",
  "sl",
  "slang",
  "sld",
  "slim",
  "slint",
  "sln",
  "slnlaunch",
  "slnx",
  "sls",
  "slurm",
  "sma",
  "smali",
  "smithy",
  "smk",
  "sml",
  "smt",
  "smt2",
  "snakefile",
  "snap",
  "snip",
  "snippet",
  "snippets",
  "socket",
  "sol",
  "soy",
  "sp",
  "sparql",
  "spc",
  "spec",
  "spin",
  "sps",
  "sqf",
  "sql",
  "sqlrpgle",
  "sra",
  "srdf",
  "srt",
  "sru",
  "srv",
  "srw",
  "ss",
  "ssjs",
  "sss",
  "st",
  "stan",
  "star",
  "sthlp",
  "stl",
  "ston",
  "story",
  "storyboard",
  "sttheme",
  "sty",
  "styl",
  "sublime-build",
  "sublime-color-scheme",
  "sublime-commands",
  "sublime-completions",
  "sublime-keymap",
  "sublime-macro",
  "sublime-menu",
  "sublime-mousemap",
  "sublime-project",
  "sublime-settings",
  "sublime-snippet",
  "sublime-syntax",
  "sublime-theme",
  "sublime-workspace",
  "sublime_metrics",
  "sublime_session",
  "sum",
  "surql",
  "sv",
  "svelte",
  "svg",
  "svh",
  "svx",
  "sw",
  "swg",
  "swift",
  "swig",
  "syntax",
  "t",
  "tab",
  "tac",
  "tact",
  "tag",
  "talon",
  "target",
  "targets",
  "tcc",
  "tcl",
  "tcl.in",
  "tcsh",
  "te",
  "tea",
  "templ",
  "tesc",
  "tese",
  "tex",
  "texi",
  "texinfo",
  "textgrid",
  "textile",
  "textproto",
  "tf",
  "tfstate",
  "tfstate.backup",
  "tftpl",
  "tfvars",
  "thor",
  "thrift",
  "thy",
  "timer",
  "tl",
  "tla",
  "tlv",
  "tm",
  "tmac",
  "tmcommand",
  "tmdl",
  "tml",
  "tmlanguage",
  "tmpl",
  "tmpreferences",
  "tmsnippet",
  "tmtheme",
  "tmux",
  "toc",
  "tofu",
  "toit",
  "toml",
  "toml.example",
  "tool",
  "topojson",
  "tpb",
  "tpl",
  "tpp",
  "tps",
  "tres",
  "trg",
  "trigger",
  "ts",
  "tscn",
  "tsconfig.json",
  "tsp",
  "tst",
  "tsv",
  "tsx",
  "ttl",
  "tu",
  "twig",
  "txi",
  "txl",
  "txt",
  "txtpb",
  "txx",
  "typ",
  "uc",
  "udf",
  "udo",
  "ui",
  "unity",
  "uno",
  "upc",
  "uplc",
  "ur",
  "urdf",
  "url",
  "urs",
  "ux",
  "v",
  "vala",
  "vapi",
  "vark",
  "vb",
  "vba",
  "vbhtml",
  "vbproj",
  "vbs",
  "vcf",
  "vcl",
  "vcxproj",
  "vdf",
  "veo",
  "vert",
  "vh",
  "vhd",
  "vhdl",
  "vhf",
  "vhi",
  "vho",
  "vhost",
  "vhs",
  "vht",
  "vhw",
  "vim",
  "vimrc",
  "viw",
  "vmb",
  "vmf",
  "volt",
  "vrx",
  "vs",
  "vsh",
  "vshader",
  "vsixmanifest",
  "vssettings",
  "vstemplate",
  "vtl",
  "vto",
  "vtt",
  "vue",
  "vw",
  "vxml",
  "vy",
  "w",
  "wast",
  "wat",
  "watchr",
  "wdl",
  "webapp",
  "webidl",
  "webmanifest",
  "weechatlog",
  "wgsl",
  "whiley",
  "wiki",
  "wikitext",
  "wisp",
  "wit",
  "wixproj",
  "wl",
  "wlk",
  "wls",
  "wlt",
  "wlua",
  "workbook",
  "workflow",
  "wren",
  "ws",
  "wsdl",
  "wsf",
  "wsgi",
  "wxi",
  "wxl",
  "wxs",
  "x",
  "x10",
  "x3d",
  "x68",
  "xacro",
  "xaml",
  "xbm",
  "xc",
  "xdc",
  "xht",
  "xhtml",
  "xi",
  "xib",
  "xlf",
  "xliff",
  "xm",
  "xmi",
  "xml",
  "xml.dist",
  "xmp",
  "xojo_code",
  "xojo_menu",
  "xojo_report",
  "xojo_script",
  "xojo_toolbar",
  "xojo_window",
  "xpl",
  "xpm",
  "xproc",
  "xproj",
  "xpy",
  "xq",
  "xql",
  "xqm",
  "xquery",
  "xqy",
  "xrl",
  "xs",
  "xsd",
  "xsh",
  "xsjs",
  "xsjslib",
  "xsl",
  "xslt",
  "xsp-config",
  "xsp.metadata",
  "xspec",
  "xtend",
  "xul",
  "xzap",
  "y",
  "yacc",
  "yaml",
  "yaml-tmlanguage",
  "yaml.sed",
  "yang",
  "yap",
  "yar",
  "yara",
  "yasnippet",
  "yml",
  "yml.mysql",
  "yrl",
  "yul",
  "yy",
  "yyp",
  "z3",
  "zap",
  "zcml",
  "zed",
  "zeek",
  "zep",
  "zig",
  "zig.zon",
  "zil",
  "zimpl",
  "zmodel",
  "zmpl",
  "zone",
  "zpl",
  "zs",
  "zsh",
  "zsh-theme",
])

const pathFileNames = new Set([
  ".abbrev_defs",
  ".ackrc",
  ".all-contributorsrc",
  ".arcconfig",
  ".atomignore",
  ".auto-changelog",
  ".babelignore",
  ".babelrc",
  ".bash_aliases",
  ".bash_functions",
  ".bash_history",
  ".bash_logout",
  ".bash_profile",
  ".bashrc",
  ".browserslistrc",
  ".buckconfig",
  ".bzrignore",
  ".c8rc",
  ".ckignore",
  ".clang-format",
  ".clang-tidy",
  ".clangd",
  ".classpath",
  ".coffeelintignore",
  ".coveragerc",
  ".cshrc",
  ".curlrc",
  ".cvsignore",
  ".dir_colors",
  ".dockerignore",
  ".easignore",
  ".eleventyignore",
  ".env.ci",
  ".env.dev",
  ".env.development",
  ".env.development.local",
  ".env.example",
  ".env.local",
  ".env.prod",
  ".env.production",
  ".env.sample",
  ".env.staging",
  ".env.template",
  ".env.test",
  ".env.testing",
  ".envrc",
  ".eslint-ignore",
  ".eslintignore",
  ".exrc",
  ".factor-boot-rc",
  ".factor-rc",
  ".flake8",
  ".flaskenv",
  ".gclient",
  ".gemrc",
  ".git-blame-ignore-revs",
  ".gitattributes",
  ".gitmodules",
  ".gnus",
  ".gvimrc",
  ".htaccess",
  ".htmlhintrc",
  ".ignore",
  ".imgbotconfig",
  ".inputrc",
  ".irbrc",
  ".jscsrc",
  ".jshintrc",
  ".jslintrc",
  ".justfile",
  ".kshrc",
  ".latexmkrc",
  ".login",
  ".luacheckrc",
  ".markdownlintignore",
  ".nodemonignore",
  ".npmignore",
  ".npmrc",
  ".nvimrc",
  ".nycrc",
  ".php_cs",
  ".php_cs.dist",
  ".prettierignore",
  ".profile",
  ".project",
  ".pryrc",
  ".pylintrc",
  ".rgignore",
  ".rprofile",
  ".rspec",
  ".scalafix.conf",
  ".scalafmt.conf",
  ".shellcheckrc",
  ".simplecov",
  ".spacemacs",
  ".stylelintignore",
  ".swcrc",
  ".tern-config",
  ".tern-project",
  ".tgitconfig",
  ".tm_properties",
  ".tmux.conf",
  ".vercelignore",
  ".viper",
  ".vscodeignore",
  ".watchmanconfig",
  ".wgetrc",
  ".xcompose",
  ".xinitrc",
  ".xsession",
  ".yardopts",
  ".zlogin",
  ".zlogout",
  ".zprofile",
  ".zshenv",
  ".zshrc",
  "9fs",
  "_curlrc",
  "_dir_colors",
  "_dircolors",
  "_emacs",
  "_redirects",
  "_vimrc",
  "abbrev_defs",
  "ack",
  "ackrc",
  "android.bp",
  "apache2.conf",
  "apkbuild",
  "app.config",
  "appraisals",
  "bash_aliases",
  "bash_logout",
  "bash_profile",
  "bashrc",
  "berksfile",
  "brewfile",
  "browserslist",
  "bsdmakefile",
  "buck",
  "build",
  "build.bazel",
  "buildfile",
  "cabal.config",
  "cabal.project",
  "caddyfile",
  "cakefile",
  "capfile",
  "cargo.toml.orig",
  "cask",
  "citation",
  "citation.cff",
  "citations",
  "cksums",
  "codeowners",
  "commit_editmsg",
  "config.worktree",
  "configure.ac",
  "containerfile",
  "contents.lr",
  "copying",
  "cpanfile",
  "crontab",
  "cshrc",
  "dangerfile",
  "deliverfile",
  "deps",
  "dir_colors",
  "dockerfile",
  "dune-project",
  "earthfile",
  "eask",
  "emakefile",
  "encodings.dir",
  "eqnrc",
  "expr-dist",
  "fakefile",
  "fastfile",
  "file_contexts",
  "firestore.rules",
  "fontlog",
  "fonts.alias",
  "fonts.dir",
  "fonts.scale",
  "fp-lib-table",
  "gemfile",
  "genfs_contexts",
  "gitignore-global",
  "gitignore_global",
  "gnumakefile",
  "go.work",
  "gradlew",
  "gtkrc",
  "gtkrc-2.0",
  "guardfile",
  "gvimrc",
  "hosts",
  "httpd.conf",
  "initial_sids",
  "inputrc",
  "install",
  "jakefile",
  "jarfile",
  "jenkinsfile",
  "justfile",
  "kakrc",
  "kbuild",
  "kshrc",
  "latexmkrc",
  "ld.script",
  "license",
  "login",
  "m3makefile",
  "m3overrides",
  "makefile",
  "makefile.am",
  "makefile.in",
  "man",
  "manifest.mf",
  "mavenfile",
  "mcmod.info",
  "md5sums",
  "meson.build",
  "mkfile",
  "mmn",
  "mmt",
  "mocha.opts",
  "module.bazel",
  "modulefile",
  "mvnw",
  "nanorc",
  "news",
  "nextflow.config",
  "nginx.conf",
  "notebook",
  "nuget.config",
  "nukefile",
  "nvimrc",
  "owh",
  "package.resolved",
  "packages.config",
  "phakefile",
  "pipfile",
  "pkgbuild",
  "podfile",
  "port_contexts",
  "procfile",
  "profile",
  "project.ede",
  "project.godot",
  "puppetfile",
  "pylintrc",
  "rakefile",
  "readme.1st",
  "rebar.config",
  "rexfile",
  "riemann.config",
  "root",
  "sconscript",
  "sconstruct",
  "security_classes",
  "settings.stylecop",
  "sha1sums",
  "sha256sums",
  "sha512sums",
  "singularity",
  "slakefile",
  "snakefile",
  "snapfile",
  "ssh-config",
  "ssh_config",
  "sshconfig",
  "sshd-config",
  "sshd_config",
  "starfield",
  "steepfile",
  "suite.rc",
  "thorfile",
  "tiltfile",
  "tmux.conf",
  "torrc",
  "troffrc",
  "troffrc-end",
  "vagrantfile",
  "vimrc",
  "vlcrc",
  "web.config",
  "web.debug.config",
  "web.release.config",
  "workspace",
  "workspace.bazel",
  "workspace.bzlmod",
  "wscript",
  "xcompose",
  "xinitrc",
  "xsession",
  "zlogin",
  "zlogout",
  "zprofile",
  "zshenv",
  "zshrc",
])

const pathFileNamePrefixes = new Set([
  "9fs",
  "_curlrc",
  "_dir_colors",
  "_dircolors",
  "_emacs",
  "_redirects",
  "_vimrc",
  "abbrev_defs",
  "ack",
  "ackrc",
  "apkbuild",
  "appraisals",
  "bash_aliases",
  "bash_logout",
  "bash_profile",
  "bashrc",
  "berksfile",
  "brewfile",
  "browserslist",
  "bsdmakefile",
  "buck",
  "build",
  "buildfile",
  "caddyfile",
  "cakefile",
  "capfile",
  "cask",
  "citation",
  "citations",
  "cksums",
  "codeowners",
  "commit_editmsg",
  "containerfile",
  "copying",
  "cpanfile",
  "crontab",
  "cshrc",
  "dangerfile",
  "deliverfile",
  "deps",
  "dir_colors",
  "dockerfile",
  "dune-project",
  "earthfile",
  "eask",
  "emakefile",
  "eqnrc",
  "expr-dist",
  "fakefile",
  "fastfile",
  "file_contexts",
  "fontlog",
  "fp-lib-table",
  "gemfile",
  "genfs_contexts",
  "gitignore-global",
  "gitignore_global",
  "gnumakefile",
  "gradlew",
  "gtkrc",
  "guardfile",
  "gvimrc",
  "hosts",
  "initial_sids",
  "inputrc",
  "install",
  "jakefile",
  "jarfile",
  "jenkinsfile",
  "justfile",
  "kakrc",
  "kbuild",
  "kshrc",
  "latexmkrc",
  "license",
  "login",
  "m3makefile",
  "m3overrides",
  "makefile",
  "man",
  "mavenfile",
  "md5sums",
  "mkfile",
  "mmn",
  "mmt",
  "modulefile",
  "mvnw",
  "nanorc",
  "news",
  "notebook",
  "nukefile",
  "nvimrc",
  "owh",
  "phakefile",
  "pipfile",
  "pkgbuild",
  "podfile",
  "port_contexts",
  "procfile",
  "profile",
  "puppetfile",
  "pylintrc",
  "rakefile",
  "rexfile",
  "root",
  "sconscript",
  "sconstruct",
  "security_classes",
  "sha1sums",
  "sha256sums",
  "sha512sums",
  "singularity",
  "slakefile",
  "snakefile",
  "snapfile",
  "ssh-config",
  "ssh_config",
  "sshconfig",
  "sshd-config",
  "sshd_config",
  "starfield",
  "steepfile",
  "thorfile",
  "tiltfile",
  "torrc",
  "troffrc",
  "troffrc-end",
  "vagrantfile",
  "vimrc",
  "vlcrc",
  "workspace",
  "wscript",
  "xcompose",
  "xinitrc",
  "xsession",
  "zlogin",
  "zlogout",
  "zprofile",
  "zshenv",
  "zshrc",
])

export function inlineCodeKind(text: string): "path" | "url" | undefined {
  if (/^https?:\/\//i.test(text)) return "url"
  if (/^[a-z][a-z0-9+.-]*:\/\//i.test(text)) return
  if (text === "/") return
  if (/^\/[a-z][a-z0-9-]*$/i.test(text)) return
  if (/\s/.test(text)) return
  if (/[()\[\]{}*+=<>|&^"';]/.test(text)) return
  if (/[/\\]/.test(text) || /^\.\.?[/\\]/.test(text) || hasPathExtension(text) || hasPathFileName(text)) return "path"
}

function hasPathExtension(text: string) {
  const value = text.toLowerCase()
  if (value.endsWith(".d.ts")) return true
  const index = value.lastIndexOf(".")
  if (index === -1) return false
  return pathExtensions.has(value.slice(index + 1))
}

function hasPathFileName(text: string) {
  const value = text.toLowerCase()
  if (pathFileNames.has(value)) return true
  const index = value.indexOf(".")
  if (index === -1) return false
  return pathFileNamePrefixes.has(value.slice(0, index))
}
