first commit

This commit is contained in:
2026-07-21 16:50:58 +02:00
commit 256599626e
407 changed files with 30489 additions and 0 deletions
+117
View File
@@ -0,0 +1,117 @@
/**
* Catégories recettes Ben-to (alignées produit : familles & variantes typiques).
* Utilisé par `build-recipes.mjs` pour associer chaque recette à une « base » du catalogue.
*/
/** @typedef {'sweet' | 'savory'} BaseFlavor */
/** Ordre daffichage dans le builder (étape « base »). */
export const RECIPE_BASE_DISPLAY_ORDER = [
"base:onigiri",
"base:gimbap",
"base:mandu",
"base:empanadas-savory",
"base:empanadas-sweet",
"base:galettes",
"base:bao",
"base:muffin",
"base:mini-cakes",
"base:biscuits-secs",
"base:fluffy-cakes",
"base:cakes",
"base:carnet"
];
/** Flavour du bandeau salé / sucré pour la carte « base » (une valeur par catégorie). */
export const RECIPE_BASE_FLAVOR = /** @type {Readonly<Record<string, BaseFlavor>>} */ ({
"base:onigiri": "savory",
"base:gimbap": "savory",
"base:mandu": "savory",
"base:empanadas-savory": "savory",
"base:empanadas-sweet": "sweet",
"base:galettes": "savory",
"base:bao": "savory",
"base:muffin": "sweet",
"base:mini-cakes": "sweet",
"base:biscuits-secs": "sweet",
"base:fluffy-cakes": "sweet",
"base:cakes": "sweet",
"base:carnet": "savory"
});
const normSlug = (slug) => slug.toLowerCase();
const normTags = (tags) => tags.map((t) => t.trim().toLowerCase()).filter(Boolean);
/**
* Associe une recette à un identifiant de base catalogue.
* Règles évaluées du plus spécifique au plus général ; la première correspondance lemporte.
*
* @param {string} slug
* @param {ReadonlyArray<string>} tags Tags bentext (section tags), déjà en minuscules possible
* @returns {string}
*/
export const resolveRecipeBaseId = (slug, tags) => {
const s = normSlug(slug);
const tg = normTags([...tags]);
if (
tg.includes("carnet") ||
tg.includes('cheesecake') ||
tg.includes('carrot-cake')
) return "base:carnet";
if (s.includes("inarizushi") || s.includes("musubi") || s.includes("onigiri")) return "base:onigiri";
if (
s.includes("gimbap") ||
s.includes("kimbap") ||
(s.includes("maki") && !s.includes("makisu"))
) {
return "base:gimbap";
}
if (s.includes("mandu") || s.includes("gyoza") || s.includes("jiaozi") || s.includes("mandoo")) {
return "base:mandu";
}
if (s.includes("empanadas-citron") || s.includes("empanada-citron")) return "base:empanadas-sweet";
if (s.includes("empanad")) return "base:empanadas-savory";
if (
s.includes("dan-bing") ||
s.includes("danbing") ||
s.includes("blini") ||
s.includes("naan") ||
s.includes("jeon") ||
s.includes("paratha") ||
s.includes("cong-you") ||
s.includes("congyou")
) {
return "base:galettes";
}
if (/\b(mantou|baozi)\b/i.test(slug) || /\bbao\b/i.test(slug)) return "base:bao";
if (s.includes("muffin")) return "base:muffin";
if (s.includes("madeleine") || s.includes("financier")) return "base:mini-cakes";
if (s.includes("biscuit")) return "base:biscuits-secs";
if (
s.includes("savoie") ||
s.includes("fluffy") ||
s.includes("gateau") ||
s.includes("gâteau")
) {
return "base:fluffy-cakes";
}
if (s.includes("cake") || s.includes("banana") ||
s.includes("cremeux") ||
s.includes("crémeux")) {
return "base:cakes";
}
return "base:carnet";
};