87 lines
2.5 KiB
TypeScript
87 lines
2.5 KiB
TypeScript
#!/usr/bin/env tsx
|
|
/**
|
|
* STEG 2 — importera verifierade gap-fill-recept i seed-katalogen.
|
|
*
|
|
* - Läser export-JSON från gapfill-nullcells-export.json.
|
|
* - Upsertar mot befintliga SEED_RECIPES på slug.
|
|
* - Regenererar packages/database/src/seed/data/verified-recipes.ts programmatiskt.
|
|
* - Hand-editerar ALDRIG verified-recipes.ts.
|
|
*/
|
|
|
|
import { SEED_RECIPES, type SeedRecipe } from "../../database/src/seed/data/recipes.js";
|
|
import * as fs from "node:fs/promises";
|
|
import * as path from "node:path";
|
|
|
|
const EXPORT_PATH = path.resolve(
|
|
import.meta.dirname ?? "..",
|
|
"..",
|
|
"output",
|
|
"gapfill-nullcells-export.json",
|
|
);
|
|
|
|
const VERIFIED_RECIPES_PATH = path.resolve(
|
|
import.meta.dirname ?? "..",
|
|
"..",
|
|
"..",
|
|
"database",
|
|
"src",
|
|
"seed",
|
|
"data",
|
|
"verified-recipes.ts",
|
|
);
|
|
|
|
interface ExportEnvelope {
|
|
recipes: SeedRecipe[];
|
|
}
|
|
|
|
async function main() {
|
|
const raw = await fs.readFile(EXPORT_PATH, "utf-8");
|
|
const envelope: ExportEnvelope = JSON.parse(raw);
|
|
const newRecipes = envelope.recipes;
|
|
|
|
const existingBySlug = new Map(SEED_RECIPES.map((r) => [r.slug, r]));
|
|
let upserted = 0;
|
|
let added = 0;
|
|
|
|
// Behåll befintlig ordning; nya läggs sist i export-ordning.
|
|
const merged: SeedRecipe[] = [...SEED_RECIPES];
|
|
|
|
for (const recipe of newRecipes) {
|
|
if (existingBySlug.has(recipe.slug)) {
|
|
const idx = merged.findIndex((r) => r.slug === recipe.slug);
|
|
if (idx !== -1) merged[idx] = recipe;
|
|
upserted++;
|
|
} else {
|
|
existingBySlug.set(recipe.slug, recipe);
|
|
merged.push(recipe);
|
|
added++;
|
|
}
|
|
}
|
|
|
|
const fileBody = `import type {
|
|
SeedRecipe,
|
|
} from "./recipes.js";
|
|
|
|
/**
|
|
* Committed seed catalog: ${merged.length} verified recipes (JSON export converted once).
|
|
* Allergens and nutrition are re-derived at seed time from canonical ingredients.
|
|
* Verification statuses preserved: editorial + verified.
|
|
*/
|
|
export const VERIFIED_RECIPES: SeedRecipe[] = ${JSON.stringify(merged, null, 2)};
|
|
`;
|
|
|
|
await fs.writeFile(VERIFIED_RECIPES_PATH, fileBody, "utf-8");
|
|
|
|
console.error(`[import-gapfill] Befintliga recept: ${SEED_RECIPES.length}`);
|
|
console.error(`[import-gapfill] Nya recept: ${newRecipes.length}`);
|
|
console.error(`[import-gapfill] Upsertade: ${upserted}`);
|
|
console.error(`[import-gapfill] Tillagda: ${added}`);
|
|
console.error(`[import-gapfill] Nytt totalt: ${merged.length}`);
|
|
console.error(`[import-gapfill] Skrev: ${VERIFIED_RECIPES_PATH}`);
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error("[import-gapfill] Fatal:", err);
|
|
process.exit(1);
|
|
});
|