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