Merge branch 'mealie-next' into fix/shopping-list-only-checkbox-tick-off

This commit is contained in:
Mario Džoić 2025-07-21 16:15:53 +02:00 committed by GitHub
commit ffced131d9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
33 changed files with 1297 additions and 1283 deletions

View file

@ -12,7 +12,7 @@ repos:
exclude: ^tests/data/ exclude: ^tests/data/
- repo: https://github.com/astral-sh/ruff-pre-commit - repo: https://github.com/astral-sh/ruff-pre-commit
# Ruff version. # Ruff version.
rev: v0.12.3 rev: v0.12.4
hooks: hooks:
- id: ruff - id: ruff
- id: ruff-format - id: ruff-format

View file

@ -179,9 +179,15 @@ def inject_nuxt_values():
all_langs = [] all_langs = []
for match in locales_dir.glob("*.json"): for match in locales_dir.glob("*.json"):
lang_string = f'{{ code: "{match.stem}", file: "{match.name.replace(".json", ".ts")}" }},' match_data = LOCALE_DATA.get(match.stem)
match_dir = match_data.dir if match_data else "ltr"
lang_string = f'{{ code: "{match.stem}", file: "{match.name.replace(".json", ".ts")}", dir: "{match_dir}" }},'
all_langs.append(lang_string) all_langs.append(lang_string)
all_langs.sort()
all_date_locales.sort()
log.debug(f"injecting locales into nuxt config -> {nuxt_config}") log.debug(f"injecting locales into nuxt config -> {nuxt_config}")
inject_inline(nuxt_config, CodeKeys.nuxt_local_messages, all_langs) inject_inline(nuxt_config, CodeKeys.nuxt_local_messages, all_langs)
inject_inline(i18n_config, CodeKeys.nuxt_local_dates, all_date_locales) inject_inline(i18n_config, CodeKeys.nuxt_local_dates, all_date_locales)

View file

@ -31,7 +31,7 @@ To deploy mealie on your local network, it is highly recommended to use Docker t
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do: We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
1. Take a backup just in case! 1. Take a backup just in case!
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.0.1` 2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.0.2`
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access. 3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
4. Restart the container 4. Restart the container

View file

@ -7,7 +7,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
```yaml ```yaml
services: services:
mealie: mealie:
image: ghcr.io/mealie-recipes/mealie:v3.0.1 # (3) image: ghcr.io/mealie-recipes/mealie:v3.0.2 # (3)
container_name: mealie container_name: mealie
restart: always restart: always
ports: ports:

View file

@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
```yaml ```yaml
services: services:
mealie: mealie:
image: ghcr.io/mealie-recipes/mealie:v3.0.1 # (3) image: ghcr.io/mealie-recipes/mealie:v3.0.2 # (3)
container_name: mealie container_name: mealie
restart: always restart: always
ports: ports:

View file

@ -125,25 +125,20 @@
</v-list-item> </v-list-item>
<div v-if="useItems.recipeActions && recipeActions && recipeActions.length"> <div v-if="useItems.recipeActions && recipeActions && recipeActions.length">
<v-divider /> <v-divider />
<v-list-group @click.stop>
<template #activator="{ props }">
<v-list-item-title v-bind="props">
{{ $t("recipe.recipe-actions") }}
</v-list-item-title>
</template>
<v-list density="compact" class="ma-0 pa-0">
<v-list-item <v-list-item
v-for="(action, index) in recipeActions" v-for="(action, index) in recipeActions"
:key="index" :key="index"
class="pl-6"
@click="executeRecipeAction(action)" @click="executeRecipeAction(action)"
> >
<template #prepend>
<v-icon color="undefined">
{{ $globals.icons.linkVariantPlus }}
</v-icon>
</template>
<v-list-item-title> <v-list-item-title>
{{ action.title }} {{ action.title }}
</v-list-item-title> </v-list-item-title>
</v-list-item> </v-list-item>
</v-list>
</v-list-group>
</div> </div>
</v-list> </v-list>
</v-menu> </v-menu>

View file

@ -3,12 +3,13 @@
v-model="selected" v-model="selected"
item-key="id" item-key="id"
show-select show-select
:sort-by="[{ key: 'dateAdded', order: 'desc' }]" :sort-by="sortBy"
:headers="headers" :headers="headers"
:items="recipes" :items="recipes"
:items-per-page="15" :items-per-page="15"
class="elevation-0" class="elevation-0"
:loading="loading" :loading="loading"
return-object
> >
<template #[`item.name`]="{ item }"> <template #[`item.name`]="{ item }">
<a <a
@ -117,7 +118,7 @@ export default defineNuxtComponent({
}, },
}, },
}, },
emits: ["click"], emits: ["click", "update:modelValue"],
setup(props, context) { setup(props, context) {
const i18n = useI18n(); const i18n = useI18n();
const $auth = useMealieAuth(); const $auth = useMealieAuth();
@ -128,6 +129,9 @@ export default defineNuxtComponent({
set: value => context.emit(INPUT_EVENT, value), set: value => context.emit(INPUT_EVENT, value),
}); });
// Initialize sort state with default sorting by dateAdded descending
const sortBy = ref([{ key: "dateAdded", order: "desc" }]);
const headers = computed(() => { const headers = computed(() => {
const hdrs: Array<{ title: string; value: string; align?: string; sortable?: boolean }> = []; const hdrs: Array<{ title: string; value: string; align?: string; sortable?: boolean }> = [];
@ -206,6 +210,7 @@ export default defineNuxtComponent({
return { return {
selected, selected,
sortBy,
groupSlug, groupSlug,
headers, headers,
formatDate, formatDate,

View file

@ -7,13 +7,14 @@
<v-card-text> <v-card-text>
{{ $t("language-dialog.select-description") }} {{ $t("language-dialog.select-description") }}
<v-autocomplete <v-autocomplete
v-model="locale" v-model="selectedLocale"
:items="locales" :items="locales"
item-title="name" item-title="name"
item-value="value"
class="my-3" class="my-3"
hide-details hide-details
variant="outlined" variant="outlined"
offset @update:model-value="onLocaleSelect"
> >
<template #item="{ item, props }"> <template #item="{ item, props }">
<div <div
@ -59,6 +60,14 @@ export default defineNuxtComponent({
}); });
const { locales: LOCALES, locale, i18n } = useLocales(); const { locales: LOCALES, locale, i18n } = useLocales();
const selectedLocale = ref(locale.value);
const onLocaleSelect = (value: string) => {
if (value && locales.some(l => l.value === value)) {
locale.value = value as any;
}
};
watch(locale, () => { watch(locale, () => {
dialog.value = false; // Close dialog when locale changes dialog.value = false; // Close dialog when locale changes
}); });
@ -72,6 +81,8 @@ export default defineNuxtComponent({
i18n, i18n,
locales, locales,
locale, locale,
selectedLocale,
onLocaleSelect,
}; };
}, },
}); });

View file

@ -33,7 +33,7 @@ export const LOCALES = [
{ {
name: "Svenska (Swedish)", name: "Svenska (Swedish)",
value: "sv-SE", value: "sv-SE",
progress: 39, progress: 47,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -57,7 +57,7 @@ export const LOCALES = [
{ {
name: "Pусский (Russian)", name: "Pусский (Russian)",
value: "ru-RU", value: "ru-RU",
progress: 35, progress: 37,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -75,7 +75,7 @@ export const LOCALES = [
{ {
name: "Português do Brasil (Brazilian Portuguese)", name: "Português do Brasil (Brazilian Portuguese)",
value: "pt-BR", value: "pt-BR",
progress: 34, progress: 36,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -87,13 +87,13 @@ export const LOCALES = [
{ {
name: "Norsk (Norwegian)", name: "Norsk (Norwegian)",
value: "no-NO", value: "no-NO",
progress: 37, progress: 38,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Nederlands (Dutch)", name: "Nederlands (Dutch)",
value: "nl-NL", value: "nl-NL",
progress: 42, progress: 44,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -123,7 +123,7 @@ export const LOCALES = [
{ {
name: "Italiano (Italian)", name: "Italiano (Italian)",
value: "it-IT", value: "it-IT",
progress: 37, progress: 38,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -135,7 +135,7 @@ export const LOCALES = [
{ {
name: "Magyar (Hungarian)", name: "Magyar (Hungarian)",
value: "hu-HU", value: "hu-HU",
progress: 39, progress: 40,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -147,19 +147,19 @@ export const LOCALES = [
{ {
name: "עברית (Hebrew)", name: "עברית (Hebrew)",
value: "he-IL", value: "he-IL",
progress: 37, progress: 45,
dir: "rtl", dir: "rtl",
}, },
{ {
name: "Galego (Galician)", name: "Galego (Galician)",
value: "gl-ES", value: "gl-ES",
progress: 37, progress: 38,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Français (French)", name: "Français (French)",
value: "fr-FR", value: "fr-FR",
progress: 38, progress: 49,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -189,7 +189,7 @@ export const LOCALES = [
{ {
name: "Español (Spanish)", name: "Español (Spanish)",
value: "es-ES", value: "es-ES",
progress: 37, progress: 40,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -201,31 +201,31 @@ export const LOCALES = [
{ {
name: "British English", name: "British English",
value: "en-GB", value: "en-GB",
progress: 22, progress: 23,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Ελληνικά (Greek)", name: "Ελληνικά (Greek)",
value: "el-GR", value: "el-GR",
progress: 37, progress: 38,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Deutsch (German)", name: "Deutsch (German)",
value: "de-DE", value: "de-DE",
progress: 55, progress: 63,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Dansk (Danish)", name: "Dansk (Danish)",
value: "da-DK", value: "da-DK",
progress: 37, progress: 38,
dir: "ltr", dir: "ltr",
}, },
{ {
name: "Čeština (Czech)", name: "Čeština (Czech)",
value: "cs-CZ", value: "cs-CZ",
progress: 37, progress: 40,
dir: "ltr", dir: "ltr",
}, },
{ {

View file

@ -3,8 +3,6 @@ import { LOCALES } from "./available-locales";
export const useLocales = () => { export const useLocales = () => {
const i18n = useI18n(); const i18n = useI18n();
const { isRtl } = useRtl();
const { current: vuetifyLocale } = useLocale(); const { current: vuetifyLocale } = useLocale();
const locale = computed<LocaleObject["code"]>({ const locale = computed<LocaleObject["code"]>({
@ -13,18 +11,21 @@ export const useLocales = () => {
i18n.setLocale(value); i18n.setLocale(value);
}, },
}); });
function updateLocale(lc: LocaleObject["code"]) {
vuetifyLocale.value = lc;
}
// auto update vuetify locale // auto update vuetify locale
watch(locale, (lc) => { watch(locale, (lc) => {
vuetifyLocale.value = lc; updateLocale(lc);
});
// auto update rtl
watch(vuetifyLocale, (vl) => {
const currentLocale = LOCALES.find(lc => lc.value === vl);
if (currentLocale) {
isRtl.value = currentLocale.dir === "rtl";
}
}); });
// set initial locale
if (i18n.locale.value) {
updateLocale(i18n.locale.value);
};
return { return {
locale, locale,
locales: LOCALES, locales: LOCALES,

View file

@ -1,47 +1,48 @@
/* eslint-disable @typescript-eslint/no-require-imports */ /* eslint-disable @typescript-eslint/no-require-imports */
const datetimeFormats = { const datetimeFormats = {
// CODE_GEN_ID: DATE_LOCALES // CODE_GEN_ID: DATE_LOCALES
"tr-TR": require("./lang/dateTimeFormats/tr-TR.json"), "af-ZA": require("./lang/dateTimeFormats/af-ZA.json"),
"zh-CN": require("./lang/dateTimeFormats/zh-CN.json"), "ar-SA": require("./lang/dateTimeFormats/ar-SA.json"),
"ja-JP": require("./lang/dateTimeFormats/ja-JP.json"), "bg-BG": require("./lang/dateTimeFormats/bg-BG.json"),
"en-GB": require("./lang/dateTimeFormats/en-GB.json"),
"ca-ES": require("./lang/dateTimeFormats/ca-ES.json"), "ca-ES": require("./lang/dateTimeFormats/ca-ES.json"),
"cs-CZ": require("./lang/dateTimeFormats/cs-CZ.json"),
"da-DK": require("./lang/dateTimeFormats/da-DK.json"),
"de-DE": require("./lang/dateTimeFormats/de-DE.json"),
"el-GR": require("./lang/dateTimeFormats/el-GR.json"),
"en-GB": require("./lang/dateTimeFormats/en-GB.json"),
"en-US": require("./lang/dateTimeFormats/en-US.json"),
"es-ES": require("./lang/dateTimeFormats/es-ES.json"),
"et-EE": require("./lang/dateTimeFormats/et-EE.json"),
"fi-FI": require("./lang/dateTimeFormats/fi-FI.json"),
"fr-BE": require("./lang/dateTimeFormats/fr-BE.json"),
"fr-CA": require("./lang/dateTimeFormats/fr-CA.json"),
"fr-FR": require("./lang/dateTimeFormats/fr-FR.json"),
"gl-ES": require("./lang/dateTimeFormats/gl-ES.json"),
"he-IL": require("./lang/dateTimeFormats/he-IL.json"),
"hr-HR": require("./lang/dateTimeFormats/hr-HR.json"),
"hu-HU": require("./lang/dateTimeFormats/hu-HU.json"),
"is-IS": require("./lang/dateTimeFormats/is-IS.json"),
"it-IT": require("./lang/dateTimeFormats/it-IT.json"), "it-IT": require("./lang/dateTimeFormats/it-IT.json"),
"ja-JP": require("./lang/dateTimeFormats/ja-JP.json"),
"ko-KR": require("./lang/dateTimeFormats/ko-KR.json"),
"lt-LT": require("./lang/dateTimeFormats/lt-LT.json"),
"lv-LV": require("./lang/dateTimeFormats/lv-LV.json"),
"nl-NL": require("./lang/dateTimeFormats/nl-NL.json"),
"no-NO": require("./lang/dateTimeFormats/no-NO.json"),
"pl-PL": require("./lang/dateTimeFormats/pl-PL.json"), "pl-PL": require("./lang/dateTimeFormats/pl-PL.json"),
"pt-BR": require("./lang/dateTimeFormats/pt-BR.json"),
"pt-PT": require("./lang/dateTimeFormats/pt-PT.json"), "pt-PT": require("./lang/dateTimeFormats/pt-PT.json"),
"ro-RO": require("./lang/dateTimeFormats/ro-RO.json"), "ro-RO": require("./lang/dateTimeFormats/ro-RO.json"),
"sr-SP": require("./lang/dateTimeFormats/sr-SP.json"),
"hr-HR": require("./lang/dateTimeFormats/hr-HR.json"),
"de-DE": require("./lang/dateTimeFormats/de-DE.json"),
"zh-TW": require("./lang/dateTimeFormats/zh-TW.json"),
"af-ZA": require("./lang/dateTimeFormats/af-ZA.json"),
"fr-CA": require("./lang/dateTimeFormats/fr-CA.json"),
"he-IL": require("./lang/dateTimeFormats/he-IL.json"),
"pt-BR": require("./lang/dateTimeFormats/pt-BR.json"),
"cs-CZ": require("./lang/dateTimeFormats/cs-CZ.json"),
"fr-FR": require("./lang/dateTimeFormats/fr-FR.json"),
"ru-RU": require("./lang/dateTimeFormats/ru-RU.json"), "ru-RU": require("./lang/dateTimeFormats/ru-RU.json"),
"is-IS": require("./lang/dateTimeFormats/is-IS.json"),
"sk-SK": require("./lang/dateTimeFormats/sk-SK.json"), "sk-SK": require("./lang/dateTimeFormats/sk-SK.json"),
"el-GR": require("./lang/dateTimeFormats/el-GR.json"),
"fr-BE": require("./lang/dateTimeFormats/fr-BE.json"),
"da-DK": require("./lang/dateTimeFormats/da-DK.json"),
"hu-HU": require("./lang/dateTimeFormats/hu-HU.json"),
"es-ES": require("./lang/dateTimeFormats/es-ES.json"),
"gl-ES": require("./lang/dateTimeFormats/gl-ES.json"),
"no-NO": require("./lang/dateTimeFormats/no-NO.json"),
"lt-LT": require("./lang/dateTimeFormats/lt-LT.json"),
"en-US": require("./lang/dateTimeFormats/en-US.json"),
"sv-SE": require("./lang/dateTimeFormats/sv-SE.json"),
"ko-KR": require("./lang/dateTimeFormats/ko-KR.json"),
"bg-BG": require("./lang/dateTimeFormats/bg-BG.json"),
"sl-SI": require("./lang/dateTimeFormats/sl-SI.json"), "sl-SI": require("./lang/dateTimeFormats/sl-SI.json"),
"sr-SP": require("./lang/dateTimeFormats/sr-SP.json"),
"sv-SE": require("./lang/dateTimeFormats/sv-SE.json"),
"tr-TR": require("./lang/dateTimeFormats/tr-TR.json"),
"uk-UA": require("./lang/dateTimeFormats/uk-UA.json"), "uk-UA": require("./lang/dateTimeFormats/uk-UA.json"),
"lv-LV": require("./lang/dateTimeFormats/lv-LV.json"),
"ar-SA": require("./lang/dateTimeFormats/ar-SA.json"),
"nl-NL": require("./lang/dateTimeFormats/nl-NL.json"),
"vi-VN": require("./lang/dateTimeFormats/vi-VN.json"), "vi-VN": require("./lang/dateTimeFormats/vi-VN.json"),
"fi-FI": require("./lang/dateTimeFormats/fi-FI.json"), "zh-CN": require("./lang/dateTimeFormats/zh-CN.json"),
"zh-TW": require("./lang/dateTimeFormats/zh-TW.json"),
// END: DATE_LOCALES // END: DATE_LOCALES
}; };

View file

@ -0,0 +1,21 @@
{
"short": {
"month": "short",
"day": "numeric",
"weekday": "long"
},
"medium": {
"month": "long",
"day": "numeric",
"weekday": "long",
"year": "numeric"
},
"long": {
"year": "numeric",
"month": "long",
"day": "numeric",
"weekday": "long",
"hour": "numeric",
"minute": "numeric"
}
}

View file

@ -599,10 +599,10 @@
"create-recipe-from-an-image": "Opret opskrift fra et billede", "create-recipe-from-an-image": "Opret opskrift fra et billede",
"create-recipe-from-an-image-description": "Opret en opskrift ved at overføre et billede af den. Mealie vil forsøge at udtrække teksten fra billedet med AI og oprette en opskrift fra det.", "create-recipe-from-an-image-description": "Opret en opskrift ved at overføre et billede af den. Mealie vil forsøge at udtrække teksten fra billedet med AI og oprette en opskrift fra det.",
"crop-and-rotate-the-image": "Beskær og roter billedet, så kun teksten er synlig, og det vises i den rigtige retning.", "crop-and-rotate-the-image": "Beskær og roter billedet, så kun teksten er synlig, og det vises i den rigtige retning.",
"create-from-images": "Create from Images", "create-from-images": "Opret fra billede",
"should-translate-description": "Oversæt opskriften til mit sprog", "should-translate-description": "Oversæt opskriften til mit sprog",
"please-wait-image-procesing": "Vent venligst, billedet behandles. Dette kan tage lidt tid.", "please-wait-image-procesing": "Vent venligst, billedet behandles. Dette kan tage lidt tid.",
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.", "please-wait-images-processing": "Vent venligst, billedet behandles. Dette kan tage lidt tid.",
"bulk-url-import": "Import fra flere URL-adresser", "bulk-url-import": "Import fra flere URL-adresser",
"debug-scraper": "Fejlsøg indlæser", "debug-scraper": "Fejlsøg indlæser",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Opret en opskrift ved at angive navnet. Alle opskrifter skal have unikke navne.", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Opret en opskrift ved at angive navnet. Alle opskrifter skal have unikke navne.",
@ -662,9 +662,9 @@
}, },
"reset-servings-count": "Nulstil antal serveringer", "reset-servings-count": "Nulstil antal serveringer",
"not-linked-ingredients": "Yderligere ingredienser", "not-linked-ingredients": "Yderligere ingredienser",
"upload-another-image": "Upload another image", "upload-another-image": "Upload et andet billede",
"upload-images": "Upload images", "upload-images": "Upload billeder",
"upload-more-images": "Upload more images" "upload-more-images": "Upload flere billeder"
}, },
"recipe-finder": { "recipe-finder": {
"recipe-finder": "Opskriftssøger", "recipe-finder": "Opskriftssøger",
@ -724,7 +724,7 @@
"backup-restore": "Backup / gendannelse", "backup-restore": "Backup / gendannelse",
"back-restore-description": "Gendannelse af denne sikkerhedskopi vil overskrive alle de aktuelle data i din database og i datamappen og erstatte dem med indholdet af denne sikkerhedskopi. {cannot-be-undone} Hvis gendannelsen lykkes, vil du blive logget ud.", "back-restore-description": "Gendannelse af denne sikkerhedskopi vil overskrive alle de aktuelle data i din database og i datamappen og erstatte dem med indholdet af denne sikkerhedskopi. {cannot-be-undone} Hvis gendannelsen lykkes, vil du blive logget ud.",
"cannot-be-undone": "Denne handling kan ikke fortrydes - brug med forsigtighed.", "cannot-be-undone": "Denne handling kan ikke fortrydes - brug med forsigtighed.",
"postgresql-note": "If you are using PostgreSQL, please review the {backup-restore-process} prior to restoring.", "postgresql-note": "Hvis du bruger PostgreSQL, så gennemse venligst {backup-restore-process} før du gendanner.",
"backup-restore-process-in-the-documentation": "backup/restoreproces i dokumentationen", "backup-restore-process-in-the-documentation": "backup/restoreproces i dokumentationen",
"irreversible-acknowledgment": "Jeg forstår, at denne handling er irreversibel, destruktiv og kan forårsage tab af data", "irreversible-acknowledgment": "Jeg forstår, at denne handling er irreversibel, destruktiv og kan forårsage tab af data",
"restore-backup": "Gendan sikkerhedskopi" "restore-backup": "Gendan sikkerhedskopi"

View file

@ -599,10 +599,10 @@
"create-recipe-from-an-image": "Crear receta a partir de una imagen", "create-recipe-from-an-image": "Crear receta a partir de una imagen",
"create-recipe-from-an-image-description": "Crea una receta cargando una imagen de ella. Mealie intentará extraer el texto de la imagen usando IA y crear una receta de ella.", "create-recipe-from-an-image-description": "Crea una receta cargando una imagen de ella. Mealie intentará extraer el texto de la imagen usando IA y crear una receta de ella.",
"crop-and-rotate-the-image": "Recortar y rotar la imagen de manera que sólo el texto sea visible, y esté en la orientación correcta.", "crop-and-rotate-the-image": "Recortar y rotar la imagen de manera que sólo el texto sea visible, y esté en la orientación correcta.",
"create-from-images": "Create from Images", "create-from-images": "Crear a partir de imágenes",
"should-translate-description": "Traducir la receta a mi idioma", "should-translate-description": "Traducir la receta a mi idioma",
"please-wait-image-procesing": "Por favor, espere, la imagen se está procesando. Esto puede tardar un tiempo.", "please-wait-image-procesing": "Por favor, espere, la imagen se está procesando. Esto puede tardar un tiempo.",
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.", "please-wait-images-processing": "Por favor, espere, las imágenes se están procesando. Esto puede tardar algún tiempo.",
"bulk-url-import": "Importación masiva desde URL", "bulk-url-import": "Importación masiva desde URL",
"debug-scraper": "Depurar analizador", "debug-scraper": "Depurar analizador",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crear una receta proporcionando el nombre. Todas las recetas deben tener nombres únicos.", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crear una receta proporcionando el nombre. Todas las recetas deben tener nombres únicos.",
@ -662,9 +662,9 @@
}, },
"reset-servings-count": "Restablecer contador de porciones", "reset-servings-count": "Restablecer contador de porciones",
"not-linked-ingredients": "Ingredientes adicionales", "not-linked-ingredients": "Ingredientes adicionales",
"upload-another-image": "Upload another image", "upload-another-image": "Subir otra imagen",
"upload-images": "Upload images", "upload-images": "Subir imágenes",
"upload-more-images": "Upload more images" "upload-more-images": "Subir más imágenes"
}, },
"recipe-finder": { "recipe-finder": {
"recipe-finder": "Buscador de recetas", "recipe-finder": "Buscador de recetas",

View file

@ -151,6 +151,7 @@ import {
mdiKnife, mdiKnife,
mdiCookie, mdiCookie,
mdiBellPlus, mdiBellPlus,
mdiLinkVariantPlus,
} from "@mdi/js"; } from "@mdi/js";
export const icons = { export const icons = {
@ -236,6 +237,7 @@ export const icons = {
informationOutline: mdiInformationOutline, informationOutline: mdiInformationOutline,
informationVariant: mdiInformationVariant, informationVariant: mdiInformationVariant,
link: mdiLink, link: mdiLink,
linkVariantPlus: mdiLinkVariantPlus,
lock: mdiLock, lock: mdiLock,
logout: mdiLogout, logout: mdiLogout,
menu: mdiMenu, menu: mdiMenu,

View file

@ -175,114 +175,52 @@ export default defineNuxtConfig({
subsets: ["cyrillic-ext", "cyrillic", "greek-ext", "greek", "vietnamese", "latin-ext", "latin"], subsets: ["cyrillic-ext", "cyrillic", "greek-ext", "greek", "vietnamese", "latin-ext", "latin"],
}, },
}, },
/* auth: {
redirect: {
login: "/login",
logout: "/login",
callback: "/login",
home: "/",
},
cookie: {
prefix: "mealie.auth.",
options: {
expires: 7,
path: "/",
},
},
rewriteRedirects: false,
// Options
strategies: {
local: {
resetOnError: true,
token: {
property: "access_token",
global: true,
// required: true,
// type: 'Bearer'
},
user: {
property: "",
autoFetch: true,
},
endpoints: {
login: {
url: "api/auth/token",
method: "post",
propertyName: "access_token",
},
refresh: { url: "api/auth/refresh", method: "post" },
logout: { url: "api/auth/logout", method: "post" },
user: { url: "api/users/self", method: "get" },
},
},
oidc: {
scheme: "local",
resetOnError: true,
token: {
property: "access_token",
global: true,
},
user: {
property: "",
autoFetch: true,
},
endpoints: {
login: {
url: "api/auth/oauth/callback",
method: "get",
},
logout: { url: "api/auth/logout", method: "post" },
user: { url: "api/users/self", method: "get" },
},
},
},
}, */
i18n: { i18n: {
locales: [ locales: [
// CODE_GEN_ID: MESSAGE_LOCALES // CODE_GEN_ID: MESSAGE_LOCALES
{ code: "tr-TR", file: "tr-TR.ts" }, { code: "af-ZA", file: "af-ZA.ts", dir: "ltr" },
{ code: "zh-CN", file: "zh-CN.ts" }, { code: "ar-SA", file: "ar-SA.ts", dir: "rtl" },
{ code: "ja-JP", file: "ja-JP.ts" }, { code: "bg-BG", file: "bg-BG.ts", dir: "ltr" },
{ code: "en-GB", file: "en-GB.ts" }, { code: "ca-ES", file: "ca-ES.ts", dir: "ltr" },
{ code: "ca-ES", file: "ca-ES.ts" }, { code: "cs-CZ", file: "cs-CZ.ts", dir: "ltr" },
{ code: "it-IT", file: "it-IT.ts" }, { code: "da-DK", file: "da-DK.ts", dir: "ltr" },
{ code: "pl-PL", file: "pl-PL.ts" }, { code: "de-DE", file: "de-DE.ts", dir: "ltr" },
{ code: "pt-PT", file: "pt-PT.ts" }, { code: "el-GR", file: "el-GR.ts", dir: "ltr" },
{ code: "ro-RO", file: "ro-RO.ts" }, { code: "en-GB", file: "en-GB.ts", dir: "ltr" },
{ code: "sr-SP", file: "sr-SP.ts" }, { code: "en-US", file: "en-US.ts", dir: "ltr" },
{ code: "hr-HR", file: "hr-HR.ts" }, { code: "es-ES", file: "es-ES.ts", dir: "ltr" },
{ code: "de-DE", file: "de-DE.ts" }, { code: "et-EE", file: "et-EE.ts", dir: "ltr" },
{ code: "zh-TW", file: "zh-TW.ts" }, { code: "fi-FI", file: "fi-FI.ts", dir: "ltr" },
{ code: "af-ZA", file: "af-ZA.ts" }, { code: "fr-BE", file: "fr-BE.ts", dir: "ltr" },
{ code: "fr-CA", file: "fr-CA.ts" }, { code: "fr-CA", file: "fr-CA.ts", dir: "ltr" },
{ code: "he-IL", file: "he-IL.ts" }, { code: "fr-FR", file: "fr-FR.ts", dir: "ltr" },
{ code: "pt-BR", file: "pt-BR.ts" }, { code: "gl-ES", file: "gl-ES.ts", dir: "ltr" },
{ code: "cs-CZ", file: "cs-CZ.ts" }, { code: "he-IL", file: "he-IL.ts", dir: "rtl" },
{ code: "fr-FR", file: "fr-FR.ts" }, { code: "hr-HR", file: "hr-HR.ts", dir: "ltr" },
{ code: "ru-RU", file: "ru-RU.ts" }, { code: "hu-HU", file: "hu-HU.ts", dir: "ltr" },
{ code: "is-IS", file: "is-IS.ts" }, { code: "is-IS", file: "is-IS.ts", dir: "ltr" },
{ code: "sk-SK", file: "sk-SK.ts" }, { code: "it-IT", file: "it-IT.ts", dir: "ltr" },
{ code: "el-GR", file: "el-GR.ts" }, { code: "ja-JP", file: "ja-JP.ts", dir: "ltr" },
{ code: "fr-BE", file: "fr-BE.ts" }, { code: "ko-KR", file: "ko-KR.ts", dir: "ltr" },
{ code: "da-DK", file: "da-DK.ts" }, { code: "lt-LT", file: "lt-LT.ts", dir: "ltr" },
{ code: "hu-HU", file: "hu-HU.ts" }, { code: "lv-LV", file: "lv-LV.ts", dir: "ltr" },
{ code: "es-ES", file: "es-ES.ts" }, { code: "nl-NL", file: "nl-NL.ts", dir: "ltr" },
{ code: "gl-ES", file: "gl-ES.ts" }, { code: "no-NO", file: "no-NO.ts", dir: "ltr" },
{ code: "no-NO", file: "no-NO.ts" }, { code: "pl-PL", file: "pl-PL.ts", dir: "ltr" },
{ code: "lt-LT", file: "lt-LT.ts" }, { code: "pt-BR", file: "pt-BR.ts", dir: "ltr" },
{ code: "en-US", file: "en-US.ts" }, { code: "pt-PT", file: "pt-PT.ts", dir: "ltr" },
{ code: "sv-SE", file: "sv-SE.ts" }, { code: "ro-RO", file: "ro-RO.ts", dir: "ltr" },
{ code: "ko-KR", file: "ko-KR.ts" }, { code: "ru-RU", file: "ru-RU.ts", dir: "ltr" },
{ code: "bg-BG", file: "bg-BG.ts" }, { code: "sk-SK", file: "sk-SK.ts", dir: "ltr" },
{ code: "sl-SI", file: "sl-SI.ts" }, { code: "sl-SI", file: "sl-SI.ts", dir: "ltr" },
{ code: "uk-UA", file: "uk-UA.ts" }, { code: "sr-SP", file: "sr-SP.ts", dir: "ltr" },
{ code: "et-EE", file: "et-EE.ts" }, { code: "sv-SE", file: "sv-SE.ts", dir: "ltr" },
{ code: "lv-LV", file: "lv-LV.ts" }, { code: "tr-TR", file: "tr-TR.ts", dir: "ltr" },
{ code: "ar-SA", file: "ar-SA.ts" }, { code: "uk-UA", file: "uk-UA.ts", dir: "ltr" },
{ code: "nl-NL", file: "nl-NL.ts" }, { code: "vi-VN", file: "vi-VN.ts", dir: "ltr" },
{ code: "vi-VN", file: "vi-VN.ts" }, { code: "zh-CN", file: "zh-CN.ts", dir: "ltr" },
{ code: "fi-FI", file: "fi-FI.ts" }, { code: "zh-TW", file: "zh-TW.ts", dir: "ltr" },
// END: MESSAGE_LOCALES // END: MESSAGE_LOCALES
], ],
strategy: "no_prefix", strategy: "no_prefix",

View file

@ -1,6 +1,6 @@
{ {
"name": "mealie", "name": "mealie",
"version": "3.0.1", "version": "3.0.2",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "nuxt dev", "dev": "nuxt dev",

View file

@ -126,7 +126,7 @@
<!-- Alias Sub-Dialog --> <!-- Alias Sub-Dialog -->
<RecipeDataAliasManagerDialog <RecipeDataAliasManagerDialog
v-if="editTarget" v-if="editTarget"
:value="aliasManagerDialog" v-model="aliasManagerDialog"
:data="editTarget" :data="editTarget"
@submit="updateFoodAlias" @submit="updateFoodAlias"
@cancel="aliasManagerDialog = false" @cancel="aliasManagerDialog = false"

View file

@ -4,7 +4,7 @@
<BaseDialog <BaseDialog
v-model="state.createDialog" v-model="state.createDialog"
:title="$t('data-pages.recipe-actions.new-recipe-action')" :title="$t('data-pages.recipe-actions.new-recipe-action')"
:icon="$globals.icons.primary" :icon="$globals.icons.linkVariantPlus"
can-submit can-submit
@submit="createAction" @submit="createAction"
> >
@ -34,7 +34,7 @@
<!-- Edit Dialog --> <!-- Edit Dialog -->
<BaseDialog <BaseDialog
v-model="state.editDialog" v-model="state.editDialog"
:icon="$globals.icons.primary" :icon="$globals.icons.linkVariantPlus"
:title="$t('data-pages.recipe-actions.edit-recipe-action')" :title="$t('data-pages.recipe-actions.edit-recipe-action')"
:submit-text="$t('general.save')" :submit-text="$t('general.save')"
can-submit can-submit
@ -115,7 +115,7 @@
<!-- Data Table --> <!-- Data Table -->
<BaseCardSectionTitle <BaseCardSectionTitle
:icon="$globals.icons.primary" :icon="$globals.icons.linkVariantPlus"
section section
:title="$t('data-pages.recipe-actions.recipe-actions-data')" :title="$t('data-pages.recipe-actions.recipe-actions-data')"
/> />

View file

@ -44,6 +44,7 @@
:title="$t('general.confirm')" :title="$t('general.confirm')"
:icon="$globals.icons.alertCircle" :icon="$globals.icons.alertCircle"
color="error" color="error"
can-confirm
@confirm="deleteTag" @confirm="deleteTag"
> >
<v-card-text> <v-card-text>

View file

@ -52,6 +52,7 @@
:title="$t('general.confirm')" :title="$t('general.confirm')"
:icon="$globals.icons.alertCircle" :icon="$globals.icons.alertCircle"
color="error" color="error"
can-confirm
@confirm="deleteTool" @confirm="deleteTool"
> >
<v-card-text> <v-card-text>

View file

@ -19,30 +19,16 @@
v-model="fromUnit" v-model="fromUnit"
return-object return-object
:items="store" :items="store"
item-title="id" item-title="name"
:label="$t('data-pages.units.source-unit')" :label="$t('data-pages.units.source-unit')"
> />
<template #chip="{ item }">
{{ item.raw.name }}
</template>
<template #item="{ item }">
{{ item.raw.name }}
</template>
</v-autocomplete>
<v-autocomplete <v-autocomplete
v-model="toUnit" v-model="toUnit"
return-object return-object
:items="store" :items="store"
item-title="id" item-title="name"
:label="$t('data-pages.units.target-unit')" :label="$t('data-pages.units.target-unit')"
> />
<template #chip="{ item }">
{{ item.raw.name }}
</template>
<template #item="{ item }">
{{ item.raw.name }}
</template>
</v-autocomplete>
<template v-if="canMerge && fromUnit && toUnit"> <template v-if="canMerge && fromUnit && toUnit">
<div class="text-center"> <div class="text-center">

View file

@ -11,7 +11,7 @@
}, },
"servings-text": { "servings-text": {
"makes": "Realizadas", "makes": "Realizadas",
"serves": "Personas", "serves": "Porciones",
"serving": "Porción", "serving": "Porción",
"servings": "Porciones", "servings": "Porciones",
"yield": "Ración", "yield": "Ración",

View file

@ -46,20 +46,20 @@
"red onion": { "red onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red onion", "name": "červená cibule",
"plural_name": "Červená cibule" "plural_name": "červené cibule"
}, },
"yellow onion": { "yellow onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yellow onion", "name": "žlutá cibule",
"plural_name": "yellow onions" "plural_name": "yellow onions"
}, },
"celery": { "celery": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celer", "name": "celer",
"plural_name": "Celery" "plural_name": "celery"
}, },
"jalapeno": { "jalapeno": {
"aliases": [], "aliases": [],
@ -76,8 +76,8 @@
"shallot": { "shallot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "shallot", "name": "šalotka",
"plural_name": "shallots" "plural_name": "šalotky"
}, },
"cherry tomato": { "cherry tomato": {
"aliases": [], "aliases": [],
@ -95,13 +95,13 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "špenát", "name": "špenát",
"plural_name": "spinaches" "plural_name": "špenát"
}, },
"sweet corn": { "sweet corn": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet corn", "name": "sladká kukuřice",
"plural_name": "sweet corns" "plural_name": "sladké kukuřice"
}, },
"chile pepper": { "chile pepper": {
"aliases": [ "aliases": [
@ -228,14 +228,14 @@
"radish": { "radish": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "radish", "name": "ředkvička",
"plural_name": "radishes" "plural_name": "ředkvičky"
}, },
"red cabbage": { "red cabbage": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red cabbage", "name": "červené zelí",
"plural_name": "red cabbages" "plural_name": "červené zelí"
}, },
"artichoke": { "artichoke": {
"aliases": [], "aliases": [],

View file

@ -4,62 +4,62 @@
"garlic": { "garlic": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "hvidløg",
"plural_name": "garlics" "plural_name": "hvidløg"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion", "name": "løg",
"plural_name": "onions" "plural_name": "løg"
}, },
"bell pepper": { "bell pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bell pepper", "name": "peberfrugt",
"plural_name": "bell peppers" "plural_name": "peberfrugter"
}, },
"carrot": { "carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carrot", "name": "gulerod",
"plural_name": "carrots" "plural_name": "gulerødder"
}, },
"scallion": { "scallion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "scallion", "name": "forårsløg",
"plural_name": "scallions" "plural_name": "forårsløg"
}, },
"zucchini": { "zucchini": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "zucchini", "name": "squash",
"plural_name": "zucchinis" "plural_name": "squash"
}, },
"potato": { "potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "potato", "name": "kartoffel",
"plural_name": "potatoes" "plural_name": "kartofler"
}, },
"red onion": { "red onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red onion", "name": "rødløg",
"plural_name": "red onions" "plural_name": "rødløg"
}, },
"yellow onion": { "yellow onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yellow onion", "name": "løg",
"plural_name": "yellow onions" "plural_name": "løg"
}, },
"celery": { "celery": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celery", "name": "selleri",
"plural_name": "celeries" "plural_name": "selleri"
}, },
"jalapeno": { "jalapeno": {
"aliases": [], "aliases": [],
@ -70,64 +70,64 @@
"avocado": { "avocado": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "avocado", "name": "avokado",
"plural_name": "avocados" "plural_name": "avokadoer"
}, },
"shallot": { "shallot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "shallot", "name": "skalotteløg",
"plural_name": "shallots" "plural_name": "skalotteløg"
}, },
"cherry tomato": { "cherry tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry tomato", "name": "cherrytomat",
"plural_name": "cherry tomatoes" "plural_name": "cherrytomater"
}, },
"cucumber": { "cucumber": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cucumber", "name": "agurk",
"plural_name": "cucumbers" "plural_name": "agurker"
}, },
"spinach": { "spinach": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spinach", "name": "spinat",
"plural_name": "spinaches" "plural_name": "spinat"
}, },
"sweet corn": { "sweet corn": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet corn", "name": "sød majs",
"plural_name": "sweet corns" "plural_name": "sød majs"
}, },
"chile pepper": { "chile pepper": {
"aliases": [ "aliases": [
"capsicum" "peberfrugt"
], ],
"description": "", "description": "",
"name": "chile pepper", "name": "chilipeber",
"plural_name": "chile peppers" "plural_name": "chilipeber"
}, },
"sweet potato": { "sweet potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet potato", "name": "sød kartoffel",
"plural_name": "sweet potatoes" "plural_name": "søde kartofler"
}, },
"broccoli": { "broccoli": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "broccoli", "name": "broccoli",
"plural_name": "broccolis" "plural_name": "broccoli"
}, },
"heart of palm": { "heart of palm": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "heart of palm", "name": "palmehjerte",
"plural_name": "heart of palms" "plural_name": "palmehjerter"
}, },
"baby green": { "baby green": {
"aliases": [], "aliases": [],
@ -138,38 +138,38 @@
"pumpkin": { "pumpkin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pumpkin", "name": "græskar",
"plural_name": "pumpkins" "plural_name": "græskar"
}, },
"cauliflower": { "cauliflower": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cauliflower", "name": "blomkål",
"plural_name": "cauliflowers" "plural_name": "blomkålshoveder"
}, },
"cabbage": { "cabbage": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cabbage", "name": "cabbage",
"plural_name": "cabbages" "plural_name": "kålhoveder"
}, },
"asparagu": { "asparagu": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "asparagu", "name": "asparges",
"plural_name": "asparagus" "plural_name": "asparges"
}, },
"kale": { "kale": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kale", "name": "grønkål",
"plural_name": "kales" "plural_name": "grønkål"
}, },
"arugula": { "arugula": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "arugula", "name": "rucola",
"plural_name": "arugulas" "plural_name": "rucola"
}, },
"leek": { "leek": {
"aliases": [], "aliases": [],
@ -274,13 +274,13 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby carrot", "name": "baby carrot",
"plural_name": "baby carrots" "plural_name": "babygulerødder"
}, },
"mixed vegetable": { "mixed vegetable": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed vegetable", "name": "blandede grøntsager",
"plural_name": "mixed vegetables" "plural_name": "blandede grøntsager"
}, },
"poblano pepper": { "poblano pepper": {
"aliases": [], "aliases": [],
@ -303,38 +303,38 @@
"cayenne pepper": { "cayenne pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cayenne pepper", "name": "cayennepeber",
"plural_name": "cayenne peppers" "plural_name": "cayennepeber"
}, },
"green tomato": { "green tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "green tomato", "name": "grøn tomat",
"plural_name": "green tomatoes" "plural_name": "grønne tomater"
}, },
"watercress": { "watercress": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "watercress", "name": "brøndkarse",
"plural_name": "watercress" "plural_name": "brøndkarse"
}, },
"iceberg": { "iceberg": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "iceberg", "name": "iceberg",
"plural_name": "icebergs" "plural_name": "iceberg"
}, },
"mashed potato": { "mashed potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mashed potato", "name": "kartoffelmos",
"plural_name": "mashed potatoes" "plural_name": "kartoffelmos"
}, },
"horseradish": { "horseradish": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "horseradish", "name": "peberrod",
"plural_name": "horseradishes" "plural_name": "peberrod"
}, },
"chard": { "chard": {
"aliases": [], "aliases": [],
@ -383,14 +383,14 @@
"water chestnut": { "water chestnut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "water chestnut", "name": "vand kastanje",
"plural_name": "water chestnuts" "plural_name": "vand kastanjer"
}, },
"turnip": { "turnip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turnip", "name": "majroe",
"plural_name": "turnips" "plural_name": "majroer"
}, },
"thai chile pepper": { "thai chile pepper": {
"aliases": [], "aliases": [],
@ -401,8 +401,8 @@
"bok choy": { "bok choy": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bok choy", "name": "pak choi",
"plural_name": "bok choy" "plural_name": "pak choi"
}, },
"okra": { "okra": {
"aliases": [], "aliases": [],
@ -419,8 +419,8 @@
"corn cob": { "corn cob": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "corn cob", "name": "majskolbe",
"plural_name": "corn cobs" "plural_name": "majskolber"
}, },
"radicchio": { "radicchio": {
"aliases": [], "aliases": [],
@ -505,14 +505,14 @@
"daikon": { "daikon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "daikon", "name": "kinaradise",
"plural_name": "daikons" "plural_name": "kinaradiser"
}, },
"baby corn": { "baby corn": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby corn", "name": "babymajs",
"plural_name": "baby corns" "plural_name": "babymajs"
}, },
"broccoli rabe": { "broccoli rabe": {
"aliases": [], "aliases": [],
@ -577,8 +577,8 @@
"frisee": { "frisee": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "frisee", "name": "friséesalat",
"plural_name": "frisees" "plural_name": "friséesalat"
}, },
"anaheim pepper": { "anaheim pepper": {
"aliases": [], "aliases": [],
@ -613,8 +613,8 @@
"pea shoot": { "pea shoot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pea shoot", "name": "ærteskud",
"plural_name": "pea shoots" "plural_name": "ærteskud"
}, },
"alfalfa": { "alfalfa": {
"aliases": [], "aliases": [],
@ -628,26 +628,26 @@
"foods": { "foods": {
"tomato": { "tomato": {
"aliases": [], "aliases": [],
"description": "Yes they are a fruit", "description": "Ja de er en frugt",
"name": "tomato", "name": "tomat",
"plural_name": "tomatoes" "plural_name": "tomater"
}, },
"lemon": { "lemon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lemon", "name": "citron",
"plural_name": "lemons" "plural_name": "citroner"
}, },
"lime": { "lime": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lime", "name": "limefrugt",
"plural_name": "limes" "plural_name": "limefrugter"
}, },
"apple": { "apple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "apple", "name": "æble",
"plural_name": "apples" "plural_name": "apples"
}, },
"banana": { "banana": {
@ -696,7 +696,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "coconut", "name": "coconut",
"plural_name": "coconuts" "plural_name": "kokosnødder"
}, },
"craisin": { "craisin": {
"aliases": [], "aliases": [],
@ -707,80 +707,80 @@
"pear": { "pear": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pear", "name": "pære",
"plural_name": "pears" "plural_name": "pærer"
}, },
"grape": { "grape": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "grape", "name": "drue",
"plural_name": "grapes" "plural_name": "vindruer"
}, },
"pomegranate": { "pomegranate": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pomegranate", "name": "granatæble",
"plural_name": "pomegranates" "plural_name": "pomegranates"
}, },
"watermelon": { "watermelon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "watermelon", "name": "vandmelon",
"plural_name": "watermelons" "plural_name": "vandmeloner"
}, },
"rhubarb": { "rhubarb": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rhubarb", "name": "rabarber",
"plural_name": "rhubarbs" "plural_name": "rabarber"
}, },
"dried apricot": { "dried apricot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried apricot", "name": "tørret abrikos",
"plural_name": "dried apricots" "plural_name": "tørrede abrikoser"
}, },
"kiwi": { "kiwi": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kiwi", "name": "kiwifrugt",
"plural_name": "kiwis" "plural_name": "kiwifrugter"
}, },
"grapefruit": { "grapefruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "grapefruit", "name": "grapefrugt",
"plural_name": "grapefruits" "plural_name": "grapefrugter"
}, },
"plum": { "plum": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "plum", "name": "blomme",
"plural_name": "plums" "plural_name": "blommer"
}, },
"fig": { "fig": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "fig", "name": "figne",
"plural_name": "figs" "plural_name": "figner"
}, },
"apricot": { "apricot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "apricot", "name": "abrikos",
"plural_name": "apricots" "plural_name": "abrikoser"
}, },
"currant": { "currant": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "currant", "name": "solbær",
"plural_name": "currants" "plural_name": "solbær"
}, },
"mandarin": { "mandarin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mandarin", "name": "mandarin",
"plural_name": "mandarins" "plural_name": "mandariner"
}, },
"prune": { "prune": {
"aliases": [], "aliases": [],

View file

@ -3724,7 +3724,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "Latik", "name": "Latik",
"plural_name": "latiks" "plural_name": "Latik"
}, },
"rice cream": { "rice cream": {
"aliases": [], "aliases": [],
@ -4039,8 +4039,8 @@
"ham steak": { "ham steak": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "ham steak", "name": "Schinkensteak",
"plural_name": "ham steaks" "plural_name": "Schinkensteaks"
}, },
"venison": { "venison": {
"aliases": [], "aliases": [],
@ -4196,13 +4196,13 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "Bauchspeck", "name": "Bauchspeck",
"plural_name": "back bacons" "plural_name": "Rückenspeck"
}, },
"salt pork": { "salt pork": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "Gepökeltes Schweinefleisch", "name": "Gepökeltes Schweinefleisch",
"plural_name": "salt porks" "plural_name": "Gepökeltes Schweinefleisch"
}, },
"veal shank": { "veal shank": {
"aliases": [], "aliases": [],
@ -4273,8 +4273,8 @@
"ground bison": { "ground bison": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "ground bison", "name": "Bison-Hackfleisch",
"plural_name": "ground bisons" "plural_name": "Bison-Hackfleisch"
}, },
"fresh sausage": { "fresh sausage": {
"aliases": [], "aliases": [],
@ -4433,8 +4433,8 @@
"turkey bacon": { "turkey bacon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "Truthahnspeck", "name": "Putenspeck",
"plural_name": "turkey bacons" "plural_name": "Putenspeck"
}, },
"duck": { "duck": {
"aliases": [], "aliases": [],
@ -4469,8 +4469,8 @@
"deli turkey": { "deli turkey": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "deli turkey", "name": "Puten-Aufschnitt",
"plural_name": "deli turkeys" "plural_name": "Puten-Aufschnitt"
}, },
"smoked turkey": { "smoked turkey": {
"aliases": [], "aliases": [],
@ -4482,7 +4482,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "Putenfleisch", "name": "Putenfleisch",
"plural_name": "turkey meats" "plural_name": "Putenfleisch"
}, },
"chicken quarter": { "chicken quarter": {
"aliases": [], "aliases": [],
@ -4535,8 +4535,8 @@
"turkey pepperoni": { "turkey pepperoni": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turkey pepperoni", "name": "Puten-Peperonisalami",
"plural_name": "turkey pepperonis" "plural_name": "Puten-Peperonisalami"
}, },
"turkey ham": { "turkey ham": {
"aliases": [], "aliases": [],
@ -4601,8 +4601,8 @@
"turkey burger": { "turkey burger": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turkey burger", "name": "Puten-Burger",
"plural_name": "turkey burgers" "plural_name": "Puten-Burger"
}, },
"chicken andouille": { "chicken andouille": {
"aliases": [], "aliases": [],
@ -4619,8 +4619,8 @@
"smoked turkey leg": { "smoked turkey leg": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "smoked turkey leg", "name": "geräucherte Putenkeule",
"plural_name": "smoked turkey legs" "plural_name": "geräucherte Putenkeulen"
}, },
"chicken italian sausage": { "chicken italian sausage": {
"aliases": [], "aliases": [],
@ -4661,14 +4661,14 @@
"chicken foot": { "chicken foot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chicken foot", "name": "Hühnerfuß",
"plural_name": "chicken feet" "plural_name": "Hühnerfüße"
}, },
"pulled chicken": { "pulled chicken": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pulled chicken", "name": "Pulled Chicken",
"plural_name": "pulled chickens" "plural_name": "Pulled Chicken"
}, },
"deli chicken": { "deli chicken": {
"aliases": [], "aliases": [],
@ -4679,7 +4679,7 @@
"smoked duck breast": { "smoked duck breast": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "smoked duck breast", "name": "geräucherte Entenbrust",
"plural_name": "smoked duck breasts" "plural_name": "smoked duck breasts"
}, },
"pigeon": { "pigeon": {
@ -4715,8 +4715,8 @@
"roast duck": { "roast duck": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "roast duck", "name": "Entenbraten",
"plural_name": "roast ducks" "plural_name": "Entenbraten"
}, },
"chicken meatball": { "chicken meatball": {
"aliases": [], "aliases": [],
@ -4733,8 +4733,8 @@
"guinea fowl": { "guinea fowl": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "guinea fowl", "name": "Perlhuhn",
"plural_name": "guinea fowls" "plural_name": "Perlhühner"
}, },
"smoked turkey wing": { "smoked turkey wing": {
"aliases": [], "aliases": [],
@ -4787,8 +4787,8 @@
"turkey roast": { "turkey roast": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turkey roast", "name": "Putenbraten",
"plural_name": "turkey roasts" "plural_name": "Putenbraten"
}, },
"capon": { "capon": {
"aliases": [], "aliases": [],
@ -4799,8 +4799,8 @@
"smoked turkey bacon": { "smoked turkey bacon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "smoked turkey bacon", "name": "geräucherter Putenspeck",
"plural_name": "smoked turkey bacons" "plural_name": "geräucherter Putenspeck"
}, },
"chicken bacon": { "chicken bacon": {
"aliases": [], "aliases": [],
@ -4811,8 +4811,8 @@
"turkey rissole": { "turkey rissole": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turkey rissole", "name": "Puten-Frikadelle",
"plural_name": "turkey rissoles" "plural_name": "Puten-Frikadellen"
}, },
"chicken kebab": { "chicken kebab": {
"aliases": [], "aliases": [],
@ -4847,26 +4847,26 @@
"duck bacon": { "duck bacon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "duck bacon", "name": "Entenspeck",
"plural_name": "duck bacons" "plural_name": "Entenspeck"
}, },
"pulled turkey": { "pulled turkey": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pulled turkey", "name": "Pulled Turkey",
"plural_name": "pulled turkeys" "plural_name": "Pulled Turkey"
}, },
"chicken gyro": { "chicken gyro": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chicken gyro", "name": "Hähnchen-Gyros",
"plural_name": "chicken gyros" "plural_name": "Hähnchen-Gyros"
}, },
"chicken patty": { "chicken patty": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chicken patty", "name": "Hähnchen-Patty",
"plural_name": "chicken patties" "plural_name": "Hähnchen-Patties"
}, },
"chicken rib": { "chicken rib": {
"aliases": [], "aliases": [],
@ -4877,8 +4877,8 @@
"turkey tail": { "turkey tail": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turkey tail", "name": "Truthahnschwanz",
"plural_name": "turkey tails" "plural_name": "Truthahnschwänze"
}, },
"chicken milanesa": { "chicken milanesa": {
"aliases": [], "aliases": [],
@ -5440,7 +5440,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "Echter Bonito", "name": "Echter Bonito",
"plural_name": "Echte Bonito" "plural_name": "Echte Boniten"
}, },
"bottarga": { "bottarga": {
"aliases": [], "aliases": [],
@ -5469,8 +5469,8 @@
"tiny fish": { "tiny fish": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "tiny fish", "name": "Kleinfisch",
"plural_name": "tiny fish" "plural_name": "Kleinfische"
}, },
"tuna belly": { "tuna belly": {
"aliases": [], "aliases": [],
@ -5497,20 +5497,20 @@
"shrimp": { "shrimp": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "Shrimp", "name": "Garnele",
"plural_name": "Shrimps" "plural_name": "Garnelen"
}, },
"octopuse": { "octopuse": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "Tintenfische", "name": "Oktopus",
"plural_name": "Tintenfische" "plural_name": "Oktopusse"
}, },
"prawn": { "prawn": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "Garnele", "name": "Riesengarnele",
"plural_name": "Garnelen" "plural_name": "Riesengarnelen"
}, },
"crab": { "crab": {
"aliases": [], "aliases": [],
@ -5575,8 +5575,8 @@
"octopu": { "octopu": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "octopu", "name": "Oktopus",
"plural_name": "octopus" "plural_name": "Oktopusse"
}, },
"kombu": { "kombu": {
"aliases": [], "aliases": [],
@ -5587,116 +5587,116 @@
"dried shrimp": { "dried shrimp": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried shrimp", "name": "getrocknete Garnele",
"plural_name": "dried shrimps" "plural_name": "getrocknete Garnelen"
}, },
"bay scallop": { "bay scallop": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bay scallop", "name": "Karibik-Kammmuschel",
"plural_name": "bay scallops" "plural_name": "Karibik-Kammmuscheln"
}, },
"wakame": { "wakame": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "wakame", "name": "Wakame",
"plural_name": "wakames" "plural_name": "Wakame"
}, },
"soft-shell crab": { "soft-shell crab": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "soft-shell crab", "name": "Butterkrebs",
"plural_name": "soft-shell crabs" "plural_name": "Butterkrebse"
}, },
"scampi": { "scampi": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "scampi", "name": "Scampi",
"plural_name": "scampis" "plural_name": "Scampi"
}, },
"king crab": { "king crab": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "king crab", "name": "Königskrabbe",
"plural_name": "king crabs" "plural_name": "Königskrabben"
}, },
"mixed seafood": { "mixed seafood": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed seafood", "name": "gemischte Meeresfrüchte",
"plural_name": "mixed seafoods" "plural_name": "gemischte Meeresfrüchte"
}, },
"baby squid": { "baby squid": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby squid", "name": "Calamaretti",
"plural_name": "baby squids" "plural_name": "Calamaretti"
}, },
"squid ink": { "squid ink": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "squid ink", "name": "Sepiatinte",
"plural_name": "squid inks" "plural_name": "Sepiatinten"
}, },
"dried prawn": { "dried prawn": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried prawn", "name": "getrocknete Garnele",
"plural_name": "dried prawns" "plural_name": "getrocknete Garnelen"
}, },
"dulse seaweed": { "dulse seaweed": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dulse seaweed", "name": "Lappentang",
"plural_name": "dulse seaweeds" "plural_name": "Lappentang"
}, },
"roasted seaweed": { "roasted seaweed": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "roasted seaweed", "name": "gerösteter Seetang",
"plural_name": "roasted seaweeds" "plural_name": "gerösteter Seetang"
}, },
"smoked oyster": { "smoked oyster": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "smoked oyster", "name": "geräucherte Auster",
"plural_name": "smoked oysters" "plural_name": "geräucherte Austern"
}, },
"kelp": { "kelp": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kelp", "name": "Seetang",
"plural_name": "kelps" "plural_name": "Seetang"
}, },
"kizami nori": { "kizami nori": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kizami nori", "name": "Kizami Nori",
"plural_name": "kizami noris" "plural_name": "Kizami Nori"
}, },
"hijiki": { "hijiki": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "hijiki", "name": "Hijiki",
"plural_name": "hijikis" "plural_name": "Hijiki"
}, },
"salted shrimp": { "salted shrimp": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "salted shrimp", "name": "gesalzene Garnele",
"plural_name": "salted shrimps" "plural_name": "gesalzene Garnelen"
}, },
"yaki-nori": { "yaki-nori": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yaki-nori", "name": "Yaki Nori",
"plural_name": "yaki-noris" "plural_name": "Yaki Nori"
}, },
"conch": { "conch": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "conch", "name": "Meeresschnecke",
"plural_name": "conches" "plural_name": "Meeresschnecken"
}, },
"arame": { "arame": {
"aliases": [], "aliases": [],
@ -5707,8 +5707,8 @@
"calamari steak": { "calamari steak": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "calamari steak", "name": "Tintenfischtube",
"plural_name": "calamari steaks" "plural_name": "Tintenfischtuben"
}, },
"mud crab": { "mud crab": {
"aliases": [], "aliases": [],
@ -5761,32 +5761,32 @@
"prepared crab cake": { "prepared crab cake": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "prepared crab cake", "name": "Fertig-Crab Cake",
"plural_name": "prepared crab cakes" "plural_name": "Fertig-Crab Cakes"
}, },
"sea lettuce": { "sea lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sea lettuce", "name": "Ulva",
"plural_name": "sea lettuces" "plural_name": "Ulva"
}, },
"korean seaweed": { "korean seaweed": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "korean seaweed", "name": "Gim",
"plural_name": "korean seaweeds" "plural_name": "Gim"
}, },
"ogo seaweed": { "ogo seaweed": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "ogo seaweed", "name": "Hawai-Rotalge",
"plural_name": "ogo seaweeds" "plural_name": "Hawai-Rotalgen"
}, },
"seaweed caviar": { "seaweed caviar": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "seaweed caviar", "name": "Algen-Kaviar",
"plural_name": "seaweed caviars" "plural_name": "Algen-Kaviar"
}, },
"haddock": { "haddock": {
"aliases": [], "aliases": [],
@ -5933,8 +5933,8 @@
"panch puran": { "panch puran": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "panch puran", "name": "Panch Phoron",
"plural_name": "panch purans" "plural_name": "Panch Phoron"
}, },
"dill": { "dill": {
"aliases": [], "aliases": [],
@ -6023,8 +6023,8 @@
"curry leaf": { "curry leaf": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "curry leaf", "name": "Curryblatt",
"plural_name": "curry leaves" "plural_name": "Curryblätter"
}, },
"fennel seed": { "fennel seed": {
"aliases": [], "aliases": [],
@ -6035,8 +6035,8 @@
"tarragon": { "tarragon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "tarragon", "name": "Estragon",
"plural_name": "tarragons" "plural_name": "Estragon"
}, },
"saffron": { "saffron": {
"aliases": [], "aliases": [],
@ -6047,8 +6047,8 @@
"asafoetida": { "asafoetida": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "asafoetida", "name": "Asafoetida",
"plural_name": "asafoetidas" "plural_name": "Asafoetida"
}, },
"star anise": { "star anise": {
"aliases": [], "aliases": [],
@ -6071,8 +6071,8 @@
"caraway": { "caraway": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "caraway", "name": "Kümmel",
"plural_name": "caraways" "plural_name": "Kümmel"
}, },
"garlic granule": { "garlic granule": {
"aliases": [], "aliases": [],
@ -6107,8 +6107,8 @@
"onion flake": { "onion flake": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion flake", "name": "Zwiebelflocke",
"plural_name": "onion flakes" "plural_name": "Zwiebelflocken"
}, },
"matcha powder": { "matcha powder": {
"aliases": [], "aliases": [],
@ -6173,8 +6173,8 @@
"chervil": { "chervil": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chervil", "name": "Kerbel",
"plural_name": "chervils" "plural_name": "Kerbel"
}, },
"lavender": { "lavender": {
"aliases": [], "aliases": [],
@ -6185,8 +6185,8 @@
"carom seed": { "carom seed": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carom seed", "name": "Ajowan",
"plural_name": "carom seeds" "plural_name": "Ajowan"
}, },
"mexican oregano": { "mexican oregano": {
"aliases": [], "aliases": [],
@ -6215,7 +6215,7 @@
"dried chili": { "dried chili": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried chili", "name": "Getrocknete Chili",
"plural_name": "dried chilies" "plural_name": "dried chilies"
}, },
"black cardamom": { "black cardamom": {
@ -6245,8 +6245,8 @@
"hot paprika": { "hot paprika": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "hot paprika", "name": "Scharfe Paprika",
"plural_name": "hot paprikas" "plural_name": "Scharfe Paprikas"
}, },
"lemon thyme": { "lemon thyme": {
"aliases": [], "aliases": [],
@ -6371,14 +6371,14 @@
"vietnamese mint": { "vietnamese mint": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "vietnamese mint", "name": "Vietnamesische Minze",
"plural_name": "vietnamese mints" "plural_name": "vietnamese mints"
}, },
"dried orange peel": { "dried orange peel": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried orange peel", "name": "Getrocknete Orangenscheiben",
"plural_name": "dried orange peels" "plural_name": "Getrocknete Orangenscheiben"
}, },
"espelette pepper": { "espelette pepper": {
"aliases": [], "aliases": [],
@ -6737,7 +6737,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rice syrup", "name": "rice syrup",
"plural_name": "rice syrups" "plural_name": "Zuckerrohr-Sirup"
}, },
"manuka honey": { "manuka honey": {
"aliases": [], "aliases": [],
@ -6868,7 +6868,7 @@
"mango syrup": { "mango syrup": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mango syrup", "name": "Mango Sirup",
"plural_name": "mango syrups" "plural_name": "mango syrups"
}, },
"malt syrup": { "malt syrup": {
@ -7000,7 +7000,7 @@
"chocolate sugar": { "chocolate sugar": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chocolate sugar", "name": "Schokoladenzucker",
"plural_name": "chocolate sugars" "plural_name": "chocolate sugars"
}, },
"flavored syrup": { "flavored syrup": {
@ -7118,7 +7118,7 @@
"liquid smoke": { "liquid smoke": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "liquid smoke", "name": "flüssiger Rauch",
"plural_name": "liquid smokes" "plural_name": "liquid smokes"
}, },
"poultry seasoning": { "poultry seasoning": {
@ -7665,7 +7665,7 @@
"baking powder": { "baking powder": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baking powder", "name": "Backpulver",
"plural_name": "baking powders" "plural_name": "baking powders"
}, },
"baking soda": { "baking soda": {
@ -7739,7 +7739,7 @@
"gelatin": { "gelatin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "gelatin", "name": "Gelatine",
"plural_name": "gelatins" "plural_name": "gelatins"
}, },
"pastry flour": { "pastry flour": {
@ -8052,8 +8052,8 @@
"cinnamon chip": { "cinnamon chip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cinnamon chip", "name": "Zimt-Backchip",
"plural_name": "cinnamon chips" "plural_name": "Zimt-Backchips"
}, },
"agar agar": { "agar agar": {
"aliases": [], "aliases": [],
@ -8070,14 +8070,14 @@
"matzo meal": { "matzo meal": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "matzo meal", "name": "Matzemehl",
"plural_name": "matzo meals" "plural_name": "Matzemehle"
}, },
"sago": { "sago": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sago", "name": "Sago",
"plural_name": "sagos" "plural_name": "Sago"
}, },
"white baking chocolate": { "white baking chocolate": {
"aliases": [], "aliases": [],
@ -8088,8 +8088,8 @@
"cassava flour": { "cassava flour": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cassava flour", "name": "Maniokmehl",
"plural_name": "cassava flours" "plural_name": "Maniokmehle"
}, },
"whipped cream stabilizer": { "whipped cream stabilizer": {
"aliases": [], "aliases": [],
@ -8106,8 +8106,8 @@
"vital wheat gluten": { "vital wheat gluten": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "vital wheat gluten", "name": "Vital Weizengluten",
"plural_name": "vital wheat glutens" "plural_name": "Vital Weizenglutene"
}, },
"baking chip": { "baking chip": {
"aliases": [], "aliases": [],
@ -8118,74 +8118,74 @@
"meringue powder": { "meringue powder": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "meringue powder", "name": "Baiser-Pulver",
"plural_name": "meringue powders" "plural_name": "Baiser-Pulver"
}, },
"hazelnut flour": { "hazelnut flour": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "hazelnut flour", "name": "Haselnussmehl",
"plural_name": "hazelnut flours" "plural_name": "Haselnussmehle"
}, },
"citric acid": { "citric acid": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "citric acid", "name": "Zitronensäure",
"plural_name": "citric acids" "plural_name": "Zitronensäuren"
}, },
"coconut chip": { "coconut chip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "coconut chip", "name": "Kokoschip",
"plural_name": "coconut chips" "plural_name": "Kokoschips"
}, },
"quinoa flour": { "quinoa flour": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "quinoa flour", "name": "Quinoamehl",
"plural_name": "quinoa flours" "plural_name": "Quinoamehle"
}, },
"finger millet flour": { "finger millet flour": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "finger millet flour", "name": "Fingerhirsemehl",
"plural_name": "finger millet flours" "plural_name": "Fingerhirsemehle"
}, },
"fondant": { "fondant": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "fondant", "name": "Fondant",
"plural_name": "fondants" "plural_name": "Fondants"
}, },
"mint baking chip": { "mint baking chip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mint baking chip", "name": "Minze-Backchip",
"plural_name": "mint baking chips" "plural_name": "Minze-Backchips"
}, },
"angel food cake mix": { "angel food cake mix": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "angel food cake mix", "name": "Angel Food Cake-Mischung",
"plural_name": "angel food cake mixes" "plural_name": "Angel Food Cake-Mischungen"
}, },
"white cornmeal": { "white cornmeal": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "white cornmeal", "name": "weißes Maismehl",
"plural_name": "white cornmeals" "plural_name": "weiße Maismehle"
}, },
"millet flour": { "millet flour": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "millet flour", "name": "Hirsemehl",
"plural_name": "millet flours" "plural_name": "Hirsemehle"
}, },
"mincemeat": { "mincemeat": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mincemeat", "name": "Mincemeat",
"plural_name": "mincemeats" "plural_name": "Mincemeats"
}, },
"gluten-free baking flour": { "gluten-free baking flour": {
"aliases": [], "aliases": [],
@ -10294,8 +10294,8 @@
"crispy fried onion": { "crispy fried onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "crispy fried onion", "name": "Röstzwiebel",
"plural_name": "crispy fried onions" "plural_name": "Röstzwiebeln"
}, },
"matzo": { "matzo": {
"aliases": [], "aliases": [],
@ -10444,8 +10444,8 @@
"frozen onion ring": { "frozen onion ring": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "frozen onion ring", "name": "tiefgefrorener Zwiebelring",
"plural_name": "frozen onion rings" "plural_name": "tiefgefrorene Zwiebelringe"
}, },
"corn muffin": { "corn muffin": {
"aliases": [], "aliases": [],
@ -10528,8 +10528,8 @@
"prawn cracker": { "prawn cracker": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "prawn cracker", "name": "Krabbenchip",
"plural_name": "prawn crackers" "plural_name": "Krabbenchips"
}, },
"bao bun": { "bao bun": {
"aliases": [], "aliases": [],
@ -11898,8 +11898,8 @@
"onion marmalade": { "onion marmalade": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion marmalade", "name": "Zwiebelkonfitüre",
"plural_name": "onion marmalades" "plural_name": "Zwiebelkonfitüren"
}, },
"giardiniera": { "giardiniera": {
"aliases": [], "aliases": [],
@ -12148,8 +12148,8 @@
"canned tuna": { "canned tuna": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "canned tuna", "name": "Thunfisch in Dosen",
"plural_name": "canned tuna" "plural_name": "Thunfisch in Dosen"
}, },
"pickle": { "pickle": {
"aliases": [], "aliases": [],
@ -12916,8 +12916,8 @@
"turkey gravy": { "turkey gravy": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turkey gravy", "name": "Truthahn-Bratensauce",
"plural_name": "turkey gravies" "plural_name": "Truthahn-Bratensaucen"
}, },
"stir-fry sauce": { "stir-fry sauce": {
"aliases": [], "aliases": [],
@ -13712,8 +13712,8 @@
"turkey bone broth": { "turkey bone broth": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turkey bone broth", "name": "Puten-Knochenbrühe",
"plural_name": "turkey bone broths" "plural_name": "Puten-Knochenbrühe"
}, },
"anchovy stock": { "anchovy stock": {
"aliases": [], "aliases": [],
@ -15647,19 +15647,19 @@
"pepsi": { "pepsi": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pepsi", "name": "Pepsi",
"plural_name": "pepsis" "plural_name": "Pepsis"
}, },
"cherry soda": { "cherry soda": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry soda", "name": "Kirschlimonade",
"plural_name": "cherry sodas" "plural_name": "Kirschlimonaden"
}, },
"peppermint tea": { "peppermint tea": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "peppermint tea", "name": "Pfefferminztee",
"plural_name": "peppermint teas" "plural_name": "peppermint teas"
}, },
"sports drink": { "sports drink": {
@ -15729,8 +15729,8 @@
"protein powder": { "protein powder": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "protein powder", "name": "Proteinpulver",
"plural_name": "protein powders" "plural_name": "Proteinpulver"
}, },
"lemon extract": { "lemon extract": {
"aliases": [], "aliases": [],
@ -16155,7 +16155,7 @@
"vitamin d": { "vitamin d": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "vitamin d", "name": "Vitamin D",
"plural_name": "vitamin ds" "plural_name": "vitamin ds"
}, },
"calcium lactate": { "calcium lactate": {
@ -16233,7 +16233,7 @@
"thc": { "thc": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "thc", "name": "THC",
"plural_name": "thcs" "plural_name": "thcs"
}, },
"berry powder": { "berry powder": {
@ -16299,7 +16299,7 @@
"maltodextrin": { "maltodextrin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "maltodextrin", "name": "Maltodextrin",
"plural_name": "maltodextrins" "plural_name": "maltodextrins"
} }
} }

View file

@ -4,136 +4,136 @@
"garlic": { "garlic": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "ajo",
"plural_name": "garlics" "plural_name": "ajos"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion", "name": "cebolla",
"plural_name": "onions" "plural_name": "cebollas"
}, },
"bell pepper": { "bell pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bell pepper", "name": "morrón",
"plural_name": "bell peppers" "plural_name": "morrones"
}, },
"carrot": { "carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carrot", "name": "zanahoria",
"plural_name": "carrots" "plural_name": "zanahorias"
}, },
"scallion": { "scallion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "scallion", "name": "cebolletas",
"plural_name": "scallions" "plural_name": "cebolletas"
}, },
"zucchini": { "zucchini": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "zucchini", "name": "calabacín",
"plural_name": "zucchinis" "plural_name": "calabacines"
}, },
"potato": { "potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "potato", "name": "papa",
"plural_name": "potatoes" "plural_name": "papas"
}, },
"red onion": { "red onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red onion", "name": "cebolla colorada",
"plural_name": "red onions" "plural_name": "cebollas coloradas"
}, },
"yellow onion": { "yellow onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yellow onion", "name": "cebolla amarilla",
"plural_name": "yellow onions" "plural_name": "cebollas amarillas"
}, },
"celery": { "celery": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celery", "name": "apio",
"plural_name": "celeries" "plural_name": "apios"
}, },
"jalapeno": { "jalapeno": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "jalapeno", "name": "jalapeño",
"plural_name": "jalapenoes" "plural_name": "jalapeños"
}, },
"avocado": { "avocado": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "avocado", "name": "palta",
"plural_name": "avocados" "plural_name": "paltas"
}, },
"shallot": { "shallot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "shallot", "name": "cebolleta",
"plural_name": "shallots" "plural_name": "cebolletas"
}, },
"cherry tomato": { "cherry tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry tomato", "name": "tomate cherry",
"plural_name": "cherry tomatoes" "plural_name": "tomates cherry"
}, },
"cucumber": { "cucumber": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cucumber", "name": "pepino",
"plural_name": "cucumbers" "plural_name": "pepinos"
}, },
"spinach": { "spinach": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spinach", "name": "espinaca",
"plural_name": "spinaches" "plural_name": "espinacas"
}, },
"sweet corn": { "sweet corn": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet corn", "name": "maíz dulce",
"plural_name": "sweet corns" "plural_name": "maíz dulce"
}, },
"chile pepper": { "chile pepper": {
"aliases": [ "aliases": [
"capsicum" "morrones"
], ],
"description": "", "description": "",
"name": "chile pepper", "name": "ají picante",
"plural_name": "chile peppers" "plural_name": "ajies picantes"
}, },
"sweet potato": { "sweet potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet potato", "name": "boniato",
"plural_name": "sweet potatoes" "plural_name": "boniatos"
}, },
"broccoli": { "broccoli": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "broccoli", "name": "brócoli",
"plural_name": "broccolis" "plural_name": "brócolis"
}, },
"heart of palm": { "heart of palm": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "heart of palm", "name": "palmito",
"plural_name": "heart of palms" "plural_name": "palmitos"
}, },
"baby green": { "baby green": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby green", "name": "hoja tierna",
"plural_name": "baby greens" "plural_name": "hojas tiernas"
}, },
"pumpkin": { "pumpkin": {
"aliases": [], "aliases": [],
@ -285,38 +285,38 @@
"poblano pepper": { "poblano pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "poblano pepper", "name": "morrón verde",
"plural_name": "poblano peppers" "plural_name": "morrones verdes"
}, },
"sweet pepper": { "sweet pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet pepper", "name": "pimienta dulce",
"plural_name": "sweet peppers" "plural_name": "pimientas dulces"
}, },
"serrano pepper": { "serrano pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "serrano pepper", "name": "chile serrano",
"plural_name": "serrano peppers" "plural_name": "chiles serranos"
}, },
"cayenne pepper": { "cayenne pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cayenne pepper", "name": "pimienta de cayena",
"plural_name": "cayenne peppers" "plural_name": "pimienta de cayena"
}, },
"green tomato": { "green tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "green tomato", "name": "tomate verde",
"plural_name": "green tomatoes" "plural_name": "tomates verdes"
}, },
"watercress": { "watercress": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "watercress", "name": "berro",
"plural_name": "watercress" "plural_name": "berros"
}, },
"iceberg": { "iceberg": {
"aliases": [], "aliases": [],
@ -327,38 +327,38 @@
"mashed potato": { "mashed potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mashed potato", "name": "puré de papa",
"plural_name": "mashed potatoes" "plural_name": "puré de papa"
}, },
"horseradish": { "horseradish": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "horseradish", "name": "rabanito",
"plural_name": "horseradishes" "plural_name": "rabanitos"
}, },
"chard": { "chard": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chard", "name": "acelga",
"plural_name": "chards" "plural_name": "acelgas"
}, },
"pimiento": { "pimiento": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pimiento", "name": "ají",
"plural_name": "pimientoes" "plural_name": "ajíes"
}, },
"spaghetti squash": { "spaghetti squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spaghetti squash", "name": "cabello de ángel",
"plural_name": "spaghetti squashes" "plural_name": "cabellos de ángeles"
}, },
"butter lettuce": { "butter lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "butter lettuce", "name": "lechuga de manteca",
"plural_name": "butter lettuces" "plural_name": "lechuga de manteca"
}, },
"hash brown": { "hash brown": {
"aliases": [], "aliases": [],
@ -371,32 +371,32 @@
"chinese leaves" "chinese leaves"
], ],
"description": "", "description": "",
"name": "napa cabbage", "name": "repollo",
"plural_name": "napa cabbages" "plural_name": "repollos"
}, },
"celeriac": { "celeriac": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celeriac", "name": "apio",
"plural_name": "celeriacs" "plural_name": "apios"
}, },
"water chestnut": { "water chestnut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "water chestnut", "name": "castaño de agua",
"plural_name": "water chestnuts" "plural_name": "castaños de agua"
}, },
"turnip": { "turnip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turnip", "name": "nabo",
"plural_name": "turnips" "plural_name": "nabos"
}, },
"thai chile pepper": { "thai chile pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "thai chile pepper", "name": "chile ojo de pájaro",
"plural_name": "thai chile peppers" "plural_name": "chiles ojo de pájaro"
}, },
"bok choy": { "bok choy": {
"aliases": [], "aliases": [],
@ -407,31 +407,31 @@
"okra": { "okra": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "okra", "name": "abelmosco",
"plural_name": "okra" "plural_name": "abelmosco"
}, },
"acorn squash": { "acorn squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "acorn squash", "name": "calabaza bellota",
"plural_name": "acorn squashes" "plural_name": "calabazas bellota"
}, },
"corn cob": { "corn cob": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "corn cob", "name": "maíz",
"plural_name": "corn cobs" "plural_name": "maíces"
}, },
"radicchio": { "radicchio": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "radicchio", "name": "repollo colorado",
"plural_name": "radicchio" "plural_name": "repollo colorado"
}, },
"pearl onion": { "pearl onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pearl onion", "name": "cebolla perla",
"plural_name": "pearl onions" "plural_name": "pearl onions"
}, },
"tenderstem broccoli": { "tenderstem broccoli": {
@ -566,55 +566,55 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "fresno chile", "name": "fresno chile",
"plural_name": "fresno chiles" "plural_name": "chile fresno"
}, },
"delicata squash": { "delicata squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "delicata squash", "name": "calabaza delicata",
"plural_name": "delicata squashes" "plural_name": "calabazas delicata"
}, },
"frisee": { "frisee": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "frisee", "name": "lechuga rizada",
"plural_name": "frisees" "plural_name": "lechuga rizada"
}, },
"anaheim pepper": { "anaheim pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "anaheim pepper", "name": "chile anaheim",
"plural_name": "anaheim peppers" "plural_name": "chile anaheim"
}, },
"cres": { "cres": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cres", "name": "brote",
"plural_name": "cress" "plural_name": "brotes"
}, },
"broccoli slaw": { "broccoli slaw": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "broccoli slaw", "name": "brócoli",
"plural_name": "broccoli slaws" "plural_name": "brócolis"
}, },
"arbol chile pepper": { "arbol chile pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "arbol chile pepper", "name": "pimienta de arbol",
"plural_name": "arbol chile peppers" "plural_name": "pimienta de arbol"
}, },
"golden beet": { "golden beet": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "golden beet", "name": "remolacha dorada",
"plural_name": "golden beets" "plural_name": "remolacha dorada"
}, },
"pea shoot": { "pea shoot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pea shoot", "name": "brote de guisante",
"plural_name": "pea shoots" "plural_name": "brotes de guisante"
}, },
"alfalfa": { "alfalfa": {
"aliases": [], "aliases": [],
@ -628,27 +628,27 @@
"foods": { "foods": {
"tomato": { "tomato": {
"aliases": [], "aliases": [],
"description": "Yes they are a fruit", "description": "Sí, son una fruta",
"name": "tomato", "name": "tomate",
"plural_name": "tomatoes" "plural_name": "tomates"
}, },
"lemon": { "lemon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lemon", "name": "limón",
"plural_name": "lemons" "plural_name": "limones"
}, },
"lime": { "lime": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lime", "name": "lima",
"plural_name": "limes" "plural_name": "limas"
}, },
"apple": { "apple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "apple", "name": "manzana",
"plural_name": "apples" "plural_name": "manzanas"
}, },
"banana": { "banana": {
"aliases": [], "aliases": [],
@ -659,62 +659,62 @@
"orange": { "orange": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "orange", "name": "naranja",
"plural_name": "oranges" "plural_name": "naranjas"
}, },
"raisin": { "raisin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "raisin", "name": "pasa",
"plural_name": "raisins" "plural_name": "pasas"
}, },
"pineapple": { "pineapple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pineapple", "name": "piña",
"plural_name": "pineapples" "plural_name": "piñas"
}, },
"mango": { "mango": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mango", "name": "mango",
"plural_name": "mangoes" "plural_name": "mangos"
}, },
"peach": { "peach": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "peach", "name": "durazno",
"plural_name": "peaches" "plural_name": "duraznos"
}, },
"date": { "date": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "date", "name": "fecha",
"plural_name": "dates" "plural_name": "fechas"
}, },
"coconut": { "coconut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "coconut", "name": "coco",
"plural_name": "coconuts" "plural_name": "cocos"
}, },
"craisin": { "craisin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "craisin", "name": "arándano rojo",
"plural_name": "craisins" "plural_name": "arándanos rojos"
}, },
"pear": { "pear": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pear", "name": "pera",
"plural_name": "pears" "plural_name": "peras"
}, },
"grape": { "grape": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "grape", "name": "uva",
"plural_name": "grapes" "plural_name": "uvas"
}, },
"pomegranate": { "pomegranate": {
"aliases": [], "aliases": [],
@ -869,128 +869,128 @@
"melon": { "melon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "melon", "name": "melón",
"plural_name": "melons" "plural_name": "melones"
}, },
"tangerine": { "tangerine": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "tangerine", "name": "mandarina",
"plural_name": "tangerines" "plural_name": "mandarinas"
}, },
"dried mango": { "dried mango": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried mango", "name": "mango seco",
"plural_name": "dried mangoes" "plural_name": "mangos secos"
}, },
"dried apple": { "dried apple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried apple", "name": "manzana seca",
"plural_name": "dried apples" "plural_name": "manzanas secas"
}, },
"quince": { "quince": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "quince", "name": "membrillo",
"plural_name": "quinces" "plural_name": "membrillos"
}, },
"guava": { "guava": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "guava", "name": "guayaba",
"plural_name": "guavas" "plural_name": "guayabas"
}, },
"banana chip": { "banana chip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "banana chip", "name": "chip de banana",
"plural_name": "banana chips" "plural_name": "chips de banana"
}, },
"kumquat": { "kumquat": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kumquat", "name": "naranjo enano",
"plural_name": "kumquats" "plural_name": "naranjos enanos"
}, },
"jackfruit": { "jackfruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "jackfruit", "name": "yaca",
"plural_name": "jackfruits" "plural_name": "yaca"
}, },
"dragon fruit": { "dragon fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dragon fruit", "name": "fruta del dragón",
"plural_name": "dragon fruits" "plural_name": "frutas del dragón"
}, },
"mixed fruit": { "mixed fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed fruit", "name": "fruta mixta",
"plural_name": "mixed fruits" "plural_name": "frutas mixtas"
}, },
"asian pear": { "asian pear": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "asian pear", "name": "pera asiática",
"plural_name": "asian pears" "plural_name": "peras asiáticas"
}, },
"lychee": { "lychee": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lychee", "name": "lichi",
"plural_name": "lychees" "plural_name": "lichis"
}, },
"young coconut": { "young coconut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "young coconut", "name": "coco joven",
"plural_name": "young coconuts" "plural_name": "cocos jóvenes"
}, },
"kaffir lime": { "kaffir lime": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kaffir lime", "name": "lima kaffir",
"plural_name": "kaffir limes" "plural_name": "limas kaffir"
}, },
"star fruit": { "star fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "star fruit", "name": "carambola",
"plural_name": "star fruits" "plural_name": "carambolas"
}, },
"green papaya": { "green papaya": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "green papaya", "name": "papaya verde",
"plural_name": "green papayas" "plural_name": "papayas verdes"
}, },
"pomelo": { "pomelo": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pomelo", "name": "pomelo",
"plural_name": "pomeloes" "plural_name": "pomelos"
}, },
"chestnut puree": { "chestnut puree": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chestnut puree", "name": "puré de castañas",
"plural_name": "chestnut purees" "plural_name": "puré de castañas"
}, },
"prickly pear": { "prickly pear": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "prickly pear", "name": "pera espinosa",
"plural_name": "prickly pears" "plural_name": "peras espinosas"
}, },
"calamansi": { "calamansi": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "calamansi", "name": "calamondín",
"plural_name": "calamansis" "plural_name": "calamondines"
}, },
"yuzu": { "yuzu": {
"aliases": [], "aliases": [],
@ -1007,14 +1007,14 @@
"apple chip": { "apple chip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "apple chip", "name": "chip de manzana",
"plural_name": "apple chips" "plural_name": "chips de manzana"
}, },
"mixed peel": { "mixed peel": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed peel", "name": "cáscara mixta",
"plural_name": "mixed peels" "plural_name": "cáscara mixta"
}, },
"kokum": { "kokum": {
"aliases": [], "aliases": [],
@ -1169,14 +1169,14 @@
"fig leaf": { "fig leaf": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "fig leaf", "name": "hoja de higuera",
"plural_name": "fig leaves" "plural_name": "hojas de higuera"
}, },
"freeze-dried pineapple": { "freeze-dried pineapple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "freeze-dried pineapple", "name": "piña secada por congelación",
"plural_name": "freeze-dried pineapples" "plural_name": "piñas secadas por congelación"
}, },
"pluot": { "pluot": {
"aliases": [], "aliases": [],
@ -1193,26 +1193,26 @@
"hog plum": { "hog plum": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "hog plum", "name": "ciruela de cerdo",
"plural_name": "hog plums" "plural_name": "ciruelas de cerdo"
}, },
"bergamot orange": { "bergamot orange": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bergamot orange", "name": "bergamota",
"plural_name": "bergamot oranges" "plural_name": "bergamotas"
}, },
"luo han guo": { "luo han guo": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "luo han guo", "name": "fruto del monje",
"plural_name": "luo han guos" "plural_name": "frutos del monje"
}, },
"mamey": { "mamey": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mamey", "name": "mamao",
"plural_name": "mameys" "plural_name": "mamaos"
}, },
"sapote": { "sapote": {
"aliases": [], "aliases": [],
@ -1223,14 +1223,14 @@
"green ume plum": { "green ume plum": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "green ume plum", "name": "ciruela verde",
"plural_name": "green ume plums" "plural_name": "ciruelas verdes"
}, },
"kiwano": { "kiwano": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kiwano", "name": "kiwano",
"plural_name": "kiwanoes" "plural_name": "kiwanos"
} }
} }
}, },
@ -1239,26 +1239,26 @@
"button mushroom": { "button mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "button mushroom", "name": "champiñón",
"plural_name": "button mushrooms" "plural_name": "champiñones"
}, },
"shiitake mushroom": { "shiitake mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "shiitake mushroom", "name": "hongo shiitake",
"plural_name": "shiitake mushrooms" "plural_name": "hongos shiitake"
}, },
"portobello mushroom": { "portobello mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "portobello mushroom", "name": "hongo portobello",
"plural_name": "portobello mushrooms" "plural_name": "hongos portobello"
}, },
"wild mushroom": { "wild mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "wild mushroom", "name": "hongos silvestre",
"plural_name": "wild mushrooms" "plural_name": "hongos silvestre"
}, },
"porcini": { "porcini": {
"aliases": [], "aliases": [],
@ -1269,56 +1269,56 @@
"mixed mushroom": { "mixed mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed mushroom", "name": "hongos mixtos",
"plural_name": "mixed mushrooms" "plural_name": "hongos mixtos"
}, },
"oyster mushroom": { "oyster mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "oyster mushroom", "name": "champiñón blanco",
"plural_name": "oyster mushrooms" "plural_name": "champiñón blanco"
}, },
"chestnut mushroom": { "chestnut mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chestnut mushroom", "name": "champiñón de castaño",
"plural_name": "chestnut mushrooms" "plural_name": "champiñones de castaño"
}, },
"enoki mushroom": { "enoki mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "enoki mushroom", "name": "hongo enoki",
"plural_name": "enoki mushrooms" "plural_name": "hongos enoki"
}, },
"black fungu": { "black fungu": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "black fungu", "name": "hongo negro",
"plural_name": "black fungus" "plural_name": "hongos negros"
}, },
"black truffle": { "black truffle": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "black truffle", "name": "trufa negra",
"plural_name": "black truffles" "plural_name": "trufas negras"
}, },
"morel mushroom": { "morel mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "morel mushroom", "name": "hongo morel",
"plural_name": "morel mushrooms" "plural_name": "hongos morel"
}, },
"field mushroom": { "field mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "field mushroom", "name": "hongo de campo",
"plural_name": "field mushrooms" "plural_name": "hongos de campo"
}, },
"king oyster mushroom": { "king oyster mushroom": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "king oyster mushroom", "name": "hongo de ostra rey",
"plural_name": "king oyster mushrooms" "plural_name": "hongos de ostra rey"
}, },
"shimeji mushroom": { "shimeji mushroom": {
"aliases": [], "aliases": [],
@ -1477,56 +1477,56 @@
"cherry": { "cherry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry", "name": "cereza",
"plural_name": "cherries" "plural_name": "cerezas"
}, },
"blackberry": { "blackberry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "blackberry", "name": "mora",
"plural_name": "blackberries" "plural_name": "moras"
}, },
"berry mix": { "berry mix": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "berry mix", "name": "mix de baya",
"plural_name": "berry mixes" "plural_name": "mix de bayas"
}, },
"maraschino cherry": { "maraschino cherry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "maraschino cherry", "name": "cereza maraschino",
"plural_name": "maraschino cherries" "plural_name": "cerezas maraschino"
}, },
"dried cherry": { "dried cherry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried cherry", "name": "cereza seca",
"plural_name": "dried cherries" "plural_name": "cerezas secas"
}, },
"juniper berry": { "juniper berry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "juniper berry", "name": "baya de enebro",
"plural_name": "juniper berries" "plural_name": "bayas de enebro"
}, },
"sour cherry": { "sour cherry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sour cherry", "name": "cereza agria",
"plural_name": "sour cherries" "plural_name": "cerezas agrias"
}, },
"goji berry": { "goji berry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "goji berry", "name": "baya goji",
"plural_name": "goji berries" "plural_name": "bayas goji"
}, },
"dried blueberry": { "dried blueberry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried blueberry", "name": "arándano seco",
"plural_name": "dried blueberries" "plural_name": "arándanos secos"
}, },
"freeze-dried strawberry": { "freeze-dried strawberry": {
"aliases": [], "aliases": [],

View file

@ -1901,8 +1901,8 @@
"candlenut": { "candlenut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "candlenut", "name": "kemirinoot",
"plural_name": "candlenuts" "plural_name": "kemirinoten"
}, },
"peanut brittle": { "peanut brittle": {
"aliases": [], "aliases": [],
@ -1919,14 +1919,14 @@
"honey-roasted almond": { "honey-roasted almond": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "honey-roasted almond", "name": "geroosterde amandel met honing",
"plural_name": "honey-roasted almonds" "plural_name": "geroosterde amandels met honing"
}, },
"toasted nut": { "toasted nut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "toasted nut", "name": "geroosterde noot",
"plural_name": "toasted nuts" "plural_name": "geroosterde noten"
}, },
"chironji": { "chironji": {
"aliases": [], "aliases": [],
@ -1937,8 +1937,8 @@
"honey-roasted pecan": { "honey-roasted pecan": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "honey-roasted pecan", "name": "geroosterde pecannoot met honing",
"plural_name": "honey-roasted pecans" "plural_name": "geroosterde pecannoten met honing"
}, },
"tigernut": { "tigernut": {
"aliases": [], "aliases": [],
@ -2088,13 +2088,13 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pecorino", "name": "pecorino",
"plural_name": "pecorinoes" "plural_name": "pecorino's"
}, },
"gruyere": { "gruyere": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "gruyere", "name": "gruyère",
"plural_name": "gruyeres" "plural_name": "gruyères"
}, },
"mascarpone": { "mascarpone": {
"aliases": [], "aliases": [],
@ -2190,7 +2190,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "halloumi", "name": "halloumi",
"plural_name": "halloumis" "plural_name": "halloumi's"
}, },
"chevre": { "chevre": {
"aliases": [], "aliases": [],
@ -2226,7 +2226,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "burrata", "name": "burrata",
"plural_name": "burratas" "plural_name": "burrata's"
}, },
"havarti": { "havarti": {
"aliases": [], "aliases": [],
@ -2243,8 +2243,8 @@
"grana-padano": { "grana-padano": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "grana-padano", "name": "grana padano",
"plural_name": "grana-padanoes" "plural_name": "grana padano's"
}, },
"muenster": { "muenster": {
"aliases": [], "aliases": [],
@ -2328,7 +2328,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kaaspoeder", "name": "kaaspoeder",
"plural_name": "cheese powders" "plural_name": "kaaspoeders"
}, },
"fromage blanc": { "fromage blanc": {
"aliases": [], "aliases": [],
@ -2406,7 +2406,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "comté", "name": "comté",
"plural_name": "comtés" "plural_name": "comté's"
}, },
"graviera": { "graviera": {
"aliases": [], "aliases": [],
@ -2424,7 +2424,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "scamorza", "name": "scamorza",
"plural_name": "scamorzas" "plural_name": "scamorza's"
}, },
"cambozola": { "cambozola": {
"aliases": [], "aliases": [],
@ -2613,20 +2613,20 @@
"butter": { "butter": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "butter", "name": "boter",
"plural_name": "butter" "plural_name": "boters"
}, },
"egg": { "egg": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "egg", "name": "ei",
"plural_name": "eggs" "plural_name": "eieren"
}, },
"milk": { "milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "milk", "name": "melk",
"plural_name": "milks" "plural_name": "melk"
}, },
"heavy cream": { "heavy cream": {
"aliases": [], "aliases": [],
@ -2637,8 +2637,8 @@
"sour cream": { "sour cream": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sour cream", "name": "zure room",
"plural_name": "sour creams" "plural_name": "zure room"
}, },
"buttermilk": { "buttermilk": {
"aliases": [], "aliases": [],
@ -2649,26 +2649,26 @@
"yogurt": { "yogurt": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yogurt", "name": "yoghurt",
"plural_name": "yogurts" "plural_name": "yoghurts"
}, },
"greek yogurt": { "greek yogurt": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "greek yogurt", "name": "griekse yoghurt",
"plural_name": "greek yogurts" "plural_name": "griekse yoghurts"
}, },
"cream": { "cream": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cream", "name": "room",
"plural_name": "creams" "plural_name": "room"
}, },
"whipped cream": { "whipped cream": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "whipped cream", "name": "slagroom",
"plural_name": "whipped creams" "plural_name": "slagroom"
}, },
"ghee": { "ghee": {
"aliases": [ "aliases": [
@ -2687,8 +2687,8 @@
"condensed milk": { "condensed milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "condensed milk", "name": "gecondenseerde melk",
"plural_name": "condensed milks" "plural_name": "gecondenseerde melk"
}, },
"half and half": { "half and half": {
"aliases": [], "aliases": [],
@ -2705,8 +2705,8 @@
"ice cream": { "ice cream": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "ice cream", "name": "roomijs",
"plural_name": "ice creams" "plural_name": "roomijsjes"
}, },
"margarine": { "margarine": {
"aliases": [], "aliases": [],
@ -2717,20 +2717,20 @@
"creme fraiche": { "creme fraiche": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "creme fraiche", "name": "crème fraîche",
"plural_name": "creme fraiches" "plural_name": "crème fraîches"
}, },
"frosting": { "frosting": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "frosting", "name": "glazuur",
"plural_name": "frostings" "plural_name": "glazuren"
}, },
"milk powder": { "milk powder": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "milk powder", "name": "melkpoeder",
"plural_name": "milk powders" "plural_name": "melkpoeders"
}, },
"curd": { "curd": {
"aliases": [], "aliases": [],
@ -2765,8 +2765,8 @@
"chocolate frosting": { "chocolate frosting": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chocolate frosting", "name": "chocolade glazuur",
"plural_name": "chocolate frostings" "plural_name": "chocolade glazuren"
}, },
"kefir": { "kefir": {
"aliases": [], "aliases": [],
@ -2783,8 +2783,8 @@
"chocolate milk": { "chocolate milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chocolate milk", "name": "chocolade melk",
"plural_name": "chocolate milks" "plural_name": "chocolade melk"
}, },
"liquid egg substitute": { "liquid egg substitute": {
"aliases": [], "aliases": [],
@ -2849,8 +2849,8 @@
"goat milk": { "goat milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "goat milk", "name": "geitenmelk",
"plural_name": "goat milks" "plural_name": "geitenmelk"
}, },
"cheese curd": { "cheese curd": {
"aliases": [], "aliases": [],
@ -2861,8 +2861,8 @@
"sour milk": { "sour milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sour milk", "name": "zure melk",
"plural_name": "sour milks" "plural_name": "zure melk"
}, },
"ganache": { "ganache": {
"aliases": [], "aliases": [],
@ -2879,14 +2879,14 @@
"duck egg": { "duck egg": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "duck egg", "name": "eendenei",
"plural_name": "duck eggs" "plural_name": "eendeneieren"
}, },
"salted egg": { "salted egg": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "salted egg", "name": "gezout ei",
"plural_name": "salted eggs" "plural_name": "gezoute eieren"
}, },
"skyr": { "skyr": {
"aliases": [], "aliases": [],
@ -3077,8 +3077,8 @@
"sheep milk": { "sheep milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sheep milk", "name": "schapenmelk",
"plural_name": "sheep milks" "plural_name": "schapenmelk"
}, },
"starter culture": { "starter culture": {
"aliases": [], "aliases": [],
@ -3095,8 +3095,8 @@
"ostrich egg": { "ostrich egg": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "ostrich egg", "name": "struisvogelei",
"plural_name": "ostrich eggs" "plural_name": "struisvogeleieren"
}, },
"vanilla milk": { "vanilla milk": {
"aliases": [], "aliases": [],
@ -3135,14 +3135,14 @@
"coconut milk": { "coconut milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "coconut milk", "name": "kokosmelk",
"plural_name": "coconut milks" "plural_name": "kokosmelk"
}, },
"almond milk": { "almond milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "almond milk", "name": "amandelmelk",
"plural_name": "almond milks" "plural_name": "amandelmelk"
}, },
"almond butter": { "almond butter": {
"aliases": [], "aliases": [],
@ -3177,8 +3177,8 @@
"soy milk": { "soy milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "soy milk", "name": "sojamelk",
"plural_name": "soy milks" "plural_name": "sojamelk"
}, },
"extra firm tofu": { "extra firm tofu": {
"aliases": [], "aliases": [],

View file

@ -4,313 +4,313 @@
"garlic": { "garlic": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "чеснок",
"plural_name": "garlics" "plural_name": "чеснока"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion", "name": "лук",
"plural_name": "onions" "plural_name": "лука"
}, },
"bell pepper": { "bell pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bell pepper", "name": "болгарский перец",
"plural_name": "bell peppers" "plural_name": "болгарских перца"
}, },
"carrot": { "carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carrot", "name": "морковь",
"plural_name": "carrots" "plural_name": "моркови"
}, },
"scallion": { "scallion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "scallion", "name": "зелёный лук",
"plural_name": "scallions" "plural_name": "зелёного лука"
}, },
"zucchini": { "zucchini": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "цукини", "name": "цукини",
"plural_name": "zucchinis" "plural_name": "цукини"
}, },
"potato": { "potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "potato", "name": "картофель",
"plural_name": "potatoes" "plural_name": "картофеля"
}, },
"red onion": { "red onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red onion", "name": "красный лук",
"plural_name": "red onions" "plural_name": "красного лука"
}, },
"yellow onion": { "yellow onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yellow onion", "name": "жёлтый лук",
"plural_name": "yellow onions" "plural_name": "жёлтого лука"
}, },
"celery": { "celery": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celery", "name": "сельдерей",
"plural_name": "celeries" "plural_name": "сельдерея"
}, },
"jalapeno": { "jalapeno": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "jalapeno", "name": "халапеньо",
"plural_name": "jalapenoes" "plural_name": "халапеньо"
}, },
"avocado": { "avocado": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "avocado", "name": "авокадо",
"plural_name": "avocados" "plural_name": "авокадо"
}, },
"shallot": { "shallot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "shallot", "name": "шалот",
"plural_name": "shallots" "plural_name": "шалот"
}, },
"cherry tomato": { "cherry tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry tomato", "name": "помидор Черри",
"plural_name": "cherry tomatoes" "plural_name": "помидоры Черри"
}, },
"cucumber": { "cucumber": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cucumber", "name": "огурец",
"plural_name": "cucumbers" "plural_name": "огурцы"
}, },
"spinach": { "spinach": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spinach", "name": "шпинат",
"plural_name": "spinaches" "plural_name": "шпинат"
}, },
"sweet corn": { "sweet corn": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet corn", "name": "сладкая кукуруза",
"plural_name": "sweet corns" "plural_name": "сладкая кукуруза"
}, },
"chile pepper": { "chile pepper": {
"aliases": [ "aliases": [
"capsicum" "стручковый перец"
], ],
"description": "", "description": "",
"name": "chile pepper", "name": "перец чили",
"plural_name": "chile peppers" "plural_name": "перца чили"
}, },
"sweet potato": { "sweet potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet potato", "name": "батат",
"plural_name": "sweet potatoes" "plural_name": "батат"
}, },
"broccoli": { "broccoli": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "broccoli", "name": "брокколи",
"plural_name": "broccolis" "plural_name": "брокколи"
}, },
"heart of palm": { "heart of palm": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "heart of palm", "name": "сердце пальмы",
"plural_name": "heart of palms" "plural_name": "сердец пальмы"
}, },
"baby green": { "baby green": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby green", "name": "молодая зелень",
"plural_name": "baby greens" "plural_name": "молодая зелень"
}, },
"pumpkin": { "pumpkin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pumpkin", "name": "тыква",
"plural_name": "pumpkins" "plural_name": "тыквы"
}, },
"cauliflower": { "cauliflower": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cauliflower", "name": "цветная капуста",
"plural_name": "cauliflowers" "plural_name": "цветной капусты"
}, },
"cabbage": { "cabbage": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cabbage", "name": "капуста",
"plural_name": "cabbages" "plural_name": "капуста"
}, },
"asparagu": { "asparagu": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "asparagu", "name": "спаржа",
"plural_name": "asparagus" "plural_name": "спаржа"
}, },
"kale": { "kale": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kale", "name": "кудрявая капуста",
"plural_name": "kales" "plural_name": "кудрявая капуста"
}, },
"arugula": { "arugula": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "arugula", "name": "руккола",
"plural_name": "arugulas" "plural_name": "руккола"
}, },
"leek": { "leek": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "leek", "name": "лук-порей",
"plural_name": "leeks" "plural_name": "лук-порей"
}, },
"eggplant": { "eggplant": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "eggplant", "name": "баклажан",
"plural_name": "eggplants" "plural_name": "баклажаны"
}, },
"lettuce": { "lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lettuce", "name": "салат - латук",
"plural_name": "lettuces" "plural_name": "салат - латук"
}, },
"butternut squash": { "butternut squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "butternut squash", "name": "мускатная тыква",
"plural_name": "butternut squashes" "plural_name": "мускатная тыква"
}, },
"romaine": { "romaine": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "romaine", "name": "римский салат",
"plural_name": "romaines" "plural_name": "римский салат"
}, },
"beetroot": { "beetroot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "beetroot", "name": "свёкла",
"plural_name": "beetroots" "plural_name": "свёклы"
}, },
"brussels sprout": { "brussels sprout": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "brussels sprout", "name": "брюссельская капуста",
"plural_name": "brussels sprouts" "plural_name": "брюссельская капуста"
}, },
"fennel": { "fennel": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "fennel", "name": "фенхель",
"plural_name": "fennels" "plural_name": "фенхель"
}, },
"sun dried tomato": { "sun dried tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sun dried tomato", "name": "вяленый помидор",
"plural_name": "sun dried tomatoes" "plural_name": "вяленые помидоры"
}, },
"radish": { "radish": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "radish", "name": "редис",
"plural_name": "radishes" "plural_name": "редис"
}, },
"red cabbage": { "red cabbage": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red cabbage", "name": "красная капуста",
"plural_name": "red cabbages" "plural_name": "красная капуста"
}, },
"artichoke": { "artichoke": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "artichoke", "name": "артишок",
"plural_name": "artichokes" "plural_name": "артишоки"
}, },
"new potato": { "new potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "new potato", "name": "молодой картофель",
"plural_name": "new potatoes" "plural_name": "молодой картофель"
}, },
"summer squash": { "summer squash": {
"aliases": [ "aliases": [
"courgette", "кабачок",
"gem squash" "гем-сквош"
], ],
"description": "", "description": "",
"name": "summer squash", "name": "молодой кабачок",
"plural_name": "summer squashes" "plural_name": "молодой кабачок"
}, },
"mixed green": { "mixed green": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed green", "name": "смешанная зелень",
"plural_name": "mixed greens" "plural_name": "смешанная зелень"
}, },
"parsnip": { "parsnip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "parsnip", "name": "пастернак",
"plural_name": "parsnips" "plural_name": "пастернаки"
}, },
"baby carrot": { "baby carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby carrot", "name": "беби-морковь",
"plural_name": "baby carrots" "plural_name": "беби-морковь"
}, },
"mixed vegetable": { "mixed vegetable": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed vegetable", "name": "овощная смесь",
"plural_name": "mixed vegetables" "plural_name": "овощная смесь"
}, },
"poblano pepper": { "poblano pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "poblano pepper", "name": "перец поблано",
"plural_name": "poblano peppers" "plural_name": "перец поблано"
}, },
"sweet pepper": { "sweet pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet pepper", "name": "сладкий перец",
"plural_name": "sweet peppers" "plural_name": "сладкие перцы"
}, },
"serrano pepper": { "serrano pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "serrano pepper", "name": "перец серрано",
"plural_name": "serrano peppers" "plural_name": "перец серрано"
}, },
"cayenne pepper": { "cayenne pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cayenne pepper", "name": "кайенский перец",
"plural_name": "cayenne peppers" "plural_name": "кайенский перец"
}, },
"green tomato": { "green tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "green tomato", "name": "зелёный томат",
"plural_name": "green tomatoes" "plural_name": "зелёные томаты"
}, },
"watercress": { "watercress": {
"aliases": [], "aliases": [],
@ -321,76 +321,76 @@
"iceberg": { "iceberg": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "iceberg", "name": "салат айсберг",
"plural_name": "icebergs" "plural_name": "салат айсберг"
}, },
"mashed potato": { "mashed potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mashed potato", "name": "картофельное пюре",
"plural_name": "mashed potatoes" "plural_name": "картофельное пюре"
}, },
"horseradish": { "horseradish": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "horseradish", "name": "хрен",
"plural_name": "horseradishes" "plural_name": "хрен"
}, },
"chard": { "chard": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chard", "name": "мангольд",
"plural_name": "chards" "plural_name": "мангольд"
}, },
"pimiento": { "pimiento": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pimiento", "name": "пимиенто",
"plural_name": "pimientoes" "plural_name": "пимиенто"
}, },
"spaghetti squash": { "spaghetti squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spaghetti squash", "name": "тыква-спагетти",
"plural_name": "spaghetti squashes" "plural_name": "тыква-спагетти"
}, },
"butter lettuce": { "butter lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "butter lettuce", "name": "баттерхед",
"plural_name": "butter lettuces" "plural_name": "баттерхед"
}, },
"hash brown": { "hash brown": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "hash brown", "name": "хашбраун",
"plural_name": "hash browns" "plural_name": "хашбраун"
}, },
"napa cabbage": { "napa cabbage": {
"aliases": [ "aliases": [
"chinese leaves" "китайские листья"
], ],
"description": "", "description": "",
"name": "napa cabbage", "name": "пекинская капуста",
"plural_name": "napa cabbages" "plural_name": "пекинская капуста"
}, },
"celeriac": { "celeriac": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celeriac", "name": "корень сельдерея",
"plural_name": "celeriacs" "plural_name": "корень сельдерея"
}, },
"water chestnut": { "water chestnut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "water chestnut", "name": "болотница сладкая",
"plural_name": "water chestnuts" "plural_name": "болотница сладкая"
}, },
"turnip": { "turnip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turnip", "name": "репа",
"plural_name": "turnips" "plural_name": "репа"
}, },
"thai chile pepper": { "thai chile pepper": {
"aliases": [], "aliases": [],
@ -450,153 +450,153 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "leaf lettuce", "name": "leaf lettuce",
"plural_name": "leaf lettuces" "plural_name": "листовой салат"
}, },
"pepperoncini": { "pepperoncini": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pepperoncini", "name": "пеперончини",
"plural_name": "pepperoncinis" "plural_name": "пеперончини"
}, },
"baby bok choy": { "baby bok choy": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby bok choy", "name": "молодой бок‑чой",
"plural_name": "baby bok choys" "plural_name": "молодой бок‑чой"
}, },
"jicama": { "jicama": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "jicama", "name": "хикама",
"plural_name": "jicamas" "plural_name": "хикама"
}, },
"endive": { "endive": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "endive", "name": "эндивий(цикорий-салатный)",
"plural_name": "endives" "plural_name": "эндивий(цикорий-салатный)"
}, },
"habanero pepper": { "habanero pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "habanero pepper", "name": "перец хабанеро",
"plural_name": "habanero peppers" "plural_name": "перец хабанеро"
}, },
"corn husk": { "corn husk": {
"aliases": [ "aliases": [
"maize" "кукуруза"
], ],
"description": "", "description": "",
"name": "corn husk", "name": "кукурузная шелуха",
"plural_name": "corn husks" "plural_name": "кукурузная шелуха"
}, },
"collard green": { "collard green": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "collard green", "name": "листовая капуста",
"plural_name": "collard greens" "plural_name": "листовая капуста"
}, },
"french-fried onion": { "french-fried onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "french-fried onion", "name": "хрустящий жареный лук",
"plural_name": "french-fried onions" "plural_name": "хрустящий жареный лук"
}, },
"daikon": { "daikon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "daikon", "name": "дайкон",
"plural_name": "daikons" "plural_name": "дайкон"
}, },
"baby corn": { "baby corn": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby corn", "name": "молодая кукуруза",
"plural_name": "baby corns" "plural_name": "молодая кукуруза"
}, },
"broccoli rabe": { "broccoli rabe": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "broccoli rabe", "name": "рапини",
"plural_name": "broccoli rabes" "plural_name": "рапини"
}, },
"rutabaga": { "rutabaga": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rutabaga", "name": "брюква",
"plural_name": "rutabagas" "plural_name": "брюква"
}, },
"belgian endive": { "belgian endive": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "belgian endive", "name": "витлуф",
"plural_name": "belgian endives" "plural_name": "витлуф"
}, },
"yam": { "yam": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yam", "name": "ямс",
"plural_name": "yams" "plural_name": "ямс"
}, },
"ancho chile pepper": { "ancho chile pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "ancho chile pepper", "name": "перец анчо",
"plural_name": "ancho chile peppers" "plural_name": "перец анчо"
}, },
"microgreen": { "microgreen": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "microgreen", "name": "микрозелень",
"plural_name": "microgreens" "plural_name": "микрозелень"
}, },
"boston lettuce": { "boston lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "boston lettuce", "name": "салат Бостон",
"plural_name": "boston lettuces" "plural_name": "салат Бостон"
}, },
"kohlrabi": { "kohlrabi": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kohlrabi", "name": "кольраби",
"plural_name": "kohlrabis" "plural_name": "кольраби"
}, },
"fresno chile": { "fresno chile": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "fresno chile", "name": "чили Фресно",
"plural_name": "fresno chiles" "plural_name": "чили Фресно"
}, },
"delicata squash": { "delicata squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "delicata squash", "name": "деликатная тыква",
"plural_name": "delicata squashes" "plural_name": "деликатная тыква"
}, },
"frisee": { "frisee": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "frisee", "name": "фрисе",
"plural_name": "frisees" "plural_name": "фрисе"
}, },
"anaheim pepper": { "anaheim pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "anaheim pepper", "name": "перец анахайм",
"plural_name": "anaheim peppers" "plural_name": "перец анахайм"
}, },
"cres": { "cres": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cres", "name": "кресс-салат",
"plural_name": "cress" "plural_name": "кресс-салат"
}, },
"broccoli slaw": { "broccoli slaw": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "broccoli slaw", "name": "брокколи слоу",
"plural_name": "broccoli slaws" "plural_name": "брокколи слоу"
}, },
"arbol chile pepper": { "arbol chile pepper": {
"aliases": [], "aliases": [],
@ -750,156 +750,156 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "grapefruit", "name": "grapefruit",
"plural_name": "grapefruits" "plural_name": "грейпфрут"
}, },
"plum": { "plum": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "plum", "name": "слива",
"plural_name": "plums" "plural_name": "сливы"
}, },
"fig": { "fig": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "fig", "name": "инжир",
"plural_name": "figs" "plural_name": "инжир"
}, },
"apricot": { "apricot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "apricot", "name": "абрикос",
"plural_name": "apricots" "plural_name": "абрикосы"
}, },
"currant": { "currant": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "currant", "name": "смородина",
"plural_name": "currants" "plural_name": "смородина"
}, },
"mandarin": { "mandarin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mandarin", "name": "мандарин",
"plural_name": "mandarins" "plural_name": "мандарины"
}, },
"prune": { "prune": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "prune", "name": "чернослив",
"plural_name": "prunes" "plural_name": "чернослив"
}, },
"cantaloupe": { "cantaloupe": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cantaloupe", "name": "канталупа",
"plural_name": "cantaloupes" "plural_name": "канталупа"
}, },
"sultana": { "sultana": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sultana", "name": "кишмиш Султанина",
"plural_name": "sultanas" "plural_name": "кишмиш Султанина"
}, },
"passion fruit": { "passion fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "passion fruit", "name": "маракуйя",
"plural_name": "passion fruits" "plural_name": "маракуйя"
}, },
"papaya": { "papaya": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "papaya", "name": "папайя",
"plural_name": "papayas" "plural_name": "папайя"
}, },
"tamarind": { "tamarind": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "tamarind", "name": "тамаринд",
"plural_name": "tamarinds" "plural_name": "тамаринд"
}, },
"nectarine": { "nectarine": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "nectarine", "name": "нектарин",
"plural_name": "nectarines" "plural_name": "нектарины"
}, },
"dried fig": { "dried fig": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried fig", "name": "сушёный инжир",
"plural_name": "dried figs" "plural_name": "сушёный инжир"
}, },
"chestnut": { "chestnut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chestnut", "name": "каштан",
"plural_name": "chestnuts" "plural_name": "каштаны"
}, },
"meyer lemon": { "meyer lemon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "meyer lemon", "name": "мейер лимон",
"plural_name": "meyer lemons" "plural_name": "мейер лимоны"
}, },
"honeydew melon": { "honeydew melon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "honeydew melon", "name": "медовая дыня",
"plural_name": "honeydew melons" "plural_name": "медовые дыни"
}, },
"dried fruit": { "dried fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried fruit", "name": "сухофрукт",
"plural_name": "dried fruits" "plural_name": "сухофрукты"
}, },
"clementine": { "clementine": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "clementine", "name": "клементин",
"plural_name": "clementines" "plural_name": "клементин"
}, },
"persimmon": { "persimmon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "persimmon", "name": "хурма персимон",
"plural_name": "persimmons" "plural_name": "хурма персимон"
}, },
"melon": { "melon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "melon", "name": "дыня",
"plural_name": "melons" "plural_name": "дыни"
}, },
"tangerine": { "tangerine": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "tangerine", "name": "танжерин",
"plural_name": "tangerines" "plural_name": "танжерины"
}, },
"dried mango": { "dried mango": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried mango", "name": "сушёное манго",
"plural_name": "dried mangoes" "plural_name": "сушёное манго"
}, },
"dried apple": { "dried apple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried apple", "name": "сушёное яблоко",
"plural_name": "dried apples" "plural_name": "сушёные яблоки"
}, },
"quince": { "quince": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "quince", "name": "айва",
"plural_name": "quinces" "plural_name": "айва"
}, },
"guava": { "guava": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "guava", "name": "гуава",
"plural_name": "guavas" "plural_name": "guavas"
}, },
"banana chip": { "banana chip": {

View file

@ -1,6 +1,8 @@
import html
import json import json
import pathlib import pathlib
from dataclasses import dataclass from dataclasses import dataclass
from typing import Any
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from fastapi import Depends, FastAPI, Response from fastapi import Depends, FastAPI, Response
@ -24,6 +26,9 @@ class MetaTag:
property_name: str property_name: str
content: str content: str
def __post_init__(self):
self.content = escape(self.content) # escape HTML to prevent XSS attacks
class SPAStaticFiles(StaticFiles): class SPAStaticFiles(StaticFiles):
async def get_response(self, path: str, scope): async def get_response(self, path: str, scope):
@ -42,6 +47,17 @@ __app_settings = get_app_settings()
__contents = "" __contents = ""
def escape(content: Any) -> Any:
if isinstance(content, str):
return html.escape(content)
elif isinstance(content, list | tuple | set):
return [escape(item) for item in content]
elif isinstance(content, dict):
return {escape(k): escape(v) for k, v in content.items()}
else:
return content
def inject_meta(contents: str, tags: list[MetaTag]) -> str: def inject_meta(contents: str, tags: list[MetaTag]) -> str:
soup = BeautifulSoup(contents, "lxml") soup = BeautifulSoup(contents, "lxml")
scraped_meta_tags = soup.find_all("meta") scraped_meta_tags = soup.find_all("meta")
@ -80,15 +96,13 @@ def content_with_meta(group_slug: str, recipe: Recipe) -> str:
# Inject meta tags # Inject meta tags
recipe_url = f"{__app_settings.BASE_URL}/g/{group_slug}/r/{recipe.slug}" recipe_url = f"{__app_settings.BASE_URL}/g/{group_slug}/r/{recipe.slug}"
if recipe.image: if recipe.image:
image_url = ( image_url = f"{__app_settings.BASE_URL}/api/media/recipes/{recipe.id}/images/original.webp?version={escape(recipe.image)}"
f"{__app_settings.BASE_URL}/api/media/recipes/{recipe.id}/images/original.webp?version={recipe.image}"
)
else: else:
image_url = "https://raw.githubusercontent.com/mealie-recipes/mealie/9571816ac4eed5beacfc0abf6c03eff1427fd0eb/frontend/static/icons/android-chrome-512x512.png" image_url = "https://raw.githubusercontent.com/mealie-recipes/mealie/9571816ac4eed5beacfc0abf6c03eff1427fd0eb/frontend/static/icons/android-chrome-512x512.png"
ingredients: list[str] = [] ingredients: list[str] = []
if recipe.settings.disable_amount: # type: ignore if recipe.settings.disable_amount: # type: ignore
ingredients = [i.note for i in recipe.recipe_ingredient if i.note] ingredients = [escape(i.note) for i in recipe.recipe_ingredient if i.note]
else: else:
for ing in recipe.recipe_ingredient: for ing in recipe.recipe_ingredient:
@ -102,25 +116,30 @@ def content_with_meta(group_slug: str, recipe: Recipe) -> str:
if ing.note: if ing.note:
s += f"{ing.note}" s += f"{ing.note}"
ingredients.append(s) ingredients.append(escape(s))
nutrition: dict[str, str | None] = recipe.nutrition.model_dump(by_alias=True) if recipe.nutrition else {} nutrition: dict[str, str | None] = recipe.nutrition.model_dump(by_alias=True) if recipe.nutrition else {}
for k, v in nutrition.items():
if v:
nutrition[k] = escape(v)
as_schema_org = { as_schema_org: dict[str, Any] = {
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "Recipe", "@type": "Recipe",
"name": recipe.name, "name": escape(recipe.name),
"description": recipe.description, "description": escape(recipe.description),
"image": [image_url], "image": [image_url],
"datePublished": recipe.created_at, "datePublished": recipe.created_at,
"prepTime": recipe.prep_time, "prepTime": escape(recipe.prep_time),
"cookTime": recipe.cook_time, "cookTime": escape(recipe.cook_time),
"totalTime": recipe.total_time, "totalTime": escape(recipe.total_time),
"recipeYield": recipe.recipe_yield_display, "recipeYield": escape(recipe.recipe_yield_display),
"recipeIngredient": ingredients, "recipeIngredient": ingredients,
"recipeInstructions": [i.text for i in recipe.recipe_instructions] if recipe.recipe_instructions else [], "recipeInstructions": [escape(i.text) for i in recipe.recipe_instructions]
"recipeCategory": [c.name for c in recipe.recipe_category] if recipe.recipe_category else [], if recipe.recipe_instructions
"keywords": [t.name for t in recipe.tags] if recipe.tags else [], else [],
"recipeCategory": [escape(c.name) for c in recipe.recipe_category] if recipe.recipe_category else [],
"keywords": [escape(t.name) for t in recipe.tags] if recipe.tags else [],
"nutrition": nutrition, "nutrition": nutrition,
} }

387
poetry.lock generated
View file

@ -14,14 +14,14 @@ files = [
[[package]] [[package]]
name = "alembic" name = "alembic"
version = "1.16.2" version = "1.16.4"
description = "A database migration tool for SQLAlchemy." description = "A database migration tool for SQLAlchemy."
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "alembic-1.16.2-py3-none-any.whl", hash = "sha256:5f42e9bd0afdbd1d5e3ad856c01754530367debdebf21ed6894e34af52b3bb03"}, {file = "alembic-1.16.4-py3-none-any.whl", hash = "sha256:b05e51e8e82efc1abd14ba2af6392897e145930c3e0a2faf2b0da2f7f7fd660d"},
{file = "alembic-1.16.2.tar.gz", hash = "sha256:e53c38ff88dadb92eb22f8b150708367db731d58ad7e9d417c9168ab516cbed8"}, {file = "alembic-1.16.4.tar.gz", hash = "sha256:efab6ada0dd0fae2c92060800e0bf5c1dc26af15a10e02fb4babff164b4725e2"},
] ]
[package.dependencies] [package.dependencies]
@ -126,14 +126,14 @@ files = [
[[package]] [[package]]
name = "authlib" name = "authlib"
version = "1.6.0" version = "1.6.1"
description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients." description = "The ultimate Python library in building OAuth and OpenID Connect servers and clients."
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "authlib-1.6.0-py2.py3-none-any.whl", hash = "sha256:91685589498f79e8655e8a8947431ad6288831d643f11c55c2143ffcc738048d"}, {file = "authlib-1.6.1-py2.py3-none-any.whl", hash = "sha256:e9d2031c34c6309373ab845afc24168fe9e93dc52d252631f52642f21f5ed06e"},
{file = "authlib-1.6.0.tar.gz", hash = "sha256:4367d32031b7af175ad3a323d571dc7257b7099d55978087ceae4a0d88cd3210"}, {file = "authlib-1.6.1.tar.gz", hash = "sha256:4dffdbb1460ba6ec8c17981a4c67af7d8af131231b5a36a88a1e8c80c111cdfd"},
] ]
[package.dependencies] [package.dependencies]
@ -478,79 +478,79 @@ markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\""}
[[package]] [[package]]
name = "coverage" name = "coverage"
version = "7.9.1" version = "7.9.2"
description = "Code coverage measurement for Python" description = "Code coverage measurement for Python"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["dev"] groups = ["dev"]
files = [ files = [
{file = "coverage-7.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc94d7c5e8423920787c33d811c0be67b7be83c705f001f7180c7b186dcf10ca"}, {file = "coverage-7.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:66283a192a14a3854b2e7f3418d7db05cdf411012ab7ff5db98ff3b181e1f912"},
{file = "coverage-7.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16aa0830d0c08a2c40c264cef801db8bc4fc0e1892782e45bcacbd5889270509"}, {file = "coverage-7.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4e01d138540ef34fcf35c1aa24d06c3de2a4cffa349e29a10056544f35cca15f"},
{file = "coverage-7.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf95981b126f23db63e9dbe4cf65bd71f9a6305696fa5e2262693bc4e2183f5b"}, {file = "coverage-7.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f22627c1fe2745ee98d3ab87679ca73a97e75ca75eb5faee48660d060875465f"},
{file = "coverage-7.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f05031cf21699785cd47cb7485f67df619e7bcdae38e0fde40d23d3d0210d3c3"}, {file = "coverage-7.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b1c2d8363247b46bd51f393f86c94096e64a1cf6906803fa8d5a9d03784bdbf"},
{file = "coverage-7.9.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb4fbcab8764dc072cb651a4bcda4d11fb5658a1d8d68842a862a6610bd8cfa3"}, {file = "coverage-7.9.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c10c882b114faf82dbd33e876d0cbd5e1d1ebc0d2a74ceef642c6152f3f4d547"},
{file = "coverage-7.9.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0f16649a7330ec307942ed27d06ee7e7a38417144620bb3d6e9a18ded8a2d3e5"}, {file = "coverage-7.9.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:de3c0378bdf7066c3988d66cd5232d161e933b87103b014ab1b0b4676098fa45"},
{file = "coverage-7.9.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cea0a27a89e6432705fffc178064503508e3c0184b4f061700e771a09de58187"}, {file = "coverage-7.9.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1e2f097eae0e5991e7623958a24ced3282676c93c013dde41399ff63e230fcf2"},
{file = "coverage-7.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e980b53a959fa53b6f05343afbd1e6f44a23ed6c23c4b4c56c6662bbb40c82ce"}, {file = "coverage-7.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28dc1f67e83a14e7079b6cea4d314bc8b24d1aed42d3582ff89c0295f09b181e"},
{file = "coverage-7.9.1-cp310-cp310-win32.whl", hash = "sha256:70760b4c5560be6ca70d11f8988ee6542b003f982b32f83d5ac0b72476607b70"}, {file = "coverage-7.9.2-cp310-cp310-win32.whl", hash = "sha256:bf7d773da6af9e10dbddacbf4e5cab13d06d0ed93561d44dae0188a42c65be7e"},
{file = "coverage-7.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:a66e8f628b71f78c0e0342003d53b53101ba4e00ea8dabb799d9dba0abbbcebe"}, {file = "coverage-7.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:0c0378ba787681ab1897f7c89b415bd56b0b2d9a47e5a3d8dc0ea55aac118d6c"},
{file = "coverage-7.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:95c765060e65c692da2d2f51a9499c5e9f5cf5453aeaf1420e3fc847cc060582"}, {file = "coverage-7.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a7a56a2964a9687b6aba5b5ced6971af308ef6f79a91043c05dd4ee3ebc3e9ba"},
{file = "coverage-7.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba383dc6afd5ec5b7a0d0c23d38895db0e15bcba7fb0fa8901f245267ac30d86"}, {file = "coverage-7.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:123d589f32c11d9be7fe2e66d823a236fe759b0096f5db3fb1b75b2fa414a4fa"},
{file = "coverage-7.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae0383f13cbdcf1e5e7014489b0d71cc0106458878ccde52e8a12ced4298ed"}, {file = "coverage-7.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:333b2e0ca576a7dbd66e85ab402e35c03b0b22f525eed82681c4b866e2e2653a"},
{file = "coverage-7.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69aa417a030bf11ec46149636314c24c8d60fadb12fc0ee8f10fda0d918c879d"}, {file = "coverage-7.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:326802760da234baf9f2f85a39e4a4b5861b94f6c8d95251f699e4f73b1835dc"},
{file = "coverage-7.9.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4be2a28656afe279b34d4f91c3e26eccf2f85500d4a4ff0b1f8b54bf807338"}, {file = "coverage-7.9.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19e7be4cfec248df38ce40968c95d3952fbffd57b400d4b9bb580f28179556d2"},
{file = "coverage-7.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:382e7ddd5289f140259b610e5f5c58f713d025cb2f66d0eb17e68d0a94278875"}, {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0b4a4cb73b9f2b891c1788711408ef9707666501ba23684387277ededab1097c"},
{file = "coverage-7.9.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e5532482344186c543c37bfad0ee6069e8ae4fc38d073b8bc836fc8f03c9e250"}, {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2c8937fa16c8c9fbbd9f118588756e7bcdc7e16a470766a9aef912dd3f117dbd"},
{file = "coverage-7.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a39d18b3f50cc121d0ce3838d32d58bd1d15dab89c910358ebefc3665712256c"}, {file = "coverage-7.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:42da2280c4d30c57a9b578bafd1d4494fa6c056d4c419d9689e66d775539be74"},
{file = "coverage-7.9.1-cp311-cp311-win32.whl", hash = "sha256:dd24bd8d77c98557880def750782df77ab2b6885a18483dc8588792247174b32"}, {file = "coverage-7.9.2-cp311-cp311-win32.whl", hash = "sha256:14fa8d3da147f5fdf9d298cacc18791818f3f1a9f542c8958b80c228320e90c6"},
{file = "coverage-7.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:6b55ad10a35a21b8015eabddc9ba31eb590f54adc9cd39bcf09ff5349fd52125"}, {file = "coverage-7.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:549cab4892fc82004f9739963163fd3aac7a7b0df430669b75b86d293d2df2a7"},
{file = "coverage-7.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ad935f0016be24c0e97fc8c40c465f9c4b85cbbe6eac48934c0dc4d2568321e"}, {file = "coverage-7.9.2-cp311-cp311-win_arm64.whl", hash = "sha256:c2667a2b913e307f06aa4e5677f01a9746cd08e4b35e14ebcde6420a9ebb4c62"},
{file = "coverage-7.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8de12b4b87c20de895f10567639c0797b621b22897b0af3ce4b4e204a743626"}, {file = "coverage-7.9.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae9eb07f1cfacd9cfe8eaee6f4ff4b8a289a668c39c165cd0c8548484920ffc0"},
{file = "coverage-7.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5add197315a054e92cee1b5f686a2bcba60c4c3e66ee3de77ace6c867bdee7cb"}, {file = "coverage-7.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9ce85551f9a1119f02adc46d3014b5ee3f765deac166acf20dbb851ceb79b6f3"},
{file = "coverage-7.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600a1d4106fe66f41e5d0136dfbc68fe7200a5cbe85610ddf094f8f22e1b0300"}, {file = "coverage-7.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8f6389ac977c5fb322e0e38885fbbf901743f79d47f50db706e7644dcdcb6e1"},
{file = "coverage-7.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a876e4c3e5a2a1715a6608906aa5a2e0475b9c0f68343c2ada98110512ab1d8"}, {file = "coverage-7.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff0d9eae8cdfcd58fe7893b88993723583a6ce4dfbfd9f29e001922544f95615"},
{file = "coverage-7.9.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81f34346dd63010453922c8e628a52ea2d2ccd73cb2487f7700ac531b247c8a5"}, {file = "coverage-7.9.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fae939811e14e53ed8a9818dad51d434a41ee09df9305663735f2e2d2d7d959b"},
{file = "coverage-7.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:888f8eee13f2377ce86d44f338968eedec3291876b0b8a7289247ba52cb984cd"}, {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:31991156251ec202c798501e0a42bbdf2169dcb0f137b1f5c0f4267f3fc68ef9"},
{file = "coverage-7.9.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9969ef1e69b8c8e1e70d591f91bbc37fc9a3621e447525d1602801a24ceda898"}, {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d0d67963f9cbfc7c7f96d4ac74ed60ecbebd2ea6eeb51887af0f8dce205e545f"},
{file = "coverage-7.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60c458224331ee3f1a5b472773e4a085cc27a86a0b48205409d364272d67140d"}, {file = "coverage-7.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:49b752a2858b10580969ec6af6f090a9a440a64a301ac1528d7ca5f7ed497f4d"},
{file = "coverage-7.9.1-cp312-cp312-win32.whl", hash = "sha256:5f646a99a8c2b3ff4c6a6e081f78fad0dde275cd59f8f49dc4eab2e394332e74"}, {file = "coverage-7.9.2-cp312-cp312-win32.whl", hash = "sha256:88d7598b8ee130f32f8a43198ee02edd16d7f77692fa056cb779616bbea1b355"},
{file = "coverage-7.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:30f445f85c353090b83e552dcbbdad3ec84c7967e108c3ae54556ca69955563e"}, {file = "coverage-7.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:9dfb070f830739ee49d7c83e4941cc767e503e4394fdecb3b54bfdac1d7662c0"},
{file = "coverage-7.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:af41da5dca398d3474129c58cb2b106a5d93bbb196be0d307ac82311ca234342"}, {file = "coverage-7.9.2-cp312-cp312-win_arm64.whl", hash = "sha256:4e2c058aef613e79df00e86b6d42a641c877211384ce5bd07585ed7ba71ab31b"},
{file = "coverage-7.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:31324f18d5969feef7344a932c32428a2d1a3e50b15a6404e97cba1cc9b2c631"}, {file = "coverage-7.9.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:985abe7f242e0d7bba228ab01070fde1d6c8fa12f142e43debe9ed1dde686038"},
{file = "coverage-7.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0c804506d624e8a20fb3108764c52e0eef664e29d21692afa375e0dd98dc384f"}, {file = "coverage-7.9.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c3939264a76d44fde7f213924021ed31f55ef28111a19649fec90c0f109e6d"},
{file = "coverage-7.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef64c27bc40189f36fcc50c3fb8f16ccda73b6a0b80d9bd6e6ce4cffcd810bbd"}, {file = "coverage-7.9.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae5d563e970dbe04382f736ec214ef48103d1b875967c89d83c6e3f21706d5b3"},
{file = "coverage-7.9.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4fe2348cc6ec372e25adec0219ee2334a68d2f5222e0cba9c0d613394e12d86"}, {file = "coverage-7.9.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdd612e59baed2a93c8843c9a7cb902260f181370f1d772f4842987535071d14"},
{file = "coverage-7.9.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34ed2186fe52fcc24d4561041979a0dec69adae7bce2ae8d1c49eace13e55c43"}, {file = "coverage-7.9.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:256ea87cb2a1ed992bcdfc349d8042dcea1b80436f4ddf6e246d6bee4b5d73b6"},
{file = "coverage-7.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:25308bd3d00d5eedd5ae7d4357161f4df743e3c0240fa773ee1b0f75e6c7c0f1"}, {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f44ae036b63c8ea432f610534a2668b0c3aee810e7037ab9d8ff6883de480f5b"},
{file = "coverage-7.9.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73e9439310f65d55a5a1e0564b48e34f5369bee943d72c88378f2d576f5a5751"}, {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:82d76ad87c932935417a19b10cfe7abb15fd3f923cfe47dbdaa74ef4e503752d"},
{file = "coverage-7.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37ab6be0859141b53aa89412a82454b482c81cf750de4f29223d52268a86de67"}, {file = "coverage-7.9.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:619317bb86de4193debc712b9e59d5cffd91dc1d178627ab2a77b9870deb2868"},
{file = "coverage-7.9.1-cp313-cp313-win32.whl", hash = "sha256:64bdd969456e2d02a8b08aa047a92d269c7ac1f47e0c977675d550c9a0863643"}, {file = "coverage-7.9.2-cp313-cp313-win32.whl", hash = "sha256:0a07757de9feb1dfafd16ab651e0f628fd7ce551604d1bf23e47e1ddca93f08a"},
{file = "coverage-7.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:be9e3f68ca9edb897c2184ad0eee815c635565dbe7a0e7e814dc1f7cbab92c0a"}, {file = "coverage-7.9.2-cp313-cp313-win_amd64.whl", hash = "sha256:115db3d1f4d3f35f5bb021e270edd85011934ff97c8797216b62f461dd69374b"},
{file = "coverage-7.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:1c503289ffef1d5105d91bbb4d62cbe4b14bec4d13ca225f9c73cde9bb46207d"}, {file = "coverage-7.9.2-cp313-cp313-win_arm64.whl", hash = "sha256:48f82f889c80af8b2a7bb6e158d95a3fbec6a3453a1004d04e4f3b5945a02694"},
{file = "coverage-7.9.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0b3496922cb5f4215bf5caaef4cf12364a26b0be82e9ed6d050f3352cf2d7ef0"}, {file = "coverage-7.9.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:55a28954545f9d2f96870b40f6c3386a59ba8ed50caf2d949676dac3ecab99f5"},
{file = "coverage-7.9.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9565c3ab1c93310569ec0d86b017f128f027cab0b622b7af288696d7ed43a16d"}, {file = "coverage-7.9.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cdef6504637731a63c133bb2e6f0f0214e2748495ec15fe42d1e219d1b133f0b"},
{file = "coverage-7.9.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2241ad5dbf79ae1d9c08fe52b36d03ca122fb9ac6bca0f34439e99f8327ac89f"}, {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcd5ebe66c7a97273d5d2ddd4ad0ed2e706b39630ed4b53e713d360626c3dbb3"},
{file = "coverage-7.9.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb5838701ca68b10ebc0937dbd0eb81974bac54447c55cd58dea5bca8451029"}, {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9303aed20872d7a3c9cb39c5d2b9bdbe44e3a9a1aecb52920f7e7495410dfab8"},
{file = "coverage-7.9.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a25f814591a8c0c5372c11ac8967f669b97444c47fd794926e175c4047ece"}, {file = "coverage-7.9.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc18ea9e417a04d1920a9a76fe9ebd2f43ca505b81994598482f938d5c315f46"},
{file = "coverage-7.9.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2d04b16a6062516df97969f1ae7efd0de9c31eb6ebdceaa0d213b21c0ca1a683"}, {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6406cff19880aaaadc932152242523e892faff224da29e241ce2fca329866584"},
{file = "coverage-7.9.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7931b9e249edefb07cd6ae10c702788546341d5fe44db5b6108a25da4dca513f"}, {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2d0d4f6ecdf37fcc19c88fec3e2277d5dee740fb51ffdd69b9579b8c31e4232e"},
{file = "coverage-7.9.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52e92b01041151bf607ee858e5a56c62d4b70f4dac85b8c8cb7fb8a351ab2c10"}, {file = "coverage-7.9.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c33624f50cf8de418ab2b4d6ca9eda96dc45b2c4231336bac91454520e8d1fac"},
{file = "coverage-7.9.1-cp313-cp313t-win32.whl", hash = "sha256:684e2110ed84fd1ca5f40e89aa44adf1729dc85444004111aa01866507adf363"}, {file = "coverage-7.9.2-cp313-cp313t-win32.whl", hash = "sha256:1df6b76e737c6a92210eebcb2390af59a141f9e9430210595251fbaf02d46926"},
{file = "coverage-7.9.1-cp313-cp313t-win_amd64.whl", hash = "sha256:437c576979e4db840539674e68c84b3cda82bc824dd138d56bead1435f1cb5d7"}, {file = "coverage-7.9.2-cp313-cp313t-win_amd64.whl", hash = "sha256:f5fd54310b92741ebe00d9c0d1d7b2b27463952c022da6d47c175d246a98d1bd"},
{file = "coverage-7.9.1-cp313-cp313t-win_arm64.whl", hash = "sha256:18a0912944d70aaf5f399e350445738a1a20b50fbea788f640751c2ed9208b6c"}, {file = "coverage-7.9.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c48c2375287108c887ee87d13b4070a381c6537d30e8487b24ec721bf2a781cb"},
{file = "coverage-7.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f424507f57878e424d9a95dc4ead3fbdd72fd201e404e861e465f28ea469951"}, {file = "coverage-7.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ddc39510ac922a5c4c27849b739f875d3e1d9e590d1e7b64c98dadf037a16cce"},
{file = "coverage-7.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:535fde4001b2783ac80865d90e7cc7798b6b126f4cd8a8c54acfe76804e54e58"}, {file = "coverage-7.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a535c0c7364acd55229749c2b3e5eebf141865de3a8f697076a3291985f02d30"},
{file = "coverage-7.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02532fd3290bb8fa6bec876520842428e2a6ed6c27014eca81b031c2d30e3f71"}, {file = "coverage-7.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df0f9ef28e0f20c767ccdccfc5ae5f83a6f4a2fbdfbcbcc8487a8a78771168c8"},
{file = "coverage-7.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56f5eb308b17bca3bbff810f55ee26d51926d9f89ba92707ee41d3c061257e55"}, {file = "coverage-7.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f3da12e0ccbcb348969221d29441ac714bbddc4d74e13923d3d5a7a0bebef7a"},
{file = "coverage-7.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfa447506c1a52271f1b0de3f42ea0fa14676052549095e378d5bff1c505ff7b"}, {file = "coverage-7.9.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a17eaf46f56ae0f870f14a3cbc2e4632fe3771eab7f687eda1ee59b73d09fe4"},
{file = "coverage-7.9.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9ca8e220006966b4a7b68e8984a6aee645a0384b0769e829ba60281fe61ec4f7"}, {file = "coverage-7.9.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:669135a9d25df55d1ed56a11bf555f37c922cf08d80799d4f65d77d7d6123fcf"},
{file = "coverage-7.9.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:49f1d0788ba5b7ba65933f3a18864117c6506619f5ca80326b478f72acf3f385"}, {file = "coverage-7.9.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9d3a700304d01a627df9db4322dc082a0ce1e8fc74ac238e2af39ced4c083193"},
{file = "coverage-7.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:68cd53aec6f45b8e4724c0950ce86eacb775c6be01ce6e3669fe4f3a21e768ed"}, {file = "coverage-7.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:71ae8b53855644a0b1579d4041304ddc9995c7b21c8a1f16753c4d8903b4dfed"},
{file = "coverage-7.9.1-cp39-cp39-win32.whl", hash = "sha256:95335095b6c7b1cc14c3f3f17d5452ce677e8490d101698562b2ffcacc304c8d"}, {file = "coverage-7.9.2-cp39-cp39-win32.whl", hash = "sha256:dd7a57b33b5cf27acb491e890720af45db05589a80c1ffc798462a765be6d4d7"},
{file = "coverage-7.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:e1b5191d1648acc439b24721caab2fd0c86679d8549ed2c84d5a7ec1bedcc244"}, {file = "coverage-7.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:f65bb452e579d5540c8b37ec105dd54d8b9307b07bcaa186818c104ffda22441"},
{file = "coverage-7.9.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:db0f04118d1db74db6c9e1cb1898532c7dcc220f1d2718f058601f7c3f499514"}, {file = "coverage-7.9.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:8a1166db2fb62473285bcb092f586e081e92656c7dfa8e9f62b4d39d7e6b5050"},
{file = "coverage-7.9.1-py3-none-any.whl", hash = "sha256:66b974b145aa189516b6bf2d8423e888b742517d37872f6ee4c5be0073bd9a3c"}, {file = "coverage-7.9.2-py3-none-any.whl", hash = "sha256:e425cd5b00f6fc0ed7cdbd766c70be8baab4b7839e4d4fe5fac48581dd968ea4"},
{file = "coverage-7.9.1.tar.gz", hash = "sha256:6cf43c78c4282708a28e466316935ec7489a9c487518a77fa68f716c67909cec"}, {file = "coverage-7.9.2.tar.gz", hash = "sha256:997024fa51e3290264ffd7492ec97d0690293ccd2b45a6cd7d82d945a4a80c8b"},
] ]
[package.extras] [package.extras]
@ -684,24 +684,25 @@ cli = ["requests"]
[[package]] [[package]]
name = "fastapi" name = "fastapi"
version = "0.115.14" version = "0.116.1"
description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "fastapi-0.115.14-py3-none-any.whl", hash = "sha256:6c0c8bf9420bd58f565e585036d971872472b4f7d3f6c73b698e10cffdefb3ca"}, {file = "fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565"},
{file = "fastapi-0.115.14.tar.gz", hash = "sha256:b1de15cdc1c499a4da47914db35d0e4ef8f1ce62b624e94e0e5824421df99739"}, {file = "fastapi-0.116.1.tar.gz", hash = "sha256:ed52cbf946abfd70c5a0dccb24673f0670deeb517a88b3544d03c2a6bf283143"},
] ]
[package.dependencies] [package.dependencies]
pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0"
starlette = ">=0.40.0,<0.47.0" starlette = ">=0.40.0,<0.48.0"
typing-extensions = ">=4.8.0" typing-extensions = ">=4.8.0"
[package.extras] [package.extras]
all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"]
standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.5)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"]
[[package]] [[package]]
name = "filelock" name = "filelock"
@ -1627,44 +1628,44 @@ files = [
[[package]] [[package]]
name = "mypy" name = "mypy"
version = "1.16.1" version = "1.17.0"
description = "Optional static typing for Python" description = "Optional static typing for Python"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["dev"] groups = ["dev"]
files = [ files = [
{file = "mypy-1.16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b4f0fed1022a63c6fec38f28b7fc77fca47fd490445c69d0a66266c59dd0b88a"}, {file = "mypy-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8e08de6138043108b3b18f09d3f817a4783912e48828ab397ecf183135d84d6"},
{file = "mypy-1.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86042bbf9f5a05ea000d3203cf87aa9d0ccf9a01f73f71c58979eb9249f46d72"}, {file = "mypy-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce4a17920ec144647d448fc43725b5873548b1aae6c603225626747ededf582d"},
{file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ea7469ee5902c95542bea7ee545f7006508c65c8c54b06dc2c92676ce526f3ea"}, {file = "mypy-1.17.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ff25d151cc057fdddb1cb1881ef36e9c41fa2a5e78d8dd71bee6e4dcd2bc05b"},
{file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:352025753ef6a83cb9e7f2427319bb7875d1fdda8439d1e23de12ab164179574"}, {file = "mypy-1.17.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93468cf29aa9a132bceb103bd8475f78cacde2b1b9a94fd978d50d4bdf616c9a"},
{file = "mypy-1.16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff9fa5b16e4c1364eb89a4d16bcda9987f05d39604e1e6c35378a2987c1aac2d"}, {file = "mypy-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:98189382b310f16343151f65dd7e6867386d3e35f7878c45cfa11383d175d91f"},
{file = "mypy-1.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:1256688e284632382f8f3b9e2123df7d279f603c561f099758e66dd6ed4e8bd6"}, {file = "mypy-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:c004135a300ab06a045c1c0d8e3f10215e71d7b4f5bb9a42ab80236364429937"},
{file = "mypy-1.16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:472e4e4c100062488ec643f6162dd0d5208e33e2f34544e1fc931372e806c0cc"}, {file = "mypy-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d4fe5c72fd262d9c2c91c1117d16aac555e05f5beb2bae6a755274c6eec42be"},
{file = "mypy-1.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea16e2a7d2714277e349e24d19a782a663a34ed60864006e8585db08f8ad1782"}, {file = "mypy-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96b196e5c16f41b4f7736840e8455958e832871990c7ba26bf58175e357ed61"},
{file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08e850ea22adc4d8a4014651575567b0318ede51e8e9fe7a68f25391af699507"}, {file = "mypy-1.17.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73a0ff2dd10337ceb521c080d4147755ee302dcde6e1a913babd59473904615f"},
{file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22d76a63a42619bfb90122889b903519149879ddbf2ba4251834727944c8baca"}, {file = "mypy-1.17.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24cfcc1179c4447854e9e406d3af0f77736d631ec87d31c6281ecd5025df625d"},
{file = "mypy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c7ce0662b6b9dc8f4ed86eb7a5d505ee3298c04b40ec13b30e572c0e5ae17c4"}, {file = "mypy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56f180ff6430e6373db7a1d569317675b0a451caf5fef6ce4ab365f5f2f6c3"},
{file = "mypy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:211287e98e05352a2e1d4e8759c5490925a7c784ddc84207f4714822f8cf99b6"}, {file = "mypy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:eafaf8b9252734400f9b77df98b4eee3d2eecab16104680d51341c75702cad70"},
{file = "mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d"}, {file = "mypy-1.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f986f1cab8dbec39ba6e0eaa42d4d3ac6686516a5d3dccd64be095db05ebc6bb"},
{file = "mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9"}, {file = "mypy-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:51e455a54d199dd6e931cd7ea987d061c2afbaf0960f7f66deef47c90d1b304d"},
{file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79"}, {file = "mypy-1.17.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3204d773bab5ff4ebbd1f8efa11b498027cd57017c003ae970f310e5b96be8d8"},
{file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15"}, {file = "mypy-1.17.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1051df7ec0886fa246a530ae917c473491e9a0ba6938cfd0ec2abc1076495c3e"},
{file = "mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd"}, {file = "mypy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f773c6d14dcc108a5b141b4456b0871df638eb411a89cd1c0c001fc4a9d08fc8"},
{file = "mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b"}, {file = "mypy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:1619a485fd0e9c959b943c7b519ed26b712de3002d7de43154a489a2d0fd817d"},
{file = "mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438"}, {file = "mypy-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c41aa59211e49d717d92b3bb1238c06d387c9325d3122085113c79118bebb06"},
{file = "mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536"}, {file = "mypy-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e69db1fb65b3114f98c753e3930a00514f5b68794ba80590eb02090d54a5d4a"},
{file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f"}, {file = "mypy-1.17.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03ba330b76710f83d6ac500053f7727270b6b8553b0423348ffb3af6f2f7b889"},
{file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359"}, {file = "mypy-1.17.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037bc0f0b124ce46bfde955c647f3e395c6174476a968c0f22c95a8d2f589bba"},
{file = "mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be"}, {file = "mypy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38876106cb6132259683632b287238858bd58de267d80defb6f418e9ee50658"},
{file = "mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee"}, {file = "mypy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:d30ba01c0f151998f367506fab31c2ac4527e6a7b2690107c7a7f9e3cb419a9c"},
{file = "mypy-1.16.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7fc688329af6a287567f45cc1cefb9db662defeb14625213a5b7da6e692e2069"}, {file = "mypy-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63e751f1b5ab51d6f3d219fe3a2fe4523eaa387d854ad06906c63883fde5b1ab"},
{file = "mypy-1.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e198ab3f55924c03ead626ff424cad1732d0d391478dfbf7bb97b34602395da"}, {file = "mypy-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7fb09d05e0f1c329a36dcd30e27564a3555717cde87301fae4fb542402ddfad"},
{file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09aa4f91ada245f0a45dbc47e548fd94e0dd5a8433e0114917dc3b526912a30c"}, {file = "mypy-1.17.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b72c34ce05ac3a1361ae2ebb50757fb6e3624032d91488d93544e9f82db0ed6c"},
{file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13c7cd5b1cb2909aa318a90fd1b7e31f17c50b242953e7dd58345b2a814f6383"}, {file = "mypy-1.17.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:434ad499ad8dde8b2f6391ddfa982f41cb07ccda8e3c67781b1bfd4e5f9450a8"},
{file = "mypy-1.16.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:58e07fb958bc5d752a280da0e890c538f1515b79a65757bbdc54252ba82e0b40"}, {file = "mypy-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f105f61a5eff52e137fd73bee32958b2add9d9f0a856f17314018646af838e97"},
{file = "mypy-1.16.1-cp39-cp39-win_amd64.whl", hash = "sha256:f895078594d918f93337a505f8add9bd654d1a24962b4c6ed9390e12531eb31b"}, {file = "mypy-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:ba06254a5a22729853209550d80f94e28690d5530c661f9416a68ac097b13fc4"},
{file = "mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37"}, {file = "mypy-1.17.0-py3-none-any.whl", hash = "sha256:15d9d0018237ab058e5de3d8fce61b6fa72cc59cc78fd91f1b474bce12abf496"},
{file = "mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab"}, {file = "mypy-1.17.0.tar.gz", hash = "sha256:e5d7ccc08ba089c06e2f5629c660388ef1fee708444f1dee0b9203fa031dee03"},
] ]
[package.dependencies] [package.dependencies]
@ -1816,14 +1817,14 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"]
[[package]] [[package]]
name = "openai" name = "openai"
version = "1.95.1" version = "1.97.0"
description = "The official Python library for the openai API" description = "The official Python library for the openai API"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "openai-1.95.1-py3-none-any.whl", hash = "sha256:8bbdfeceef231b1ddfabbc232b179d79f8b849aab5a7da131178f8d10e0f162f"}, {file = "openai-1.97.0-py3-none-any.whl", hash = "sha256:a1c24d96f4609f3f7f51c9e1c2606d97cc6e334833438659cfd687e9c972c610"},
{file = "openai-1.95.1.tar.gz", hash = "sha256:f089b605282e2a2b6776090b4b46563ac1da77f56402a222597d591e2dcc1086"}, {file = "openai-1.97.0.tar.gz", hash = "sha256:0be349569ccaa4fb54f97bb808423fd29ccaeb1246ee1be762e0c81a47bae0aa"},
] ]
[package.dependencies] [package.dependencies]
@ -1844,84 +1845,84 @@ voice-helpers = ["numpy (>=2.0.2)", "sounddevice (>=0.5.1)"]
[[package]] [[package]]
name = "orjson" name = "orjson"
version = "3.10.18" version = "3.11.0"
description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["main"] groups = ["main"]
files = [ files = [
{file = "orjson-3.10.18-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a45e5d68066b408e4bc383b6e4ef05e717c65219a9e1390abc6155a520cac402"}, {file = "orjson-3.11.0-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b8913baba9751f7400f8fa4ec18a8b618ff01177490842e39e47b66c1b04bc79"},
{file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be3b9b143e8b9db05368b13b04c84d37544ec85bb97237b3a923f076265ec89c"}, {file = "orjson-3.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d4d86910554de5c9c87bc560b3bdd315cc3988adbdc2acf5dda3797079407ed"},
{file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9b0aa09745e2c9b3bf779b096fa71d1cc2d801a604ef6dd79c8b1bfef52b2f92"}, {file = "orjson-3.11.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84ae3d329360cf18fb61b67c505c00dedb61b0ee23abfd50f377a58e7d7bed06"},
{file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53a245c104d2792e65c8d225158f2b8262749ffe64bc7755b00024757d957a13"}, {file = "orjson-3.11.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47a54e660414baacd71ebf41a69bb17ea25abb3c5b69ce9e13e43be7ac20e342"},
{file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f9495ab2611b7f8a0a8a505bcb0f0cbdb5469caafe17b0e404c3c746f9900469"}, {file = "orjson-3.11.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2560b740604751854be146169c1de7e7ee1e6120b00c1788ec3f3a012c6a243f"},
{file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73be1cbcebadeabdbc468f82b087df435843c809cd079a565fb16f0f3b23238f"}, {file = "orjson-3.11.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd7f9cd995da9e46fbac0a371f0ff6e89a21d8ecb7a8a113c0acb147b0a32f73"},
{file = "orjson-3.10.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8936ee2679e38903df158037a2f1c108129dee218975122e37847fb1d4ac68"}, {file = "orjson-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cf728cb3a013bdf9f4132575404bf885aa773d8bb4205656575e1890fc91990"},
{file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7115fcbc8525c74e4c2b608129bef740198e9a120ae46184dac7683191042056"}, {file = "orjson-3.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c27de273320294121200440cd5002b6aeb922d3cb9dab3357087c69f04ca6934"},
{file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:771474ad34c66bc4d1c01f645f150048030694ea5b2709b87d3bda273ffe505d"}, {file = "orjson-3.11.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4430ec6ff1a1f4595dd7e0fad991bdb2fed65401ed294984c490ffa025926325"},
{file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7c14047dbbea52886dd87169f21939af5d55143dad22d10db6a7514f058156a8"}, {file = "orjson-3.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:325be41a8d7c227d460a9795a181511ba0e731cf3fee088c63eb47e706ea7559"},
{file = "orjson-3.10.18-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:641481b73baec8db14fdf58f8967e52dc8bda1f2aba3aa5f5c1b07ed6df50b7f"}, {file = "orjson-3.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9760217b84d1aee393b4436fbe9c639e963ec7bc0f2c074581ce5fb3777e466"},
{file = "orjson-3.10.18-cp310-cp310-win32.whl", hash = "sha256:607eb3ae0909d47280c1fc657c4284c34b785bae371d007595633f4b1a2bbe06"}, {file = "orjson-3.11.0-cp310-cp310-win32.whl", hash = "sha256:fe36e5012f886ff91c68b87a499c227fa220e9668cea96335219874c8be5fab5"},
{file = "orjson-3.10.18-cp310-cp310-win_amd64.whl", hash = "sha256:8770432524ce0eca50b7efc2a9a5f486ee0113a5fbb4231526d414e6254eba92"}, {file = "orjson-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:ebeecd5d5511b3ca9dc4e7db0ab95266afd41baf424cc2fad8c2d3a3cdae650a"},
{file = "orjson-3.10.18-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e0a183ac3b8e40471e8d843105da6fbe7c070faab023be3b08188ee3f85719b8"}, {file = "orjson-3.11.0-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:1785df7ada75c18411ff7e20ac822af904a40161ea9dfe8c55b3f6b66939add6"},
{file = "orjson-3.10.18-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5ef7c164d9174362f85238d0cd4afdeeb89d9e523e4651add6a5d458d6f7d42d"}, {file = "orjson-3.11.0-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:a57899bebbcea146616a2426d20b51b3562b4bc9f8039a3bd14fae361c23053d"},
{file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd14c5d99cdc7bf93f22b12ec3b294931518aa019e2a147e8aa2f31fd3240f7"}, {file = "orjson-3.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fbc2fc825aff1456dd358c11a0ad7912a4cb4537d3db92e5334af7463a967"},
{file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7b672502323b6cd133c4af6b79e3bea36bad2d16bca6c1f645903fce83909a7a"}, {file = "orjson-3.11.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4305a638f4cf9bed3746ca3b7c242f14e05177d5baec2527026e0f9ee6c24fb7"},
{file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51f8c63be6e070ec894c629186b1c0fe798662b8687f3d9fdfa5e401c6bd7679"}, {file = "orjson-3.11.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1235fe7bbc37164f69302199d46f29cfb874018738714dccc5a5a44042c79c77"},
{file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9478ade5313d724e0495d167083c6f3be0dd2f1c9c8a38db9a9e912cdaf947"}, {file = "orjson-3.11.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a640e3954e7b4fcb160097551e54cafbde9966be3991932155b71071077881aa"},
{file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:187aefa562300a9d382b4b4eb9694806e5848b0cedf52037bb5c228c61bb66d4"}, {file = "orjson-3.11.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d750b97d22d5566955e50b02c622f3a1d32744d7a578c878b29a873190ccb7a"},
{file = "orjson-3.10.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9da552683bc9da222379c7a01779bddd0ad39dd699dd6300abaf43eadee38334"}, {file = "orjson-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bfcfe498484161e011f8190a400591c52b026de96b3b3cbd3f21e8999b9dc0e"},
{file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e450885f7b47a0231979d9c49b567ed1c4e9f69240804621be87c40bc9d3cf17"}, {file = "orjson-3.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:feaed3ed43a1d2df75c039798eb5ec92c350c7d86be53369bafc4f3700ce7df2"},
{file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5e3c9cc2ba324187cd06287ca24f65528f16dfc80add48dc99fa6c836bb3137e"}, {file = "orjson-3.11.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:aa1120607ec8fc98acf8c54aac6fb0b7b003ba883401fa2d261833111e2fa071"},
{file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:50ce016233ac4bfd843ac5471e232b865271d7d9d44cf9d33773bcd883ce442b"}, {file = "orjson-3.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c4b48d9775b0cf1f0aca734f4c6b272cbfacfac38e6a455e6520662f9434afb7"},
{file = "orjson-3.10.18-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b3ceff74a8f7ffde0b2785ca749fc4e80e4315c0fd887561144059fb1c138aa7"}, {file = "orjson-3.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f018ed1986d79434ac712ff19f951cd00b4dfcb767444410fbb834ebec160abf"},
{file = "orjson-3.10.18-cp311-cp311-win32.whl", hash = "sha256:fdba703c722bd868c04702cac4cb8c6b8ff137af2623bc0ddb3b3e6a2c8996c1"}, {file = "orjson-3.11.0-cp311-cp311-win32.whl", hash = "sha256:08e191f8a55ac2c00be48e98a5d10dca004cbe8abe73392c55951bfda60fc123"},
{file = "orjson-3.10.18-cp311-cp311-win_amd64.whl", hash = "sha256:c28082933c71ff4bc6ccc82a454a2bffcef6e1d7379756ca567c772e4fb3278a"}, {file = "orjson-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:b5a4214ea59c8a3b56f8d484b28114af74e9fba0956f9be5c3ce388ae143bf1f"},
{file = "orjson-3.10.18-cp311-cp311-win_arm64.whl", hash = "sha256:a6c7c391beaedd3fa63206e5c2b7b554196f14debf1ec9deb54b5d279b1b46f5"}, {file = "orjson-3.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:57e8e7198a679ab21241ab3f355a7990c7447559e35940595e628c107ef23736"},
{file = "orjson-3.10.18-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:50c15557afb7f6d63bc6d6348e0337a880a04eaa9cd7c9d569bcb4e760a24753"}, {file = "orjson-3.11.0-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:b4089f940c638bb1947d54e46c1cd58f4259072fcc97bc833ea9c78903150ac9"},
{file = "orjson-3.10.18-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:356b076f1662c9813d5fa56db7d63ccceef4c271b1fb3dd522aca291375fcf17"}, {file = "orjson-3.11.0-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:8335a0ba1c26359fb5c82d643b4c1abbee2bc62875e0f2b5bde6c8e9e25eb68c"},
{file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:559eb40a70a7494cd5beab2d73657262a74a2c59aff2068fdba8f0424ec5b39d"}, {file = "orjson-3.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63c1c9772dafc811d16d6a7efa3369a739da15d1720d6e58ebe7562f54d6f4a2"},
{file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f3c29eb9a81e2fbc6fd7ddcfba3e101ba92eaff455b8d602bf7511088bbc0eae"}, {file = "orjson-3.11.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9457ccbd8b241fb4ba516417a4c5b95ba0059df4ac801309bcb4ec3870f45ad9"},
{file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6612787e5b0756a171c7d81ba245ef63a3533a637c335aa7fcb8e665f4a0966f"}, {file = "orjson-3.11.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0846e13abe79daece94a00b92574f294acad1d362be766c04245b9b4dd0e47e1"},
{file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ac6bd7be0dcab5b702c9d43d25e70eb456dfd2e119d512447468f6405b4a69c"}, {file = "orjson-3.11.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5587c85ae02f608a3f377b6af9eb04829606f518257cbffa8f5081c1aacf2e2f"},
{file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9f72f100cee8dde70100406d5c1abba515a7df926d4ed81e20a9730c062fe9ad"}, {file = "orjson-3.11.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c7a1964a71c1567b4570c932a0084ac24ad52c8cf6253d1881400936565ed438"},
{file = "orjson-3.10.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca85398d6d093dd41dc0983cbf54ab8e6afd1c547b6b8a311643917fbf4e0c"}, {file = "orjson-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5a8243e73690cc6e9151c9e1dd046a8f21778d775f7d478fa1eb4daa4897c61"},
{file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:22748de2a07fcc8781a70edb887abf801bb6142e6236123ff93d12d92db3d406"}, {file = "orjson-3.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51646f6d995df37b6e1b628f092f41c0feccf1d47e3452c6e95e2474b547d842"},
{file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:3a83c9954a4107b9acd10291b7f12a6b29e35e8d43a414799906ea10e75438e6"}, {file = "orjson-3.11.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:2fb8ca8f0b4e31b8aaec674c7540649b64ef02809410506a44dc68d31bd5647b"},
{file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:303565c67a6c7b1f194c94632a4a39918e067bd6176a48bec697393865ce4f06"}, {file = "orjson-3.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:64a6a3e94a44856c3f6557e6aa56a6686544fed9816ae0afa8df9077f5759791"},
{file = "orjson-3.10.18-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:86314fdb5053a2f5a5d881f03fca0219bfdf832912aa88d18676a5175c6916b5"}, {file = "orjson-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d69f95d484938d8fab5963e09131bcf9fbbb81fa4ec132e316eb2fb9adb8ce78"},
{file = "orjson-3.10.18-cp312-cp312-win32.whl", hash = "sha256:187ec33bbec58c76dbd4066340067d9ece6e10067bb0cc074a21ae3300caa84e"}, {file = "orjson-3.11.0-cp312-cp312-win32.whl", hash = "sha256:8514f9f9c667ce7d7ef709ab1a73e7fcab78c297270e90b1963df7126d2b0e23"},
{file = "orjson-3.10.18-cp312-cp312-win_amd64.whl", hash = "sha256:f9f94cf6d3f9cd720d641f8399e390e7411487e493962213390d1ae45c7814fc"}, {file = "orjson-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:41b38a894520b8cb5344a35ffafdf6ae8042f56d16771b2c5eb107798cee85ee"},
{file = "orjson-3.10.18-cp312-cp312-win_arm64.whl", hash = "sha256:3d600be83fe4514944500fa8c2a0a77099025ec6482e8087d7659e891f23058a"}, {file = "orjson-3.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:5579acd235dd134467340b2f8a670c1c36023b5a69c6a3174c4792af7502bd92"},
{file = "orjson-3.10.18-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:69c34b9441b863175cc6a01f2935de994025e773f814412030f269da4f7be147"}, {file = "orjson-3.11.0-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:4a8ba9698655e16746fdf5266939427da0f9553305152aeb1a1cc14974a19cfb"},
{file = "orjson-3.10.18-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:1ebeda919725f9dbdb269f59bc94f861afbe2a27dce5608cdba2d92772364d1c"}, {file = "orjson-3.11.0-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:67133847f9a35a5ef5acfa3325d4a2f7fe05c11f1505c4117bb086fc06f2a58f"},
{file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5adf5f4eed520a4959d29ea80192fa626ab9a20b2ea13f8f6dc58644f6927103"}, {file = "orjson-3.11.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f797d57814975b78f5f5423acb003db6f9be5186b72d48bd97a1000e89d331d"},
{file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7592bb48a214e18cd670974f289520f12b7aed1fa0b2e2616b8ed9e069e08595"}, {file = "orjson-3.11.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:28acd19822987c5163b9e03a6e60853a52acfee384af2b394d11cb413b889246"},
{file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f872bef9f042734110642b7a11937440797ace8c87527de25e0c53558b579ccc"}, {file = "orjson-3.11.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8d38d9e1e2cf9729658e35956cf01e13e89148beb4cb9e794c9c10c5cb252f8"},
{file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0315317601149c244cb3ecef246ef5861a64824ccbcb8018d32c66a60a84ffbc"}, {file = "orjson-3.11.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05f094edd2b782650b0761fd78858d9254de1c1286f5af43145b3d08cdacfd51"},
{file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0da26957e77e9e55a6c2ce2e7182a36a6f6b180ab7189315cb0995ec362e049"}, {file = "orjson-3.11.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d09176a4a9e04a5394a4a0edd758f645d53d903b306d02f2691b97d5c736a9e"},
{file = "orjson-3.10.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb70d489bc79b7519e5803e2cc4c72343c9dc1154258adf2f8925d0b60da7c58"}, {file = "orjson-3.11.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a585042104e90a61eda2564d11317b6a304eb4e71cd33e839f5af6be56c34d3"},
{file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e9e86a6af31b92299b00736c89caf63816f70a4001e750bda179e15564d7a034"}, {file = "orjson-3.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d2218629dbfdeeb5c9e0573d59f809d42f9d49ae6464d2f479e667aee14c3ef4"},
{file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:c382a5c0b5931a5fc5405053d36c1ce3fd561694738626c77ae0b1dfc0242ca1"}, {file = "orjson-3.11.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:613e54a2b10b51b656305c11235a9c4a5c5491ef5c283f86483d4e9e123ed5e4"},
{file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8e4b2ae732431127171b875cb2668f883e1234711d3c147ffd69fe5be51a8012"}, {file = "orjson-3.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9dac7fbf3b8b05965986c5cfae051eb9a30fced7f15f1d13a5adc608436eb486"},
{file = "orjson-3.10.18-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d808e34ddb24fc29a4d4041dcfafbae13e129c93509b847b14432717d94b44f"}, {file = "orjson-3.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93b64b254414e2be55ac5257124b5602c5f0b4d06b80bd27d1165efe8f36e836"},
{file = "orjson-3.10.18-cp313-cp313-win32.whl", hash = "sha256:ad8eacbb5d904d5591f27dee4031e2c1db43d559edb8f91778efd642d70e6bea"}, {file = "orjson-3.11.0-cp313-cp313-win32.whl", hash = "sha256:359cbe11bc940c64cb3848cf22000d2aef36aff7bfd09ca2c0b9cb309c387132"},
{file = "orjson-3.10.18-cp313-cp313-win_amd64.whl", hash = "sha256:aed411bcb68bf62e85588f2a7e03a6082cc42e5a2796e06e72a962d7c6310b52"}, {file = "orjson-3.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:0759b36428067dc777b202dd286fbdd33d7f261c6455c4238ea4e8474358b1e6"},
{file = "orjson-3.10.18-cp313-cp313-win_arm64.whl", hash = "sha256:f54c1385a0e6aba2f15a40d703b858bedad36ded0491e55d35d905b2c34a4cc3"}, {file = "orjson-3.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:51cdca2f36e923126d0734efaf72ddbb5d6da01dbd20eab898bdc50de80d7b5a"},
{file = "orjson-3.10.18-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:c95fae14225edfd699454e84f61c3dd938df6629a00c6ce15e704f57b58433bb"}, {file = "orjson-3.11.0-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d79c180cfb3ae68f13245d0ff551dca03d96258aa560830bf8a223bd68d8272c"},
{file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5232d85f177f98e0cefabb48b5e7f60cff6f3f0365f9c60631fecd73849b2a82"}, {file = "orjson-3.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:105bca887532dc71ce4b05a5de95dea447a310409d7a8cf0cb1c4a120469e9ad"},
{file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2783e121cafedf0d85c148c248a20470018b4ffd34494a68e125e7d5857655d1"}, {file = "orjson-3.11.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acf5a63ae9cdb88274126af85913ceae554d8fd71122effa24a53227abbeee16"},
{file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e54ee3722caf3db09c91f442441e78f916046aa58d16b93af8a91500b7bbf273"}, {file = "orjson-3.11.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:894635df36c0be32f1c8c8607e853b8865edb58e7618e57892e85d06418723eb"},
{file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2daf7e5379b61380808c24f6fc182b7719301739e4271c3ec88f2984a2d61f89"}, {file = "orjson-3.11.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02dd4f0a1a2be943a104ce5f3ec092631ee3e9f0b4bb9eeee3400430bd94ddef"},
{file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7f39b371af3add20b25338f4b29a8d6e79a8c7ed0e9dd49e008228a065d07781"}, {file = "orjson-3.11.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:720b4bb5e1b971960a62c2fa254c2d2a14e7eb791e350d05df8583025aa59d15"},
{file = "orjson-3.10.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b819ed34c01d88c6bec290e6842966f8e9ff84b7694632e88341363440d4cc0"}, {file = "orjson-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bf058105a8aed144e0d1cfe7ac4174748c3fc7203f225abaeac7f4121abccb0"},
{file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2f6c57debaef0b1aa13092822cbd3698a1fb0209a9ea013a969f4efa36bdea57"}, {file = "orjson-3.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a2788f741e5a0e885e5eaf1d91d0c9106e03cb9575b0c55ba36fd3d48b0b1e9b"},
{file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:755b6d61ffdb1ffa1e768330190132e21343757c9aa2308c67257cc81a1a6f5a"}, {file = "orjson-3.11.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:c60c99fe1e15894367b0340b2ff16c7c69f9c3f3a54aa3961a58c102b292ad94"},
{file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce8d0a875a85b4c8579eab5ac535fb4b2a50937267482be402627ca7e7570ee3"}, {file = "orjson-3.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:99d17aab984f4d029b8f3c307e6be3c63d9ee5ef55e30d761caf05e883009949"},
{file = "orjson-3.10.18-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:57b5d0673cbd26781bebc2bf86f99dd19bd5a9cb55f71cc4f66419f6b50f3d77"}, {file = "orjson-3.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e98f02e23611763c9e5dfcb83bd33219231091589f0d1691e721aea9c52bf329"},
{file = "orjson-3.10.18-cp39-cp39-win32.whl", hash = "sha256:951775d8b49d1d16ca8818b1f20c4965cae9157e7b562a2ae34d3967b8f21c8e"}, {file = "orjson-3.11.0-cp39-cp39-win32.whl", hash = "sha256:923301f33ea866b18f8836cf41d9c6d33e3b5cab8577d20fed34ec29f0e13a0d"},
{file = "orjson-3.10.18-cp39-cp39-win_amd64.whl", hash = "sha256:fdd9d68f83f0bc4406610b1ac68bdcded8c5ee58605cc69e643a06f4d075f429"}, {file = "orjson-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:475491bb78af2a0170f49e90013f1a0f1286527f3617491f8940d7e5da862da7"},
{file = "orjson-3.10.18.tar.gz", hash = "sha256:e8da3947d92123eda795b68228cafe2724815621fe35e8e320a9e9593a4bcd53"}, {file = "orjson-3.11.0.tar.gz", hash = "sha256:2e4c129da624f291bcc607016a99e7f04a353f6874f3bd8d9b47b88597d5f700"},
] ]
[[package]] [[package]]
@ -2684,14 +2685,14 @@ dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests
[[package]] [[package]]
name = "pytest-asyncio" name = "pytest-asyncio"
version = "1.0.0" version = "1.1.0"
description = "Pytest support for asyncio" description = "Pytest support for asyncio"
optional = false optional = false
python-versions = ">=3.9" python-versions = ">=3.9"
groups = ["dev"] groups = ["dev"]
files = [ files = [
{file = "pytest_asyncio-1.0.0-py3-none-any.whl", hash = "sha256:4f024da9f1ef945e680dc68610b52550e36590a67fd31bb3b4943979a1f90ef3"}, {file = "pytest_asyncio-1.1.0-py3-none-any.whl", hash = "sha256:5fe2d69607b0bd75c656d1211f969cadba035030156745ee09e7d71740e58ecf"},
{file = "pytest_asyncio-1.0.0.tar.gz", hash = "sha256:d15463d13f4456e1ead2594520216b225a16f781e144f8fdf6c5bb4667c48b3f"}, {file = "pytest_asyncio-1.1.0.tar.gz", hash = "sha256:796aa822981e01b68c12e4827b8697108f7205020f24b5793b3c41555dab68ea"},
] ]
[package.dependencies] [package.dependencies]
@ -3871,4 +3872,4 @@ pgsql = ["psycopg2-binary"]
[metadata] [metadata]
lock-version = "2.1" lock-version = "2.1"
python-versions = ">=3.12,<3.13" python-versions = ">=3.12,<3.13"
content-hash = "df16815f799254568f5e7083c49bb302e77003bcafbd34dfa92ad65d0335efb3" content-hash = "8c337ab9231ded0f66d8e8d14a6d465bb8009f0f9377e5c480ed5baa4b928ed1"

View file

@ -3,7 +3,7 @@ authors = ["Hayden <hay-kot@pm.me>"]
description = "A Recipe Manager" description = "A Recipe Manager"
license = "AGPL" license = "AGPL"
name = "mealie" name = "mealie"
version = "3.0.1" version = "3.0.2"
include = [ include = [
# Explicit include to override .gitignore when packaging the frontend # Explicit include to override .gitignore when packaging the frontend
{ path = "mealie/frontend/**/*", format = ["sdist", "wheel"] } { path = "mealie/frontend/**/*", format = ["sdist", "wheel"] }
@ -24,7 +24,7 @@ appdirs = "1.4.4"
apprise = "^1.4.5" apprise = "^1.4.5"
bcrypt = "^4.0.1" bcrypt = "^4.0.1"
extruct = "^0.18.0" extruct = "^0.18.0"
fastapi = "^0.115.0" fastapi = "^0.116.0"
httpx = "^0.28.0" httpx = "^0.28.0"
lxml = "^6.0.0" lxml = "^6.0.0"
orjson = "^3.8.0" orjson = "^3.8.0"

View file

@ -2,7 +2,8 @@ import pytest
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from mealie.routes import spa from mealie.routes import spa
from mealie.schema.recipe.recipe import Recipe from mealie.schema.recipe.recipe import Recipe, RecipeSettings
from mealie.schema.recipe.recipe_notes import RecipeNote
from mealie.schema.recipe.recipe_share_token import RecipeShareTokenSave from mealie.schema.recipe.recipe_share_token import RecipeShareTokenSave
from tests import data as test_data from tests import data as test_data
from tests.utils.factories import random_string from tests.utils.factories import random_string
@ -189,3 +190,28 @@ async def test_spa_service_shared_recipe_with_meta_invalid_data(unique_user: Tes
response = await spa.serve_shared_recipe_with_meta(group.slug, random_string(), session=unique_user.repos.session) response = await spa.serve_shared_recipe_with_meta(group.slug, random_string(), session=unique_user.repos.session)
assert response.status_code == 404 assert response.status_code == 404
@pytest.mark.parametrize(
"malicious_content, malicious_strings",
[
("<script>alert('XSS');</script>", ["<script>", "alert('XSS')"]),
("<img src=x onerror=alert('XSS')>", ["<img", "onerror=alert('XSS')"]),
("<div onmouseover=alert('XSS')>Hover me</div>", ["<div", "onmouseover=alert('XSS')"]),
("<a href='javascript:alert(\"XSS\")'>Click me</a>", ["<a", 'javascript:alert("XSS")']),
],
)
def test_spa_escapes_malicious_recipe_data(unique_user: TestUser, malicious_content: str, malicious_strings: list[str]):
recipe = Recipe(
user_id=unique_user.user_id,
group_id=unique_user.group_id,
name=malicious_content,
description=malicious_content,
image=malicious_content,
notes=[RecipeNote(title=malicious_content, text=malicious_content)],
settings=RecipeSettings(),
)
response = spa.content_with_meta(unique_user.group_id, recipe)
for string in malicious_strings:
assert string not in response