From 38c882e743941395ed71fb751c1683f8fee5ec80 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 19 Aug 2026 21:38:30 +0000 Subject: [PATCH] feat(katalog): utoka ingredienskatalogen 145 -> 362 (bred tackning) 217 nya vanliga svenska livsmedel med standardiserade schablonvarden per 100 g (seed_estimate): mejeri/ostar, kott & fagel (styckdetaljer, farser, korv), chark, fisk & skaldjur, mycket gronsaker/frukt/bar, baljvaxter, spannmal/pasta, brod, bakning, notter/fron, oljor/vinager/saser, torkade kryddor samt dryck. Ratt enhet + densitet/styckvikt, korrekta allergener och kost-/religionsflaggor. Verifierat: seed gron (362), typecheck gron, Atwater-rimlighetskoll (avvikelser bara dar fiber/syror forklarar dem). --- .../src/seed/data/ingredients-extra.ts | 1866 +++++++++++++++++ .../database/src/seed/data/ingredients.ts | 3 + 2 files changed, 1869 insertions(+) create mode 100644 packages/database/src/seed/data/ingredients-extra.ts diff --git a/packages/database/src/seed/data/ingredients-extra.ts b/packages/database/src/seed/data/ingredients-extra.ts new file mode 100644 index 0000000..64799da --- /dev/null +++ b/packages/database/src/seed/data/ingredients-extra.ts @@ -0,0 +1,1866 @@ +import type { Allergen, NutritionDeclaration, NutritionProvenance } from "@app/shared-types"; +import type { SeedIngredient } from "./ingredients.js"; + +/** + * Seed: BRED utökning av ingredienskatalogen (spec §21) – vanliga svenska + * livsmedel så att "allt finns i appen". Samma schablon-princip som + * ingredients.ts: värdena är standardiserade uppskattningar per 100 g + * ("seed_estimate", confidence 0.7). Produktionsvägen byter provenance till + * "livsmedelsverket" via connectorn. AI hittar ALDRIG på näringsvärden – + * detta är etablerade referensvärden, inte gissningar. + * + * Egen (identisk) fabrik här för att undvika import-cykel med ingredients.ts; + * bara TYPEN SeedIngredient importeras (raderas vid kompilering). + */ + +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 }; +/** Typad allergenlista så att literalerna checkas mot Allergen-unionen. */ +const A = (...xs: Allergen[]): Allergen[] => xs; + +export const EXTRA_INGREDIENTS: SeedIngredient[] = [ + // =================================================================== + // MEJERI & växtdryck + // =================================================================== + ing("sour_cream", "Gräddfil 12 %", "Sour cream", "mejeri", { + ...vgt, + defaultUnit: "DECILITER", + densityGPerMl: 1.01, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 123, p: 2.9, k: 3.8, f: 12, mf: 8, s: 3.8, salt: 0.1 }, + shelfLifeGuidance: { fridge: 14 }, + defaultPriceMinorPerKg: 3000, + aliases: ["gräddfil", "graddfil", "gräddfil 12"], + }), + ing("filmjolk", "Filmjölk 3 %", "Fermented milk (filmjölk)", "mejeri", { + ...vgt, + defaultUnit: "DECILITER", + densityGPerMl: 1.03, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 56, p: 3.3, k: 4.3, f: 3, mf: 2, s: 4.3, salt: 0.1 }, + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 1600, + aliases: ["filmjölk", "filmjolk", "fil"], + }), + ing("skyr", "Skyr naturell", "Skyr", "mejeri", { + ...vgt, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 63, p: 11, k: 4, f: 0.2, mf: 0.1, s: 4, salt: 0.1 }, + shelfLifeGuidance: { fridge: 14 }, + defaultPriceMinorPerKg: 4200, + aliases: ["skyr"], + }), + ing("mozzarella", "Mozzarella", "Mozzarella", "mejeri", { + ...vgt, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 250, p: 18, k: 3, f: 19, mf: 12, s: 1, salt: 0.6 }, + shelfLifeGuidance: { fridge: 14 }, + defaultPriceMinorPerKg: 8000, + aliases: ["mozzarella", "mozarella", "buffelmozzarella"], + }), + ing("parmesan", "Parmesan", "Parmesan", "mejeri", { + ...vgt, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 402, p: 36, k: 0, f: 29, mf: 19, s: 0, salt: 1.6 }, + shelfLifeGuidance: { fridge: 60 }, + defaultPriceMinorPerKg: 18000, + aliases: ["parmesan", "parmigiano", "parmigiano reggiano", "grana padano"], + }), + ing("cream_cheese", "Färskost naturell", "Cream cheese", "mejeri", { + ...vgt, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 253, p: 5.5, k: 4, f: 24, mf: 15, s: 3.5, salt: 0.9 }, + shelfLifeGuidance: { fridge: 21 }, + defaultPriceMinorPerKg: 8000, + aliases: ["färskost", "farskost", "philadelphia", "cream cheese"], + }), + ing("cheddar", "Cheddarost", "Cheddar", "mejeri", { + ...vgt, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 410, p: 25, k: 1.3, f: 34, mf: 21, s: 0.5, salt: 1.8 }, + shelfLifeGuidance: { fridge: 45 }, + defaultPriceMinorPerKg: 11000, + aliases: ["cheddar", "cheddarost"], + }), + ing("brie", "Brieost", "Brie", "mejeri", { + ...vgt, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 334, p: 20, k: 0.5, f: 28, mf: 18, s: 0.5, salt: 1.6 }, + shelfLifeGuidance: { fridge: 21 }, + defaultPriceMinorPerKg: 12000, + aliases: ["brie", "brieost", "vitmögelost", "camembert"], + }), + ing("mascarpone", "Mascarpone", "Mascarpone", "mejeri", { + ...vgt, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 429, p: 4.6, k: 4.8, f: 44, mf: 30, s: 3, salt: 0.1 }, + shelfLifeGuidance: { fridge: 14 }, + defaultPriceMinorPerKg: 9000, + aliases: ["mascarpone"], + }), + ing("ricotta", "Ricotta", "Ricotta", "mejeri", { + ...vgt, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 174, p: 11, k: 3, f: 13, mf: 8, s: 0.3, salt: 0.3 }, + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 7000, + aliases: ["ricotta"], + }), + ing("blue_cheese", "Ädelost", "Blue cheese", "mejeri", { + ...vgt, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 353, p: 21, k: 2.3, f: 29, mf: 19, s: 0.5, salt: 3.5 }, + shelfLifeGuidance: { fridge: 30 }, + defaultPriceMinorPerKg: 12000, + aliases: ["ädelost", "adelost", "blåmögelost", "gorgonzola", "roquefort"], + }), + ing("gouda", "Gouda", "Gouda", "mejeri", { + ...vgt, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 356, p: 25, k: 2.2, f: 27, mf: 18, s: 0.5, salt: 2 }, + shelfLifeGuidance: { fridge: 45 }, + defaultPriceMinorPerKg: 9000, + aliases: ["gouda", "goudaost", "grevé", "greve"], + }), + ing("margarine", "Margarin", "Margarine", "mejeri", { + ...veg, + n: { kcal: 631, p: 0.2, k: 0.7, f: 70, mf: 18, s: 0.5, salt: 1.1 }, + shelfLifeGuidance: { fridge: 60 }, + defaultPriceMinorPerKg: 3500, + aliases: ["margarin", "matfett"], + }), + ing("ghee", "Ghee (klarnat smör)", "Ghee", "mejeri", { + ...vgt, + allergens: A("milk"), + n: { kcal: 897, p: 0, k: 0, f: 100, mf: 62, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 12000, + aliases: ["ghee", "klarnat smör", "klarnat smor"], + }), + ing("buttermilk", "Kärnmjölk", "Buttermilk", "mejeri", { + ...vgt, + defaultUnit: "DECILITER", + densityGPerMl: 1.03, + allergens: A("milk"), + containsLactose: true, + n: { kcal: 40, p: 3.3, k: 4.7, f: 0.9, mf: 0.6, s: 4.7, salt: 0.1 }, + shelfLifeGuidance: { fridge: 10 }, + aliases: ["kärnmjölk", "karnmjolk"], + }), + ing("vanilla_ice_cream", "Vaniljglass", "Vanilla ice cream", "mejeri", { + ...vgt, + allergens: A("milk", "eggs"), + containsLactose: true, + n: { kcal: 207, p: 3.5, k: 24, f: 11, mf: 7, s: 21, salt: 0.1 }, + shelfLifeGuidance: { freezer: 365 }, + defaultPriceMinorPerKg: 4000, + aliases: ["glass", "vaniljglass", "gräddglass"], + }), + ing("soy_milk", "Sojadryck", "Soy drink", "mejeri", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.03, + allergens: A("soy"), + n: { kcal: 42, p: 3.3, k: 2.5, f: 1.8, mf: 0.3, s: 2.5, salt: 0.1 }, + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 2200, + aliases: ["sojamjölk", "sojamjolk", "sojadryck", "soymilk"], + }), + ing("almond_milk", "Mandeldryck", "Almond drink", "mejeri", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1, + allergens: A("tree_nuts"), + n: { kcal: 22, p: 0.5, k: 3, f: 1.1, mf: 0.1, s: 2, salt: 0.1 }, + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 2500, + aliases: ["mandelmjölk", "mandelmjolk", "mandeldryck", "almond milk"], + }), + + // =================================================================== + // KÖTT & FÅGEL + // =================================================================== + ing("whole_chicken", "Kyckling (hel)", "Whole chicken", "kott_fagel", { + n: { kcal: 167, p: 20, k: 0, f: 9, mf: 2.6, salt: 0.2 }, + shelfLifeGuidance: { fridge: 3, freezer: 300 }, + defaultPriceMinorPerKg: 7000, + aliases: ["hel kyckling", "kyckling", "grillkyckling"], + }), + ing("chicken_drumstick", "Kycklingklubba", "Chicken drumstick", "kott_fagel", { + n: { kcal: 161, p: 18, k: 0, f: 9.5, mf: 2.6, salt: 0.2 }, + shelfLifeGuidance: { fridge: 3, freezer: 270 }, + defaultPriceMinorPerKg: 6000, + aliases: ["kycklingklubba", "kycklingben", "klubba"], + }), + ing("chicken_wings", "Kycklingvingar", "Chicken wings", "kott_fagel", { + n: { kcal: 203, p: 18, k: 0, f: 14, mf: 4, salt: 0.2 }, + shelfLifeGuidance: { fridge: 3, freezer: 270 }, + defaultPriceMinorPerKg: 6000, + aliases: ["kycklingvingar", "vingar", "buffalo wings"], + }), + ing("chicken_mince", "Kycklingfärs", "Chicken mince", "kott_fagel", { + n: { kcal: 143, p: 20, k: 0, f: 7, mf: 2, salt: 0.15 }, + shelfLifeGuidance: { fridge: 2, freezer: 180 }, + defaultPriceMinorPerKg: 9000, + aliases: ["kycklingfärs", "kycklingfars"], + }), + ing("pork_chop", "Fläskkotlett", "Pork chop", "kott_fagel", { + isPork: true, + n: { kcal: 172, p: 21, k: 0, f: 9, mf: 3.2, salt: 0.1 }, + shelfLifeGuidance: { fridge: 4, freezer: 240 }, + defaultPriceMinorPerKg: 8000, + aliases: ["fläskkotlett", "flaskkotlett", "kotlett"], + }), + ing("pork_tenderloin", "Fläskfilé", "Pork tenderloin", "kott_fagel", { + isPork: true, + n: { kcal: 120, p: 21, k: 0, f: 4, mf: 1.3, salt: 0.1 }, + shelfLifeGuidance: { fridge: 4, freezer: 240 }, + defaultPriceMinorPerKg: 12000, + aliases: ["fläskfilé", "flaskfile", "fläskfile"], + }), + ing("pork_belly", "Sidfläsk", "Pork belly", "kott_fagel", { + isPork: true, + n: { kcal: 291, p: 15, k: 0, f: 26, mf: 9.5, salt: 0.3 }, + shelfLifeGuidance: { fridge: 4, freezer: 180 }, + defaultPriceMinorPerKg: 8000, + aliases: ["sidfläsk", "sidflask", "fläsksida"], + }), + ing("minced_pork", "Fläskfärs", "Pork mince", "kott_fagel", { + isPork: true, + n: { kcal: 244, p: 17, k: 0, f: 20, mf: 7, salt: 0.1 }, + shelfLifeGuidance: { fridge: 2, freezer: 180 }, + defaultPriceMinorPerKg: 7000, + aliases: ["fläskfärs", "flaskfars"], + }), + ing("minced_beef_20", "Nötfärs 20 %", "Minced beef (20%)", "kott_fagel", { + isBeef: true, + n: { kcal: 254, p: 17, k: 0, f: 20, mf: 8.5, salt: 0.1 }, + shelfLifeGuidance: { fridge: 2, freezer: 180 }, + defaultPriceMinorPerKg: 9000, + aliases: ["nötfärs 20", "notfars 20", "fet nötfärs"], + }), + ing("entrecote", "Entrecôte (nöt)", "Ribeye steak", "kott_fagel", { + isBeef: true, + n: { kcal: 224, p: 20, k: 0, f: 16, mf: 6.5, salt: 0.1 }, + shelfLifeGuidance: { fridge: 4, freezer: 240 }, + defaultPriceMinorPerKg: 25000, + aliases: ["entrecote", "entrecôte", "ribeye", "ryggbiff"], + }), + ing("beef_tenderloin", "Oxfilé", "Beef tenderloin", "kott_fagel", { + isBeef: true, + n: { kcal: 130, p: 22, k: 0, f: 4.5, mf: 1.8, salt: 0.1 }, + shelfLifeGuidance: { fridge: 4, freezer: 240 }, + defaultPriceMinorPerKg: 40000, + aliases: ["oxfilé", "oxfile", "biff", "nötfilé"], + }), + ing("beef_stew_meat", "Grytbitar av nöt (högrev)", "Beef stew meat", "kott_fagel", { + isBeef: true, + n: { kcal: 182, p: 20, k: 0, f: 11, mf: 4.5, salt: 0.1 }, + shelfLifeGuidance: { fridge: 4, freezer: 240 }, + defaultPriceMinorPerKg: 11000, + aliases: ["högrev", "hogrev", "grytbitar", "bog", "grytkött"], + }), + ing("roast_beef_cold", "Rostbiff (pålägg)", "Roast beef (deli)", "kott_fagel", { + isBeef: true, + n: { kcal: 140, p: 25, k: 0, f: 4.5, mf: 1.7, salt: 0.7 }, + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 18000, + aliases: ["rostbiff", "roast beef"], + }), + ing("lamb_mince", "Lammfärs", "Lamb mince", "kott_fagel", { + n: { kcal: 282, p: 17, k: 0, f: 24, mf: 11, salt: 0.15 }, + shelfLifeGuidance: { fridge: 2, freezer: 180 }, + defaultPriceMinorPerKg: 13000, + aliases: ["lammfärs", "lammfars"], + }), + ing("lamb_chop", "Lammkotlett", "Lamb chop", "kott_fagel", { + n: { kcal: 240, p: 18, k: 0, f: 19, mf: 8, salt: 0.15 }, + shelfLifeGuidance: { fridge: 4, freezer: 240 }, + defaultPriceMinorPerKg: 20000, + aliases: ["lammkotlett", "lammracks", "lammrack"], + }), + ing("lamb_fillet", "Lammstek/lammfilé", "Lamb fillet", "kott_fagel", { + n: { kcal: 150, p: 20, k: 0, f: 8, mf: 3.5, salt: 0.15 }, + shelfLifeGuidance: { fridge: 4, freezer: 240 }, + defaultPriceMinorPerKg: 22000, + aliases: ["lammstek", "lammfilé", "lammfile", "lammytterfilé"], + }), + ing("duck_breast", "Ankbröstfilé", "Duck breast", "kott_fagel", { + n: { kcal: 200, p: 18, k: 0, f: 14, mf: 5, salt: 0.2 }, + shelfLifeGuidance: { fridge: 4, freezer: 240 }, + defaultPriceMinorPerKg: 20000, + aliases: ["anka", "ankbröst", "ankbrost", "ankbröstfilé"], + }), + ing("turkey_mince", "Kalkonfärs", "Turkey mince", "kott_fagel", { + n: { kcal: 149, p: 21, k: 0, f: 7, mf: 2, salt: 0.15 }, + shelfLifeGuidance: { fridge: 2, freezer: 180 }, + defaultPriceMinorPerKg: 10000, + aliases: ["kalkonfärs", "kalkonfars"], + }), + ing("blood_pudding", "Blodpudding", "Blood pudding", "kott_fagel", { + isPork: true, + allergens: A("gluten", "milk"), + containsGluten: true, + containsLactose: true, + n: { kcal: 165, p: 8, k: 20, f: 6, mf: 2.5, fib: 2, s: 3, salt: 1.1 }, + shelfLifeGuidance: { fridge: 10, freezer: 180 }, + defaultPriceMinorPerKg: 3500, + aliases: ["blodpudding", "blodkorv"], + }), + ing("kassler", "Kassler", "Kassler (smoked pork loin)", "kott_fagel", { + isPork: true, + n: { kcal: 130, p: 21, k: 0.5, f: 5, mf: 1.8, salt: 2.2 }, + shelfLifeGuidance: { fridge: 10, freezer: 180 }, + defaultPriceMinorPerKg: 9000, + aliases: ["kassler", "rökt fläskkarré"], + }), + ing("grill_sausage", "Grillkorv", "Grilling sausage", "kott_fagel", { + isPork: true, + n: { kcal: 250, p: 11, k: 5, f: 21, mf: 8, s: 1.5, salt: 1.8 }, + shelfLifeGuidance: { fridge: 12, freezer: 120 }, + defaultPriceMinorPerKg: 5000, + aliases: ["grillkorv", "korv", "bratwurst", "salsiccia"], + }), + ing("hot_dog_sausage", "Varmkorv/wienerkorv", "Hot dog sausage", "kott_fagel", { + isPork: true, + n: { kcal: 240, p: 10, k: 4, f: 21, mf: 8, s: 1, salt: 1.9 }, + shelfLifeGuidance: { fridge: 14, freezer: 120 }, + defaultPriceMinorPerKg: 4000, + aliases: ["varmkorv", "wienerkorv", "korv", "frankfurter"], + }), + ing("chorizo_sausage", "Chorizo (färsk korv)", "Chorizo sausage", "kott_fagel", { + isPork: true, + n: { kcal: 348, p: 21, k: 2, f: 28, mf: 11, s: 1, salt: 2.5 }, + shelfLifeGuidance: { fridge: 14, freezer: 120 }, + defaultPriceMinorPerKg: 9000, + aliases: ["chorizo"], + }), + + // =================================================================== + // CHARK (pålägg) + // =================================================================== + ing("salami", "Salami", "Salami", "chark", { + isPork: true, + n: { kcal: 378, p: 21, k: 1.5, f: 32, mf: 12, s: 1, salt: 4 }, + shelfLifeGuidance: { fridge: 21 }, + defaultPriceMinorPerKg: 14000, + aliases: ["salami", "medwurst", "medvurst"], + }), + ing("prosciutto", "Lufttorkad skinka", "Prosciutto", "chark", { + isPork: true, + n: { kcal: 250, p: 27, k: 0.3, f: 16, mf: 5.5, salt: 5 }, + shelfLifeGuidance: { fridge: 21 }, + defaultPriceMinorPerKg: 22000, + aliases: ["parmaskinka", "prosciutto", "lufttorkad skinka", "serranoskinka"], + }), + ing("liver_pate", "Leverpastej", "Liver pâté", "chark", { + isPork: true, + allergens: A("gluten", "milk"), + containsGluten: true, + containsLactose: true, + n: { kcal: 300, p: 12, k: 5, f: 26, mf: 9, s: 1, salt: 1.4 }, + shelfLifeGuidance: { fridge: 14 }, + defaultPriceMinorPerKg: 5000, + aliases: ["leverpastej", "pastej"], + }), + ing("deli_ham", "Skinka (pålägg)", "Sliced ham", "chark", { + isPork: true, + n: { kcal: 110, p: 18, k: 1, f: 4, mf: 1.4, salt: 2.2 }, + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 10000, + aliases: ["skinka", "skinkpålägg", "rökt skinka", "kokt skinka pålägg"], + }), + + // =================================================================== + // FISK + // =================================================================== + ing("pollock", "Sej", "Pollock", "fisk", { + allergens: A("fish"), + n: { kcal: 92, p: 19, k: 0, f: 1, mf: 0.2, salt: 0.2 }, + shelfLifeGuidance: { fridge: 2, freezer: 180 }, + defaultPriceMinorPerKg: 9000, + aliases: ["sej", "gråsej"], + }), + ing("haddock", "Kolja", "Haddock", "fisk", { + allergens: A("fish"), + n: { kcal: 80, p: 18, k: 0, f: 0.6, mf: 0.1, salt: 0.2 }, + shelfLifeGuidance: { fridge: 2, freezer: 180 }, + defaultPriceMinorPerKg: 12000, + aliases: ["kolja"], + }), + ing("plaice", "Rödspätta", "Plaice", "fisk", { + allergens: A("fish"), + n: { kcal: 86, p: 17, k: 0, f: 1.5, mf: 0.3, salt: 0.3 }, + shelfLifeGuidance: { fridge: 2, freezer: 180 }, + defaultPriceMinorPerKg: 13000, + aliases: ["rödspätta", "rodspatta", "spätta", "flundra"], + }), + ing("pike_perch", "Gös", "Pike-perch", "fisk", { + allergens: A("fish"), + n: { kcal: 83, p: 19, k: 0, f: 0.7, mf: 0.1, salt: 0.1 }, + shelfLifeGuidance: { fridge: 2, freezer: 180 }, + defaultPriceMinorPerKg: 20000, + aliases: ["gös", "gos"], + }), + ing("mackerel", "Makrill", "Mackerel", "fisk", { + allergens: A("fish"), + n: { kcal: 205, p: 19, k: 0, f: 14, mf: 3.3, salt: 0.3 }, + shelfLifeGuidance: { fridge: 2, freezer: 120 }, + defaultPriceMinorPerKg: 10000, + aliases: ["makrill"], + }), + ing("herring_fresh", "Sill/strömming (färsk)", "Fresh herring", "fisk", { + allergens: A("fish"), + n: { kcal: 158, p: 18, k: 0, f: 9, mf: 2, salt: 0.2 }, + shelfLifeGuidance: { fridge: 2, freezer: 120 }, + defaultPriceMinorPerKg: 8000, + aliases: ["sill", "strömming", "stromming", "färsk sill"], + }), + ing("rainbow_trout", "Regnbågslax/öring", "Rainbow trout", "fisk", { + allergens: A("fish"), + n: { kcal: 141, p: 20, k: 0, f: 6, mf: 1.5, salt: 0.1 }, + shelfLifeGuidance: { fridge: 2, freezer: 180 }, + defaultPriceMinorPerKg: 13000, + aliases: ["regnbågslax", "öring", "oring", "regnbågsöring", "forell"], + }), + ing("smoked_salmon", "Rökt lax", "Smoked salmon", "fisk", { + allergens: A("fish"), + n: { kcal: 180, p: 22, k: 0, f: 10, mf: 2, salt: 3 }, + shelfLifeGuidance: { fridge: 14 }, + defaultPriceMinorPerKg: 24000, + aliases: ["rökt lax", "rokt lax"], + }), + ing("cured_salmon", "Gravad lax", "Cured salmon", "fisk", { + allergens: A("fish"), + n: { kcal: 200, p: 20, k: 3, f: 12, mf: 2.5, s: 3, salt: 3.5 }, + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 24000, + aliases: ["gravad lax", "gravlax"], + }), + ing("fish_fingers", "Fiskpinnar", "Fish fingers", "fisk", { + allergens: A("fish", "gluten"), + containsGluten: true, + n: { kcal: 200, p: 12, k: 18, f: 9, mf: 1.2, fib: 1, s: 1, salt: 0.9 }, + shelfLifeGuidance: { freezer: 300 }, + defaultPriceMinorPerKg: 8000, + aliases: ["fiskpinnar", "fiskpinne"], + }), + ing("cod_roe_tube", "Kaviar (tub)", "Cod roe spread", "fisk", { + allergens: A("fish"), + n: { kcal: 240, p: 13, k: 8, f: 17, mf: 3, s: 4, salt: 4.5 }, + shelfLifeGuidance: { fridge: 30 }, + defaultPriceMinorPerKg: 12000, + aliases: ["kaviar", "kalles kaviar", "smörgåskaviar"], + }), + ing("sardines_canned", "Sardiner (burk)", "Canned sardines", "fisk", { + allergens: A("fish"), + n: { kcal: 208, p: 25, k: 0, f: 11, mf: 2.5, salt: 1 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 9000, + aliases: ["sardiner"], + }), + ing("mackerel_tomato", "Makrill i tomatsås", "Mackerel in tomato", "fisk", { + allergens: A("fish"), + n: { kcal: 185, p: 14, k: 5, f: 12, mf: 2.5, s: 4, salt: 1 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 7000, + aliases: ["makrill i tomat", "makrill i tomatsås"], + }), + + // =================================================================== + // SKALDJUR + // =================================================================== + ing("crab", "Krabba (kokt)", "Crab", "skaldjur", { + allergens: A("crustaceans"), + n: { kcal: 107, p: 18, k: 0, f: 3.6, mf: 0.5, salt: 1.2 }, + shelfLifeGuidance: { fridge: 2 }, + defaultPriceMinorPerKg: 18000, + aliases: ["krabba", "krabbkött", "kungskrabba"], + }), + ing("mussels", "Blåmusslor", "Mussels", "skaldjur", { + allergens: A("molluscs"), + n: { kcal: 86, p: 12, k: 3.7, f: 2.2, mf: 0.4, salt: 0.5 }, + shelfLifeGuidance: { fridge: 2 }, + defaultPriceMinorPerKg: 6000, + aliases: ["blåmusslor", "blamusslor", "musslor"], + }), + ing("langoustine", "Havskräfta", "Langoustine", "skaldjur", { + allergens: A("crustaceans"), + n: { kcal: 90, p: 19, k: 0, f: 1.5, mf: 0.2, salt: 0.5 }, + shelfLifeGuidance: { fridge: 2 }, + defaultPriceMinorPerKg: 30000, + aliases: ["havskräfta", "havskrafta", "scampi", "kejsarhummer"], + }), + ing("scallops", "Pilgrimsmusslor", "Scallops", "skaldjur", { + allergens: A("molluscs"), + n: { kcal: 88, p: 17, k: 2.4, f: 0.8, mf: 0.1, salt: 0.6 }, + shelfLifeGuidance: { fridge: 2 }, + defaultPriceMinorPerKg: 32000, + aliases: ["pilgrimsmusslor", "pilgrimsmussla", "kammusslor"], + }), + ing("squid", "Bläckfisk (calamari)", "Squid", "skaldjur", { + allergens: A("molluscs"), + n: { kcal: 92, p: 16, k: 3, f: 1.4, mf: 0.4, salt: 0.4 }, + shelfLifeGuidance: { fridge: 2, freezer: 120 }, + defaultPriceMinorPerKg: 14000, + aliases: ["bläckfisk", "blackfisk", "calamari", "tioarmad bläckfisk"], + }), + + // =================================================================== + // GRÖNSAKER + // =================================================================== + ing("aubergine", "Aubergine", "Aubergine", "gronsaker", { + ...veg, + gramsPerPiece: 250, + n: { kcal: 25, p: 1, k: 3, f: 0.2, fib: 3, s: 3.5, salt: 0 }, + peakSeasons: ["summer", "autumn"], + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 4000, + aliases: ["aubergine", "äggplanta", "eggplant"], + }), + ing("fennel", "Fänkål", "Fennel", "gronsaker", { + ...veg, + gramsPerPiece: 230, + n: { kcal: 31, p: 1.2, k: 4.2, f: 0.2, fib: 3.1, s: 4, salt: 0.1 }, + peakSeasons: ["autumn"], + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 4500, + aliases: ["fänkål", "fankal"], + }), + ing("celery_stalk", "Stjälkselleri", "Celery", "gronsaker", { + ...veg, + allergens: A("celery"), + n: { kcal: 16, p: 0.7, k: 1.4, f: 0.2, fib: 1.6, s: 1.3, salt: 0.2 }, + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 3500, + aliases: ["stjälkselleri", "selleri", "blekselleri"], + }), + ing("celeriac", "Rotselleri", "Celeriac", "gronsaker", { + ...veg, + allergens: A("celery"), + n: { kcal: 42, p: 1.5, k: 6, f: 0.3, fib: 1.8, s: 1.6, salt: 0.1 }, + peakSeasons: ["autumn", "winter"], + shelfLifeGuidance: { fridge: 21 }, + defaultPriceMinorPerKg: 3000, + aliases: ["rotselleri", "sellerirot"], + }), + ing("parsnip", "Palsternacka", "Parsnip", "gronsaker", { + ...veg, + n: { kcal: 75, p: 1.2, k: 13, f: 0.3, fib: 4.9, s: 4.8, salt: 0 }, + peakSeasons: ["autumn", "winter"], + shelfLifeGuidance: { fridge: 21 }, + defaultPriceMinorPerKg: 3000, + aliases: ["palsternacka"], + }), + ing("swede", "Kålrot", "Swede", "gronsaker", { + ...veg, + n: { kcal: 37, p: 1.1, k: 6, f: 0.2, fib: 2.3, s: 4.5, salt: 0 }, + peakSeasons: ["autumn", "winter"], + shelfLifeGuidance: { fridge: 30 }, + defaultPriceMinorPerKg: 2000, + aliases: ["kålrot", "kalrot"], + }), + ing("butternut_squash", "Butternutpumpa", "Butternut squash", "gronsaker", { + ...veg, + n: { kcal: 45, p: 1, k: 9, f: 0.1, fib: 2, s: 2.2, salt: 0 }, + peakSeasons: ["autumn"], + shelfLifeGuidance: { pantry: 30 }, + defaultPriceMinorPerKg: 3000, + aliases: ["butternut", "butternutpumpa", "pumpa"], + }), + ing("pumpkin", "Pumpa", "Pumpkin", "gronsaker", { + ...veg, + n: { kcal: 26, p: 1, k: 5, f: 0.1, fib: 0.5, s: 2.8, salt: 0 }, + peakSeasons: ["autumn"], + shelfLifeGuidance: { pantry: 30 }, + defaultPriceMinorPerKg: 2500, + aliases: ["pumpa", "halloweenpumpa"], + }), + ing("brussels_sprouts", "Brysselkål", "Brussels sprouts", "gronsaker", { + ...veg, + n: { kcal: 43, p: 3.4, k: 5, f: 0.3, fib: 3.8, s: 2.2, salt: 0.1 }, + peakSeasons: ["autumn", "winter"], + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 4000, + aliases: ["brysselkål", "brysselkal"], + }), + ing("asparagus", "Sparris", "Asparagus", "gronsaker", { + ...veg, + n: { kcal: 20, p: 2.2, k: 2, f: 0.1, fib: 2.1, s: 1.9, salt: 0 }, + peakSeasons: ["spring"], + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 8000, + aliases: ["sparris", "grön sparris", "vit sparris"], + }), + ing("sugar_snap_peas", "Sockerärtor", "Sugar snap peas", "gronsaker", { + ...veg, + n: { kcal: 42, p: 2.8, k: 5, f: 0.2, fib: 2.6, s: 4, salt: 0 }, + peakSeasons: ["summer"], + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 6000, + aliases: ["sockerärtor", "sockerartor", "sockerärter", "snap peas"], + }), + ing("spring_onion", "Salladslök", "Spring onion", "gronsaker", { + ...veg, + n: { kcal: 32, p: 1.8, k: 5, f: 0.2, fib: 2.6, s: 2.3, salt: 0 }, + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 4000, + aliases: ["salladslök", "salladslok", "vårlök", "varlok", "knippelök", "scallion"], + }), + ing("shallot", "Schalottenlök", "Shallot", "gronsaker", { + ...veg, + n: { kcal: 72, p: 2.5, k: 15, f: 0.1, fib: 3.2, s: 7.9, salt: 0 }, + shelfLifeGuidance: { pantry: 30 }, + defaultPriceMinorPerKg: 5000, + aliases: ["schalottenlök", "schalottenlok", "bananschalottenlök"], + }), + ing("red_chili", "Röd chili (färsk)", "Red chili", "gronsaker", { + ...veg, + n: { kcal: 40, p: 1.9, k: 6, f: 0.4, fib: 1.5, s: 5, salt: 0 }, + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 12000, + aliases: ["röd chili", "rod chili", "chili", "chilifrukt", "spansk peppar"], + }), + ing("cherry_tomato", "Körsbärstomat", "Cherry tomato", "gronsaker", { + ...veg, + n: { kcal: 20, p: 0.9, k: 3, f: 0.2, fib: 1.2, s: 2.8, salt: 0 }, + peakSeasons: ["summer"], + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 5000, + aliases: ["körsbärstomat", "korsbarstomat", "körsbärstomater", "cocktailtomat"], + }), + ing("iceberg_lettuce", "Isbergssallad", "Iceberg lettuce", "gronsaker", { + ...veg, + gramsPerPiece: 400, + n: { kcal: 14, p: 0.9, k: 2, f: 0.1, fib: 1.2, s: 1.8, salt: 0 }, + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 3000, + aliases: ["isbergssallad", "isberg"], + }), + ing("arugula", "Ruccola", "Arugula", "gronsaker", { + ...veg, + n: { kcal: 25, p: 2.6, k: 2, f: 0.7, fib: 1.6, s: 2, salt: 0.1 }, + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 9000, + aliases: ["ruccola", "rucola", "rocket", "senapskål"], + }), + ing("radish", "Rädisor", "Radish", "gronsaker", { + ...veg, + n: { kcal: 16, p: 0.7, k: 2, f: 0.1, fib: 1.6, s: 1.9, salt: 0.1 }, + peakSeasons: ["spring", "summer"], + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 5000, + aliases: ["rädisor", "radisor", "rädisa"], + }), + ing("corn_cob", "Majskolv (färsk)", "Corn on the cob", "gronsaker", { + ...veg, + gramsPerPiece: 200, + n: { kcal: 86, p: 3.2, k: 15, f: 1.2, fib: 2.7, s: 3.2, salt: 0 }, + peakSeasons: ["summer", "autumn"], + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 4000, + aliases: ["majskolv", "färsk majs", "majs på kolv"], + }), + ing("chanterelle", "Kantareller", "Chanterelle", "gronsaker", { + ...veg, + n: { kcal: 38, p: 1.5, k: 3.8, f: 0.5, fib: 3.8, s: 1.2, salt: 0 }, + peakSeasons: ["summer", "autumn"], + shelfLifeGuidance: { fridge: 4 }, + defaultPriceMinorPerKg: 20000, + aliases: ["kantareller", "kantarell", "gul kantarell"], + }), + ing("porcini", "Karljohansvamp", "Porcini", "gronsaker", { + ...veg, + n: { kcal: 34, p: 3, k: 3, f: 0.4, fib: 2.5, s: 1.5, salt: 0 }, + peakSeasons: ["autumn"], + shelfLifeGuidance: { fridge: 4 }, + defaultPriceMinorPerKg: 22000, + aliases: ["karljohansvamp", "karljohan", "stensopp", "porcini"], + }), + ing("coriander_fresh", "Koriander (färsk)", "Fresh coriander", "gronsaker", { + ...veg, + n: { kcal: 23, p: 2.1, k: 0.9, f: 0.5, fib: 2.8, s: 0.9, salt: 0.05 }, + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 12000, + aliases: ["koriander", "färsk koriander", "cilantro"], + }), + ing("mint_fresh", "Mynta (färsk)", "Fresh mint", "gronsaker", { + ...veg, + n: { kcal: 44, p: 3.3, k: 6, f: 0.7, fib: 8, s: 0, salt: 0 }, + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 14000, + aliases: ["mynta", "färsk mynta", "pepparmynta"], + }), + ing("chives", "Gräslök", "Chives", "gronsaker", { + ...veg, + n: { kcal: 30, p: 3.3, k: 1.8, f: 0.7, fib: 2.5, s: 1.9, salt: 0 }, + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 12000, + aliases: ["gräslök", "graslok"], + }), + ing("rosemary_fresh", "Rosmarin (färsk)", "Fresh rosemary", "gronsaker", { + ...veg, + n: { kcal: 131, p: 3.3, k: 21, f: 5.9, fib: 14, s: 0, salt: 0.1 }, + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 16000, + aliases: ["rosmarin", "färsk rosmarin"], + }), + ing("thyme_fresh", "Timjan (färsk)", "Fresh thyme", "gronsaker", { + ...veg, + n: { kcal: 101, p: 5.6, k: 24, f: 1.7, fib: 14, s: 0, salt: 0.1 }, + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 16000, + aliases: ["timjan", "färsk timjan"], + }), + ing("horseradish", "Pepparrot (färsk)", "Horseradish", "gronsaker", { + ...veg, + n: { kcal: 48, p: 1.2, k: 11, f: 0.7, fib: 3.3, s: 8, salt: 0.3 }, + shelfLifeGuidance: { fridge: 21 }, + defaultPriceMinorPerKg: 8000, + aliases: ["pepparrot", "riven pepparrot"], + }), + ing("pak_choi", "Pak choi", "Pak choi", "gronsaker", { + ...veg, + n: { kcal: 13, p: 1.5, k: 1.2, f: 0.2, fib: 1, s: 1.2, salt: 0.1 }, + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 5000, + aliases: ["pak choi", "bok choy", "kinesisk senapskål"], + }), + ing("bean_sprouts", "Böngroddar", "Bean sprouts", "gronsaker", { + ...veg, + n: { kcal: 30, p: 3, k: 4, f: 0.2, fib: 1.8, s: 2.6, salt: 0 }, + shelfLifeGuidance: { fridge: 4 }, + defaultPriceMinorPerKg: 6000, + aliases: ["böngroddar", "bongroddar", "groddar", "mungbönsgroddar"], + }), + + // =================================================================== + // FRUKT & BÄR + // =================================================================== + ing("mango", "Mango", "Mango", "frukt", { + ...veg, + gramsPerPiece: 200, + n: { kcal: 60, p: 0.8, k: 14, f: 0.4, fib: 1.6, s: 14, salt: 0 }, + shelfLifeGuidance: { fridge: 7, pantry: 4 }, + defaultPriceMinorPerKg: 4000, + aliases: ["mango"], + }), + ing("pineapple", "Ananas", "Pineapple", "frukt", { + ...veg, + n: { kcal: 50, p: 0.5, k: 12, f: 0.1, fib: 1.4, s: 10, salt: 0 }, + shelfLifeGuidance: { fridge: 5, pantry: 3 }, + defaultPriceMinorPerKg: 2500, + aliases: ["ananas", "färsk ananas"], + }), + ing("kiwi", "Kiwi", "Kiwi", "frukt", { + ...veg, + gramsPerPiece: 75, + n: { kcal: 61, p: 1.1, k: 12, f: 0.5, fib: 3, s: 9, salt: 0 }, + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 4000, + aliases: ["kiwi", "kiwifrukt"], + }), + ing("watermelon", "Vattenmelon", "Watermelon", "frukt", { + ...veg, + n: { kcal: 30, p: 0.6, k: 7.6, f: 0.2, fib: 0.4, s: 6.2, salt: 0 }, + peakSeasons: ["summer"], + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 2000, + aliases: ["vattenmelon"], + }), + ing("cantaloupe", "Melon (cantaloupe)", "Cantaloupe melon", "frukt", { + ...veg, + n: { kcal: 34, p: 0.8, k: 8, f: 0.2, fib: 0.9, s: 8, salt: 0 }, + peakSeasons: ["summer"], + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 2500, + aliases: ["melon", "cantaloupe", "galiamelon", "honungsmelon"], + }), + ing("peach", "Persika", "Peach", "frukt", { + ...veg, + gramsPerPiece: 150, + n: { kcal: 39, p: 0.9, k: 8, f: 0.3, fib: 1.5, s: 8, salt: 0 }, + peakSeasons: ["summer"], + shelfLifeGuidance: { fridge: 5, pantry: 3 }, + defaultPriceMinorPerKg: 4000, + aliases: ["persika", "nektarin"], + }), + ing("plum", "Plommon", "Plum", "frukt", { + ...veg, + gramsPerPiece: 65, + n: { kcal: 46, p: 0.7, k: 10, f: 0.3, fib: 1.4, s: 10, salt: 0 }, + peakSeasons: ["autumn"], + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 4000, + aliases: ["plommon", "sviskon"], + }), + ing("apricot", "Aprikos", "Apricot", "frukt", { + ...veg, + gramsPerPiece: 40, + n: { kcal: 48, p: 1.4, k: 9, f: 0.4, fib: 2, s: 9, salt: 0 }, + peakSeasons: ["summer"], + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 5000, + aliases: ["aprikos", "aprikoser"], + }), + ing("cherries", "Körsbär", "Cherries", "frukt", { + ...veg, + n: { kcal: 63, p: 1.1, k: 13, f: 0.2, fib: 2.1, s: 13, salt: 0 }, + peakSeasons: ["summer"], + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 7000, + aliases: ["körsbär", "korsbar", "bigarråer"], + }), + ing("blackberry", "Björnbär", "Blackberry", "frukt", { + ...veg, + n: { kcal: 43, p: 1.4, k: 5, f: 0.5, fib: 5.3, s: 4.9, salt: 0 }, + peakSeasons: ["summer", "autumn"], + shelfLifeGuidance: { fridge: 3 }, + defaultPriceMinorPerKg: 9000, + aliases: ["björnbär", "bjornbar"], + }), + ing("blackcurrant", "Svarta vinbär", "Blackcurrant", "frukt", { + ...veg, + n: { kcal: 63, p: 1.4, k: 12, f: 0.4, fib: 6, s: 10, salt: 0 }, + peakSeasons: ["summer"], + shelfLifeGuidance: { fridge: 4 }, + defaultPriceMinorPerKg: 8000, + aliases: ["svarta vinbär", "svarta vinbar", "solbär"], + }), + ing("redcurrant", "Röda vinbär", "Redcurrant", "frukt", { + ...veg, + n: { kcal: 46, p: 1.1, k: 8, f: 0.2, fib: 4.3, s: 7, salt: 0 }, + peakSeasons: ["summer"], + shelfLifeGuidance: { fridge: 4 }, + defaultPriceMinorPerKg: 8000, + aliases: ["röda vinbär", "roda vinbar"], + }), + ing("gooseberry", "Krusbär", "Gooseberry", "frukt", { + ...veg, + n: { kcal: 44, p: 0.9, k: 8, f: 0.6, fib: 4.3, s: 8, salt: 0 }, + peakSeasons: ["summer"], + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 7000, + aliases: ["krusbär", "krusbar"], + }), + ing("lingonberry_fresh", "Lingon (färska)", "Lingonberry", "frukt", { + ...veg, + n: { kcal: 54, p: 0.6, k: 9, f: 0.5, fib: 3, s: 6, salt: 0 }, + peakSeasons: ["autumn"], + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 6000, + aliases: ["lingon", "färska lingon"], + }), + ing("cloudberry", "Hjortron", "Cloudberry", "frukt", { + ...veg, + n: { kcal: 51, p: 2.4, k: 8, f: 0.8, fib: 6, s: 8, salt: 0 }, + peakSeasons: ["summer", "autumn"], + shelfLifeGuidance: { fridge: 5 }, + defaultPriceMinorPerKg: 20000, + aliases: ["hjortron"], + }), + ing("pomegranate", "Granatäpple", "Pomegranate", "frukt", { + ...veg, + gramsPerPiece: 280, + n: { kcal: 83, p: 1.7, k: 16, f: 1.2, fib: 4, s: 14, salt: 0 }, + peakSeasons: ["autumn", "winter"], + shelfLifeGuidance: { fridge: 21, pantry: 7 }, + defaultPriceMinorPerKg: 5000, + aliases: ["granatäpple", "granatapple", "granatäpplekärnor"], + }), + ing("grapefruit", "Grapefrukt", "Grapefruit", "frukt", { + ...veg, + gramsPerPiece: 300, + n: { kcal: 42, p: 0.8, k: 9, f: 0.1, fib: 1.6, s: 7, salt: 0 }, + peakSeasons: ["winter"], + shelfLifeGuidance: { fridge: 21, pantry: 7 }, + defaultPriceMinorPerKg: 3000, + aliases: ["grapefrukt", "grape"], + }), + ing("clementine", "Clementin", "Clementine", "frukt", { + ...veg, + gramsPerPiece: 75, + n: { kcal: 47, p: 0.9, k: 10, f: 0.2, fib: 1.7, s: 9, salt: 0 }, + peakSeasons: ["winter"], + shelfLifeGuidance: { fridge: 14, pantry: 7 }, + defaultPriceMinorPerKg: 3000, + aliases: ["clementin", "mandarin", "klementin"], + }), + ing("passion_fruit", "Passionsfrukt", "Passion fruit", "frukt", { + ...veg, + gramsPerPiece: 40, + n: { kcal: 97, p: 2.2, k: 13, f: 0.7, fib: 10, s: 11, salt: 0 }, + shelfLifeGuidance: { fridge: 10 }, + defaultPriceMinorPerKg: 12000, + aliases: ["passionsfrukt", "maracuja"], + }), + ing("dates", "Dadlar", "Dates", "frukt", { + ...veg, + n: { kcal: 282, p: 2.5, k: 68, f: 0.4, fib: 8, s: 63, salt: 0 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 6000, + aliases: ["dadlar", "medjool", "dadel"], + }), + + // =================================================================== + // BALJVÄXTER + // =================================================================== + ing("brown_beans", "Bruna bönor (kokta)", "Brown beans", "baljvaxter", { + ...veg, + allergens: A(), + n: { kcal: 91, p: 6, k: 12, f: 0.5, fib: 5, s: 0.5, salt: 0.2 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 2500, + aliases: ["bruna bönor", "bruna bonor"], + }), + ing("white_beans", "Vita bönor (kokta)", "White beans", "baljvaxter", { + ...veg, + n: { kcal: 114, p: 8, k: 15, f: 0.6, fib: 6, s: 0.5, salt: 0.2 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 2500, + aliases: ["vita bönor", "vita bonor", "cannellinibönor", "stora vita bönor"], + }), + ing("green_lentils", "Gröna/bruna linser (torra)", "Green lentils", "baljvaxter", { + ...veg, + n: { kcal: 340, p: 24, k: 47, f: 1.5, fib: 15, s: 2, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 3500, + aliases: ["gröna linser", "bruna linser", "puylinser", "belugalinser"], + }), + ing("yellow_peas", "Gula ärtor (torra)", "Yellow split peas", "baljvaxter", { + ...veg, + n: { kcal: 335, p: 23, k: 49, f: 1.5, fib: 15, s: 3, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 2500, + aliases: ["gula ärtor", "gula artor", "gula ärter", "spisärter"], + }), + ing("edamame", "Edamame (sojabönor)", "Edamame", "baljvaxter", { + ...veg, + allergens: A("soy"), + n: { kcal: 121, p: 12, k: 5, f: 5, mf: 0.6, fib: 5, s: 2.2, salt: 0 }, + shelfLifeGuidance: { freezer: 300 }, + defaultPriceMinorPerKg: 5000, + aliases: ["edamame", "sojabönor", "sojabonor"], + }), + ing("tempeh", "Tempeh", "Tempeh", "baljvaxter", { + ...veg, + allergens: A("soy"), + n: { kcal: 192, p: 20, k: 8, f: 11, mf: 2.2, fib: 5, s: 1, salt: 0 }, + shelfLifeGuidance: { fridge: 14 }, + defaultPriceMinorPerKg: 8000, + aliases: ["tempeh"], + }), + ing("soy_mince_dry", "Sojafärs (torr)", "Textured soy protein", "baljvaxter", { + ...veg, + allergens: A("soy"), + n: { kcal: 340, p: 52, k: 20, f: 1.5, fib: 18, s: 4, salt: 1 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 6000, + aliases: ["sojafärs", "sojafars", "sojaprotein", "tvp"], + }), + ing("quorn", "Quorn (mykoprotein)", "Quorn", "baljvaxter", { + ...vgt, + allergens: A("eggs"), + n: { kcal: 92, p: 15, k: 4.5, f: 2, mf: 0.5, fib: 6, s: 0.7, salt: 0.4 }, + shelfLifeGuidance: { fridge: 14, freezer: 300 }, + defaultPriceMinorPerKg: 9000, + aliases: ["quorn", "mykoprotein"], + }), + ing("falafel", "Falafel (färdig)", "Falafel", "baljvaxter", { + ...veg, + allergens: A("gluten", "sesame"), + containsGluten: true, + n: { kcal: 333, p: 13, k: 32, f: 18, mf: 2.4, fib: 8, s: 2, salt: 1 }, + shelfLifeGuidance: { fridge: 7, freezer: 180 }, + defaultPriceMinorPerKg: 6000, + aliases: ["falafel", "falafelbollar"], + }), + + // =================================================================== + // SPANNMÅL & pasta + // =================================================================== + ing("brown_rice", "Fullkornsris (torrt)", "Brown rice", "spannmal", { + ...veg, + n: { kcal: 360, p: 7.5, k: 72, f: 2.8, fib: 3.5, s: 0.7, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 3000, + aliases: ["fullkornsris", "råris", "raris", "brunt ris"], + }), + ing("risotto_rice", "Risottoris (arborio)", "Risotto rice", "spannmal", { + ...veg, + n: { kcal: 358, p: 7, k: 78, f: 0.6, fib: 1.4, s: 0.2, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 4000, + aliases: ["risottoris", "arborio", "arborioris", "carnaroli"], + }), + ing("bulgur", "Bulgur (torr)", "Bulgur", "spannmal", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 342, p: 12, k: 63, f: 1.3, fib: 12, s: 0.4, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 3000, + aliases: ["bulgur"], + }), + ing("quinoa", "Quinoa (torr)", "Quinoa", "spannmal", { + ...veg, + n: { kcal: 368, p: 14, k: 57, f: 6, mf: 0.7, fib: 7, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 5000, + aliases: ["quinoa", "quinoagryn"], + }), + ing("pearl_barley", "Korngryn/matkorn (torrt)", "Pearl barley", "spannmal", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 352, p: 10, k: 73, f: 1.2, fib: 15, s: 0.8, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 2500, + aliases: ["korngryn", "matkorn", "pärlkorn", "kornotto"], + }), + ing("wholegrain_pasta", "Fullkornspasta (torr)", "Wholegrain pasta", "spannmal", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 348, p: 14, k: 62, f: 2.5, fib: 8, s: 3, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 3000, + aliases: ["fullkornspasta", "fullkornsspaghetti"], + }), + ing("lasagne_sheets", "Lasagneplattor (torra)", "Lasagne sheets", "spannmal", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 355, p: 12, k: 71, f: 1.5, fib: 3, s: 3, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 3500, + aliases: ["lasagneplattor", "lasagne", "lasagneplatta"], + }), + ing("macaroni", "Makaroner (torra)", "Macaroni", "spannmal", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 356, p: 12, k: 71, f: 1.5, fib: 3, s: 3, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 2500, + aliases: ["makaroner", "makaroni", "rörmakaroner"], + }), + ing("rice_noodles", "Risnudlar (torra)", "Rice noodles", "spannmal", { + ...veg, + n: { kcal: 360, p: 6, k: 83, f: 0.6, fib: 1.6, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 4000, + aliases: ["risnudlar", "risnudel", "glasnudlar"], + }), + ing("muesli", "Müsli", "Muesli", "spannmal", { + ...veg, + allergens: A("gluten", "tree_nuts"), + containsGluten: true, + n: { kcal: 360, p: 10, k: 60, f: 6, mf: 1, fib: 8, s: 15, salt: 0.1 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 4000, + aliases: ["müsli", "musli", "granola"], + }), + ing("cornflakes", "Cornflakes", "Cornflakes", "spannmal", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 378, p: 7, k: 84, f: 0.9, fib: 3, s: 8, salt: 1.1 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 4000, + aliases: ["cornflakes", "majsflingor"], + }), + + // =================================================================== + // BRÖD + // =================================================================== + ing("knackebrod", "Knäckebröd", "Crispbread", "brod", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 340, p: 10, k: 62, f: 2, fib: 16, s: 1, salt: 1.2 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 4000, + aliases: ["knäckebröd", "knackebrod", "knäcke"], + }), + ing("rye_bread", "Rågbröd", "Rye bread", "brod", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 230, p: 7, k: 44, f: 1.5, fib: 6, s: 3, salt: 1 }, + shelfLifeGuidance: { pantry: 5, freezer: 90 }, + defaultPriceMinorPerKg: 4500, + aliases: ["rågbröd", "ragbrod", "kavring", "mörkt bröd"], + }), + ing("toast_bread", "Formbröd (vitt)", "White loaf", "brod", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 265, p: 8, k: 49, f: 3.5, fib: 3, s: 4, salt: 1 }, + shelfLifeGuidance: { pantry: 5, freezer: 90 }, + defaultPriceMinorPerKg: 3500, + aliases: ["formbröd", "formbrod", "rostbröd", "toast", "vitt bröd"], + }), + ing("baguette", "Baguette", "Baguette", "brod", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 270, p: 9, k: 52, f: 2, fib: 3, s: 2.5, salt: 1.2 }, + shelfLifeGuidance: { pantry: 2 }, + defaultPriceMinorPerKg: 4000, + aliases: ["baguette", "franskbröd", "ciabatta"], + }), + ing("pita_bread", "Pitabröd", "Pita bread", "brod", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 275, p: 9, k: 55, f: 1.2, fib: 2.2, s: 2, salt: 1.1 }, + shelfLifeGuidance: { pantry: 5, freezer: 90 }, + defaultPriceMinorPerKg: 4000, + aliases: ["pitabröd", "pitabrod", "pita"], + }), + ing("naan_bread", "Naanbröd", "Naan bread", "brod", { + ...vgt, + allergens: A("gluten", "milk"), + containsGluten: true, + containsLactose: true, + n: { kcal: 310, p: 9, k: 50, f: 8, mf: 2, fib: 2, s: 4, salt: 1.1 }, + shelfLifeGuidance: { pantry: 5, freezer: 90 }, + defaultPriceMinorPerKg: 5000, + aliases: ["naan", "naanbröd", "naanbrod"], + }), + ing("tunnbrod", "Tunnbröd", "Swedish flatbread", "brod", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 290, p: 9, k: 55, f: 3, fib: 5, s: 2, salt: 1 }, + shelfLifeGuidance: { pantry: 14, freezer: 120 }, + defaultPriceMinorPerKg: 5000, + aliases: ["tunnbröd", "tunnbrod", "mjukt tunnbröd", "polarbröd"], + }), + + // =================================================================== + // BAKNING + // =================================================================== + ing("white_chocolate", "Vit choklad", "White chocolate", "bakning", { + ...vgt, + allergens: A("milk", "soy"), + containsLactose: true, + n: { kcal: 539, p: 6, k: 59, f: 30, mf: 18, s: 59, salt: 0.2 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 12000, + aliases: ["vit choklad", "vitchoklad"], + }), + ing("milk_chocolate", "Mjölkchoklad", "Milk chocolate", "bakning", { + ...vgt, + allergens: A("milk", "soy"), + containsLactose: true, + n: { kcal: 535, p: 7.7, k: 59, f: 30, mf: 18, s: 52, salt: 0.2 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 10000, + aliases: ["mjölkchoklad", "mjolkchoklad", "choklad"], + }), + ing("marzipan", "Marsipan", "Marzipan", "bakning", { + ...veg, + allergens: A("tree_nuts"), + n: { kcal: 460, p: 9, k: 50, f: 25, mf: 2.3, fib: 5, s: 43, salt: 0 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 10000, + aliases: ["marsipan"], + }), + ing("dry_yeast", "Torrjäst", "Dry yeast", "bakning", { + ...veg, + n: { kcal: 325, p: 40, k: 5, f: 7.6, fib: 26, s: 0, salt: 0.1 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 12000, + aliases: ["torrjäst", "torrjast", "snabbjäst"], + }), + ing("gelatin", "Gelatin (blad/pulver)", "Gelatin", "bakning", { + n: { kcal: 335, p: 84, k: 0, f: 0.1, s: 0, salt: 0.3 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 15000, + aliases: ["gelatin", "gelatinblad", "husbloss"], + }), + ing("light_syrup", "Ljus sirap", "Light syrup", "bakning", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.4, + n: { kcal: 315, p: 0.3, k: 78, f: 0, s: 50, salt: 0.1 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 4000, + aliases: ["ljus sirap", "sirap", "glykossirap"], + }), + ing("dark_syrup", "Mörk sirap", "Dark syrup", "bakning", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.42, + n: { kcal: 300, p: 1, k: 74, f: 0, s: 48, salt: 0.2 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 4000, + aliases: ["mörk sirap", "mork sirap", "melass"], + }), + ing("brown_sugar", "Farinsocker", "Brown sugar", "bakning", { + ...veg, + n: { kcal: 384, p: 0.1, k: 96, f: 0, s: 95, salt: 0.1 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 2500, + aliases: ["farinsocker", "brunt socker", "muscovado", "muscovadosocker"], + }), + ing("almond_flour", "Mandelmjöl", "Almond flour", "bakning", { + ...veg, + allergens: A("tree_nuts"), + n: { kcal: 620, p: 24, k: 6, f: 53, mf: 4, fib: 11, s: 4, salt: 0 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 12000, + aliases: ["mandelmjöl", "mandelmjol", "malen mandel"], + }), + ing("coconut_flour", "Kokosmjöl", "Coconut flour", "bakning", { + ...veg, + n: { kcal: 400, p: 18, k: 22, f: 16, mf: 14, fib: 39, s: 9, salt: 0 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 8000, + aliases: ["kokosmjöl", "kokosmjol"], + }), + ing("potato_starch", "Potatismjöl", "Potato starch", "bakning", { + ...veg, + n: { kcal: 333, p: 0.1, k: 83, f: 0.1, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 3000, + aliases: ["potatismjöl", "potatismjol", "potatisstärkelse"], + }), + ing("cornstarch", "Majsstärkelse (Maizena)", "Cornstarch", "bakning", { + ...veg, + n: { kcal: 381, p: 0.3, k: 91, f: 0.1, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 3500, + aliases: ["majsstärkelse", "majsstarkelse", "maizena", "majsmjöl"], + }), + ing("chocolate_chips", "Chokladknappar (mörka)", "Dark chocolate chips", "bakning", { + ...veg, + allergens: A("soy"), + n: { kcal: 480, p: 4, k: 63, f: 25, mf: 15, s: 55, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 11000, + aliases: ["chokladknappar", "chokladchips", "bakchoklad"], + }), + + // =================================================================== + // SKAFFERI – oljor, vinäger, såser, nötter, frön, sylt, pasta/fond + // =================================================================== + ing("sunflower_oil", "Solrosolja", "Sunflower oil", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 0.92, + n: { kcal: 884, p: 0, k: 0, f: 100, mf: 11, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 3000, + aliases: ["solrosolja"], + }), + ing("coconut_oil", "Kokosolja", "Coconut oil", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 0.92, + n: { kcal: 892, p: 0, k: 0, f: 100, mf: 87, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 6000, + aliases: ["kokosolja", "kokosfett"], + }), + ing("sesame_oil", "Sesamolja", "Sesame oil", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 0.92, + allergens: A("sesame"), + n: { kcal: 884, p: 0, k: 0, f: 100, mf: 14, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 8000, + aliases: ["sesamolja", "rostad sesamolja"], + }), + ing("white_wine_vinegar", "Vitvinsvinäger", "White wine vinegar", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1, + n: { kcal: 20, p: 0, k: 0.6, f: 0, s: 0.4, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 3000, + aliases: ["vitvinsvinäger", "vitvinsvinager"], + }), + ing("red_wine_vinegar", "Rödvinsvinäger", "Red wine vinegar", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1, + n: { kcal: 19, p: 0, k: 0.3, f: 0, s: 0.3, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 3000, + aliases: ["rödvinsvinäger", "rodvinsvinager"], + }), + ing("apple_cider_vinegar", "Äppelcidervinäger", "Apple cider vinegar", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.01, + n: { kcal: 22, p: 0, k: 0.9, f: 0, s: 0.4, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 3500, + aliases: ["äppelcidervinäger", "appelcidervinager", "äpplecidervinäger"], + }), + ing("vinegar_attika", "Ättika 12 %", "Vinegar (ättika)", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.01, + n: { kcal: 12, p: 0, k: 0, f: 0, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 2000, + aliases: ["ättika", "attika", "ättiksprit"], + }), + ing("rice_vinegar", "Risvinäger", "Rice vinegar", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1, + n: { kcal: 18, p: 0, k: 0.5, f: 0, s: 0.5, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 4000, + aliases: ["risvinäger", "risvinager"], + }), + ing("ketchup", "Ketchup", "Ketchup", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.1, + n: { kcal: 102, p: 1.2, k: 24, f: 0.1, fib: 0.3, s: 22, salt: 2.5 }, + shelfLifeGuidance: { fridge: 60, pantry: 180 }, + defaultPriceMinorPerKg: 3000, + aliases: ["ketchup", "tomatketchup"], + }), + ing("bbq_sauce", "Grillsås (BBQ)", "BBQ sauce", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.2, + n: { kcal: 172, p: 0.8, k: 41, f: 0.2, s: 33, salt: 2 }, + shelfLifeGuidance: { fridge: 60, pantry: 180 }, + defaultPriceMinorPerKg: 4000, + aliases: ["grillsås", "grillsas", "bbq-sås", "barbecuesås"], + }), + ing("sweet_chili_sauce", "Sweet chilisås", "Sweet chili sauce", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.2, + n: { kcal: 230, p: 0.5, k: 56, f: 0.1, s: 52, salt: 1.5 }, + shelfLifeGuidance: { fridge: 60, pantry: 180 }, + defaultPriceMinorPerKg: 4000, + aliases: ["sweet chili", "sweet chilisås", "chilisås"], + }), + ing("sriracha", "Sriracha", "Sriracha", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.1, + n: { kcal: 93, p: 1.9, k: 19, f: 0.9, s: 15, salt: 6 }, + shelfLifeGuidance: { fridge: 90, pantry: 365 }, + defaultPriceMinorPerKg: 5000, + aliases: ["sriracha", "srirachasås"], + }), + ing("hoisin_sauce", "Hoisinsås", "Hoisin sauce", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.2, + allergens: A("soy", "gluten", "sesame"), + containsGluten: true, + n: { kcal: 220, p: 3, k: 44, f: 3.4, fib: 2, s: 30, salt: 3.8 }, + shelfLifeGuidance: { fridge: 90, pantry: 365 }, + defaultPriceMinorPerKg: 6000, + aliases: ["hoisin", "hoisinsås"], + }), + ing("oyster_sauce", "Ostronsås", "Oyster sauce", "skafferi", { + defaultUnit: "DECILITER", + densityGPerMl: 1.2, + allergens: A("molluscs", "soy", "gluten"), + containsGluten: true, + n: { kcal: 135, p: 2.4, k: 27, f: 0.3, s: 18, salt: 11 }, + shelfLifeGuidance: { fridge: 90, pantry: 365 }, + defaultPriceMinorPerKg: 6000, + aliases: ["ostronsås", "ostronsas", "oyster sauce"], + }), + ing("worcestershire", "Worcestershiresås", "Worcestershire sauce", "skafferi", { + defaultUnit: "DECILITER", + densityGPerMl: 1.1, + allergens: A("fish"), + n: { kcal: 78, p: 0, k: 19, f: 0, s: 15, salt: 8.5 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 6000, + aliases: ["worcestershire", "worcestershiresås", "wostershiresås"], + }), + ing("pesto_green", "Pesto (grön)", "Green pesto", "skafferi", { + ...vgt, + allergens: A("milk", "tree_nuts"), + containsLactose: true, + n: { kcal: 450, p: 5, k: 6, f: 45, mf: 7, fib: 2, s: 3, salt: 2.5 }, + shelfLifeGuidance: { fridge: 30, pantry: 180 }, + defaultPriceMinorPerKg: 9000, + aliases: ["pesto", "grön pesto", "basilikapesto"], + }), + ing("sundried_tomatoes", "Soltorkade tomater", "Sun-dried tomatoes", "skafferi", { + ...veg, + n: { kcal: 213, p: 5, k: 23, f: 12, mf: 1.7, fib: 6, s: 18, salt: 2 }, + shelfLifeGuidance: { fridge: 30, pantry: 180 }, + defaultPriceMinorPerKg: 9000, + aliases: ["soltorkade tomater", "soltorkad tomat"], + }), + ing("capers", "Kapris", "Capers", "skafferi", { + ...veg, + n: { kcal: 23, p: 2.4, k: 1.7, f: 0.9, fib: 3.2, s: 0.4, salt: 2.5 }, + shelfLifeGuidance: { fridge: 180, pantry: 365 }, + defaultPriceMinorPerKg: 8000, + aliases: ["kapris"], + }), + ing("tahini", "Tahini (sesampasta)", "Tahini", "skafferi", { + ...veg, + allergens: A("sesame"), + n: { kcal: 595, p: 17, k: 21, f: 54, mf: 7.6, fib: 9, s: 0.5, salt: 0.1 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 9000, + aliases: ["tahini", "sesampasta"], + }), + ing("almonds", "Mandel", "Almonds", "skafferi", { + ...veg, + allergens: A("tree_nuts"), + n: { kcal: 579, p: 21, k: 22, f: 50, mf: 3.8, fib: 12, s: 4.4, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 12000, + aliases: ["mandel", "mandlar", "sötmandel"], + }), + ing("cashews", "Cashewnötter", "Cashews", "skafferi", { + ...veg, + allergens: A("tree_nuts"), + n: { kcal: 553, p: 18, k: 30, f: 44, mf: 8, fib: 3.3, s: 6, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 13000, + aliases: ["cashewnötter", "cashew", "cashewnot"], + }), + ing("pistachios", "Pistagenötter", "Pistachios", "skafferi", { + ...veg, + allergens: A("tree_nuts"), + n: { kcal: 560, p: 20, k: 28, f: 45, mf: 5.5, fib: 10, s: 8, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 18000, + aliases: ["pistagenötter", "pistage", "pistaschnötter"], + }), + ing("pecans", "Pecannötter", "Pecans", "skafferi", { + ...veg, + allergens: A("tree_nuts"), + n: { kcal: 691, p: 9, k: 14, f: 72, mf: 6, fib: 10, s: 4, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 16000, + aliases: ["pecannötter", "pekannötter", "pecan"], + }), + ing("pine_nuts", "Pinjenötter", "Pine nuts", "skafferi", { + ...veg, + allergens: A("tree_nuts"), + n: { kcal: 673, p: 14, k: 13, f: 68, mf: 4.9, fib: 3.7, s: 3.6, salt: 0 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 30000, + aliases: ["pinjenötter", "pinjenot", "pinjekärnor"], + }), + ing("peanuts", "Jordnötter", "Peanuts", "skafferi", { + ...veg, + allergens: A("peanuts"), + n: { kcal: 567, p: 26, k: 16, f: 49, mf: 6.8, fib: 8.5, s: 4, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 6000, + aliases: ["jordnötter", "jordnot", "salta jordnötter"], + }), + ing("sunflower_seeds", "Solrosfrön", "Sunflower seeds", "skafferi", { + ...veg, + n: { kcal: 584, p: 21, k: 20, f: 51, mf: 4.5, fib: 8.6, s: 2.6, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 5000, + aliases: ["solrosfrön", "solrosfron", "solroskärnor"], + }), + ing("pumpkin_seeds", "Pumpafrön", "Pumpkin seeds", "skafferi", { + ...veg, + n: { kcal: 559, p: 30, k: 11, f: 49, mf: 8.7, fib: 6, s: 1.4, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 7000, + aliases: ["pumpafrön", "pumpafron", "pumpakärnor"], + }), + ing("flax_seeds", "Linfrön", "Flax seeds", "skafferi", { + ...veg, + n: { kcal: 534, p: 18, k: 29, f: 42, mf: 3.7, fib: 27, s: 1.5, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 4000, + aliases: ["linfrön", "linfron", "linfrö"], + }), + ing("chia_seeds", "Chiafrön", "Chia seeds", "skafferi", { + ...veg, + n: { kcal: 486, p: 17, k: 42, f: 31, mf: 3.3, fib: 34, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 8000, + aliases: ["chiafrön", "chiafron", "chiafrö"], + }), + ing("maple_syrup", "Lönnsirap", "Maple syrup", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.32, + n: { kcal: 260, p: 0, k: 67, f: 0.1, s: 60, salt: 0 }, + shelfLifeGuidance: { fridge: 365, pantry: 365 }, + defaultPriceMinorPerKg: 12000, + aliases: ["lönnsirap", "lonnsirap", "maple syrup"], + }), + ing("agave_syrup", "Agavesirap", "Agave syrup", "skafferi", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.35, + n: { kcal: 310, p: 0, k: 76, f: 0, s: 68, salt: 0 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 8000, + aliases: ["agavesirap", "agave"], + }), + ing("hazelnut_spread", "Hasselnötskräm (choklad)", "Hazelnut spread", "skafferi", { + ...vgt, + allergens: A("tree_nuts", "milk", "soy"), + containsLactose: true, + n: { kcal: 539, p: 6, k: 57, f: 31, mf: 11, s: 57, salt: 0.1 }, + shelfLifeGuidance: { pantry: 365 }, + defaultPriceMinorPerKg: 8000, + aliases: ["nutella", "hasselnötskräm", "chokladkräm"], + }), + ing("orange_marmalade", "Apelsinmarmelad", "Orange marmalade", "skafferi", { + ...veg, + n: { kcal: 265, p: 0.3, k: 65, f: 0.1, s: 60, salt: 0 }, + shelfLifeGuidance: { fridge: 60, pantry: 365 }, + defaultPriceMinorPerKg: 4000, + aliases: ["apelsinmarmelad", "marmelad"], + }), + ing("blueberry_jam", "Blåbärssylt", "Blueberry jam", "skafferi", { + ...veg, + n: { kcal: 200, p: 0.4, k: 49, f: 0.2, s: 45, salt: 0 }, + shelfLifeGuidance: { fridge: 60, pantry: 365 }, + defaultPriceMinorPerKg: 4000, + aliases: ["blåbärssylt", "blabarssylt"], + }), + ing("raspberry_jam", "Hallonsylt", "Raspberry jam", "skafferi", { + ...veg, + n: { kcal: 210, p: 0.5, k: 51, f: 0.2, s: 47, salt: 0 }, + shelfLifeGuidance: { fridge: 60, pantry: 365 }, + defaultPriceMinorPerKg: 4000, + aliases: ["hallonsylt"], + }), + ing("miso_paste", "Misopasta", "Miso paste", "skafferi", { + ...veg, + allergens: A("soy", "gluten"), + containsGluten: true, + n: { kcal: 199, p: 12, k: 26, f: 6, fib: 5, s: 6, salt: 12 }, + shelfLifeGuidance: { fridge: 365 }, + defaultPriceMinorPerKg: 9000, + aliases: ["miso", "misopasta"], + }), + ing("sambal_oelek", "Sambal oelek", "Sambal oelek", "skafferi", { + ...veg, + n: { kcal: 40, p: 1.5, k: 7, f: 0.5, s: 4, salt: 8 }, + shelfLifeGuidance: { fridge: 180, pantry: 365 }, + defaultPriceMinorPerKg: 5000, + aliases: ["sambal oelek", "sambal"], + }), + ing("green_curry_paste", "Grön currypasta", "Green curry paste", "skafferi", { + allergens: A("crustaceans", "fish"), + n: { kcal: 120, p: 3, k: 15, f: 5, fib: 3, s: 5, salt: 6 }, + shelfLifeGuidance: { fridge: 90, pantry: 365 }, + defaultPriceMinorPerKg: 8000, + aliases: ["grön currypasta", "gron currypasta", "grön curry"], + }), + ing("panko", "Panko (ströbröd)", "Panko breadcrumbs", "skafferi", { + ...veg, + allergens: A("gluten"), + containsGluten: true, + n: { kcal: 360, p: 12, k: 72, f: 2, fib: 4, s: 3, salt: 1.2 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 5000, + aliases: ["panko", "japanskt ströbröd"], + }), + ing("beef_stock_cube", "Köttbuljongtärning", "Beef stock cube", "skafferi", { + allergens: A("celery"), + n: { kcal: 200, p: 12, k: 20, f: 8, s: 2, salt: 40 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 8000, + aliases: ["köttbuljong", "kottbuljong", "oxbuljong", "buljongtärning"], + }), + + // =================================================================== + // KRYDDOR (torkade) + // =================================================================== + ing("white_pepper", "Vitpeppar", "White pepper", "kryddor", { + ...veg, + n: { kcal: 296, p: 10, k: 69, f: 2, fib: 26, s: 0, salt: 0 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 20000, + aliases: ["vitpeppar"], + }), + ing("cayenne_pepper", "Cayennepeppar", "Cayenne pepper", "kryddor", { + ...veg, + n: { kcal: 318, p: 12, k: 57, f: 17, fib: 27, s: 10, salt: 0.3 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 16000, + aliases: ["cayennepeppar", "cayenne"], + }), + ing("chili_powder", "Chilipulver", "Chili powder", "kryddor", { + ...veg, + n: { kcal: 282, p: 13, k: 50, f: 14, fib: 35, s: 8, salt: 1.6 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 12000, + aliases: ["chilipulver"], + }), + ing("nutmeg", "Muskotnöt", "Nutmeg", "kryddor", { + ...veg, + n: { kcal: 525, p: 6, k: 49, f: 36, fib: 21, s: 3, salt: 0 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 30000, + aliases: ["muskot", "muskotnöt", "muskotnot"], + }), + ing("cloves", "Kryddnejlika", "Cloves", "kryddor", { + ...veg, + n: { kcal: 274, p: 6, k: 66, f: 13, fib: 34, s: 2.4, salt: 0.3 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 20000, + aliases: ["kryddnejlika", "nejlika", "nejlikor"], + }), + ing("coriander_ground", "Koriander (mald)", "Ground coriander", "kryddor", { + ...veg, + n: { kcal: 298, p: 12, k: 55, f: 18, fib: 42, s: 0, salt: 0.3 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 14000, + aliases: ["mald koriander", "korianderfrö", "korianderpulver"], + }), + ing("ground_ginger", "Ingefära (mald)", "Ground ginger", "kryddor", { + ...veg, + n: { kcal: 335, p: 9, k: 72, f: 4, fib: 14, s: 3, salt: 0.1 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 14000, + aliases: ["mald ingefära", "torkad ingefära", "ingefärspulver"], + }), + ing("bay_leaf", "Lagerblad", "Bay leaf", "kryddor", { + ...veg, + n: { kcal: 313, p: 8, k: 75, f: 8, fib: 26, s: 0, salt: 0.2 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 16000, + aliases: ["lagerblad", "lagerbladen"], + }), + ing("fennel_seeds", "Fänkålsfrön", "Fennel seeds", "kryddor", { + ...veg, + n: { kcal: 345, p: 16, k: 52, f: 15, fib: 40, s: 0, salt: 0.2 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 14000, + aliases: ["fänkålsfrön", "fankalsfron", "fänkålsfrö"], + }), + ing("mustard_seeds", "Senapsfrön", "Mustard seeds", "kryddor", { + ...veg, + allergens: A("mustard"), + n: { kcal: 508, p: 26, k: 28, f: 36, fib: 12, s: 6.8, salt: 0.1 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 10000, + aliases: ["senapsfrön", "senapsfron", "senapsfrö"], + }), + ing("caraway_seeds", "Kummin", "Caraway seeds", "kryddor", { + ...veg, + n: { kcal: 333, p: 20, k: 50, f: 15, fib: 38, s: 0.6, salt: 0.1 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 12000, + aliases: ["kummin", "kumminfrön"], + }), + ing("star_anise", "Stjärnanis", "Star anise", "kryddor", { + ...veg, + n: { kcal: 337, p: 18, k: 50, f: 16, fib: 15, s: 0, salt: 0.2 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 18000, + aliases: ["stjärnanis", "stjarnanis", "anis"], + }), + ing("rosemary_dried", "Rosmarin (torkad)", "Dried rosemary", "kryddor", { + ...veg, + n: { kcal: 331, p: 5, k: 64, f: 15, fib: 43, s: 0, salt: 0.1 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 12000, + aliases: ["torkad rosmarin", "rosmarinpulver"], + }), + ing("basil_dried", "Basilika (torkad)", "Dried basil", "kryddor", { + ...veg, + n: { kcal: 233, p: 23, k: 48, f: 4, fib: 38, s: 1.7, salt: 0.1 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 12000, + aliases: ["torkad basilika"], + }), + ing("garlic_powder", "Vitlökspulver", "Garlic powder", "kryddor", { + ...veg, + n: { kcal: 331, p: 17, k: 73, f: 0.7, fib: 9, s: 2.4, salt: 0.1 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 12000, + aliases: ["vitlökspulver", "vitlokspulver", "vitlöksgranulat"], + }), + ing("onion_powder", "Lökpulver", "Onion powder", "kryddor", { + ...veg, + n: { kcal: 341, p: 10, k: 79, f: 1, fib: 15, s: 6, salt: 0.1 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 11000, + aliases: ["lökpulver", "lokpulver"], + }), + ing("smoked_paprika", "Rökt paprikapulver", "Smoked paprika", "kryddor", { + ...veg, + n: { kcal: 282, p: 14, k: 54, f: 13, fib: 35, s: 10, salt: 0.3 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 12000, + aliases: ["rökt paprika", "rokt paprika", "pimentón"], + }), + ing("italian_herbs", "Italiensk krydda", "Italian herbs", "kryddor", { + ...veg, + n: { kcal: 290, p: 10, k: 52, f: 7, fib: 38, s: 0, salt: 0.2 }, + shelfLifeGuidance: { pantry: 1095 }, + defaultPriceMinorPerKg: 10000, + aliases: ["italiensk krydda", "örtkrydda", "herbes de provence", "pizzakrydda"], + }), + + // =================================================================== + // KONSERVER & DRYCK + // =================================================================== + ing("passata", "Passata (silad tomat)", "Tomato passata", "konserver", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.05, + n: { kcal: 35, p: 1.6, k: 6, f: 0.2, fib: 1.4, s: 5, salt: 0.1 }, + shelfLifeGuidance: { fridge: 5, pantry: 540 }, + defaultPriceMinorPerKg: 2500, + aliases: ["passata", "silad tomat", "tomatpassata"], + }), + ing("coconut_cream", "Kokosgrädde", "Coconut cream", "konserver", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1, + n: { kcal: 330, p: 3.6, k: 6, f: 34, mf: 30, s: 3, salt: 0 }, + shelfLifeGuidance: { fridge: 4, pantry: 540 }, + defaultPriceMinorPerKg: 5000, + aliases: ["kokosgrädde", "kokosgradde", "coconut cream"], + }), + ing("pineapple_canned", "Ananas (konserv)", "Canned pineapple", "konserver", { + ...veg, + n: { kcal: 60, p: 0.4, k: 14, f: 0.1, fib: 0.8, s: 13, salt: 0 }, + shelfLifeGuidance: { pantry: 730 }, + defaultPriceMinorPerKg: 2500, + aliases: ["ananas konserv", "ananasringar", "ananasbitar"], + }), + ing("artichoke_hearts", "Kronärtskockshjärtan", "Artichoke hearts", "konserver", { + ...veg, + n: { kcal: 47, p: 3, k: 5, f: 0.2, fib: 5, s: 1, salt: 0.6 }, + shelfLifeGuidance: { fridge: 7, pantry: 540 }, + defaultPriceMinorPerKg: 6000, + aliases: ["kronärtskocka", "kronartskocka", "kronärtskockshjärtan", "artischock"], + }), + ing("orange_juice", "Apelsinjuice", "Orange juice", "dryck", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.04, + n: { kcal: 45, p: 0.7, k: 10, f: 0.2, s: 9, salt: 0 }, + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 2000, + aliases: ["apelsinjuice", "juice", "apelsinjos"], + }), + ing("apple_juice", "Äppeljuice", "Apple juice", "dryck", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.05, + n: { kcal: 46, p: 0.1, k: 11, f: 0.1, s: 10, salt: 0 }, + shelfLifeGuidance: { fridge: 7 }, + defaultPriceMinorPerKg: 1800, + aliases: ["äppeljuice", "appeljuice", "äppeljos"], + }), + ing("cola", "Läsk (cola)", "Cola", "dryck", { + ...veg, + defaultUnit: "DECILITER", + densityGPerMl: 1.04, + n: { kcal: 42, p: 0, k: 10.6, f: 0, s: 10.6, salt: 0 }, + shelfLifeGuidance: { pantry: 180 }, + defaultPriceMinorPerKg: 1500, + aliases: ["läsk", "lask", "cola", "coca-cola", "pepsi"], + }), +]; diff --git a/packages/database/src/seed/data/ingredients.ts b/packages/database/src/seed/data/ingredients.ts index 1667169..7b561d9 100644 --- a/packages/database/src/seed/data/ingredients.ts +++ b/packages/database/src/seed/data/ingredients.ts @@ -6,6 +6,7 @@ import type { StorageLocationType, Unit, } from "@app/shared-types"; +import { EXTRA_INGREDIENTS } from "./ingredients-extra.js"; /** * Seed: kanoniska ingredienser med schablonvärden per 100 g. @@ -1277,6 +1278,8 @@ export const SEED_INGREDIENTS: SeedIngredient[] = [ n: { kcal: 105, p: 24, k: 0, f: 1 }, aliases: ["kalkon", "kalkonfilé", "kalkonfile", "kalkonbröst", "turkey", "turkey breast"], }), + // Bred katalogutökning (vanliga svenska livsmedel) – se ingredients-extra.ts. + ...EXTRA_INGREDIENTS, ]; export const SEED_INGREDIENT_IDS = new Set(SEED_INGREDIENTS.map((i) => i.id));