From 1b787d0cd29e4f8da42002e1774ac37c4d16fbdc Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 19 Aug 2026 16:34:19 +0200 Subject: [PATCH] =?UTF-8?q?feat(catalog):=20=C3=A9toffe=20le=20catalogue?= =?UTF-8?q?=20d'ingr=C3=A9dients=20=C3=A0=20partir=20de=20la=20table=20Ciq?= =?UTF-8?q?ual=202025?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Source : « Table des aliments moyens Ciqual 2025 » (ANSES, ciqual.anses.fr), utilisée comme source de noms pour combler des trous du catalogue plutôt qu'importée telle quelle — le fichier est une table de correspondance "aliment moyen ↔ aliments contributeurs" très granulaire (états de cuisson, produits de marque, boissons/snacks industriels), pas directement réutilisable comme liste d'ingrédients génériques pour une app de recettes. 55 nouveaux ingrédients ajoutés à reference-seed-data.ts, catégorisés et allergène-tagués selon les conventions existantes : - 26 fromages régionaux français (Brie, Camembert, Roquefort, Munster, Reblochon, Cantal, Beaufort, Saint-Nectaire, Cancoillotte, Tomme, Époisses, etc.) — allergène Lait. - 18 charcuteries/abats/gibiers (Andouille, Boudin blanc/noir, Rillettes, Foie de veau, Ris de veau, Tripes, Cerf, Chevreuil, Sanglier…). - 4 volailles (Caille, Pintade, Oie, Foie de volaille). - 2 poissons — allergène Poissons (Anguille, Carrelet). - 2 crustacés/mollusques — allergène Crustacés/Mollusques (Araignée de mer, Bigorneau). - 3 fruits/légumes (Cardon, Cassis, Canneberge). Chaque ajout a sa clé anglaise dans catalog-en-keys.ts ; translation.json régénéré via `tsx scripts/generate-catalog-i18n.ts` (pas d'édition manuelle). Pas de migration Prisma nécessaire — pure donnée de référence, upsertée par `seedReferenceData` au prochain déploiement/seed. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 5 --- apps/api/src/db/catalog-en-keys.ts | 56 ++++++++++++++++++++ apps/api/src/db/reference-seed-data.ts | 66 ++++++++++++++++++++++++ apps/web/src/locales/fr/translation.json | 56 ++++++++++++++++++++ 3 files changed, 178 insertions(+) diff --git a/apps/api/src/db/catalog-en-keys.ts b/apps/api/src/db/catalog-en-keys.ts index 875548b..0eadfa2 100644 --- a/apps/api/src/db/catalog-en-keys.ts +++ b/apps/api/src/db/catalog-en-keys.ts @@ -97,6 +97,7 @@ const INGREDIENT_KEYS: Record = { Shiitake: "shiitake", Daikon: "daikon", "Piment vert frais": "fresh_green_chili", + Cardon: "cardoon", // --- Produits frais / Fruits ----------------------------------------- Citron: "lemon", @@ -127,6 +128,8 @@ const INGREDIENT_KEYS: Record = { Grenade: "pomegranate", Rhubarbe: "rhubarb", Coing: "quince", + Cassis: "blackcurrant", + Canneberge: "cranberry", // --- Produits frais / Herbes fraîches --------------------------------- Basilic: "basil", @@ -169,12 +172,35 @@ const INGREDIENT_KEYS: Record = { Pancetta: "pancetta", Mortadelle: "mortadella", Salami: "salami", + Andouille: "andouille", + Andouillette: "andouillette", + "Boudin blanc": "white_pudding", + "Boudin noir": "black_pudding", + Cervelas: "cervelat", + Rillettes: "rillettes", + "Saucisson sec": "dry_cured_sausage", + "Jambon de Bayonne": "bayonne_ham", + Coppa: "coppa", + "Rosette (saucisson)": "rosette_sausage", + "Foie de veau": "veal_liver", + "Rognons de veau": "veal_kidneys", + "Cervelle de veau": "veal_brain", + "Ris de veau": "veal_sweetbread", + "Langue de bœuf": "beef_tongue", + Tripes: "tripe", + Cerf: "venison", + Chevreuil: "roe_deer", + Sanglier: "wild_boar", // --- Boucherie & poissonnerie / Volailles ----------------------------- Poulet: "chicken", Dinde: "turkey", Canard: "duck", "Magret de canard": "duck_breast", + Caille: "quail", + Pintade: "guinea_fowl", + Oie: "goose", + "Foie de volaille": "poultry_liver", // --- Boucherie & poissonnerie / Poissons ------------------------------- Saumon: "salmon", @@ -207,6 +233,8 @@ const INGREDIENT_KEYS: Record = { Panga: "pangasius", "Saumon fumé": "smoked_salmon", "Poisson séché": "dried_fish", + Anguille: "eel", + "Carrelet (ou plie)": "plaice", // --- Boucherie & poissonnerie / Crustacés & fruits de mer ------------- Crevettes: "shrimp", @@ -221,6 +249,8 @@ const INGREDIENT_KEYS: Record = { Poulpe: "octopus", Palourdes: "clams", Bulots: "whelks", + "Araignée de mer": "spider_crab", + Bigorneau: "periwinkle", // --- Épicerie sèche / Féculents ---------------------------------------- Semoule: "semolina", @@ -341,6 +371,32 @@ const INGREDIENT_KEYS: Record = { Pecorino: "pecorino", Gorgonzola: "gorgonzola", Cheddar: "cheddar", + Brie: "brie", + Camembert: "camembert", + Roquefort: "roquefort", + Munster: "munster", + Reblochon: "reblochon", + Cantal: "cantal", + Beaufort: "beaufort", + "Saint-Nectaire": "saint_nectaire", + "Bleu (fromage)": "blue_cheese", + Cancoillotte: "cancoillotte", + Tomme: "tomme", + Époisses: "epoisses", + Chaource: "chaource", + Livarot: "livarot", + "Pont-l'Évêque": "pont_leveque", + Morbier: "morbier", + "Raclette (fromage)": "raclette_cheese", + "Fourme d'Ambert": "fourme_d_ambert", + Salers: "salers", + "Ossau-Iraty": "ossau_iraty", + Vacherin: "vacherin", + "Saint-Marcellin": "saint_marcellin", + Neufchâtel: "neufchatel", + "Crottin de Chavignol": "crottin_de_chavignol", + Abondance: "abondance_cheese", + "Carré de l'Est": "carre_de_l_est", // --- Crémerie & fromage / Œufs ------------------------------------------- Œuf: "egg", diff --git a/apps/api/src/db/reference-seed-data.ts b/apps/api/src/db/reference-seed-data.ts index 1d7d63a..0add29f 100644 --- a/apps/api/src/db/reference-seed-data.ts +++ b/apps/api/src/db/reference-seed-data.ts @@ -158,6 +158,7 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Shiitake", allergenNames: [] }, { name: "Daikon", allergenNames: [] }, { name: "Piment vert frais", allergenNames: [] }, + { name: "Cardon", allergenNames: [] }, ], }, { @@ -194,6 +195,8 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Grenade", allergenNames: [] }, { name: "Rhubarbe", allergenNames: [] }, { name: "Coing", allergenNames: [] }, + { name: "Cassis", allergenNames: [] }, + { name: "Canneberge", allergenNames: [] }, ], }, { @@ -251,6 +254,28 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Pancetta", allergenNames: [] }, { name: "Mortadelle", allergenNames: [] }, { name: "Salami", allergenNames: [] }, + // Added from the Ciqual 2025 "aliments moyens" table — French + // charcuterie/offal/game staples the pantry list was missing (see + // the PR description for how this batch was sourced/curated). + { name: "Andouille", allergenNames: [] }, + { name: "Andouillette", allergenNames: [] }, + { name: "Boudin blanc", allergenNames: [] }, + { name: "Boudin noir", allergenNames: [] }, + { name: "Cervelas", allergenNames: [] }, + { name: "Rillettes", allergenNames: [] }, + { name: "Saucisson sec", allergenNames: [] }, + { name: "Jambon de Bayonne", allergenNames: [] }, + { name: "Coppa", allergenNames: [] }, + { name: "Rosette (saucisson)", allergenNames: [] }, + { name: "Foie de veau", allergenNames: [] }, + { name: "Rognons de veau", allergenNames: [] }, + { name: "Cervelle de veau", allergenNames: [] }, + { name: "Ris de veau", allergenNames: [] }, + { name: "Langue de bœuf", allergenNames: [] }, + { name: "Tripes", allergenNames: [] }, + { name: "Cerf", allergenNames: [] }, + { name: "Chevreuil", allergenNames: [] }, + { name: "Sanglier", allergenNames: [] }, ], }, { @@ -263,6 +288,11 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Dinde", allergenNames: [] }, { name: "Canard", allergenNames: [] }, { name: "Magret de canard", allergenNames: [] }, + // Ciqual 2025 additions — see the VIANDES group above. + { name: "Caille", allergenNames: [] }, + { name: "Pintade", allergenNames: [] }, + { name: "Oie", allergenNames: [] }, + { name: "Foie de volaille", allergenNames: [] }, ], }, { @@ -301,6 +331,9 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Panga", allergenNames: ["Poissons"] }, { name: "Saumon fumé", allergenNames: ["Poissons"] }, { name: "Poisson séché", allergenNames: ["Poissons"] }, + // Ciqual 2025 additions. + { name: "Anguille", allergenNames: ["Poissons"] }, + { name: "Carrelet (ou plie)", allergenNames: ["Poissons"] }, ], }, { @@ -321,6 +354,9 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Poulpe", allergenNames: ["Mollusques"] }, { name: "Palourdes", allergenNames: ["Mollusques"] }, { name: "Bulots", allergenNames: ["Mollusques"] }, + // Ciqual 2025 additions. + { name: "Araignée de mer", allergenNames: ["Crustacés"] }, + { name: "Bigorneau", allergenNames: ["Mollusques"] }, ], }, // ========================================================================= @@ -517,6 +553,36 @@ export const INGREDIENT_GROUPS: Array<{ { name: "Pecorino", icon: "CHEESE", allergenNames: ["Lait"] }, { name: "Gorgonzola", icon: "CHEESE", allergenNames: ["Lait"] }, { name: "Cheddar", icon: "CHEESE", allergenNames: ["Lait"] }, + // Ciqual 2025 additions — classic French regional cheeses the + // catalog only had a handful of internationally-known ones for + // (Emmental, Parmesan, Mozzarella…), missing the actual French + // aisle staples Ciqual's "aliments moyens" table surfaced. + { name: "Brie", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Camembert", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Roquefort", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Munster", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Reblochon", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Cantal", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Beaufort", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Saint-Nectaire", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Bleu (fromage)", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Cancoillotte", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Tomme", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Époisses", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Chaource", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Livarot", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Pont-l'Évêque", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Morbier", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Raclette (fromage)", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Fourme d'Ambert", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Salers", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Ossau-Iraty", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Vacherin", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Saint-Marcellin", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Neufchâtel", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Crottin de Chavignol", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Abondance", icon: "CHEESE", allergenNames: ["Lait"] }, + { name: "Carré de l'Est", icon: "CHEESE", allergenNames: ["Lait"] }, ], }, { diff --git a/apps/web/src/locales/fr/translation.json b/apps/web/src/locales/fr/translation.json index b512aac..10380a8 100644 --- a/apps/web/src/locales/fr/translation.json +++ b/apps/web/src/locales/fr/translation.json @@ -384,6 +384,7 @@ "shiitake": "Shiitake", "daikon": "Daikon", "fresh_green_chili": "Piment vert frais", + "cardoon": "Cardon", "lemon": "Citron", "lime": "Citron vert", "apple": "Pomme", @@ -412,6 +413,8 @@ "pomegranate": "Grenade", "rhubarb": "Rhubarbe", "quince": "Coing", + "blackcurrant": "Cassis", + "cranberry": "Canneberge", "basil": "Basilic", "parsley": "Persil", "thyme": "Thym", @@ -450,10 +453,33 @@ "pancetta": "Pancetta", "mortadella": "Mortadelle", "salami": "Salami", + "andouille": "Andouille", + "andouillette": "Andouillette", + "white_pudding": "Boudin blanc", + "black_pudding": "Boudin noir", + "cervelat": "Cervelas", + "rillettes": "Rillettes", + "dry_cured_sausage": "Saucisson sec", + "bayonne_ham": "Jambon de Bayonne", + "coppa": "Coppa", + "rosette_sausage": "Rosette (saucisson)", + "veal_liver": "Foie de veau", + "veal_kidneys": "Rognons de veau", + "veal_brain": "Cervelle de veau", + "veal_sweetbread": "Ris de veau", + "beef_tongue": "Langue de bœuf", + "tripe": "Tripes", + "venison": "Cerf", + "roe_deer": "Chevreuil", + "wild_boar": "Sanglier", "chicken": "Poulet", "turkey": "Dinde", "duck": "Canard", "duck_breast": "Magret de canard", + "quail": "Caille", + "guinea_fowl": "Pintade", + "goose": "Oie", + "poultry_liver": "Foie de volaille", "salmon": "Saumon", "tuna": "Thon", "cod": "Cabillaud", @@ -484,6 +510,8 @@ "pangasius": "Panga", "smoked_salmon": "Saumon fumé", "dried_fish": "Poisson séché", + "eel": "Anguille", + "plaice": "Carrelet (ou plie)", "shrimp": "Crevettes", "langoustine": "Langoustines", "lobster": "Homard", @@ -496,6 +524,8 @@ "octopus": "Poulpe", "clams": "Palourdes", "whelks": "Bulots", + "spider_crab": "Araignée de mer", + "periwinkle": "Bigorneau", "semolina": "Semoule", "couscous": "Couscous", "bulgur": "Boulgour", @@ -603,6 +633,32 @@ "pecorino": "Pecorino", "gorgonzola": "Gorgonzola", "cheddar": "Cheddar", + "brie": "Brie", + "camembert": "Camembert", + "roquefort": "Roquefort", + "munster": "Munster", + "reblochon": "Reblochon", + "cantal": "Cantal", + "beaufort": "Beaufort", + "saint_nectaire": "Saint-Nectaire", + "blue_cheese": "Bleu (fromage)", + "cancoillotte": "Cancoillotte", + "tomme": "Tomme", + "epoisses": "Époisses", + "chaource": "Chaource", + "livarot": "Livarot", + "pont_leveque": "Pont-l'Évêque", + "morbier": "Morbier", + "raclette_cheese": "Raclette (fromage)", + "fourme_d_ambert": "Fourme d'Ambert", + "salers": "Salers", + "ossau_iraty": "Ossau-Iraty", + "vacherin": "Vacherin", + "saint_marcellin": "Saint-Marcellin", + "neufchatel": "Neufchâtel", + "crottin_de_chavignol": "Crottin de Chavignol", + "abondance_cheese": "Abondance", + "carre_de_l_est": "Carré de l'Est", "egg": "Œuf", "coconut_milk": "Lait de coco", "coconut_cream": "Crème de coco",