Files
Cibello-app/packages/database/src/seed/data/ingredients.ts
T

987 lines
33 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type {
Allergen,
NutritionDeclaration,
NutritionProvenance,
Season,
StorageLocationType,
Unit,
} from "@app/shared-types";
/**
* Seed: kanoniska ingredienser med schablonvärden per 100 g.
*
* VIKTIGT (spec §21, §61.1): värdena här är standardiserade uppskattningar
* ("seed_estimate") för utveckling. Produktionsvägen är import från
* Livsmedelsverkets öppna livsmedelsdatabas via connectorn jobbet byter då
* provenance till "livsmedelsverket". AI hittar ALDRIG på näringsvärden.
*/
export interface SeedIngredient {
id: string;
nameSv: string;
nameEn: string;
aliases: string[];
category: string;
defaultUnit: Unit;
densityGPerMl?: number;
gramsPerPiece?: number;
allergens: Allergen[];
isVegan: boolean;
isVegetarian: boolean;
containsGluten: boolean;
containsLactose: boolean;
isPork: boolean;
isBeef: boolean;
isAlcohol: boolean;
nutritionPer100: NutritionDeclaration;
nutritionProvenance: NutritionProvenance;
peakSeasons: Season[];
shelfLifeGuidance?: Partial<Record<StorageLocationType, number>>;
defaultPriceMinorPerKg?: number;
}
const PROVENANCE: NutritionProvenance = {
source: "seed_estimate",
confidence: 0.7,
verifiedByUser: false,
};
interface N {
kcal: number;
p: number;
k: number;
f: number;
mf?: number;
fib?: number;
s?: number;
salt?: number;
}
function per100(n: N): NutritionDeclaration {
return {
basis: "per_100_g",
values: {
kcal: n.kcal,
proteinG: n.p,
carbsG: n.k,
fatG: n.f,
saturatedFatG: n.mf ?? 0,
fiberG: n.fib ?? 0,
sugarG: n.s ?? 0,
saltG: n.salt ?? 0,
},
};
}
type IngOpts = Partial<
Omit<
SeedIngredient,
"id" | "nameSv" | "nameEn" | "category" | "nutritionPer100" | "nutritionProvenance"
>
> & {
n: N;
};
function ing(
id: string,
nameSv: string,
nameEn: string,
category: string,
opts: IngOpts,
): SeedIngredient {
const { n, ...rest } = opts;
return {
id,
nameSv,
nameEn,
aliases: rest.aliases ?? [],
category,
defaultUnit: rest.defaultUnit ?? "GRAM",
allergens: rest.allergens ?? [],
isVegan: rest.isVegan ?? false,
isVegetarian: rest.isVegetarian ?? false,
containsGluten: rest.containsGluten ?? false,
containsLactose: rest.containsLactose ?? false,
isPork: rest.isPork ?? false,
isBeef: rest.isBeef ?? false,
isAlcohol: rest.isAlcohol ?? false,
nutritionPer100: per100(n),
nutritionProvenance: PROVENANCE,
peakSeasons: rest.peakSeasons ?? [],
...(rest.densityGPerMl !== undefined ? { densityGPerMl: rest.densityGPerMl } : {}),
...(rest.gramsPerPiece !== undefined ? { gramsPerPiece: rest.gramsPerPiece } : {}),
...(rest.shelfLifeGuidance !== undefined ? { shelfLifeGuidance: rest.shelfLifeGuidance } : {}),
...(rest.defaultPriceMinorPerKg !== undefined
? { defaultPriceMinorPerKg: rest.defaultPriceMinorPerKg }
: {}),
};
}
const veg = { isVegan: true, isVegetarian: true };
const vgt = { isVegan: false, isVegetarian: true };
export const SEED_INGREDIENTS: SeedIngredient[] = [
// --- Mejeri & ägg ---
ing("milk_3", "Standardmjölk 3 %", "Whole milk", "mejeri", {
...vgt,
defaultUnit: "DECILITER",
densityGPerMl: 1.03,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 60, p: 3.4, k: 4.7, f: 3, mf: 1.9, s: 4.7, salt: 0.1 },
shelfLifeGuidance: { fridge: 7 },
defaultPriceMinorPerKg: 1600,
aliases: ["mjölk", "helmjölk"],
}),
ing("milk_1_5", "Mellanmjölk 1,5 %", "Semi-skimmed milk", "mejeri", {
...vgt,
defaultUnit: "DECILITER",
densityGPerMl: 1.03,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 46, p: 3.5, k: 4.8, f: 1.5, mf: 1, s: 4.8, salt: 0.1 },
shelfLifeGuidance: { fridge: 7 },
defaultPriceMinorPerKg: 1500,
aliases: ["mellanmjölk"],
}),
ing("oat_drink", "Havredryck", "Oat drink", "mejeri", {
...veg,
defaultUnit: "DECILITER",
densityGPerMl: 1.01,
containsGluten: false,
n: { kcal: 46, p: 1, k: 6.7, f: 1.5, mf: 0.2, s: 4, salt: 0.1 },
shelfLifeGuidance: { fridge: 7 },
defaultPriceMinorPerKg: 2200,
aliases: ["havremjölk"],
}),
ing("cream", "Vispgrädde 40 %", "Whipping cream", "mejeri", {
...vgt,
defaultUnit: "DECILITER",
densityGPerMl: 1,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 380, p: 2, k: 3, f: 40, mf: 26, s: 3, salt: 0.1 },
shelfLifeGuidance: { fridge: 7 },
defaultPriceMinorPerKg: 6500,
}),
ing("cooking_cream", "Matlagningsgrädde 15 %", "Cooking cream", "mejeri", {
...vgt,
defaultUnit: "DECILITER",
densityGPerMl: 1,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 162, p: 2.7, k: 4.2, f: 15, mf: 10, s: 4, salt: 0.1 },
shelfLifeGuidance: { fridge: 7 },
defaultPriceMinorPerKg: 5500,
}),
ing("creme_fraiche", "Crème fraiche", "Crème fraîche", "mejeri", {
...vgt,
defaultUnit: "DECILITER",
densityGPerMl: 1,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 292, p: 2.3, k: 3, f: 30, mf: 20, s: 3, salt: 0.1 },
shelfLifeGuidance: { fridge: 14 },
defaultPriceMinorPerKg: 6000,
}),
ing("quark", "Kvarg naturell", "Quark", "mejeri", {
...vgt,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 62, p: 11, k: 3.8, f: 0.3, mf: 0.2, s: 3.8, salt: 0.1 },
shelfLifeGuidance: { fridge: 10 },
defaultPriceMinorPerKg: 4500,
aliases: ["kesella"],
}),
ing("yoghurt_natural", "Naturell yoghurt 3 %", "Plain yogurt", "mejeri", {
...vgt,
defaultUnit: "DECILITER",
densityGPerMl: 1.03,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 61, p: 3.8, k: 4.9, f: 3, mf: 2, s: 4.9, salt: 0.1 },
shelfLifeGuidance: { fridge: 7 },
defaultPriceMinorPerKg: 3000,
}),
ing("butter", "Smör", "Butter", "mejeri", {
...vgt,
allergens: ["milk"],
containsLactose: true,
densityGPerMl: 0.91,
n: { kcal: 744, p: 0.6, k: 0.7, f: 82, mf: 52, salt: 1.2 },
shelfLifeGuidance: { fridge: 60 },
defaultPriceMinorPerKg: 11000,
}),
ing("cheese_hard", "Hårdost (t.ex. hushållsost)", "Hard cheese", "mejeri", {
...vgt,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 350, p: 26, k: 0, f: 27, mf: 17, salt: 1.2 },
shelfLifeGuidance: { fridge: 21 },
defaultPriceMinorPerKg: 12000,
aliases: ["ost", "riven ost"],
}),
ing("vasterbotten_cheese", "Västerbottensost", "Västerbotten cheese", "mejeri", {
...vgt,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 390, p: 27, k: 0, f: 31, mf: 20, salt: 1.5 },
shelfLifeGuidance: { fridge: 21 },
defaultPriceMinorPerKg: 22000,
}),
ing("feta", "Fetaost", "Feta cheese", "mejeri", {
...vgt,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 265, p: 14, k: 2, f: 22, mf: 15, salt: 2.7 },
shelfLifeGuidance: { fridge: 14 },
defaultPriceMinorPerKg: 13000,
}),
ing("halloumi", "Halloumi", "Halloumi", "mejeri", {
...vgt,
allergens: ["milk"],
containsLactose: true,
n: { kcal: 321, p: 21, k: 2.2, f: 25, mf: 16, salt: 2.8 },
shelfLifeGuidance: { fridge: 30 },
defaultPriceMinorPerKg: 16000,
}),
ing("egg", "Ägg", "Egg", "mejeri", {
...vgt,
defaultUnit: "COUNT",
gramsPerPiece: 58,
allergens: ["eggs"],
n: { kcal: 143, p: 12.6, k: 0.7, f: 9.5, mf: 3.1, salt: 0.4 },
shelfLifeGuidance: { fridge: 30, pantry: 21 },
defaultPriceMinorPerKg: 6500,
}),
// --- Kött & fågel ---
ing("chicken_breast", "Kycklingfilé", "Chicken breast", "kott_fagel", {
n: { kcal: 106, p: 22, k: 0, f: 2, mf: 0.6, salt: 0.2 },
shelfLifeGuidance: { fridge: 2, freezer: 180 },
defaultPriceMinorPerKg: 13000,
aliases: ["kyckling", "kycklingbröst"],
}),
ing("chicken_thigh", "Kycklinglårfilé", "Chicken thigh", "kott_fagel", {
n: { kcal: 150, p: 19, k: 0, f: 8, mf: 2.2, salt: 0.2 },
shelfLifeGuidance: { fridge: 2, freezer: 180 },
defaultPriceMinorPerKg: 11000,
}),
ing("minced_beef", "Nötfärs 10 %", "Minced beef", "kott_fagel", {
isBeef: true,
n: { kcal: 176, p: 20, k: 0, f: 10, mf: 4.5, salt: 0.2 },
shelfLifeGuidance: { fridge: 1, freezer: 120 },
defaultPriceMinorPerKg: 14000,
aliases: ["nötfärs"],
}),
ing("minced_mixed", "Blandfärs", "Minced pork/beef", "kott_fagel", {
isPork: true,
isBeef: true,
n: { kcal: 220, p: 18, k: 0, f: 16, mf: 7, salt: 0.2 },
shelfLifeGuidance: { fridge: 1, freezer: 120 },
defaultPriceMinorPerKg: 10000,
}),
ing("falukorv", "Falukorv", "Falu sausage", "kott_fagel", {
isPork: true,
isBeef: true,
containsGluten: true,
containsLactose: true,
allergens: ["gluten", "milk"],
n: { kcal: 230, p: 10, k: 6, f: 19, mf: 7, salt: 1.9 },
shelfLifeGuidance: { fridge: 10 },
defaultPriceMinorPerKg: 7000,
}),
ing("bacon", "Bacon", "Bacon", "kott_fagel", {
isPork: true,
n: { kcal: 320, p: 14, k: 1, f: 29, mf: 11, salt: 2.5 },
shelfLifeGuidance: { fridge: 7, freezer: 60 },
defaultPriceMinorPerKg: 18000,
}),
ing("pork_loin", "Fläskytterfilé", "Pork loin", "kott_fagel", {
isPork: true,
n: { kcal: 120, p: 21, k: 0, f: 4, mf: 1.4, salt: 0.1 },
shelfLifeGuidance: { fridge: 2, freezer: 150 },
defaultPriceMinorPerKg: 9000,
}),
ing("meatball_pork_beef", "Köttbullar (färdiga)", "Meatballs", "kott_fagel", {
isPork: true,
isBeef: true,
containsGluten: true,
containsLactose: true,
allergens: ["gluten", "eggs", "milk"],
n: { kcal: 230, p: 13, k: 7, f: 17, mf: 6.5, salt: 1.8 },
shelfLifeGuidance: { fridge: 5, freezer: 120 },
defaultPriceMinorPerKg: 9000,
}),
// --- Fisk & skaldjur ---
ing("salmon", "Laxfilé", "Salmon fillet", "fisk", {
allergens: ["fish"],
n: { kcal: 200, p: 20, k: 0, f: 13, mf: 2.5, salt: 0.1 },
shelfLifeGuidance: { fridge: 2, freezer: 90 },
defaultPriceMinorPerKg: 25000,
aliases: ["lax"],
}),
ing("cod", "Torskfilé", "Cod fillet", "fisk", {
allergens: ["fish"],
n: { kcal: 80, p: 18, k: 0, f: 0.7, mf: 0.1, salt: 0.2 },
shelfLifeGuidance: { fridge: 2, freezer: 90 },
defaultPriceMinorPerKg: 30000,
aliases: ["torsk"],
}),
ing("shrimp", "Räkor (skalade)", "Shrimp", "fisk", {
allergens: ["crustaceans"],
n: { kcal: 80, p: 18, k: 0, f: 0.8, mf: 0.2, salt: 1.5 },
shelfLifeGuidance: { fridge: 2, freezer: 90 },
defaultPriceMinorPerKg: 35000,
}),
ing("pickled_herring", "Inlagd sill", "Pickled herring", "fisk", {
allergens: ["fish"],
n: { kcal: 180, p: 12, k: 12, f: 10, mf: 2.5, s: 11, salt: 2.2 },
shelfLifeGuidance: { fridge: 21 },
defaultPriceMinorPerKg: 12000,
aliases: ["sill"],
}),
ing("anchovy_swedish", "Ansjovis (svensk)", "Swedish anchovy sprats", "fisk", {
allergens: ["fish"],
n: { kcal: 170, p: 12, k: 8, f: 10, mf: 2, salt: 6 },
shelfLifeGuidance: { fridge: 30 },
defaultPriceMinorPerKg: 18000,
}),
// --- Grönsaker ---
ing("potato", "Potatis", "Potato", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 180,
n: { kcal: 80, p: 2, k: 17, f: 0.1, fib: 1.8 },
shelfLifeGuidance: { pantry: 30, fridge: 45 },
defaultPriceMinorPerKg: 1500,
peakSeasons: ["autumn"],
}),
ing("new_potato", "Färskpotatis", "New potatoes", "gronsaker", {
...veg,
n: { kcal: 75, p: 1.9, k: 16, f: 0.1, fib: 1.6 },
shelfLifeGuidance: { pantry: 7, fridge: 10 },
defaultPriceMinorPerKg: 3000,
peakSeasons: ["summer"],
}),
ing("onion", "Gul lök", "Yellow onion", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 150,
n: { kcal: 40, p: 1.2, k: 8, f: 0.1, fib: 1.7, s: 5 },
shelfLifeGuidance: { pantry: 30 },
defaultPriceMinorPerKg: 1500,
aliases: ["lök"],
}),
ing("red_onion", "Rödlök", "Red onion", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 120,
n: { kcal: 42, p: 1.2, k: 8.5, f: 0.1, fib: 1.7, s: 5.5 },
shelfLifeGuidance: { pantry: 30 },
defaultPriceMinorPerKg: 2000,
}),
ing("garlic", "Vitlök", "Garlic", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 5,
aliases: ["vitlöksklyfta"],
n: { kcal: 140, p: 6.5, k: 28, f: 0.5, fib: 2 },
shelfLifeGuidance: { pantry: 60 },
defaultPriceMinorPerKg: 9000,
}),
ing("carrot", "Morot", "Carrot", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 125,
n: { kcal: 38, p: 0.7, k: 8, f: 0.2, fib: 2.7, s: 4.5 },
shelfLifeGuidance: { fridge: 21 },
defaultPriceMinorPerKg: 1500,
peakSeasons: ["autumn", "winter"],
}),
ing("tomato", "Tomat", "Tomato", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 125,
n: { kcal: 20, p: 0.9, k: 3.5, f: 0.2, fib: 1.4, s: 2.6 },
shelfLifeGuidance: { pantry: 7, fridge: 10 },
defaultPriceMinorPerKg: 3500,
peakSeasons: ["summer"],
}),
ing("cucumber", "Gurka", "Cucumber", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 350,
n: { kcal: 12, p: 0.7, k: 2, f: 0.1, fib: 0.7 },
shelfLifeGuidance: { fridge: 7 },
defaultPriceMinorPerKg: 2500,
peakSeasons: ["summer"],
}),
ing("bell_pepper", "Paprika", "Bell pepper", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 150,
n: { kcal: 30, p: 1, k: 5, f: 0.3, fib: 1.9, s: 4.5 },
shelfLifeGuidance: { fridge: 10 },
defaultPriceMinorPerKg: 4500,
peakSeasons: ["summer", "autumn"],
}),
ing("spinach", "Spenat (färsk)", "Spinach", "gronsaker", {
...veg,
n: { kcal: 25, p: 2.9, k: 1.5, f: 0.4, fib: 2 },
shelfLifeGuidance: { fridge: 4, freezer: 180 },
defaultPriceMinorPerKg: 9000,
}),
ing("lettuce", "Sallad (huvud)", "Lettuce", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 300,
n: { kcal: 15, p: 1.2, k: 2, f: 0.2, fib: 1.3 },
shelfLifeGuidance: { fridge: 5 },
defaultPriceMinorPerKg: 6000,
peakSeasons: ["summer"],
}),
ing("broccoli", "Broccoli", "Broccoli", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 300,
n: { kcal: 35, p: 3.5, k: 4, f: 0.4, fib: 2.9 },
shelfLifeGuidance: { fridge: 5, freezer: 180 },
defaultPriceMinorPerKg: 4000,
}),
ing("zucchini", "Zucchini", "Zucchini", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 300,
n: { kcal: 17, p: 1.2, k: 3, f: 0.3, fib: 1 },
shelfLifeGuidance: { fridge: 7 },
defaultPriceMinorPerKg: 3500,
peakSeasons: ["summer", "autumn"],
}),
ing("leek", "Purjolök", "Leek", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 200,
n: { kcal: 30, p: 1.5, k: 5.5, f: 0.3, fib: 2.3 },
shelfLifeGuidance: { fridge: 14 },
defaultPriceMinorPerKg: 3500,
peakSeasons: ["autumn", "winter"],
}),
ing("dill", "Dill (färsk)", "Dill", "gronsaker", {
...veg,
densityGPerMl: 0.12,
n: { kcal: 40, p: 3.5, k: 5, f: 0.8, fib: 2.5 },
shelfLifeGuidance: { fridge: 5 },
defaultPriceMinorPerKg: 30000,
peakSeasons: ["summer"],
}),
ing("parsley", "Persilja (färsk)", "Parsley", "gronsaker", {
...veg,
densityGPerMl: 0.12,
n: { kcal: 45, p: 3.7, k: 6, f: 0.9, fib: 3.5 },
shelfLifeGuidance: { fridge: 5 },
defaultPriceMinorPerKg: 30000,
}),
ing("basil", "Basilika (färsk)", "Basil", "gronsaker", {
...veg,
densityGPerMl: 0.12,
n: { kcal: 30, p: 3, k: 2.5, f: 0.6, fib: 1.6 },
shelfLifeGuidance: { fridge: 4 },
defaultPriceMinorPerKg: 40000,
peakSeasons: ["summer"],
}),
ing("ginger", "Ingefära (färsk)", "Ginger", "gronsaker", {
...veg,
densityGPerMl: 0.95,
n: { kcal: 80, p: 1.8, k: 16, f: 0.8, fib: 2 },
shelfLifeGuidance: { fridge: 21 },
defaultPriceMinorPerKg: 8000,
}),
ing("mushroom", "Champinjoner", "Mushrooms", "gronsaker", {
...veg,
densityGPerMl: 0.9,
n: { kcal: 25, p: 3, k: 1.5, f: 0.4, fib: 1.5 },
shelfLifeGuidance: { fridge: 5 },
defaultPriceMinorPerKg: 6000,
peakSeasons: ["autumn"],
}),
ing("frozen_peas", "Gröna ärtor (frysta)", "Frozen peas", "gronsaker", {
...veg,
densityGPerMl: 0.8,
n: { kcal: 78, p: 5.5, k: 11, f: 0.5, fib: 5.5, s: 5 },
shelfLifeGuidance: { freezer: 365 },
defaultPriceMinorPerKg: 3000,
}),
ing("corn", "Majs (konserverad)", "Sweet corn", "gronsaker", {
...veg,
densityGPerMl: 0.75,
n: { kcal: 90, p: 3, k: 17, f: 1.2, fib: 2.5, s: 5 },
shelfLifeGuidance: { pantry: 365, fridge: 4 },
defaultPriceMinorPerKg: 3000,
}),
ing("olives", "Oliver", "Olives", "gronsaker", {
...veg,
densityGPerMl: 0.95,
n: { kcal: 150, p: 1, k: 1, f: 15, mf: 2.2, salt: 3.5 },
shelfLifeGuidance: { fridge: 30 },
defaultPriceMinorPerKg: 10000,
}),
ing("avocado", "Avokado", "Avocado", "gronsaker", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 200,
n: { kcal: 160, p: 2, k: 2, f: 15, mf: 3.1, fib: 6.7 },
shelfLifeGuidance: { pantry: 4, fridge: 7 },
defaultPriceMinorPerKg: 6000,
}),
// --- Frukt & bär ---
ing("lemon", "Citron", "Lemon", "frukt", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 120,
n: { kcal: 30, p: 1, k: 9, f: 0.3, fib: 2.8, s: 2.5 },
shelfLifeGuidance: { pantry: 14, fridge: 30 },
defaultPriceMinorPerKg: 3000,
}),
ing("lime", "Lime", "Lime", "frukt", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 70,
n: { kcal: 30, p: 0.7, k: 10, f: 0.2, fib: 2.8, s: 1.7 },
shelfLifeGuidance: { pantry: 14, fridge: 30 },
defaultPriceMinorPerKg: 4000,
}),
ing("apple", "Äpple", "Apple", "frukt", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 180,
n: { kcal: 52, p: 0.3, k: 12, f: 0.2, fib: 2.4, s: 10 },
shelfLifeGuidance: { pantry: 14, fridge: 30 },
defaultPriceMinorPerKg: 2500,
peakSeasons: ["autumn"],
}),
ing("banana", "Banan", "Banana", "frukt", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 120,
n: { kcal: 89, p: 1.1, k: 20, f: 0.3, fib: 2.6, s: 12 },
shelfLifeGuidance: { pantry: 5 },
defaultPriceMinorPerKg: 2500,
}),
ing("strawberry", "Jordgubbar", "Strawberries", "frukt", {
...veg,
n: { kcal: 33, p: 0.7, k: 6, f: 0.3, fib: 2, s: 4.9 },
shelfLifeGuidance: { fridge: 3 },
defaultPriceMinorPerKg: 6000,
peakSeasons: ["summer"],
}),
// --- Spannmål, pasta, bröd ---
ing("pasta_dry", "Pasta (torr)", "Dry pasta", "spannmal", {
...veg,
containsGluten: true,
allergens: ["gluten"],
n: { kcal: 360, p: 12, k: 72, f: 1.5, fib: 3 },
shelfLifeGuidance: { pantry: 730 },
defaultPriceMinorPerKg: 2500,
aliases: ["spaghetti", "penne", "makaroner"],
}),
ing("pasta_gluten_free", "Glutenfri pasta", "Gluten-free pasta", "spannmal", {
...veg,
n: { kcal: 355, p: 7, k: 76, f: 2, fib: 2.5 },
shelfLifeGuidance: { pantry: 730 },
defaultPriceMinorPerKg: 4500,
}),
ing("rice_white", "Ris (jasmin/basmati, torrt)", "White rice", "spannmal", {
...veg,
densityGPerMl: 0.85,
n: { kcal: 350, p: 7, k: 78, f: 0.6, fib: 1.4 },
shelfLifeGuidance: { pantry: 730 },
defaultPriceMinorPerKg: 3000,
aliases: ["ris", "jasminris", "basmatiris"],
}),
ing("noodles_egg", "Äggnudlar (torra)", "Egg noodles", "spannmal", {
...vgt,
containsGluten: true,
allergens: ["gluten", "eggs"],
n: { kcal: 365, p: 13, k: 70, f: 4, fib: 3 },
shelfLifeGuidance: { pantry: 365 },
defaultPriceMinorPerKg: 4500,
aliases: ["nudlar"],
}),
ing("flour_wheat", "Vetemjöl", "Wheat flour", "spannmal", {
...veg,
containsGluten: true,
allergens: ["gluten"],
densityGPerMl: 0.6,
n: { kcal: 340, p: 10, k: 70, f: 1.5, fib: 3 },
shelfLifeGuidance: { pantry: 365 },
defaultPriceMinorPerKg: 1500,
aliases: ["mjöl"],
}),
ing("oats", "Havregryn", "Rolled oats", "spannmal", {
...veg,
densityGPerMl: 0.37,
n: { kcal: 370, p: 13, k: 58, f: 7, mf: 1.3, fib: 10 },
shelfLifeGuidance: { pantry: 365 },
defaultPriceMinorPerKg: 2000,
}),
ing("breadcrumbs", "Ströbröd", "Breadcrumbs", "spannmal", {
...veg,
containsGluten: true,
allergens: ["gluten"],
densityGPerMl: 0.55,
n: { kcal: 360, p: 11, k: 72, f: 2.5, fib: 4, salt: 1 },
shelfLifeGuidance: { pantry: 365 },
defaultPriceMinorPerKg: 3000,
}),
ing("bread_sourdough", "Surdegsbröd", "Sourdough bread", "brod", {
...veg,
containsGluten: true,
allergens: ["gluten"],
n: { kcal: 250, p: 8.5, k: 48, f: 1.5, fib: 3.5, salt: 1.1 },
shelfLifeGuidance: { pantry: 4, freezer: 90 },
defaultPriceMinorPerKg: 6000,
aliases: ["bröd"],
}),
ing("tortilla", "Tortillabröd", "Tortilla wraps", "brod", {
...veg,
containsGluten: true,
allergens: ["gluten"],
defaultUnit: "COUNT",
gramsPerPiece: 60,
n: { kcal: 300, p: 8, k: 50, f: 7, mf: 3, fib: 3, salt: 1.2 },
shelfLifeGuidance: { pantry: 30 },
defaultPriceMinorPerKg: 6000,
}),
ing("hamburger_bun", "Hamburgerbröd", "Burger buns", "brod", {
...vgt,
containsGluten: true,
allergens: ["gluten", "sesame"],
defaultUnit: "COUNT",
gramsPerPiece: 60,
n: { kcal: 290, p: 9, k: 50, f: 5, mf: 1, fib: 2.5, s: 6, salt: 1 },
shelfLifeGuidance: { pantry: 5, freezer: 90 },
defaultPriceMinorPerKg: 5500,
}),
// --- Baljväxter ---
ing("red_lentils", "Röda linser (torra)", "Red lentils", "baljvaxter", {
...veg,
densityGPerMl: 0.85,
n: { kcal: 340, p: 24, k: 52, f: 1.5, fib: 11 },
shelfLifeGuidance: { pantry: 730 },
defaultPriceMinorPerKg: 4000,
}),
ing("chickpeas_canned", "Kikärtor (kokta)", "Chickpeas", "baljvaxter", {
...veg,
densityGPerMl: 0.75,
n: { kcal: 120, p: 7, k: 17, f: 2.2, fib: 5.5 },
shelfLifeGuidance: { pantry: 730, fridge: 3 },
defaultPriceMinorPerKg: 3000,
}),
ing("black_beans_canned", "Svarta bönor (kokta)", "Black beans", "baljvaxter", {
...veg,
densityGPerMl: 0.75,
n: { kcal: 100, p: 7, k: 15, f: 0.5, fib: 7 },
shelfLifeGuidance: { pantry: 730, fridge: 3 },
defaultPriceMinorPerKg: 3000,
}),
ing("kidney_beans_canned", "Kidneybönor (kokta)", "Kidney beans", "baljvaxter", {
...veg,
densityGPerMl: 0.75,
n: { kcal: 100, p: 7.5, k: 14, f: 0.6, fib: 7 },
shelfLifeGuidance: { pantry: 730, fridge: 3 },
defaultPriceMinorPerKg: 3000,
}),
ing("tofu", "Tofu (naturell)", "Tofu", "baljvaxter", {
...veg,
allergens: ["soy"],
n: { kcal: 120, p: 12, k: 2, f: 7, mf: 1 },
shelfLifeGuidance: { fridge: 7 },
defaultPriceMinorPerKg: 8000,
}),
// --- Skafferi & konserver ---
ing("canned_tomatoes", "Krossade tomater", "Canned crushed tomatoes", "konserver", {
...veg,
defaultUnit: "COUNT",
gramsPerPiece: 400,
n: { kcal: 30, p: 1.3, k: 5, f: 0.2, fib: 1.5, s: 4 },
shelfLifeGuidance: { pantry: 730, fridge: 4 },
defaultPriceMinorPerKg: 2000,
}),
ing("tomato_paste", "Tomatpuré", "Tomato paste", "konserver", {
...veg,
densityGPerMl: 1.05,
n: { kcal: 90, p: 4.3, k: 15, f: 0.5, fib: 4, s: 12 },
shelfLifeGuidance: { pantry: 365, fridge: 14 },
defaultPriceMinorPerKg: 4000,
}),
ing("coconut_milk", "Kokosmjölk", "Coconut milk", "konserver", {
...veg,
defaultUnit: "DECILITER",
densityGPerMl: 0.97,
n: { kcal: 180, p: 1.7, k: 3, f: 18, mf: 16 },
shelfLifeGuidance: { pantry: 730, fridge: 3 },
defaultPriceMinorPerKg: 4500,
}),
ing("olive_oil", "Olivolja", "Olive oil", "skafferi", {
...veg,
defaultUnit: "TABLESPOON",
densityGPerMl: 0.92,
n: { kcal: 884, p: 0, k: 0, f: 100, mf: 14 },
shelfLifeGuidance: { pantry: 540 },
defaultPriceMinorPerKg: 10000,
}),
ing("rapeseed_oil", "Rapsolja", "Rapeseed oil", "skafferi", {
...veg,
defaultUnit: "TABLESPOON",
densityGPerMl: 0.92,
n: { kcal: 884, p: 0, k: 0, f: 100, mf: 7 },
shelfLifeGuidance: { pantry: 540 },
defaultPriceMinorPerKg: 5000,
aliases: ["matolja", "olja"],
}),
ing("sugar", "Strösocker", "Sugar", "skafferi", {
...veg,
densityGPerMl: 0.85,
n: { kcal: 400, p: 0, k: 100, f: 0, s: 100 },
shelfLifeGuidance: { pantry: 3650 },
defaultPriceMinorPerKg: 2000,
aliases: ["socker"],
}),
ing("honey", "Honung", "Honey", "skafferi", {
...vgt,
densityGPerMl: 1.4,
n: { kcal: 320, p: 0.4, k: 80, f: 0, s: 80 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 12000,
}),
ing("soy_sauce", "Soja (japansk)", "Soy sauce", "skafferi", {
...veg,
allergens: ["soy", "gluten"],
containsGluten: true,
defaultUnit: "TABLESPOON",
densityGPerMl: 1.15,
n: { kcal: 60, p: 8, k: 6, f: 0, salt: 15 },
shelfLifeGuidance: { pantry: 730 },
defaultPriceMinorPerKg: 8000,
}),
ing("fish_sauce", "Fisksås", "Fish sauce", "skafferi", {
allergens: ["fish"],
defaultUnit: "TABLESPOON",
densityGPerMl: 1.2,
n: { kcal: 45, p: 9, k: 3, f: 0, salt: 24 },
shelfLifeGuidance: { pantry: 730 },
defaultPriceMinorPerKg: 9000,
}),
ing("red_curry_paste", "Röd currypasta", "Red curry paste", "skafferi", {
allergens: ["crustaceans", "fish"],
densityGPerMl: 1.05,
n: { kcal: 120, p: 3, k: 15, f: 5, mf: 1, salt: 6 },
shelfLifeGuidance: { pantry: 365, fridge: 30 },
defaultPriceMinorPerKg: 15000,
}),
ing("red_curry_paste_vegan", "Röd currypasta (vegansk)", "Vegan red curry paste", "skafferi", {
...veg,
allergens: [],
densityGPerMl: 1.05,
n: { kcal: 115, p: 2.5, k: 14, f: 5, mf: 1, salt: 6 },
shelfLifeGuidance: { pantry: 365, fridge: 30 },
defaultPriceMinorPerKg: 16000,
}),
ing("mustard", "Senap", "Mustard", "skafferi", {
...veg,
allergens: ["mustard"],
densityGPerMl: 1.05,
n: { kcal: 130, p: 6, k: 10, f: 7, mf: 0.5, s: 8, salt: 2.5 },
shelfLifeGuidance: { fridge: 90 },
defaultPriceMinorPerKg: 6000,
}),
ing("mayonnaise", "Majonnäs", "Mayonnaise", "skafferi", {
...vgt,
allergens: ["eggs", "mustard"],
densityGPerMl: 0.95,
n: { kcal: 680, p: 1, k: 2, f: 75, mf: 6, salt: 1 },
shelfLifeGuidance: { fridge: 60 },
defaultPriceMinorPerKg: 7000,
}),
ing("vegetable_stock_cube", "Grönsaksbuljongtärning", "Vegetable stock cube", "skafferi", {
...veg,
allergens: ["celery"],
defaultUnit: "COUNT",
gramsPerPiece: 10,
n: { kcal: 220, p: 8, k: 25, f: 10, mf: 5, salt: 45 },
shelfLifeGuidance: { pantry: 730 },
defaultPriceMinorPerKg: 20000,
aliases: ["buljong"],
}),
ing("chicken_stock_cube", "Kycklingbuljongtärning", "Chicken stock cube", "skafferi", {
allergens: ["celery"],
defaultUnit: "COUNT",
gramsPerPiece: 10,
n: { kcal: 230, p: 9, k: 24, f: 11, mf: 5.5, salt: 45 },
shelfLifeGuidance: { pantry: 730 },
defaultPriceMinorPerKg: 20000,
}),
ing("peanut_butter", "Jordnötssmör", "Peanut butter", "skafferi", {
...veg,
allergens: ["peanuts"],
n: { kcal: 600, p: 25, k: 12, f: 50, mf: 10, fib: 6, salt: 0.8 },
shelfLifeGuidance: { pantry: 365 },
defaultPriceMinorPerKg: 9000,
}),
ing("teriyaki_sauce", "Teriyakisås", "Teriyaki sauce", "skafferi", {
...veg,
allergens: ["soy", "gluten"],
containsGluten: true,
defaultUnit: "TABLESPOON",
densityGPerMl: 1.2,
n: { kcal: 130, p: 4, k: 28, f: 0, s: 22, salt: 8 },
shelfLifeGuidance: { pantry: 365, fridge: 60 },
defaultPriceMinorPerKg: 10000,
}),
ing("taco_spice", "Tacokrydda", "Taco seasoning", "kryddor", {
...veg,
densityGPerMl: 0.5,
n: { kcal: 280, p: 8, k: 45, f: 6, fib: 12, salt: 18 },
shelfLifeGuidance: { pantry: 730 },
defaultPriceMinorPerKg: 25000,
}),
ing("salsa", "Salsa (burk)", "Salsa", "konserver", {
...veg,
densityGPerMl: 1.0,
n: { kcal: 45, p: 1.5, k: 8, f: 0.3, fib: 1.5, s: 6, salt: 1.5 },
shelfLifeGuidance: { pantry: 365, fridge: 7 },
defaultPriceMinorPerKg: 4500,
}),
ing("sesame_seeds", "Sesamfrön", "Sesame seeds", "skafferi", {
...veg,
allergens: ["sesame"],
defaultUnit: "TABLESPOON",
densityGPerMl: 0.6,
n: { kcal: 570, p: 18, k: 12, f: 50, mf: 7, fib: 12 },
shelfLifeGuidance: { pantry: 365 },
defaultPriceMinorPerKg: 12000,
}),
// --- Kryddor & bas ---
ing("salt", "Salt", "Salt", "kryddor", {
...veg,
defaultUnit: "TEASPOON",
densityGPerMl: 1.2,
n: { kcal: 0, p: 0, k: 0, f: 0, salt: 100 },
shelfLifeGuidance: { pantry: 3650 },
defaultPriceMinorPerKg: 1500,
}),
ing("black_pepper", "Svartpeppar", "Black pepper", "kryddor", {
...veg,
defaultUnit: "MILLILITER",
densityGPerMl: 0.5,
n: { kcal: 250, p: 10, k: 44, f: 3.3, fib: 25 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 30000,
aliases: ["peppar"],
}),
ing("paprika_powder", "Paprikapulver", "Paprika powder", "kryddor", {
...veg,
defaultUnit: "TEASPOON",
densityGPerMl: 0.45,
n: { kcal: 280, p: 14, k: 34, f: 13, fib: 35 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 25000,
}),
ing("cumin", "Spiskummin", "Cumin", "kryddor", {
...veg,
defaultUnit: "TEASPOON",
densityGPerMl: 0.5,
n: { kcal: 375, p: 18, k: 44, f: 22, fib: 10 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 30000,
}),
ing("chili_flakes", "Chiliflakes", "Chili flakes", "kryddor", {
...veg,
defaultUnit: "MILLILITER",
densityGPerMl: 0.4,
n: { kcal: 320, p: 12, k: 50, f: 17, fib: 27 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 35000,
}),
ing("oregano_dried", "Oregano (torkad)", "Dried oregano", "kryddor", {
...veg,
defaultUnit: "TEASPOON",
densityGPerMl: 0.3,
n: { kcal: 265, p: 9, k: 69, f: 4.3, fib: 42 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 40000,
}),
ing("thyme_dried", "Timjan (torkad)", "Dried thyme", "kryddor", {
...veg,
defaultUnit: "TEASPOON",
densityGPerMl: 0.3,
n: { kcal: 276, p: 9, k: 64, f: 7.4, fib: 37 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 40000,
}),
ing("curry_powder", "Currypulver", "Curry powder", "kryddor", {
...veg,
defaultUnit: "TEASPOON",
densityGPerMl: 0.45,
n: { kcal: 325, p: 14, k: 25, f: 14, fib: 33 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 30000,
}),
ing("garam_masala", "Garam masala", "Garam masala", "kryddor", {
...veg,
defaultUnit: "TEASPOON",
densityGPerMl: 0.45,
n: { kcal: 380, p: 15, k: 45, f: 15, fib: 25 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 35000,
}),
ing("turmeric", "Gurkmeja", "Turmeric", "kryddor", {
...veg,
defaultUnit: "TEASPOON",
densityGPerMl: 0.5,
n: { kcal: 350, p: 8, k: 65, f: 10, fib: 21 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 25000,
}),
ing("cinnamon", "Kanel", "Cinnamon", "kryddor", {
...veg,
defaultUnit: "TEASPOON",
densityGPerMl: 0.55,
n: { kcal: 250, p: 4, k: 80, f: 1.2, fib: 53 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 25000,
}),
ing("allspice", "Kryddpeppar", "Allspice", "kryddor", {
...veg,
defaultUnit: "MILLILITER",
densityGPerMl: 0.5,
n: { kcal: 263, p: 6, k: 72, f: 8.7, fib: 22 },
shelfLifeGuidance: { pantry: 1095 },
defaultPriceMinorPerKg: 35000,
}),
ing("saffron", "Saffran", "Saffron", "krydda", { n: { kcal: 310, p: 11, k: 65, f: 6 }, isVegan: true, isVegetarian: true }),
ing("yeast_fresh", "Jäst", "Fresh yeast", "skafferi", { n: { kcal: 105, p: 9, k: 19, f: 2 }, isVegan: true, isVegetarian: true }),
ing("cooked_ham", "Kokt skinka (julskinka)", "Cooked ham", "chark", { n: { kcal: 145, p: 18, k: 1, f: 8, mf: 3, salt: 2 }, isPork: true }),
ing("crayfish", "Kräftor", "Crayfish", "skaldjur", { n: { kcal: 77, p: 16, k: 0, f: 1 }, allergens: ["crustaceans"] }),
ing("cardamom", "Kardemumma", "Cardamom", "krydda", { n: { kcal: 311, p: 11, k: 68, f: 7 }, isVegan: true, isVegetarian: true }),
ing("almond_paste", "Mandelmassa", "Almond paste", "bakning", { n: { kcal: 430, p: 9, k: 45, f: 24, s: 40 }, allergens: ["tree_nuts"], isVegetarian: true }),
ing("red_cabbage", "Rödkål", "Red cabbage", "gronsaker", { n: { kcal: 31, p: 1.4, k: 7, f: 0.2, fib: 2 }, isVegan: true, isVegetarian: true }),
ing("lingonberry_jam", "Lingonsylt", "Lingonberry jam", "skafferi", { n: { kcal: 200, p: 0.3, k: 49, f: 0.2, s: 45 }, isVegan: true, isVegetarian: true }),
ing("prinskorv", "Prinskorv", "Cocktail sausage", "chark", { n: { kcal: 280, p: 11, k: 3, f: 25, mf: 9, salt: 2 }, isPork: true }),
ing("rye_flour", "Rågmjöl", "Rye flour", "skafferi", { n: { kcal: 325, p: 9, k: 60, f: 2, fib: 14 }, containsGluten: true, allergens: ["gluten"], isVegan: true, isVegetarian: true }),
ing("grape", "Vindruvor", "Grapes", "frukt", { n: { kcal: 69, p: 0.7, k: 18, f: 0.2, fib: 0.9, s: 15 }, isVegan: true, isVegetarian: true, aliases: ["druvor", "vindruva", "roda druvor", "röda druvor", "grona druvor", "gröna druvor", "drue druvor", "drue", "grapes"] }),
ing("beetroot", "Rödbetor", "Beetroot", "gronsaker", { n: { kcal: 43, p: 1.6, k: 10, f: 0.2, fib: 2.8, s: 7 }, isVegan: true, isVegetarian: true, aliases: ["rödbeta", "rodbeta", "rödbetor", "rodbetor", "inlagda rödbetor", "inlagda rodbetor", "skivad rödbeta", "skivade rödbetor", "beetroot", "beets", "red beets"] }),
ing("pea_shoots", "Ärtskott", "Pea shoots", "gronsaker", { n: { kcal: 42, p: 4, k: 4, f: 0.5, fib: 2 }, isVegan: true, isVegetarian: true, aliases: ["ärtskott", "artskott", "ertskott", "artiskott", "pea shoots"] })
];
export const SEED_INGREDIENT_IDS = new Set(SEED_INGREDIENTS.map((i) => i.id));