feat(core): add secure recipe APIs, precise scaling and versioned imports
This commit is contained in:
commit
5d71d32e20
31 files changed
+6293
No files matched your search
@@ -0,0 +1,173 @@
|
||||
import { recipeSchema } from '../src/lib/recipe';
|
||||
export const pasta = recipeSchema.parse({
|
||||
id: '10000000-0000-4000-8000-000000000001',
|
||||
title: 'Grüne Pesto-Pasta',
|
||||
subtitle: 'Ein Teller Sommer, ganz ohne Eile.',
|
||||
description:
|
||||
'Frisches Basilikum, geröstete Pinienkerne und ein Hauch Zitrone. Unsere liebste Pasta für Tage, an denen es einfach gut sein soll.',
|
||||
image: '/images/kitchen.jpg',
|
||||
categories: ['Alltagsküche', 'Vegetarisch'],
|
||||
tags: ['Schnell', 'Familienliebling'],
|
||||
cuisine: 'Italien',
|
||||
servings: 2,
|
||||
prepMinutes: 10,
|
||||
cookMinutes: 12,
|
||||
published: true,
|
||||
ingredients: [
|
||||
{ id: 'pasta', name: 'Pasta', amount: 200, unit: 'g', section: 'Für die Pasta' },
|
||||
{ id: 'basilikum', name: 'Basilikum', amount: 40, unit: 'g', section: 'Für das Pesto' },
|
||||
{ id: 'kerne', name: 'Pinienkerne', amount: 30, unit: 'g', section: 'Für das Pesto' },
|
||||
{ id: 'oel', name: 'Olivenöl', amount: 60, unit: 'ml', section: 'Für das Pesto' },
|
||||
{
|
||||
id: 'kaese',
|
||||
name: 'Hartkäse mit mikrobiellem Lab',
|
||||
amount: 40,
|
||||
unit: 'g',
|
||||
section: 'Für das Pesto',
|
||||
},
|
||||
{
|
||||
id: 'zitrone',
|
||||
name: 'Bio-Zitrone',
|
||||
amount: 0.5,
|
||||
unit: 'Stück',
|
||||
section: 'Zum Abschmecken',
|
||||
optional: true,
|
||||
},
|
||||
{
|
||||
id: 'salz',
|
||||
name: 'Salz',
|
||||
amount: null,
|
||||
unit: '',
|
||||
note: 'nach Geschmack',
|
||||
section: 'Zum Abschmecken',
|
||||
},
|
||||
],
|
||||
steps: [
|
||||
{
|
||||
id: 'vorbereiten',
|
||||
title: 'Ein bisschen Vorbereitung',
|
||||
text: '{{basilikum}} waschen und trocken schütteln. {{kaese}} fein reiben. Einen großen Topf Salzwasser aufsetzen.',
|
||||
ingredients: ['basilikum', 'kaese', 'salz'],
|
||||
},
|
||||
{
|
||||
id: 'pesto',
|
||||
title: 'Das Pesto zum Leuchten bringen',
|
||||
text: '{{kerne}} in einer trockenen Pfanne goldbraun rösten. Mit Basilikum und {{oel}} fein mixen, anschließend den geriebenen Käse unterheben.',
|
||||
ingredients: ['kerne', 'basilikum', 'oel', 'kaese'],
|
||||
timers: [{ id: 'roesten', label: 'Pinienkerne rösten', seconds: 180 }],
|
||||
},
|
||||
{
|
||||
id: 'kochen',
|
||||
title: 'Pasta trifft Pesto',
|
||||
text: '{{pasta}} nach Packungsangabe bissfest kochen. Vor dem Abgießen etwas Kochwasser auffangen. Pasta mit dem Pesto vermengen und mit Kochwasser geschmeidig rühren.',
|
||||
ingredients: ['pasta'],
|
||||
timers: [{ id: 'nudeln', label: 'Pasta kochen', seconds: 600 }],
|
||||
},
|
||||
{
|
||||
id: 'geniessen',
|
||||
title: 'Der schönste Moment',
|
||||
text: 'Mit dem Saft von {{zitrone}} und Salz abschmecken. Auf warme Teller verteilen und sofort genießen.',
|
||||
ingredients: ['zitrone', 'salz'],
|
||||
},
|
||||
],
|
||||
tips: 'Pesto nicht stark erhitzen: So bleibt es leuchtend grün. Ein Schuss stärkehaltiges Nudelwasser macht die Sauce wunderbar cremig.',
|
||||
storage:
|
||||
'Pesto in einem sauberen Glas mit einer dünnen Ölschicht bedecken und im Kühlschrank innerhalb von zwei Tagen verbrauchen.',
|
||||
nutrition: { kcal: 780, protein: 22, carbs: 79, fat: 42 },
|
||||
});
|
||||
export const salad = recipeSchema.parse({
|
||||
id: '10000000-0000-4000-8000-000000000002',
|
||||
title: 'Bunte Garten-Bowl',
|
||||
subtitle: 'Knackig, frisch und voller guter Dinge.',
|
||||
description:
|
||||
'Eine großzügige Schüssel Gemüse, cremige Kichererbsen und ein zitroniges Tahini-Dressing. Genau richtig für einen frischen Start.',
|
||||
image: '/images/garden.jpg',
|
||||
categories: ['Vegetarisch'],
|
||||
tags: ['Meal Prep'],
|
||||
cuisine: 'Mediterran',
|
||||
servings: 2,
|
||||
prepMinutes: 20,
|
||||
cookMinutes: 10,
|
||||
published: true,
|
||||
ingredients: [
|
||||
{ id: 'kichererbsen', name: 'Kichererbsen, gekocht', amount: 240, unit: 'g' },
|
||||
{ id: 'salat', name: 'Blattsalat', amount: 100, unit: 'g' },
|
||||
{ id: 'tomaten', name: 'Cherrytomaten', amount: 200, unit: 'g' },
|
||||
{ id: 'gurke', name: 'Gurke', amount: 0.5, unit: 'Stück' },
|
||||
{ id: 'tahini', name: 'Tahini', amount: 2, unit: 'EL' },
|
||||
{ id: 'zitrone', name: 'Zitronensaft', amount: 2, unit: 'EL' },
|
||||
{ id: 'wasser', name: 'Wasser', amount: 3, unit: 'EL' },
|
||||
{ id: 'salz', name: 'Salz', amount: null, note: 'nach Geschmack' },
|
||||
],
|
||||
steps: [
|
||||
{
|
||||
id: 'gemuese',
|
||||
title: 'Bunt vorbereiten',
|
||||
text: '{{salat}} waschen und trocknen. {{tomaten}} halbieren und {{gurke}} in Scheiben schneiden.',
|
||||
ingredients: ['salat', 'tomaten', 'gurke'],
|
||||
},
|
||||
{
|
||||
id: 'roesten',
|
||||
title: 'Kichererbsen rösten',
|
||||
text: '{{kichererbsen}} abtropfen lassen und in einer beschichteten Pfanne zehn Minuten rösten. Regelmäßig umrühren.',
|
||||
ingredients: ['kichererbsen'],
|
||||
timers: [{ id: 'roesten', label: 'Kichererbsen rösten', seconds: 600 }],
|
||||
},
|
||||
{
|
||||
id: 'dressing',
|
||||
title: 'Alles kommt zusammen',
|
||||
text: '{{tahini}} mit {{zitrone}}, {{wasser}} und Salz verrühren. Gemüse und Kichererbsen anrichten und das Dressing darübergeben.',
|
||||
ingredients: ['tahini', 'zitrone', 'wasser', 'salz'],
|
||||
},
|
||||
],
|
||||
tips: 'Das Dressing separat aufbewahren, wenn die Bowl für morgen ist.',
|
||||
storage: 'Gekühlt einen Tag haltbar. Salat und Dressing getrennt lagern.',
|
||||
});
|
||||
export const soup = recipeSchema.parse({
|
||||
id: '10000000-0000-4000-8000-000000000003',
|
||||
title: 'Wärmende Gemüsesuppe',
|
||||
subtitle: 'Ein Löffel Gemütlichkeit.',
|
||||
description:
|
||||
'Saisongemüse, weiße Bohnen und aromatische Kräuter machen aus wenigen Zutaten ein wohliges Essen für die ganze Familie.',
|
||||
image: '/images/soup.jpg',
|
||||
categories: ['Alltagsküche'],
|
||||
tags: ['Familienliebling', 'Meal Prep'],
|
||||
servings: 4,
|
||||
prepMinutes: 15,
|
||||
cookMinutes: 30,
|
||||
published: true,
|
||||
ingredients: [
|
||||
{ id: 'karotten', name: 'Karotten', amount: 300, unit: 'g' },
|
||||
{ id: 'kartoffeln', name: 'Kartoffeln', amount: 400, unit: 'g' },
|
||||
{ id: 'bohnen', name: 'Weiße Bohnen, gekocht', amount: 240, unit: 'g' },
|
||||
{ id: 'bruehe', name: 'Gemüsebrühe', amount: 1, unit: 'l' },
|
||||
{ id: 'zwiebel', name: 'Zwiebel', amount: 1, unit: 'Stück' },
|
||||
{ id: 'oel', name: 'Olivenöl', amount: 1, unit: 'EL' },
|
||||
{ id: 'kraeuter', name: 'Petersilie', amount: 0.5, unit: 'Bund', optional: true },
|
||||
],
|
||||
steps: [
|
||||
{
|
||||
id: 'schneiden',
|
||||
title: 'Alles klein schneiden',
|
||||
text: '{{karotten}}, {{kartoffeln}} und {{zwiebel}} schälen und würfeln.',
|
||||
ingredients: ['karotten', 'kartoffeln', 'zwiebel'],
|
||||
},
|
||||
{
|
||||
id: 'kochen',
|
||||
title: 'Zeit für Wärme',
|
||||
text: 'Zwiebel in {{oel}} glasig dünsten. Karotten und Kartoffeln dazugeben, mit {{bruehe}} aufgießen und zugedeckt etwa 25 Minuten sanft kochen, bis das Gemüse weich ist.',
|
||||
ingredients: ['oel', 'bruehe'],
|
||||
timers: [{ id: 'suppe', label: 'Gemüse weich kochen', seconds: 1500 }],
|
||||
},
|
||||
{
|
||||
id: 'abschmecken',
|
||||
title: 'Der letzte Schliff',
|
||||
text: '{{bohnen}} dazugeben und fünf Minuten erwärmen. Abschmecken und mit {{kraeuter}} bestreuen.',
|
||||
ingredients: ['bohnen', 'kraeuter'],
|
||||
timers: [{ id: 'bohnen', label: 'Bohnen erwärmen', seconds: 300 }],
|
||||
},
|
||||
],
|
||||
storage:
|
||||
'Rasch abkühlen und im Kühlschrank maximal zwei Tage lagern. Portionsweise bis zu drei Monate einfrieren.',
|
||||
});
|
||||
export const examples = [pasta, salad, soup];
|
||||
Reference in new issue
Block a user