forked from prettier/prettier
-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
infer-parser.js
80 lines (66 loc) · 2.15 KB
/
infer-parser.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import getInterpreter from "./get-interpreter.js";
// Didn't use `path.basename` since this module need work in browsers too
// And `file` can be a `URL`
const getFileBasename = (file) => String(file).split(/[/\\]/).pop();
function getLanguageByFileName(languages, file) {
if (!file) {
return;
}
const basename = getFileBasename(file).toLowerCase();
return (
languages.find(({ filenames }) =>
filenames?.some((name) => name.toLowerCase() === basename),
) ??
languages.find(({ extensions }) =>
extensions?.some((extension) => basename.endsWith(extension)),
)
);
}
function getLanguageByLanguageName(languages, languageName) {
if (!languageName) {
return;
}
return (
languages.find(({ name }) => name.toLowerCase() === languageName) ??
languages.find(({ aliases }) => aliases?.includes(languageName)) ??
languages.find(({ extensions }) => extensions?.includes(`.${languageName}`))
);
}
function getLanguageByInterpreter(languages, file) {
if (
process.env.PRETTIER_TARGET === "universal" ||
!file ||
getFileBasename(file).includes(".")
) {
return;
}
const interpreter = getInterpreter(file);
if (!interpreter) {
return;
}
return languages.find(({ interpreters }) =>
interpreters?.includes(interpreter),
);
}
/**
* @param {import("../index.js").Options} options
* @param {{physicalFile?: string | URL, file?: string | URL, language?: string}} fileInfo
* @returns {string | void} matched parser name if found
*/
function inferParser(options, fileInfo) {
const languages = options.plugins.flatMap(
(plugin) =>
// @ts-expect-error -- Safe
plugin.languages ?? [],
);
// If the file has no extension, we can try to infer the language from the
// interpreter in the shebang line, if any; but since this requires FS access,
// do it last.
const language =
getLanguageByLanguageName(languages, fileInfo.language) ??
getLanguageByFileName(languages, fileInfo.physicalFile) ??
getLanguageByFileName(languages, fileInfo.file) ??
getLanguageByInterpreter(languages, fileInfo.physicalFile);
return language?.parsers[0];
}
export default inferParser;