Source: detect.js

/**
 * @module detect
 * Language detector
*/

const languages = [
	['bash', [/#!(\/usr)?\/bin\/bash/g, 500], [/\b(if|elif|then|fi|echo)\b|\$/g, 10]],
	['html', [/<\/?[a-z-]+[^\n>]*>/g, 10], [/^\s+<!DOCTYPE\s+html/g, 500]],
	['http', [/^(GET|HEAD|POST|PUT|DELETE|PATCH|HTTP)\b/g, 500]],
	['js', [/\b(console|await|async|function|export|import|this|class|for|let|const|map|join|require)\b/g, 10]],
	['ts', [/\b(console|await|async|function|export|import|this|class|for|let|const|map|join|require|implements|interface|namespace)\b/g, 10]],
	['py', [/\b(def|print|class|and|or|lambda)\b/g, 10]],
	['sql', [/\b(SELECT|INSERT|FROM)\b/g, 50]],
	['pl', [/#!(\/usr)?\/bin\/perl/g, 500], [/\b(use|print)\b|\$/g, 10]],
	['lua', [/#!(\/usr)?\/bin\/lua/g, 500]],
	['make', [/\b(ifneq|endif|if|elif|then|fi|echo|.PHONY|^[a-z]+ ?:$)\b|\$/gm, 10]],
	['uri', [/https?:|mailto:|tel:|ftp:/g, 30]],
	['css', [/^(@import|@page|@media|(\.|#)[a-z]+)/gm, 20]],
	['diff', [/^[+><-]/gm, 10], [/^@@ ?[-+,0-9 ]+ ?@@/gm, 25]],
	['md', [/^(>|\t\*|\t\d+.)/gm, 10], [/\[.*\](.*)/g, 10]],
	['docker', [/^(FROM|ENTRYPOINT|RUN)/gm, 500]],
	['xml', [/<\/?[a-z-]+[^\n>]*>/g, 10], [/^<\?xml/g, 500]],
	['c', [/#include\b|\bprintf\s+\(/g, 100]],
	['rs', [/^\s+(use|fn|mut|match)\b/gm, 100]],
	['go', [/\b(func|fmt|package)\b/g, 100]],
	['java', [/^import\s+java/gm, 500]],
	['asm', [/^(section|global main|extern|\t(call|mov|ret))/gm, 100]],
]

/**
 * @function detectLanguage
 * Try to find the language the given code belong to
 * @param {String} code The code
 * @returns {String} The language of the code
 */
export const detectLanguage = code => {
	return (languages
		.map(([lang, ...features]) => [
			features.reduce((acc, [match, score]) => acc + [...code.matchAll(match)].length * score, 0),
			lang
		])
		.filter(([score, lang]) => score > 10)
		.sort((a, b) => b[0] - a[0])[0]?.[1] || 'plain');
}