Merge pull request #483 from github/aeisenberg/fix-language

Fix lines of code mapping
This commit is contained in:
Andrew Eisenberg 2021-05-07 11:02:25 -07:00 committed by GitHub
commit f00bafbde1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 116 additions and 62 deletions

File diff suppressed because one or more lines are too long

62
lib/count-loc.js generated
View file

@ -1,23 +1,47 @@
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const github_linguist_1 = require("github-linguist"); const github_linguist_1 = require("github-linguist");
// Map from linguist language names to language prefixes used in our metrics const languages_1 = require("./languages");
const supportedLanguages = { // Map from linguist language names to language prefixes used in the action and codeql
c: "cpp", const linguistToMetrics = {
"c++": "cpp", c: {
"c#": "cs", name: languages_1.Language.cpp,
go: "go", prefix: "cpp",
java: "java", },
javascript: "js", "c++": {
python: "py", name: languages_1.Language.cpp,
ruby: "rb", prefix: "cpp",
typescript: "js", },
"c#": {
name: languages_1.Language.csharp,
prefix: "cs",
},
go: {
name: languages_1.Language.go,
prefix: "go",
},
java: {
name: languages_1.Language.java,
prefix: "java",
},
javascript: {
name: languages_1.Language.javascript,
prefix: "js",
},
python: {
name: languages_1.Language.python,
prefix: "py",
},
typescript: {
name: languages_1.Language.javascript,
prefix: "js",
},
}; };
const supportedLanguagesReversed = Object.entries(supportedLanguages).reduce((obj, [key, value]) => { const nameToLinguist = Object.entries(linguistToMetrics).reduce((obj, [key, { name: action }]) => {
if (!obj[value]) { if (!obj[action]) {
obj[value] = []; obj[action] = [];
} }
obj[value].push(key); obj[action].push(key);
return obj; return obj;
}, {}); }, {});
/** /**
@ -35,15 +59,15 @@ async function countLoc(cwd, include, exclude, dbLanguages, logger) {
cwd, cwd,
include: ["**"].concat(include || []), include: ["**"].concat(include || []),
exclude, exclude,
analysisLanguages: dbLanguages.flatMap((lang) => supportedLanguagesReversed[lang]), analysisLanguages: dbLanguages.flatMap((lang) => nameToLinguist[lang]),
}).loadInfo(); }).loadInfo();
// The analysis counts LoC in all languages. We need to // The analysis counts LoC in all languages. We need to
// extract the languages we care about. Also, note that // extract the languages we care about. Also, note that
// the analysis uses slightly different names for language. // the analysis uses slightly different names for language.
const lineCounts = Object.entries(result.languages).reduce((obj, [language, { code }]) => { const lineCounts = Object.entries(result.languages).reduce((obj, [language, { code }]) => {
const dbLanguage = supportedLanguages[language]; const metricsLanguage = linguistToMetrics[language];
if (dbLanguage && dbLanguages.includes(dbLanguage)) { if (metricsLanguage && dbLanguages.includes(metricsLanguage.name)) {
obj[dbLanguage] = code + (obj[dbLanguage] || 0); obj[metricsLanguage.prefix] = code + (obj[metricsLanguage.prefix] || 0);
} }
return obj; return obj;
}, {}); }, {});

View file

@ -1 +1 @@
{"version":3,"file":"count-loc.js","sourceRoot":"","sources":["../src/count-loc.ts"],"names":[],"mappings":";;AAAA,qDAAyC;AAIzC,4EAA4E;AAC5E,MAAM,kBAAkB,GAAG;IACzB,CAAC,EAAE,KAAK;IACR,KAAK,EAAE,KAAK;IACZ,IAAI,EAAE,IAAI;IACV,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,IAAI;IAChB,MAAM,EAAE,IAAI;IACZ,IAAI,EAAE,IAAI;IACV,UAAU,EAAE,IAAI;CACjB,CAAC;AAEF,MAAM,0BAA0B,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAC1E,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;IACpB,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACf,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;KACjB;IACD,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC,EACD,EAAE,CACH,CAAC;AAEF;;;;;;;;;GASG;AACI,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,OAAiB,EACjB,OAAiB,EACjB,WAAqB,EACrB,MAAc;IAEd,MAAM,MAAM,GAAG,MAAM,IAAI,wBAAM,CAAC;QAC9B,GAAG;QACH,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACrC,OAAO;QACP,iBAAiB,EAAE,WAAW,CAAC,OAAO,CACpC,CAAC,IAAI,EAAE,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAC3C;KACF,CAAC,CAAC,QAAQ,EAAE,CAAC;IAEd,uDAAuD;IACvD,uDAAuD;IACvD,2DAA2D;IAC3D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CACxD,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,UAAU,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE;YAClD,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;SACjD;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAA4B,CAC7B,CAAC;IAEF,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;QAClC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACrC,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;YAC1D,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,KAAK,KAAK,EAAE,CAAC,CAAC;SACzC;KACF;SAAM;QACL,MAAM,CAAC,IAAI,CACT,4EAA4E;YAC1E,0EAA0E;YAC1E,sEAAsE;YACtE,4EAA4E;YAC5E,iEAAiE;YACjE,wEAAwE;YACxE,gFAAgF;YAChF,yBAAyB,CAC5B,CAAC;KACH;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAjDD,4BAiDC"} {"version":3,"file":"count-loc.js","sourceRoot":"","sources":["../src/count-loc.ts"],"names":[],"mappings":"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"}

13
lib/count-loc.test.js generated
View file

@ -13,20 +13,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
const path = __importStar(require("path")); const path = __importStar(require("path"));
const ava_1 = __importDefault(require("ava")); const ava_1 = __importDefault(require("ava"));
const count_loc_1 = require("./count-loc"); const count_loc_1 = require("./count-loc");
const languages_1 = require("./languages");
const logging_1 = require("./logging"); const logging_1 = require("./logging");
const testing_utils_1 = require("./testing-utils"); const testing_utils_1 = require("./testing-utils");
testing_utils_1.setupTests(ava_1.default); testing_utils_1.setupTests(ava_1.default);
ava_1.default("ensure lines of code works for cpp and js", async (t) => { ava_1.default("ensure lines of code works for cpp and js", async (t) => {
const results = await count_loc_1.countLoc(path.join(__dirname, "../tests/multi-language-repo"), [], [], ["cpp", "js"], logging_1.getRunnerLogger(true)); const results = await count_loc_1.countLoc(path.join(__dirname, "../tests/multi-language-repo"), [], [], [languages_1.Language.cpp, languages_1.Language.javascript], logging_1.getRunnerLogger(true));
t.deepEqual(results, { t.deepEqual(results, {
cpp: 6, cpp: 6,
js: 3, js: 3,
}); });
}); });
ava_1.default("ensure lines of code can handle undefined language", async (t) => { ava_1.default("ensure lines of code can handle undefined language", async (t) => {
const results = await count_loc_1.countLoc(path.join(__dirname, "../tests/multi-language-repo"), [], [], ["rb", "py", "hucairz"], logging_1.getRunnerLogger(true)); const results = await count_loc_1.countLoc(path.join(__dirname, "../tests/multi-language-repo"), [], [], [languages_1.Language.javascript, languages_1.Language.python, "hucairz"], logging_1.getRunnerLogger(true));
t.deepEqual(results, { t.deepEqual(results, {
rb: 6, js: 3,
py: 5, py: 5,
}); });
}); });
@ -37,15 +38,15 @@ ava_1.default("ensure lines of code can handle empty languages", async (t) => {
ava_1.default("ensure lines of code can handle includes", async (t) => { ava_1.default("ensure lines of code can handle includes", async (t) => {
// note that "**" is always included. The includes are for extra // note that "**" is always included. The includes are for extra
// directories outside the normal structure. // directories outside the normal structure.
const results = await count_loc_1.countLoc(path.join(__dirname, "../tests/multi-language-repo"), ["../../src/testdata"], [], ["js"], logging_1.getRunnerLogger(true)); const results = await count_loc_1.countLoc(path.join(__dirname, "../tests/multi-language-repo"), ["../../src/testdata"], [], [languages_1.Language.javascript], logging_1.getRunnerLogger(true));
t.deepEqual(results, { t.deepEqual(results, {
js: 15, js: 15,
}); });
}); });
ava_1.default("ensure lines of code can handle exclude", async (t) => { ava_1.default("ensure lines of code can handle exclude", async (t) => {
const results = await count_loc_1.countLoc(path.join(__dirname, "../tests/multi-language-repo"), [], ["**/*.py"], ["rb", "py"], logging_1.getRunnerLogger(true)); const results = await count_loc_1.countLoc(path.join(__dirname, "../tests/multi-language-repo"), [], ["**/*.py"], [languages_1.Language.javascript, languages_1.Language.python], logging_1.getRunnerLogger(true));
t.deepEqual(results, { t.deepEqual(results, {
rb: 6, js: 3,
}); });
}); });
//# sourceMappingURL=count-loc.test.js.map //# sourceMappingURL=count-loc.test.js.map

View file

@ -1 +1 @@
{"version":3,"file":"count-loc.test.js","sourceRoot":"","sources":["../src/count-loc.test.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA6B;AAE7B,8CAAuB;AAEvB,2CAAuC;AACvC,uCAA4C;AAC5C,mDAA6C;AAE7C,0BAAU,CAAC,aAAI,CAAC,CAAC;AAEjB,aAAI,CAAC,2CAA2C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC5D,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,EAAE,EACF,EAAE,EACF,CAAC,KAAK,EAAE,IAAI,CAAC,EACb,yBAAe,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;QACnB,GAAG,EAAE,CAAC;QACN,EAAE,EAAE,CAAC;KACN,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,oDAAoD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACrE,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,EAAE,EACF,EAAE,EACF,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,EACvB,yBAAe,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;QACnB,EAAE,EAAE,CAAC;QACL,EAAE,EAAE,CAAC;KACN,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,iDAAiD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAClE,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,EAAE,EACF,EAAE,EACF,EAAE,EACF,yBAAe,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,0CAA0C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC3D,gEAAgE;IAChE,4CAA4C;IAC5C,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,CAAC,oBAAoB,CAAC,EACtB,EAAE,EACF,CAAC,IAAI,CAAC,EACN,yBAAe,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;QACnB,EAAE,EAAE,EAAE;KACP,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,yCAAyC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC1D,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,EAAE,EACF,CAAC,SAAS,CAAC,EACX,CAAC,IAAI,EAAE,IAAI,CAAC,EACZ,yBAAe,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;QACnB,EAAE,EAAE,CAAC;KACN,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"} {"version":3,"file":"count-loc.test.js","sourceRoot":"","sources":["../src/count-loc.test.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA6B;AAE7B,8CAAuB;AAEvB,2CAAuC;AACvC,2CAAuC;AACvC,uCAA4C;AAC5C,mDAA6C;AAE7C,0BAAU,CAAC,aAAI,CAAC,CAAC;AAEjB,aAAI,CAAC,2CAA2C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC5D,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,EAAE,EACF,EAAE,EACF,CAAC,oBAAQ,CAAC,GAAG,EAAE,oBAAQ,CAAC,UAAU,CAAC,EACnC,yBAAe,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;QACnB,GAAG,EAAE,CAAC;QACN,EAAE,EAAE,CAAC;KACN,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,oDAAoD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACrE,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,EAAE,EACF,EAAE,EACF,CAAC,oBAAQ,CAAC,UAAU,EAAE,oBAAQ,CAAC,MAAM,EAAE,SAAqB,CAAC,EAC7D,yBAAe,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;QACnB,EAAE,EAAE,CAAC;QACL,EAAE,EAAE,CAAC;KACN,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,iDAAiD,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAClE,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,EAAE,EACF,EAAE,EACF,EAAE,EACF,yBAAe,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,0CAA0C,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC3D,gEAAgE;IAChE,4CAA4C;IAC5C,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,CAAC,oBAAoB,CAAC,EACtB,EAAE,EACF,CAAC,oBAAQ,CAAC,UAAU,CAAC,EACrB,yBAAe,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;QACnB,EAAE,EAAE,EAAE;KACP,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,aAAI,CAAC,yCAAyC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC1D,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EACpD,EAAE,EACF,CAAC,SAAS,CAAC,EACX,CAAC,oBAAQ,CAAC,UAAU,EAAE,oBAAQ,CAAC,MAAM,CAAC,EACtC,yBAAe,CAAC,IAAI,CAAC,CACtB,CAAC;IAEF,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;QACnB,EAAE,EAAE,CAAC;KACN,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}

View file

@ -6,7 +6,7 @@ import * as toolrunner from "@actions/exec/lib/toolrunner";
import * as analysisPaths from "./analysis-paths"; import * as analysisPaths from "./analysis-paths";
import { getCodeQL } from "./codeql"; import { getCodeQL } from "./codeql";
import * as configUtils from "./config-utils"; import * as configUtils from "./config-utils";
import { countLoc } from "./count-loc"; import { IdPrefixes, countLoc } from "./count-loc";
import { isScannedLanguage, Language } from "./languages"; import { isScannedLanguage, Language } from "./languages";
import { Logger } from "./logging"; import { Logger } from "./logging";
import * as sharedEnv from "./shared-environment"; import * as sharedEnv from "./shared-environment";
@ -288,7 +288,7 @@ export async function runAnalyze(
async function injectLinesOfCode( async function injectLinesOfCode(
sarifFile: string, sarifFile: string,
language: string, language: string,
locPromise: Promise<Record<string, number>> locPromise: Promise<Partial<Record<IdPrefixes, number>>>
) { ) {
const lineCounts = await locPromise; const lineCounts = await locPromise;
if (language in lineCounts) { if (language in lineCounts) {

View file

@ -3,6 +3,7 @@ import * as path from "path";
import test from "ava"; import test from "ava";
import { countLoc } from "./count-loc"; import { countLoc } from "./count-loc";
import { Language } from "./languages";
import { getRunnerLogger } from "./logging"; import { getRunnerLogger } from "./logging";
import { setupTests } from "./testing-utils"; import { setupTests } from "./testing-utils";
@ -13,7 +14,7 @@ test("ensure lines of code works for cpp and js", async (t) => {
path.join(__dirname, "../tests/multi-language-repo"), path.join(__dirname, "../tests/multi-language-repo"),
[], [],
[], [],
["cpp", "js"], [Language.cpp, Language.javascript],
getRunnerLogger(true) getRunnerLogger(true)
); );
@ -28,12 +29,12 @@ test("ensure lines of code can handle undefined language", async (t) => {
path.join(__dirname, "../tests/multi-language-repo"), path.join(__dirname, "../tests/multi-language-repo"),
[], [],
[], [],
["rb", "py", "hucairz"], [Language.javascript, Language.python, "hucairz" as Language],
getRunnerLogger(true) getRunnerLogger(true)
); );
t.deepEqual(results, { t.deepEqual(results, {
rb: 6, js: 3,
py: 5, py: 5,
}); });
}); });
@ -57,7 +58,7 @@ test("ensure lines of code can handle includes", async (t) => {
path.join(__dirname, "../tests/multi-language-repo"), path.join(__dirname, "../tests/multi-language-repo"),
["../../src/testdata"], ["../../src/testdata"],
[], [],
["js"], [Language.javascript],
getRunnerLogger(true) getRunnerLogger(true)
); );
@ -71,11 +72,11 @@ test("ensure lines of code can handle exclude", async (t) => {
path.join(__dirname, "../tests/multi-language-repo"), path.join(__dirname, "../tests/multi-language-repo"),
[], [],
["**/*.py"], ["**/*.py"],
["rb", "py"], [Language.javascript, Language.python],
getRunnerLogger(true) getRunnerLogger(true)
); );
t.deepEqual(results, { t.deepEqual(results, {
rb: 6, js: 3,
}); });
}); });

View file

@ -1,29 +1,59 @@
import { LocDir } from "github-linguist"; import { LocDir } from "github-linguist";
import { Language } from "./languages";
import { Logger } from "./logging"; import { Logger } from "./logging";
// Map from linguist language names to language prefixes used in our metrics // Language IDs used by codeql when specifying its metrics.
const supportedLanguages = { export type IdPrefixes = "cpp" | "cs" | "go" | "java" | "js" | "py" | "rb";
c: "cpp",
"c++": "cpp", // Map from linguist language names to language prefixes used in the action and codeql
"c#": "cs", const linguistToMetrics: Record<
go: "go", string,
java: "java", { name: Language; prefix: IdPrefixes }
javascript: "js", > = {
python: "py", c: {
ruby: "rb", name: Language.cpp,
typescript: "js", prefix: "cpp",
},
"c++": {
name: Language.cpp,
prefix: "cpp",
},
"c#": {
name: Language.csharp,
prefix: "cs",
},
go: {
name: Language.go,
prefix: "go",
},
java: {
name: Language.java,
prefix: "java",
},
javascript: {
name: Language.javascript,
prefix: "js",
},
python: {
name: Language.python,
prefix: "py",
},
typescript: {
name: Language.javascript,
prefix: "js",
},
}; };
const supportedLanguagesReversed = Object.entries(supportedLanguages).reduce( const nameToLinguist = Object.entries(linguistToMetrics).reduce(
(obj, [key, value]) => { (obj, [key, { name: action }]) => {
if (!obj[value]) { if (!obj[action]) {
obj[value] = []; obj[action] = [];
} }
obj[value].push(key); obj[action].push(key);
return obj; return obj;
}, },
{} {} as Record<Language, string[]>
); );
/** /**
@ -40,16 +70,14 @@ export async function countLoc(
cwd: string, cwd: string,
include: string[], include: string[],
exclude: string[], exclude: string[],
dbLanguages: string[], dbLanguages: Language[],
logger: Logger logger: Logger
): Promise<Record<string, number>> { ): Promise<Partial<Record<IdPrefixes, number>>> {
const result = await new LocDir({ const result = await new LocDir({
cwd, cwd,
include: ["**"].concat(include || []), include: ["**"].concat(include || []),
exclude, exclude,
analysisLanguages: dbLanguages.flatMap( analysisLanguages: dbLanguages.flatMap((lang) => nameToLinguist[lang]),
(lang) => supportedLanguagesReversed[lang]
),
}).loadInfo(); }).loadInfo();
// The analysis counts LoC in all languages. We need to // The analysis counts LoC in all languages. We need to
@ -57,13 +85,13 @@ export async function countLoc(
// the analysis uses slightly different names for language. // the analysis uses slightly different names for language.
const lineCounts = Object.entries(result.languages).reduce( const lineCounts = Object.entries(result.languages).reduce(
(obj, [language, { code }]) => { (obj, [language, { code }]) => {
const dbLanguage = supportedLanguages[language]; const metricsLanguage = linguistToMetrics[language];
if (dbLanguage && dbLanguages.includes(dbLanguage)) { if (metricsLanguage && dbLanguages.includes(metricsLanguage.name)) {
obj[dbLanguage] = code + (obj[dbLanguage] || 0); obj[metricsLanguage.prefix] = code + (obj[metricsLanguage.prefix] || 0);
} }
return obj; return obj;
}, },
{} as Record<string, number> {} as Record<IdPrefixes, number>
); );
if (Object.keys(lineCounts).length) { if (Object.keys(lineCounts).length) {