code-languages 1.40.9 → 1.41.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. package/README.md +82 -39
  2. package/dist/{api-Cvg4BdaR.d.cts → api-BmiYNzCU.d.cts} +38 -7
  3. package/dist/{api-BlQoDQtF.d.ts → api-DfrvOkQ-.d.ts} +38 -7
  4. package/dist/api.cjs +1883 -1215
  5. package/dist/api.d.cts +3 -3
  6. package/dist/api.d.ts +3 -3
  7. package/dist/api.js +1883 -1215
  8. package/dist/detect-slugs.cjs +147 -40
  9. package/dist/detect-slugs.d.cts +2 -1
  10. package/dist/detect-slugs.d.ts +2 -1
  11. package/dist/detect-slugs.js +147 -41
  12. package/dist/detect.cjs +667 -72
  13. package/dist/detect.d.cts +14 -2
  14. package/dist/detect.d.ts +14 -2
  15. package/dist/detect.js +666 -73
  16. package/dist/i18n.d.cts +1 -1
  17. package/dist/i18n.d.ts +1 -1
  18. package/dist/index.cjs +1998 -1247
  19. package/dist/index.d.cts +29 -13277
  20. package/dist/index.d.ts +29 -13277
  21. package/dist/index.js +1959 -1210
  22. package/dist/languages/actionscript.cjs +1 -0
  23. package/dist/languages/actionscript.d.cts +1 -0
  24. package/dist/languages/actionscript.d.ts +1 -0
  25. package/dist/languages/actionscript.js +1 -0
  26. package/dist/languages/algol.cjs +1 -0
  27. package/dist/languages/algol.d.cts +1 -0
  28. package/dist/languages/algol.d.ts +1 -0
  29. package/dist/languages/algol.js +1 -0
  30. package/dist/languages/ante.cjs +1 -0
  31. package/dist/languages/ante.d.cts +1 -0
  32. package/dist/languages/ante.d.ts +1 -0
  33. package/dist/languages/ante.js +1 -0
  34. package/dist/languages/assembly.cjs +1 -0
  35. package/dist/languages/assembly.d.cts +1 -0
  36. package/dist/languages/assembly.d.ts +1 -0
  37. package/dist/languages/assembly.js +1 -0
  38. package/dist/languages/astro.cjs +1 -1
  39. package/dist/languages/astro.js +1 -1
  40. package/dist/languages/austral.cjs +2 -1
  41. package/dist/languages/austral.d.cts +1 -0
  42. package/dist/languages/austral.d.ts +1 -0
  43. package/dist/languages/austral.js +2 -1
  44. package/dist/languages/awk.cjs +1 -1
  45. package/dist/languages/awk.js +1 -1
  46. package/dist/languages/bcpl.cjs +1 -0
  47. package/dist/languages/bcpl.d.cts +1 -0
  48. package/dist/languages/bcpl.d.ts +1 -0
  49. package/dist/languages/bcpl.js +1 -0
  50. package/dist/languages/bibtex.cjs +1 -1
  51. package/dist/languages/bibtex.js +1 -1
  52. package/dist/languages/bicep.cjs +1 -1
  53. package/dist/languages/bicep.js +1 -1
  54. package/dist/languages/bosque.cjs +1 -0
  55. package/dist/languages/bosque.d.cts +1 -0
  56. package/dist/languages/bosque.d.ts +1 -0
  57. package/dist/languages/bosque.js +1 -0
  58. package/dist/languages/carbon.cjs +1 -0
  59. package/dist/languages/carbon.d.cts +1 -0
  60. package/dist/languages/carbon.d.ts +1 -0
  61. package/dist/languages/carbon.js +1 -0
  62. package/dist/languages/cmake.cjs +1 -1
  63. package/dist/languages/cmake.js +1 -1
  64. package/dist/languages/coq.cjs +1 -0
  65. package/dist/languages/coq.d.cts +1 -0
  66. package/dist/languages/coq.d.ts +1 -0
  67. package/dist/languages/coq.js +1 -0
  68. package/dist/languages/cpp.cjs +1 -0
  69. package/dist/languages/cpp.d.cts +1 -0
  70. package/dist/languages/cpp.d.ts +1 -0
  71. package/dist/languages/cpp.js +1 -0
  72. package/dist/languages/csharp.cjs +1 -0
  73. package/dist/languages/csharp.d.cts +1 -0
  74. package/dist/languages/csharp.d.ts +1 -0
  75. package/dist/languages/csharp.js +1 -0
  76. package/dist/languages/dax.cjs +1 -1
  77. package/dist/languages/dax.js +1 -1
  78. package/dist/languages/dockerfile.cjs +1 -0
  79. package/dist/languages/dockerfile.d.cts +1 -0
  80. package/dist/languages/dockerfile.d.ts +1 -0
  81. package/dist/languages/dockerfile.js +1 -0
  82. package/dist/languages/emacs-lisp.cjs +54 -0
  83. package/dist/languages/emacs-lisp.d.cts +51 -0
  84. package/dist/languages/emacs-lisp.d.ts +51 -0
  85. package/dist/languages/emacs-lisp.js +52 -0
  86. package/dist/languages/fe.cjs +1 -0
  87. package/dist/languages/fe.d.cts +1 -0
  88. package/dist/languages/fe.d.ts +1 -0
  89. package/dist/languages/fe.js +1 -0
  90. package/dist/languages/fsharp.cjs +1 -0
  91. package/dist/languages/fsharp.d.cts +1 -0
  92. package/dist/languages/fsharp.d.ts +1 -0
  93. package/dist/languages/fsharp.js +1 -0
  94. package/dist/languages/gcode.cjs +1 -1
  95. package/dist/languages/gcode.js +1 -1
  96. package/dist/languages/gettext.cjs +1 -1
  97. package/dist/languages/gettext.js +1 -1
  98. package/dist/languages/go.cjs +1 -0
  99. package/dist/languages/go.d.cts +1 -0
  100. package/dist/languages/go.d.ts +1 -0
  101. package/dist/languages/go.js +1 -0
  102. package/dist/languages/io.cjs +1 -1
  103. package/dist/languages/io.js +1 -1
  104. package/dist/languages/javascript.cjs +1 -0
  105. package/dist/languages/javascript.d.cts +1 -0
  106. package/dist/languages/javascript.d.ts +1 -0
  107. package/dist/languages/javascript.js +1 -0
  108. package/dist/languages/jcl.cjs +52 -0
  109. package/dist/languages/jcl.d.cts +49 -0
  110. package/dist/languages/jcl.d.ts +49 -0
  111. package/dist/languages/jcl.js +50 -0
  112. package/dist/languages/jq.cjs +52 -0
  113. package/dist/languages/jq.d.cts +49 -0
  114. package/dist/languages/jq.d.ts +49 -0
  115. package/dist/languages/jq.js +50 -0
  116. package/dist/languages/kotlin.cjs +1 -0
  117. package/dist/languages/kotlin.d.cts +1 -0
  118. package/dist/languages/kotlin.d.ts +1 -0
  119. package/dist/languages/kotlin.js +1 -0
  120. package/dist/languages/lex.cjs +53 -0
  121. package/dist/languages/lex.d.cts +50 -0
  122. package/dist/languages/lex.d.ts +50 -0
  123. package/dist/languages/lex.js +51 -0
  124. package/dist/languages/linkerscript.cjs +1 -1
  125. package/dist/languages/linkerscript.js +1 -1
  126. package/dist/languages/liquid.cjs +1 -1
  127. package/dist/languages/liquid.js +1 -1
  128. package/dist/languages/lobster.cjs +1 -1
  129. package/dist/languages/lobster.js +1 -1
  130. package/dist/languages/luau.cjs +1 -1
  131. package/dist/languages/luau.js +1 -1
  132. package/dist/languages/markdown.cjs +1 -0
  133. package/dist/languages/markdown.d.cts +1 -0
  134. package/dist/languages/markdown.d.ts +1 -0
  135. package/dist/languages/markdown.js +1 -0
  136. package/dist/languages/meson.cjs +1 -1
  137. package/dist/languages/meson.js +1 -1
  138. package/dist/languages/objective-c.cjs +1 -0
  139. package/dist/languages/objective-c.d.cts +1 -0
  140. package/dist/languages/objective-c.d.ts +1 -0
  141. package/dist/languages/objective-c.js +1 -0
  142. package/dist/languages/pl-i.cjs +1 -1
  143. package/dist/languages/pl-i.js +1 -1
  144. package/dist/languages/postscript.cjs +1 -1
  145. package/dist/languages/postscript.js +1 -1
  146. package/dist/languages/powerquery.cjs +1 -1
  147. package/dist/languages/powerquery.js +1 -1
  148. package/dist/languages/powershell.cjs +1 -0
  149. package/dist/languages/powershell.d.cts +1 -0
  150. package/dist/languages/powershell.d.ts +1 -0
  151. package/dist/languages/powershell.js +1 -0
  152. package/dist/languages/properties.cjs +53 -0
  153. package/dist/languages/properties.d.cts +50 -0
  154. package/dist/languages/properties.d.ts +50 -0
  155. package/dist/languages/properties.js +51 -0
  156. package/dist/languages/protobuf.cjs +1 -0
  157. package/dist/languages/protobuf.d.cts +1 -0
  158. package/dist/languages/protobuf.d.ts +1 -0
  159. package/dist/languages/protobuf.js +1 -0
  160. package/dist/languages/python.cjs +1 -0
  161. package/dist/languages/python.d.cts +1 -0
  162. package/dist/languages/python.d.ts +1 -0
  163. package/dist/languages/python.js +1 -0
  164. package/dist/languages/raku.cjs +1 -0
  165. package/dist/languages/raku.d.cts +1 -0
  166. package/dist/languages/raku.d.ts +1 -0
  167. package/dist/languages/raku.js +1 -0
  168. package/dist/languages/restructuredtext.cjs +1 -0
  169. package/dist/languages/restructuredtext.d.cts +1 -0
  170. package/dist/languages/restructuredtext.d.ts +1 -0
  171. package/dist/languages/restructuredtext.js +1 -0
  172. package/dist/languages/rexx.cjs +52 -0
  173. package/dist/languages/rexx.d.cts +49 -0
  174. package/dist/languages/rexx.d.ts +49 -0
  175. package/dist/languages/rexx.js +50 -0
  176. package/dist/languages/ruby.cjs +1 -0
  177. package/dist/languages/ruby.d.cts +1 -0
  178. package/dist/languages/ruby.d.ts +1 -0
  179. package/dist/languages/ruby.js +1 -0
  180. package/dist/languages/rust.cjs +1 -1
  181. package/dist/languages/rust.js +1 -1
  182. package/dist/languages/simula.cjs +1 -0
  183. package/dist/languages/simula.d.cts +1 -0
  184. package/dist/languages/simula.d.ts +1 -0
  185. package/dist/languages/simula.js +1 -0
  186. package/dist/languages/snobol.cjs +1 -0
  187. package/dist/languages/snobol.d.cts +1 -0
  188. package/dist/languages/snobol.d.ts +1 -0
  189. package/dist/languages/snobol.js +1 -0
  190. package/dist/languages/solidity.cjs +1 -1
  191. package/dist/languages/solidity.js +1 -1
  192. package/dist/languages/spark.cjs +1 -1
  193. package/dist/languages/spark.js +1 -1
  194. package/dist/languages/spss.cjs +1 -1
  195. package/dist/languages/spss.js +1 -1
  196. package/dist/languages/squirrel.cjs +1 -1
  197. package/dist/languages/squirrel.js +1 -1
  198. package/dist/languages/tex.cjs +1 -0
  199. package/dist/languages/tex.d.cts +1 -0
  200. package/dist/languages/tex.d.ts +1 -0
  201. package/dist/languages/tex.js +1 -0
  202. package/dist/languages/typescript.cjs +2 -1
  203. package/dist/languages/typescript.d.cts +1 -0
  204. package/dist/languages/typescript.d.ts +1 -0
  205. package/dist/languages/typescript.js +2 -1
  206. package/dist/languages/vale.cjs +2 -1
  207. package/dist/languages/vale.d.cts +1 -0
  208. package/dist/languages/vale.d.ts +1 -0
  209. package/dist/languages/vale.js +2 -1
  210. package/dist/languages/vba.cjs +1 -1
  211. package/dist/languages/vba.js +1 -1
  212. package/dist/languages/vbscript.cjs +53 -0
  213. package/dist/languages/vbscript.d.cts +50 -0
  214. package/dist/languages/vbscript.d.ts +50 -0
  215. package/dist/languages/vbscript.js +51 -0
  216. package/dist/languages/verse.cjs +1 -1
  217. package/dist/languages/verse.js +1 -1
  218. package/dist/languages/vimscript.cjs +54 -0
  219. package/dist/languages/vimscript.d.cts +51 -0
  220. package/dist/languages/vimscript.d.ts +51 -0
  221. package/dist/languages/vimscript.js +52 -0
  222. package/dist/languages/visual-basic.cjs +1 -0
  223. package/dist/languages/visual-basic.d.cts +1 -0
  224. package/dist/languages/visual-basic.d.ts +1 -0
  225. package/dist/languages/visual-basic.js +1 -0
  226. package/dist/languages/webassembly.cjs +1 -0
  227. package/dist/languages/webassembly.d.cts +1 -0
  228. package/dist/languages/webassembly.d.ts +1 -0
  229. package/dist/languages/webassembly.js +1 -0
  230. package/dist/languages/yacc.cjs +55 -0
  231. package/dist/languages/yacc.d.cts +50 -0
  232. package/dist/languages/yacc.d.ts +50 -0
  233. package/dist/languages/yacc.js +53 -0
  234. package/dist/{registry-p4uQJ2gP.d.cts → registry-XRfwD571.d.cts} +80 -53
  235. package/dist/{registry-p4uQJ2gP.d.ts → registry-XRfwD571.d.ts} +80 -53
  236. package/dist/shebang-B1dhpwsv.d.ts +15 -0
  237. package/dist/shebang-BL2ZFHQP.d.cts +15 -0
  238. package/dist/{types-B0_wjl_Q.d.cts → types-DkAECzIe.d.cts} +14 -1
  239. package/dist/{types-B0_wjl_Q.d.ts → types-DkAECzIe.d.ts} +14 -1
  240. package/package.json +56 -10
@@ -1,3 +1,70 @@
1
+ // src/domain/detection/match.ts
2
+ var pathSegmentPattern = /[/\\]/;
3
+ var indexCache = /* @__PURE__ */ new WeakMap();
4
+ var getBasename = (filename) => {
5
+ const parts = filename.trim().split(pathSegmentPattern);
6
+ return parts.at(-1).toLowerCase();
7
+ };
8
+ var addIndexKey = (index, key, match) => {
9
+ const matches = index.get(key);
10
+ if (matches) {
11
+ matches.push(match);
12
+ } else {
13
+ index.set(key, [match]);
14
+ }
15
+ };
16
+ var buildDetectionIndex = (entries) => {
17
+ const index = /* @__PURE__ */ new Map();
18
+ entries.forEach((entry, entryIndex) => {
19
+ for (const extension of entry.extensions) {
20
+ const normalizedExtension = extension.toLowerCase();
21
+ const match = { entry, index: entryIndex, matchLength: extension.length };
22
+ if (normalizedExtension.startsWith(".")) {
23
+ addIndexKey(index, normalizedExtension, match);
24
+ } else {
25
+ addIndexKey(index, normalizedExtension, match);
26
+ addIndexKey(index, `.${normalizedExtension}`, match);
27
+ }
28
+ }
29
+ });
30
+ return index;
31
+ };
32
+ var getDetectionIndex = (entries) => {
33
+ let index = indexCache.get(entries);
34
+ if (!index) {
35
+ index = buildDetectionIndex(entries);
36
+ indexCache.set(entries, index);
37
+ }
38
+ return index;
39
+ };
40
+ var getLookupKeys = (basename) => {
41
+ const keys = [basename];
42
+ for (let position = basename.indexOf("."); position !== -1; position = basename.indexOf(".", position + 1)) {
43
+ const suffix = basename.slice(position);
44
+ if (suffix !== basename) {
45
+ keys.push(suffix);
46
+ }
47
+ }
48
+ return keys;
49
+ };
50
+ var detectMatchingEntries = (entries, filename) => {
51
+ const basename = getBasename(filename);
52
+ if (!basename) {
53
+ return [];
54
+ }
55
+ const index = getDetectionIndex(entries);
56
+ const bestMatches = /* @__PURE__ */ new Map();
57
+ for (const key of getLookupKeys(basename)) {
58
+ for (const match of index.get(key) ?? []) {
59
+ const existing = bestMatches.get(match.index);
60
+ if (!existing || match.matchLength > existing.matchLength) {
61
+ bestMatches.set(match.index, match);
62
+ }
63
+ }
64
+ }
65
+ return [...bestMatches.values()].sort((first, second) => second.matchLength - first.matchLength || first.index - second.index).map(({ entry }) => entry);
66
+ };
67
+
1
68
  // src/domain/language/registry.ts
2
69
  var languageIndex = [
3
70
  { slug: "abap", extensions: [".abap"] },
@@ -6,34 +73,34 @@ var languageIndex = [
6
73
  { slug: "agda", extensions: [".agda", ".lagda", ".lagda.md", ".lagda.rst", ".lagda.tex"] },
7
74
  { slug: "algol", extensions: [".alg", ".algol"] },
8
75
  { slug: "ampl", extensions: [".mod", ".dat", ".run"] },
76
+ { slug: "angelscript", extensions: [".as", ".angelscript"] },
9
77
  { slug: "ante", extensions: [".ante"] },
10
78
  { slug: "antlr", extensions: [".g4"] },
11
79
  { slug: "apex", extensions: [".cls", ".trigger"] },
12
80
  { slug: "apl", extensions: [".apl", ".dyalog"] },
13
81
  { slug: "applescript", extensions: [".applescript", ".scpt", ".scptd"] },
14
- { slug: "arduino", extensions: [".ino", ".pde"] },
15
82
  { slug: "aql", extensions: [".aql"] },
83
+ { slug: "arduino", extensions: [".ino", ".pde"] },
16
84
  { slug: "asciidoc", extensions: [".adoc", ".asciidoc", ".asc"] },
17
85
  { slug: "asp", extensions: [".asp", ".aspx", ".ascx", ".ashx", ".asmx", ".master"] },
18
86
  { slug: "assembly", extensions: [".asm", ".s", ".S", ".inc"] },
19
87
  { slug: "assemblyscript", extensions: [".as"] },
20
- { slug: "angelscript", extensions: [".as", ".angelscript"] },
21
88
  { slug: "astro", extensions: [".astro"] },
22
89
  { slug: "austral", extensions: [".aum", ".aui"] },
23
90
  { slug: "autohotkey", extensions: [".ahk", ".ah2"] },
24
91
  { slug: "avro-idl", extensions: [".avdl"] },
25
92
  { slug: "awk", extensions: [".awk"] },
26
93
  { slug: "ballerina", extensions: [".bal"] },
27
- { slug: "basic", extensions: [".bas", ".bi", ".bb"] },
28
94
  {
29
95
  slug: "bash",
30
96
  extensions: [".sh", ".bash", ".bashrc", ".bash_profile", ".bash_login", ".profile"]
31
97
  },
98
+ { slug: "basic", extensions: [".bas", ".bi", ".bb"] },
32
99
  { slug: "batch", extensions: [".bat", ".cmd"] },
33
100
  { slug: "bazel", extensions: ["BUILD.bazel", "WORKSPACE", "WORKSPACE.bazel", "MODULE.bazel"] },
34
101
  { slug: "bcpl", extensions: [".bcpl"] },
35
- { slug: "bicep", extensions: [".bicep", ".bicepparam"] },
36
102
  { slug: "bibtex", extensions: [".bib", ".bibtex"] },
103
+ { slug: "bicep", extensions: [".bicep", ".bicepparam"] },
37
104
  { slug: "blade", extensions: [".blade.php"] },
38
105
  { slug: "bosque", extensions: [".bsq"] },
39
106
  { slug: "bqn", extensions: [".bqn"] },
@@ -52,8 +119,8 @@ var languageIndex = [
52
119
  { slug: "coldfusion", extensions: [".cfm", ".cfml", ".cfc"] },
53
120
  { slug: "coq", extensions: [".v"] },
54
121
  { slug: "cpp", extensions: [".cpp", ".cc", ".cxx", ".h", ".hpp", ".hh", ".hxx"] },
55
- { slug: "crystal", extensions: [".cr"] },
56
122
  { slug: "cql", extensions: [".cql"] },
123
+ { slug: "crystal", extensions: [".cr"] },
57
124
  { slug: "csharp", extensions: [".cs", ".csx"] },
58
125
  { slug: "css", extensions: [".css"] },
59
126
  { slug: "cuda", extensions: [".cu", ".cuh"] },
@@ -75,6 +142,7 @@ var languageIndex = [
75
142
  { slug: "ejs", extensions: [".ejs"] },
76
143
  { slug: "elixir", extensions: [".ex", ".exs", ".eex", ".leex", ".heex"] },
77
144
  { slug: "elm", extensions: [".elm"] },
145
+ { slug: "emacs-lisp", extensions: [".el"] },
78
146
  { slug: "erb", extensions: [".erb", ".rhtml", ".html.erb"] },
79
147
  {
80
148
  slug: "erlang",
@@ -91,20 +159,20 @@ var languageIndex = [
91
159
  slug: "fortran",
92
160
  extensions: [".f", ".for", ".ftn", ".f90", ".f95", ".f03", ".f08", ".f18", ".f23"]
93
161
  },
94
- { slug: "freemarker", extensions: [".ftl", ".ftlh", ".ftlx"] },
95
162
  { slug: "fql", extensions: [".fql"] },
163
+ { slug: "freemarker", extensions: [".ftl", ".ftlh", ".ftlx"] },
96
164
  { slug: "fsharp", extensions: [".fs", ".fsi", ".fsx", ".fsscript"] },
97
165
  { slug: "fstar", extensions: [".fst", ".fsti"] },
98
- { slug: "gdscript", extensions: [".gd"] },
99
166
  { slug: "gcode", extensions: [".gcode", ".gco", ".nc", ".cnc", ".tap"] },
167
+ { slug: "gdscript", extensions: [".gd"] },
100
168
  { slug: "gettext", extensions: [".po", ".pot"] },
101
169
  { slug: "git", extensions: [".git", ".gitignore", ".gitattributes", ".gitmodules", ".gitkeep"] },
102
170
  { slug: "gleam", extensions: [".gleam"] },
103
- { slug: "gml", extensions: [".gml"] },
104
171
  {
105
172
  slug: "glsl",
106
173
  extensions: [".glsl", ".vert", ".frag", ".geom", ".tesc", ".tese", ".comp", ".vs", ".fs"]
107
174
  },
175
+ { slug: "gml", extensions: [".gml"] },
108
176
  { slug: "go", extensions: [".go"] },
109
177
  { slug: "gradle", extensions: [".gradle", ".gradle.kts"] },
110
178
  { slug: "grain", extensions: [".gr"] },
@@ -131,8 +199,10 @@ var languageIndex = [
131
199
  { slug: "janet", extensions: [".janet", ".jdn"] },
132
200
  { slug: "java", extensions: [".java"] },
133
201
  { slug: "javascript", extensions: [".js", ".mjs", ".cjs", ".jsx"] },
202
+ { slug: "jcl", extensions: [".jcl"] },
134
203
  { slug: "jinja", extensions: [".jinja", ".jinja2", ".j2"] },
135
204
  { slug: "jmespath", extensions: [".jmespath", ".jp"] },
205
+ { slug: "jq", extensions: [".jq"] },
136
206
  { slug: "json", extensions: [".json"] },
137
207
  { slug: "json5", extensions: [".json5"] },
138
208
  { slug: "jsonata", extensions: [".jsonata"] },
@@ -148,9 +218,10 @@ var languageIndex = [
148
218
  { slug: "kql", extensions: [".kql"] },
149
219
  { slug: "lean", extensions: [".lean"] },
150
220
  { slug: "less", extensions: [".less"] },
221
+ { slug: "lex", extensions: [".l", ".lex"] },
151
222
  { slug: "ligo", extensions: [".ligo", ".mligo", ".religo", ".jsligo"] },
152
- { slug: "liquid", extensions: [".liquid"] },
153
223
  { slug: "linkerscript", extensions: [".ld", ".lds", ".x"] },
224
+ { slug: "liquid", extensions: [".liquid"] },
154
225
  { slug: "lisp", extensions: [".lisp", ".lsp", ".cl", ".asd"] },
155
226
  { slug: "llvm-ir", extensions: [".ll", ".bc"] },
156
227
  { slug: "lobster", extensions: [".lobster"] },
@@ -165,13 +236,13 @@ var languageIndex = [
165
236
  { slug: "matlab", extensions: [".m", ".mlx"] },
166
237
  { slug: "maxima", extensions: [".mac", ".wxm"] },
167
238
  { slug: "mdx", extensions: [".mdx"] },
239
+ { slug: "mercury", extensions: [".m"] },
168
240
  { slug: "mermaid", extensions: [".mmd", ".mermaid"] },
169
241
  { slug: "meson", extensions: ["meson.build", "meson_options.txt", "meson.options", ".wrap"] },
170
- { slug: "mercury", extensions: [".m"] },
171
242
  { slug: "metal", extensions: [".metal"] },
172
243
  { slug: "modelica", extensions: [".mo"] },
173
- { slug: "mojo", extensions: [".mojo"] },
174
244
  { slug: "modula-2", extensions: [".mod", ".def"] },
245
+ { slug: "mojo", extensions: [".mojo"] },
175
246
  { slug: "moonbit", extensions: [".mbt"] },
176
247
  { slug: "move", extensions: [".move"] },
177
248
  { slug: "mumps", extensions: [".mac", ".int", ".ro", ".mro"] },
@@ -184,10 +255,10 @@ var languageIndex = [
184
255
  { slug: "nix", extensions: [".nix"] },
185
256
  { slug: "nunjucks", extensions: [".njk", ".nunjucks"] },
186
257
  { slug: "nushell", extensions: [".nu"] },
258
+ { slug: "oberon", extensions: [".ob", ".mod"] },
187
259
  { slug: "objective-c", extensions: [".m", ".mm"] },
188
260
  { slug: "ocaml", extensions: [".ml", ".mli", ".mll", ".mly", ".mlt", ".eliom", ".eliomi"] },
189
261
  { slug: "octave", extensions: [".m", ".octave"] },
190
- { slug: "oberon", extensions: [".ob", ".mod"] },
191
262
  { slug: "odin", extensions: [".odin"] },
192
263
  { slug: "openapi", extensions: [".openapi.json", ".openapi.yaml", ".openapi.yml"] },
193
264
  { slug: "opencl", extensions: [".cl", ".clh"] },
@@ -197,8 +268,8 @@ var languageIndex = [
197
268
  { slug: "perl", extensions: [".pl", ".pm", ".pod", ".t", ".psgi"] },
198
269
  { slug: "php", extensions: [".php", ".phtml", ".php3", ".php4", ".php5", ".phps"] },
199
270
  { slug: "pine-script", extensions: [".pine"] },
200
- { slug: "pl-i", extensions: [".pli", ".pl1"] },
201
271
  { slug: "pkl", extensions: [".pkl"] },
272
+ { slug: "pl-i", extensions: [".pli", ".pl1"] },
202
273
  { slug: "plantuml", extensions: [".puml", ".plantuml", ".iuml"] },
203
274
  { slug: "plpgsql", extensions: [".pgsql", ".plpgsql"] },
204
275
  { slug: "plsql", extensions: [".pls", ".pks", ".pkb", ".plsql"] },
@@ -210,24 +281,26 @@ var languageIndex = [
210
281
  { slug: "processing", extensions: [".pde"] },
211
282
  { slug: "prolog", extensions: [".pl", ".pro", ".prolog", ".P"] },
212
283
  { slug: "promql", extensions: [".promql"] },
284
+ { slug: "properties", extensions: [".properties"] },
213
285
  { slug: "protobuf", extensions: [".proto"] },
214
286
  { slug: "pug", extensions: [".pug", ".jade"] },
215
287
  { slug: "puppet", extensions: [".pp", ".epp"] },
216
288
  { slug: "purescript", extensions: [".purs"] },
217
289
  { slug: "python", extensions: [".py", ".pyw"] },
218
- { slug: "qml", extensions: [".qml", ".qmltypes", ".qmlproject"] },
219
290
  { slug: "qmake", extensions: [".pri", ".prf"] },
291
+ { slug: "qml", extensions: [".qml", ".qmltypes", ".qmlproject"] },
220
292
  { slug: "qsharp", extensions: [".qs"] },
221
293
  { slug: "r", extensions: [".r", ".R", ".rmd", ".Rmd", ".qmd", ".Rprofile"] },
222
294
  { slug: "racket", extensions: [".rkt", ".rktd", ".rktl", ".scrbl"] },
223
295
  { slug: "raku", extensions: [".raku", ".rakumod", ".rakudoc", ".rakutest", ".p6", ".pm6"] },
224
296
  { slug: "razor", extensions: [".cshtml", ".razor"] },
297
+ { slug: "reasonml", extensions: [".re", ".rei"] },
225
298
  { slug: "rebol", extensions: [".r", ".reb", ".rebol"] },
226
299
  { slug: "red", extensions: [".red", ".reds"] },
227
- { slug: "reasonml", extensions: [".re", ".rei"] },
228
300
  { slug: "rego", extensions: [".rego"] },
229
301
  { slug: "rescript", extensions: [".res", ".resi"] },
230
302
  { slug: "restructuredtext", extensions: [".rst", ".rest"] },
303
+ { slug: "rexx", extensions: [".rexx", ".rex"] },
231
304
  { slug: "roc", extensions: [".roc"] },
232
305
  { slug: "rpg", extensions: [".rpg", ".rpgle", ".sqlrpgle", ".clle", ".dspf"] },
233
306
  {
@@ -247,8 +320,8 @@ var languageIndex = [
247
320
  { slug: "snobol", extensions: [".sno", ".snobol"] },
248
321
  { slug: "solidity", extensions: [".sol"] },
249
322
  { slug: "soql", extensions: [".soql"] },
250
- { slug: "sparql", extensions: [".sparql", ".rq"] },
251
323
  { slug: "spark", extensions: [".spark", ".adb", ".ads"] },
324
+ { slug: "sparql", extensions: [".sparql", ".rq"] },
252
325
  { slug: "spl", extensions: [".spl"] },
253
326
  { slug: "spss", extensions: [".sps", ".spss"] },
254
327
  { slug: "sql", extensions: [".sql"] },
@@ -277,17 +350,19 @@ var languageIndex = [
277
350
  { slug: "unison", extensions: [".u", ".uu"] },
278
351
  { slug: "v", extensions: [".v", ".vsh"] },
279
352
  { slug: "vala", extensions: [".vala", ".vapi"] },
280
- { slug: "vba", extensions: [".bas", ".cls", ".frm", ".vba"] },
281
353
  { slug: "vale", extensions: [".vale"] },
354
+ { slug: "vba", extensions: [".bas", ".cls", ".frm", ".vba"] },
355
+ { slug: "vbscript", extensions: [".vbs", ".vbe"] },
282
356
  { slug: "velocity", extensions: [".vm", ".vtl"] },
283
357
  { slug: "verilog", extensions: [".v", ".vh", ".sv", ".svh"] },
284
358
  { slug: "verse", extensions: [".verse"] },
285
359
  { slug: "vhdl", extensions: [".vhd", ".vhdl"] },
360
+ { slug: "vimscript", extensions: [".vim", ".vimrc", ".gvimrc"] },
286
361
  { slug: "visual-basic", extensions: [".vb"] },
287
362
  { slug: "vue", extensions: [".vue"] },
288
363
  { slug: "vyper", extensions: [".vy"] },
289
- { slug: "webassembly", extensions: [".wasm", ".wat"] },
290
364
  { slug: "wdl", extensions: [".wdl"] },
365
+ { slug: "webassembly", extensions: [".wasm", ".wat"] },
291
366
  { slug: "wgsl", extensions: [".wgsl"] },
292
367
  { slug: "wren", extensions: [".wren"] },
293
368
  { slug: "xaml", extensions: [".xaml", ".baml"] },
@@ -295,6 +370,7 @@ var languageIndex = [
295
370
  { slug: "xpath", extensions: [".xpath", ".xpth"] },
296
371
  { slug: "xquery", extensions: [".xq", ".xql", ".xqm", ".xquery", ".xqy"] },
297
372
  { slug: "xslt", extensions: [".xsl", ".xslt"] },
373
+ { slug: "yacc", extensions: [".y", ".yacc"] },
298
374
  { slug: "yaml", extensions: [".yaml", ".yml"] },
299
375
  { slug: "yara", extensions: [".yar", ".yara"] },
300
376
  { slug: "zeek", extensions: [".zeek", ".bro"] },
@@ -306,31 +382,61 @@ var languageIndex = [
306
382
  }
307
383
  ];
308
384
 
309
- // src/domain/detection/match.ts
310
- var pathSegmentPattern = /[/\\]/;
311
- var getBasename = (filename) => {
312
- const parts = filename.trim().split(pathSegmentPattern);
313
- return parts.at(-1).toLowerCase();
385
+ // src/domain/detection/shebang.ts
386
+ var SHEBANG_INTERPRETERS = {
387
+ awk: "awk",
388
+ bash: "bash",
389
+ bun: "javascript",
390
+ crystal: "crystal",
391
+ csh: "tcsh",
392
+ dash: "bash",
393
+ deno: "typescript",
394
+ elixir: "elixir",
395
+ escript: "erlang",
396
+ expect: "tcl",
397
+ fish: "fish",
398
+ gawk: "awk",
399
+ groovy: "groovy",
400
+ guile: "scheme",
401
+ janet: "janet",
402
+ julia: "julia",
403
+ ksh: "bash",
404
+ lua: "lua",
405
+ mawk: "awk",
406
+ nawk: "awk",
407
+ node: "javascript",
408
+ nodejs: "javascript",
409
+ nu: "nushell",
410
+ osascript: "applescript",
411
+ perl: "perl",
412
+ php: "php",
413
+ pwsh: "powershell",
414
+ python: "python",
415
+ racket: "racket",
416
+ raku: "raku",
417
+ rscript: "r",
418
+ ruby: "ruby",
419
+ scala: "scala",
420
+ sh: "bash",
421
+ tclsh: "tcl",
422
+ tcsh: "tcsh",
423
+ wish: "tcl",
424
+ zsh: "zsh"
314
425
  };
315
- var matchesExtension = (basename, extension) => {
316
- const normalizedExtension = extension.toLowerCase();
317
- if (normalizedExtension.startsWith(".")) {
318
- return basename.endsWith(normalizedExtension);
426
+ var trailingVersionPattern = /[-.]?\d[\d.]*$/;
427
+ var lookupInterpreter = (interpreter) => SHEBANG_INTERPRETERS[interpreter] ?? SHEBANG_INTERPRETERS[interpreter.replace(trailingVersionPattern, "")];
428
+ var detectLanguageSlugByShebang = (content) => {
429
+ if (!content.startsWith("#!")) {
430
+ return void 0;
319
431
  }
320
- return basename === normalizedExtension || basename.endsWith(`.${normalizedExtension}`);
321
- };
322
- var detectMatchingEntries = (entries, filename) => {
323
- const basename = getBasename(filename);
324
- if (!basename) {
325
- return [];
432
+ const newlineIndex = content.search(/\r?\n/);
433
+ const firstLine = newlineIndex === -1 ? content : content.slice(0, newlineIndex);
434
+ const parts = firstLine.slice(2).trim().split(/\s+/);
435
+ let interpreter = parts[0]?.split("/").at(-1)?.toLowerCase();
436
+ if (interpreter === "env") {
437
+ interpreter = parts.slice(1).find((argument) => !argument.startsWith("-"))?.split("/").at(-1)?.toLowerCase();
326
438
  }
327
- return entries.map((entry, index) => ({
328
- entry,
329
- index,
330
- matchLength: Math.max(
331
- ...entry.extensions.filter((extension) => matchesExtension(basename, extension)).map((extension) => extension.length)
332
- )
333
- })).filter(({ matchLength }) => Number.isFinite(matchLength)).sort((first, second) => second.matchLength - first.matchLength || first.index - second.index).map(({ entry }) => entry);
439
+ return interpreter ? lookupInterpreter(interpreter) : void 0;
334
440
  };
335
441
 
336
442
  // src/domain/detection/detect-slugs.ts
@@ -348,4 +454,4 @@ var detectProjectLanguages = (filenames) => {
348
454
  return [...fileCounts.entries()].map(([slug, files]) => ({ slug, files })).sort((first, second) => second.files - first.files || first.slug.localeCompare(second.slug));
349
455
  };
350
456
 
351
- export { detectLanguageSlug, detectLanguageSlugs, detectProjectLanguages };
457
+ export { detectLanguageSlug, detectLanguageSlugByShebang, detectLanguageSlugs, detectProjectLanguages };