@trivia-api/models
Version:
Models for The Trivia API.
116 lines (115 loc) • 3.41 kB
JavaScript
import { isQuestionCategory } from "./guards/question";
import { isCategory } from "./v2";
/**
* Used to map categories to common other formattings and spellings
*/
export const CategoryMap = new Map();
CategoryMap.set("Arts & Literature", [
"arts",
"literature",
"arts & literature",
"arts_and_literature",
"novels",
]);
CategoryMap.set("Film & TV", ["movies", "film", "film & tv", "film_and_tv"]);
CategoryMap.set("Food & Drink", [
"food & drink",
"food_and_drink",
"food",
"drink",
"alcohol",
]);
CategoryMap.set("General Knowledge", ["general_knowledge"]);
CategoryMap.set("Geography", ["geography"]);
CategoryMap.set("History", ["history"]);
CategoryMap.set("Music", ["music"]);
CategoryMap.set("Science", ["science"]);
CategoryMap.set("Society & Culture", [
"society & culture",
"society_and_culture",
"society",
"culture",
]);
CategoryMap.set("Sport & Leisure", [
"sport_and_leisure",
"sports",
"sport",
"sport & leisure",
"games",
]);
/**
* Gets a DB Question category from any input string.
* @param input
* @returns
*/
export const getCategory = (input) => {
var _a;
const [matchingLabel] = (_a = Array.from(CategoryMap.entries()).find(([label, values]) => values.includes(decodeURI(input.toLowerCase())))) !== null && _a !== void 0 ? _a : [];
return matchingLabel !== null && matchingLabel !== void 0 ? matchingLabel : "General Knowledge";
};
/**
* Convert a V1 category to a V2 category
* @param category - The V1 category to convert
* @returns The V2 category
*/
export const convertV1OrV2CategoryToV2 = (category) => {
switch (category) {
case "Arts & Literature":
return "arts_and_literature";
case "Film & TV":
return "film_and_tv";
case "Food & Drink":
return "food_and_drink";
case "General Knowledge":
return "general_knowledge";
case "Geography":
return "geography";
case "History":
return "history";
case "Music":
return "music";
case "Science":
return "science";
case "Society & Culture":
return "society_and_culture";
case "Sport & Leisure":
return "sport_and_leisure";
default:
return category;
}
};
export const convertV1OrV2CategoryToV1 = (category) => {
switch (category) {
case "arts_and_literature":
return "Arts & Literature";
case "film_and_tv":
return "Film & TV";
case "food_and_drink":
return "Food & Drink";
case "general_knowledge":
return "General Knowledge";
case "geography":
return "Geography";
case "history":
return "History";
case "music":
return "Music";
case "science":
return "Science";
case "society_and_culture":
return "Society & Culture";
case "sport_and_leisure":
return "Sport & Leisure";
default:
return category;
}
};
export const convertUnknownCategoryToV2 = (category) => {
if (isCategory(category)) {
return category;
}
if (isQuestionCategory(category)) {
return convertV1OrV2CategoryToV2(category);
}
return convertV1OrV2CategoryToV2(getCategory(category));
};