reference-seed-data.ts reste rédigé en français (c'est juste le libellé
d'autoring, jamais stocké/exposé), mais la clé stable (`Diet.key`/
`Category.key`/`Ingredient.key`) qu'on en dérive doit elle-même être un
identifiant anglais, indépendant de la langue d'autoring — pas juste le
même texte français passé à slugify().
- apps/api/src/db/catalog-en-keys.ts : dictionnaire écrit à la main
(label français -> clé anglaise) pour les 5 régimes, 14 allergènes et
437 ingrédients ; getEnglishKey() lève une erreur explicite si un
nouvel élément n'a pas encore d'entrée plutôt que de retomber sur un
slug français silencieux.
- scripts/validate-catalog-en-keys.ts : vérifie que chaque diet/allergène/
ingrédient de reference-seed-data.ts a une entrée, et que les clés
anglaises résultantes sont uniques (437/437, 14/14, 5/5 — zéro manquant,
zéro collision).
- reference-seed-data.ts et scripts/generate-catalog-i18n.ts utilisent
désormais getEnglishKey() au lieu de slugify(nom français).
- Nouvelle migration (20260818193000_catalog_keys_to_english) qui
remappe les lignes déjà seedées avec un slug français (par la migration
précédente) vers leur clé anglaise définitive.
- apps/web/src/locales/fr/translation.json régénéré : catalog.* est
maintenant indexé par clé anglaise ("vegetarian", "eggs",
"ground_beef"...), toujours avec le libellé français en valeur.
- Tests/step-definitions mis à jour (getEnglishKey() au lieu de
slugify()) ; 102 tests Mocha + 32 scénarios Cucumber passent contre la
base migrée. Vérifié aussi en direct via GET /reference/diets et
/reference/allergies.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
/**
|
|
* One-off validation, run by hand: checks that `catalog-en-keys.ts` has an
|
|
* entry for every diet/allergen/ingredient currently in
|
|
* `reference-seed-data.ts`, and that the resulting English keys are unique
|
|
* within each table. Not part of the app or the seed itself — just a
|
|
* pre-flight check while building/editing the dictionary by hand.
|
|
*/
|
|
import { ALLERGENS, DIETS, INGREDIENT_GROUPS } from "../src/db/reference-seed-data.js";
|
|
import { getEnglishKey } from "../src/db/catalog-en-keys.js";
|
|
|
|
function check(label: string, names: string[]) {
|
|
const keys = new Map<string, string>();
|
|
const missing: string[] = [];
|
|
const duplicates: string[] = [];
|
|
for (const name of names) {
|
|
let key: string;
|
|
try {
|
|
key = getEnglishKey(name);
|
|
} catch {
|
|
missing.push(name);
|
|
continue;
|
|
}
|
|
const existing = keys.get(key);
|
|
if (existing !== undefined && existing !== name) {
|
|
duplicates.push(`"${existing}" and "${name}" both map to "${key}"`);
|
|
}
|
|
keys.set(key, name);
|
|
}
|
|
console.log(`${label}: ${names.length} names, ${keys.size} unique keys`);
|
|
if (missing.length > 0) {
|
|
console.log(` MISSING (${missing.length}):`, missing);
|
|
}
|
|
if (duplicates.length > 0) {
|
|
console.log(` DUPLICATES (${duplicates.length}):`, duplicates);
|
|
}
|
|
}
|
|
|
|
check("Diets", DIETS);
|
|
check("Allergens", ALLERGENS.map((a) => a.name));
|
|
check(
|
|
"Ingredients",
|
|
INGREDIENT_GROUPS.flatMap((g) => g.items.map((i) => i.name)),
|
|
);
|