import type { ServiceMethodFactory } from "@ethicdevs/react-monolith";
import type { LinguistFileInfos } from "../../types";
import type { CodeAnalysisServiceDeps } from "./types";
const makeGetLinguistFileInfos: ServiceMethodFactory<
CodeAnalysisServiceDeps,
[string, string | undefined],
Promise<LinguistFileInfos>
> = (deps) => {
return async (path, content = undefined) => {
const ext = deps.getFilePathExt(path);
if (deps.imageExts.includes(ext)) {
return {
color: "gray",
extensions: [ext],
languageDisplayName: ext.toUpperCase(),
language: ext,
languageId: -1,
mimeType: deps.extsMimeTypesMap[ext] || `image/${ext}`,
type: "image",
};
}
let language =
content != null
? deps.languageDetect.contents(path, content)
: deps.languageDetect.filename(path);
if (language == null || language in deps.languagesMap === false) {
language = "Shell";
}
const languageInfos = deps.languagesMap[language];
if (languageInfos == null) {
throw new Error(`Invalid language: not in languages map.`);
}
const langFromTmScope = languageInfos.tmScope.replace(/^source./i, "");
const languageResults: LinguistFileInfos = {
color: languageInfos.color || "gray",
extensions: languageInfos.extensions || [],
languageDisplayName: language,
language: langFromTmScope || languageInfos.aceMode,
languageId: languageInfos.languageId,
mimeType:
languageInfos.codemirrorMimeType ||
`text/${langFromTmScope || languageInfos.aceMode}`,
type: languageInfos.type,
};
console.log("path:", path);
console.log("languageResults:", languageResults);
return Promise.resolve(languageResults);
};
};
export default makeGetLinguistFileInfos;