Better Shebang Language Detection (Deno, Bun, etc) (fix #287819) (#289026)

This commit is contained in:
Benjamin Pasero
2026-01-20 07:43:13 +01:00
committed by GitHub
parent 32fc704566
commit ad980f0b21
2 changed files with 23 additions and 0 deletions

View File

@@ -27,6 +27,7 @@
".cts",
".mts"
],
"firstLine": "^#!.*\\b(deno|bun|ts-node)\\b",
"configuration": "./language-configuration.json"
},
{

View File

@@ -129,4 +129,26 @@ suite('LanguagesAssociations', () => {
assert.deepStrictEqual(getMimeTypes(URI.parse(`data:;label:something.data;description:data,`)), ['text/data', 'text/plain']);
});
test('Shebang detection for TypeScript runtimes', () => {
registerPlatformLanguageAssociation({ id: 'typescript', mime: 'text/typescript', firstline: /^#!.*\b(deno|bun|ts-node)\b/ });
// Deno shebangs
assert.deepStrictEqual(getMimeTypes(URI.file('script'), '#!/usr/bin/env deno'), ['text/typescript', 'text/plain']);
assert.deepStrictEqual(getMimeTypes(URI.file('script'), '#!/usr/bin/env -S deno -A'), ['text/typescript', 'text/plain']);
assert.deepStrictEqual(getMimeTypes(URI.file('script'), '#!/usr/bin/deno'), ['text/typescript', 'text/plain']);
// Bun shebangs
assert.deepStrictEqual(getMimeTypes(URI.file('script'), '#!/usr/bin/env bun'), ['text/typescript', 'text/plain']);
assert.deepStrictEqual(getMimeTypes(URI.file('script'), '#!/usr/bin/env -S bun run'), ['text/typescript', 'text/plain']);
// ts-node shebangs
assert.deepStrictEqual(getMimeTypes(URI.file('script'), '#!/usr/bin/env ts-node'), ['text/typescript', 'text/plain']);
assert.deepStrictEqual(getMimeTypes(URI.file('script'), '#!/usr/bin/env -S ts-node --esm'), ['text/typescript', 'text/plain']);
// Should NOT match other shebangs
assert.deepStrictEqual(getMimeTypes(URI.file('script'), '#!/usr/bin/env node'), ['application/unknown']);
assert.deepStrictEqual(getMimeTypes(URI.file('script'), '#!/usr/bin/env python'), ['application/unknown']);
assert.deepStrictEqual(getMimeTypes(URI.file('script'), '#!/bin/bash'), ['application/unknown']);
});
});