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>
49 lines
2.1 KiB
TypeScript
49 lines
2.1 KiB
TypeScript
/**
|
|
* One-off generator, run by hand whenever the catalog's reference data
|
|
* changes (a new ingredient/diet/allergen added to
|
|
* `db/reference-seed-data.ts`, or an English key corrected in
|
|
* `catalog-en-keys.ts`): regenerates
|
|
* `apps/web/src/locales/fr/translation.json`'s
|
|
* `catalog.{diets,allergens,ingredients}` sections (English key -> French
|
|
* label), merged in without touching the rest of the file.
|
|
*
|
|
* Doesn't touch the database — a brand new diet/allergen/ingredient is
|
|
* created fresh by `seedReferenceData`'s normal create path (see
|
|
* `reference-seed-data.ts`), no backfill needed. Renaming an *existing*
|
|
* item's English key in `catalog-en-keys.ts` does need a one-off migration
|
|
* (`UPDATE ... SET key = ...`, keyed by the *old* key value) written by
|
|
* hand for that occasion — see
|
|
* `prisma/migrations/20260818193000_catalog_keys_to_english/` for the shape
|
|
* one looks like.
|
|
*
|
|
* Never imported by the app itself — a dev-time tool, run via
|
|
* `tsx scripts/generate-catalog-i18n.ts`.
|
|
*/
|
|
import { readFileSync, writeFileSync } from "node:fs";
|
|
import { fileURLToPath } from "node:url";
|
|
import { getEnglishKey } from "../src/db/catalog-en-keys.js";
|
|
import { ALLERGENS, DIETS, INGREDIENT_GROUPS } from "../src/db/reference-seed-data.js";
|
|
|
|
const here = fileURLToPath(new URL(".", import.meta.url));
|
|
|
|
function toKeyLabelMap(labels: string[]): Record<string, string> {
|
|
const map: Record<string, string> = {};
|
|
for (const label of labels) {
|
|
map[getEnglishKey(label)] = label;
|
|
}
|
|
return map;
|
|
}
|
|
|
|
const diets = toKeyLabelMap(DIETS);
|
|
const allergens = toKeyLabelMap(ALLERGENS.map((a) => a.name));
|
|
const ingredients = toKeyLabelMap(INGREDIENT_GROUPS.flatMap((g) => g.items.map((i) => i.name)));
|
|
|
|
console.log(
|
|
`diets: ${Object.keys(diets).length}, allergens: ${Object.keys(allergens).length}, ingredients: ${Object.keys(ingredients).length}`,
|
|
);
|
|
|
|
const localePath = here + "../../web/src/locales/fr/translation.json";
|
|
const locale = JSON.parse(readFileSync(localePath, "utf8"));
|
|
locale.catalog = { diets, allergens, ingredients };
|
|
writeFileSync(localePath, JSON.stringify(locale, null, 2) + "\n");
|
|
console.log(`wrote ${localePath}`);
|