Merge remote-tracking branch 'upstream/mealie-next' into feat/remove-food-flag

This commit is contained in:
Michael Genson 2025-07-20 20:34:59 +00:00
commit aaa594dad6
58 changed files with 6306 additions and 6348 deletions

View file

@ -17,7 +17,7 @@ jobs:
name: Build Package name: Build Package
uses: ./.github/workflows/build-package.yml uses: ./.github/workflows/build-package.yml
with: with:
tag: release tag: ${{ github.event.release.tag_name }}
publish: publish:
permissions: permissions:

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.2 rev: v0.12.3
hooks: hooks:
- id: ruff - id: ruff
- id: ruff-format - id: ruff-format

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:v2.8.0` 2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.0.1`
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:v2.8.0 # (3) image: ghcr.io/mealie-recipes/mealie:v3.0.1 # (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:v2.8.0 # (3) image: ghcr.io/mealie-recipes/mealie:v3.0.1 # (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> <v-list-item
<template #activator="{ props }"> v-for="(action, index) in recipeActions"
<v-list-item-title v-bind="props"> :key="index"
{{ $t("recipe.recipe-actions") }} @click="executeRecipeAction(action)"
</v-list-item-title> >
<template #prepend>
<v-icon color="undefined">
{{ $globals.icons.linkVariantPlus }}
</v-icon>
</template> </template>
<v-list density="compact" class="ma-0 pa-0"> <v-list-item-title>
<v-list-item {{ action.title }}
v-for="(action, index) in recipeActions" </v-list-item-title>
:key="index" </v-list-item>
class="pl-6"
@click="executeRecipeAction(action)"
>
<v-list-item-title>
{{ action.title }}
</v-list-item-title>
</v-list-item>
</v-list>
</v-list-group>
</div> </div>
</v-list> </v-list>
</v-menu> </v-menu>
@ -269,13 +264,17 @@ export default defineNuxtComponent({
recipeName: props.name, recipeName: props.name,
loading: false, loading: false,
menuItems: [] as ContextMenuItem[], menuItems: [] as ContextMenuItem[],
newMealdate: new Date(Date.now() - new Date().getTimezoneOffset() * 60000), newMealdate: new Date(),
newMealType: "dinner" as PlanEntryType, newMealType: "dinner" as PlanEntryType,
pickerMenu: false, pickerMenu: false,
}); });
const newMealdateString = computed(() => { const newMealdateString = computed(() => {
return state.newMealdate.toISOString().substring(0, 10); // Format the date to YYYY-MM-DD in the same timezone as newMealdate
const year = state.newMealdate.getFullYear();
const month = String(state.newMealdate.getMonth() + 1).padStart(2, "0");
const day = String(state.newMealdate.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`;
}); });
const i18n = useI18n(); const i18n = useI18n();

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

@ -42,7 +42,7 @@
color="info" color="info"
variant="elevated" variant="elevated"
:items="bulkActions" :items="bulkActions"
v-bind="bulkActionListener" v-on="bulkActionListener"
/> />
<slot name="button-row" /> <slot name="button-row" />
</v-card-actions> </v-card-actions>
@ -55,7 +55,7 @@
</div> </div>
<v-data-table <v-data-table
v-model="selected" v-model="selected"
item-key="id" return-object
:headers="activeHeaders" :headers="activeHeaders"
:show-select="bulkActions.length > 0" :show-select="bulkActions.length > 0"
:sort-by="sortBy" :sort-by="sortBy"

View file

@ -45,28 +45,11 @@ export const useGroupSelf = function () {
export const useGroups = function () { export const useGroups = function () {
const api = useUserApi(); const api = useUserApi();
const loading = ref(false); const loading = ref(false);
const groups = ref<GroupSummary[] | null>(null);
function getAllGroups() { async function getAllGroups() {
loading.value = true; loading.value = true;
const asyncKey = String(Date.now()); const { data } = await api.groups.getAll(1, -1, { orderBy: "name", orderDirection: "asc" });
const { data: groups } = useAsyncData(asyncKey, async () => {
const { data } = await api.groups.getAll(1, -1, { orderBy: "name", orderDirection: "asc" }); ;
if (data) {
return data.items;
}
else {
return null;
}
});
loading.value = false;
return groups;
}
async function refreshAllGroups() {
loading.value = true;
const { data } = await api.groups.getAll(1, -1, { orderBy: "name", orderDirection: "asc" }); ;
if (data) { if (data) {
groups.value = data.items; groups.value = data.items;
@ -78,11 +61,15 @@ export const useGroups = function () {
loading.value = false; loading.value = false;
} }
async function refreshAllGroups() {
await getAllGroups();
}
async function deleteGroup(id: string | number) { async function deleteGroup(id: string | number) {
loading.value = true; loading.value = true;
const { data } = await api.groups.deleteOne(id); const { data } = await api.groups.deleteOne(id);
loading.value = false; loading.value = false;
refreshAllGroups(); await refreshAllGroups();
return data; return data;
} }
@ -93,9 +80,13 @@ export const useGroups = function () {
if (data && groups.value) { if (data && groups.value) {
groups.value.push(data); groups.value.push(data);
} }
loading.value = false;
} }
const groups = getAllGroups(); // Initialize data on first call
if (!groups.value) {
getAllGroups();
}
return { groups, getAllGroups, refreshAllGroups, deleteGroup, createGroup }; return { groups, getAllGroups, refreshAllGroups, deleteGroup, createGroup };
}; };

View file

@ -48,28 +48,11 @@ export const useHouseholdSelf = function () {
export const useAdminHouseholds = function () { export const useAdminHouseholds = function () {
const api = useAdminApi(); const api = useAdminApi();
const loading = ref(false); const loading = ref(false);
const households = ref<HouseholdInDB[] | null>(null);
function getAllHouseholds() { async function getAllHouseholds() {
loading.value = true; loading.value = true;
const asyncKey = String(Date.now()); const { data } = await api.households.getAll(1, -1, { orderBy: "name, group.name", orderDirection: "asc" });
const { data: households } = useAsyncData(asyncKey, async () => {
const { data } = await api.households.getAll(1, -1, { orderBy: "name, group.name", orderDirection: "asc" });
if (data) {
return data.items;
}
else {
return null;
}
});
loading.value = false;
return households;
}
async function refreshAllHouseholds() {
loading.value = true;
const { data } = await api.households.getAll(1, -1, { orderBy: "name, group.name", orderDirection: "asc" }); ;
if (data) { if (data) {
households.value = data.items; households.value = data.items;
@ -81,11 +64,15 @@ export const useAdminHouseholds = function () {
loading.value = false; loading.value = false;
} }
async function refreshAllHouseholds() {
await getAllHouseholds();
}
async function deleteHousehold(id: string | number) { async function deleteHousehold(id: string | number) {
loading.value = true; loading.value = true;
const { data } = await api.households.deleteOne(id); const { data } = await api.households.deleteOne(id);
loading.value = false; loading.value = false;
refreshAllHouseholds(); await refreshAllHouseholds();
return data; return data;
} }
@ -96,9 +83,9 @@ export const useAdminHouseholds = function () {
if (data && households.value) { if (data && households.value) {
households.value.push(data); households.value.push(data);
} }
loading.value = false;
} }
const households = getAllHouseholds();
function useHouseholdsInGroup(groupIdRef: Ref<string>) { function useHouseholdsInGroup(groupIdRef: Ref<string>) {
return computed( return computed(
() => { () => {
@ -109,6 +96,10 @@ export const useAdminHouseholds = function () {
); );
} }
if (!households.value) {
getAllHouseholds();
}
return { return {
households, households,
useHouseholdsInGroup, useHouseholdsInGroup,

View file

@ -9,7 +9,7 @@ export const LOCALES = [
{ {
name: "简体中文 (Chinese simplified)", name: "简体中文 (Chinese simplified)",
value: "zh-CN", value: "zh-CN",
progress: 32, progress: 33,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -33,7 +33,7 @@ export const LOCALES = [
{ {
name: "Svenska (Swedish)", name: "Svenska (Swedish)",
value: "sv-SE", value: "sv-SE",
progress: 37, progress: 47,
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: 39, 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: 38, 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: 37, progress: 49,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -201,19 +201,19 @@ 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: 39, progress: 61,
dir: "ltr", dir: "ltr",
}, },
{ {
@ -225,7 +225,7 @@ export const LOCALES = [
{ {
name: "Čeština (Czech)", name: "Čeština (Czech)",
value: "cs-CZ", value: "cs-CZ",
progress: 37, progress: 39,
dir: "ltr", dir: "ltr",
}, },
{ {

View file

@ -1,47 +1,47 @@
/* 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
"hu-HU": require("./lang/dateTimeFormats/hu-HU.json"),
"no-NO": require("./lang/dateTimeFormats/no-NO.json"),
"nl-NL": require("./lang/dateTimeFormats/nl-NL.json"),
"pl-PL": require("./lang/dateTimeFormats/pl-PL.json"),
"da-DK": require("./lang/dateTimeFormats/da-DK.json"),
"fr-CA": require("./lang/dateTimeFormats/fr-CA.json"),
"fr-BE": require("./lang/dateTimeFormats/fr-BE.json"),
"it-IT": require("./lang/dateTimeFormats/it-IT.json"),
"sl-SI": require("./lang/dateTimeFormats/sl-SI.json"),
"sr-SP": require("./lang/dateTimeFormats/sr-SP.json"),
"is-IS": require("./lang/dateTimeFormats/is-IS.json"),
"ja-JP": require("./lang/dateTimeFormats/ja-JP.json"),
"fr-FR": require("./lang/dateTimeFormats/fr-FR.json"),
"ca-ES": require("./lang/dateTimeFormats/ca-ES.json"),
"tr-TR": require("./lang/dateTimeFormats/tr-TR.json"), "tr-TR": require("./lang/dateTimeFormats/tr-TR.json"),
"fi-FI": require("./lang/dateTimeFormats/fi-FI.json"),
"hr-HR": require("./lang/dateTimeFormats/hr-HR.json"),
"pt-BR": require("./lang/dateTimeFormats/pt-BR.json"),
"sk-SK": require("./lang/dateTimeFormats/sk-SK.json"),
"zh-CN": require("./lang/dateTimeFormats/zh-CN.json"), "zh-CN": require("./lang/dateTimeFormats/zh-CN.json"),
"pt-PT": require("./lang/dateTimeFormats/pt-PT.json"), "ja-JP": require("./lang/dateTimeFormats/ja-JP.json"),
"en-GB": require("./lang/dateTimeFormats/en-GB.json"), "en-GB": require("./lang/dateTimeFormats/en-GB.json"),
"ca-ES": require("./lang/dateTimeFormats/ca-ES.json"),
"it-IT": require("./lang/dateTimeFormats/it-IT.json"),
"pl-PL": require("./lang/dateTimeFormats/pl-PL.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"),
"cs-CZ": require("./lang/dateTimeFormats/cs-CZ.json"), "sr-SP": require("./lang/dateTimeFormats/sr-SP.json"),
"en-US": require("./lang/dateTimeFormats/en-US.json"), "hr-HR": require("./lang/dateTimeFormats/hr-HR.json"),
"lv-LV": require("./lang/dateTimeFormats/lv-LV.json"),
"ko-KR": require("./lang/dateTimeFormats/ko-KR.json"),
"bg-BG": require("./lang/dateTimeFormats/bg-BG.json"),
"gl-ES": require("./lang/dateTimeFormats/gl-ES.json"),
"de-DE": require("./lang/dateTimeFormats/de-DE.json"), "de-DE": require("./lang/dateTimeFormats/de-DE.json"),
"lt-LT": require("./lang/dateTimeFormats/lt-LT.json"),
"ru-RU": require("./lang/dateTimeFormats/ru-RU.json"),
"he-IL": require("./lang/dateTimeFormats/he-IL.json"),
"el-GR": require("./lang/dateTimeFormats/el-GR.json"),
"zh-TW": require("./lang/dateTimeFormats/zh-TW.json"), "zh-TW": require("./lang/dateTimeFormats/zh-TW.json"),
"af-ZA": require("./lang/dateTimeFormats/af-ZA.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"),
"is-IS": require("./lang/dateTimeFormats/is-IS.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"), "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"), "sv-SE": require("./lang/dateTimeFormats/sv-SE.json"),
"ar-SA": require("./lang/dateTimeFormats/ar-SA.json"), "ko-KR": require("./lang/dateTimeFormats/ko-KR.json"),
"vi-VN": require("./lang/dateTimeFormats/vi-VN.json"), "bg-BG": require("./lang/dateTimeFormats/bg-BG.json"),
"sl-SI": require("./lang/dateTimeFormats/sl-SI.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"),
"fi-FI": require("./lang/dateTimeFormats/fi-FI.json"),
// END: DATE_LOCALES // END: DATE_LOCALES
}; };

View file

@ -5,7 +5,7 @@
"api-docs": "Dokumentace API", "api-docs": "Dokumentace API",
"api-port": "API port", "api-port": "API port",
"application-mode": "Režim aplikace", "application-mode": "Režim aplikace",
"database-type": "Typ databáze", "database-type": "Database Type",
"database-url": "URL databáze", "database-url": "URL databáze",
"default-group": "Výchozí skupina", "default-group": "Výchozí skupina",
"default-household": "Výchozí domácnost", "default-household": "Výchozí domácnost",
@ -662,9 +662,9 @@
}, },
"reset-servings-count": "Resetovat počet porcí", "reset-servings-count": "Resetovat počet porcí",
"not-linked-ingredients": "Další ingredience", "not-linked-ingredients": "Další ingredience",
"upload-another-image": "Upload another image", "upload-another-image": "Nahrát další obrázek",
"upload-images": "Upload images", "upload-images": "Nahrát obrázky",
"upload-more-images": "Upload more images" "upload-more-images": "Nahrát více obrázků"
}, },
"recipe-finder": { "recipe-finder": {
"recipe-finder": "Vyhledávač receptů", "recipe-finder": "Vyhledávač receptů",

View file

@ -1005,7 +1005,7 @@
"webhooks-enabled": "Webhooks aktiviert", "webhooks-enabled": "Webhooks aktiviert",
"you-are-not-allowed-to-create-a-user": "Du bist nicht berechtigt, einen Benutzer anzulegen", "you-are-not-allowed-to-create-a-user": "Du bist nicht berechtigt, einen Benutzer anzulegen",
"you-are-not-allowed-to-delete-this-user": "Du bist nicht berechtigt, diesen Benutzer zu entfernen", "you-are-not-allowed-to-delete-this-user": "Du bist nicht berechtigt, diesen Benutzer zu entfernen",
"enable-advanced-content": "Erweiterten Inhalt aktivieren", "enable-advanced-content": "Erweiterte Inhalte aktivieren",
"enable-advanced-content-description": "Aktiviert zusätzliche Funktionen wie Rezept-Skalierung, API-Schlüssel, Webhooks und Datenverwaltung. Keine Sorge, das kann später noch geändert werden.", "enable-advanced-content-description": "Aktiviert zusätzliche Funktionen wie Rezept-Skalierung, API-Schlüssel, Webhooks und Datenverwaltung. Keine Sorge, das kann später noch geändert werden.",
"favorite-recipes": "Favoriten", "favorite-recipes": "Favoriten",
"email-or-username": "E-Mail oder Benutzername", "email-or-username": "E-Mail oder Benutzername",

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

@ -88,8 +88,8 @@
"close": "Fermer", "close": "Fermer",
"confirm": "Confirmer", "confirm": "Confirmer",
"confirm-how-does-everything-look": "À quoi ressemble le tout ?", "confirm-how-does-everything-look": "À quoi ressemble le tout ?",
"confirm-delete-generic": "Voulez-vous vraiment supprimer ceci?", "confirm-delete-generic": "Voulez-vous vraiment supprimer ceci ?",
"copied_message": "Copié!", "copied_message": "Copié !",
"create": "Créer", "create": "Créer",
"created": "Créé", "created": "Créé",
"custom": "Personnalisé", "custom": "Personnalisé",
@ -111,7 +111,7 @@
"friday": "Vendredi", "friday": "Vendredi",
"general": "Général", "general": "Général",
"get": "Envoyer", "get": "Envoyer",
"home": "Page daccueil", "home": "Accueil",
"image": "Image", "image": "Image",
"image-upload-failed": "Le téléchargement de limage a échoué", "image-upload-failed": "Le téléchargement de limage a échoué",
"import": "Importer", "import": "Importer",
@ -599,10 +599,10 @@
"create-recipe-from-an-image": "Créer une recette à partir dune image", "create-recipe-from-an-image": "Créer une recette à partir dune image",
"create-recipe-from-an-image-description": "Créez une recette en téléchargeant une image de celle-ci. Mealie utilisera lIA pour tenter dextraire le texte et de créer une recette.", "create-recipe-from-an-image-description": "Créez une recette en téléchargeant une image de celle-ci. Mealie utilisera lIA pour tenter dextraire le texte et de créer une recette.",
"crop-and-rotate-the-image": "Rogner et pivoter limage pour que seul le texte soit visible, et quil soit dans la bonne orientation.", "crop-and-rotate-the-image": "Rogner et pivoter limage pour que seul le texte soit visible, et quil soit dans la bonne orientation.",
"create-from-images": "Create from Images", "create-from-images": "Créer à partir dimages",
"should-translate-description": "Traduire la recette dans ma langue", "should-translate-description": "Traduire la recette dans ma langue",
"please-wait-image-procesing": "Veuillez patienter, limage est en cours de traitement. Cela peut prendre du temps.", "please-wait-image-procesing": "Veuillez patienter, limage est en cours de traitement. Cela peut prendre du temps.",
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.", "please-wait-images-processing": "Veuillez patienter, les images sont en cours de traitement. Cela peut prendre un certain temps.",
"bulk-url-import": "Importation en masse d'URL", "bulk-url-import": "Importation en masse d'URL",
"debug-scraper": "Déboguer le récupérateur", "debug-scraper": "Déboguer le récupérateur",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Créer une recette en fournissant le nom. Toutes les recettes doivent avoir des noms uniques.", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Créer une recette en fournissant le nom. Toutes les recettes doivent avoir des noms uniques.",
@ -662,9 +662,9 @@
}, },
"reset-servings-count": "Réinitialiser le nombre de portions", "reset-servings-count": "Réinitialiser le nombre de portions",
"not-linked-ingredients": "Ingrédients supplémentaires", "not-linked-ingredients": "Ingrédients supplémentaires",
"upload-another-image": "Upload another image", "upload-another-image": "Télécharger une autre image",
"upload-images": "Upload images", "upload-images": "Télécharger des images",
"upload-more-images": "Upload more images" "upload-more-images": "Télécharger d'autres images"
}, },
"recipe-finder": { "recipe-finder": {
"recipe-finder": "Recherche de recette", "recipe-finder": "Recherche de recette",

View file

@ -45,7 +45,7 @@
"category-filter": "סינון קטגוריות", "category-filter": "סינון קטגוריות",
"category-update-failed": "עדכון קטגוריה נכשל", "category-update-failed": "עדכון קטגוריה נכשל",
"category-updated": "קטגוריה עודכנה", "category-updated": "קטגוריה עודכנה",
"uncategorized-count": "{count} לא קיבלו קטגוריה", "uncategorized-count": "{count} ללא קטגוריה",
"create-a-category": "יצירת קטגוריה", "create-a-category": "יצירת קטגוריה",
"category-name": "שם קטגוריה", "category-name": "שם קטגוריה",
"category": "קטגוריה" "category": "קטגוריה"

View file

@ -599,10 +599,10 @@
"create-recipe-from-an-image": "Create Recipe from an Image", "create-recipe-from-an-image": "Create Recipe from an Image",
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.", "create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.", "crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
"create-from-images": "Create from Images", "create-from-images": "Criar a partir de imagens",
"should-translate-description": "Traduza a receita para o meu idioma", "should-translate-description": "Traduza a receita para o meu idioma",
"please-wait-image-procesing": "Por favor aguarde, a imagem está sendo processada. Isto pode levar algum tempo.", "please-wait-image-procesing": "Por favor aguarde, a imagem está sendo processada. Isto pode levar algum tempo.",
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.", "please-wait-images-processing": "Por favor aguarde, as imagens estão sendo processadas. Isso pode levar um tempo.",
"bulk-url-import": "Importação de URL em massa", "bulk-url-import": "Importação de URL em massa",
"debug-scraper": "Debug Scraper", "debug-scraper": "Debug Scraper",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crie uma receita fornecendo o nome. Todas as receitas devem ter nomes exclusivos.", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crie uma receita fornecendo o nome. Todas as receitas devem ter nomes exclusivos.",

View file

@ -288,7 +288,7 @@
"household-group": "Группа домохозяйства", "household-group": "Группа домохозяйства",
"household-management": "Управление домохозяйствами", "household-management": "Управление домохозяйствами",
"manage-households": "Управление Домами", "manage-households": "Управление Домами",
"admin-household-management": "Admin Household Management", "admin-household-management": "Управление Домохозяйством",
"admin-household-management-text": "Изменения в данном домохозяйстве будут отражены немедленно.", "admin-household-management-text": "Изменения в данном домохозяйстве будут отражены немедленно.",
"household-id-value": "Id домохозяйства: {0}", "household-id-value": "Id домохозяйства: {0}",
"private-household": "Частное домохозяйство", "private-household": "Частное домохозяйство",
@ -298,7 +298,7 @@
"household-recipe-preferences": "Предпочтения для рецептов домашнего хозяйства", "household-recipe-preferences": "Предпочтения для рецептов домашнего хозяйства",
"default-recipe-preferences-description": "Это настройки по умолчанию, когда в вашем домашнем хозяйстве создается новый рецепт. Они могут быть изменены для отдельных рецептов в меню настроек рецепта.", "default-recipe-preferences-description": "Это настройки по умолчанию, когда в вашем домашнем хозяйстве создается новый рецепт. Они могут быть изменены для отдельных рецептов в меню настроек рецепта.",
"allow-users-outside-of-your-household-to-see-your-recipes": "Разрешить пользователям вне вашего домохозяйства видеть ваши рецепты", "allow-users-outside-of-your-household-to-see-your-recipes": "Разрешить пользователям вне вашего домохозяйства видеть ваши рецепты",
"allow-users-outside-of-your-household-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your household or with a pre-generated private link", "allow-users-outside-of-your-household-to-see-your-recipes-description": "При включении данной функции, вы можете делиться публичной ссылкой на данный рецепт, чтобы поделиться им с людьми без аккаунта. Если функция выключена — поделиться рецептом можно только с пользователями внутри вашего домохозяйства или по предварительно сгенерированной приватной ссылке",
"household-preferences": "Параметры домохозяйства" "household-preferences": "Параметры домохозяйства"
}, },
"meal-plan": { "meal-plan": {

View file

@ -2,8 +2,8 @@
"about": { "about": {
"about": "Om", "about": "Om",
"about-mealie": "Om Mealie", "about-mealie": "Om Mealie",
"api-docs": "API Dokumentation", "api-docs": "API-dokumentation",
"api-port": "API Port", "api-port": "API-port",
"application-mode": "Applikationsläge", "application-mode": "Applikationsläge",
"database-type": "Databastyp", "database-type": "Databastyp",
"database-url": "Databas URL", "database-url": "Databas URL",
@ -17,7 +17,7 @@
"download-recipe-json": "Senast hämtad JSON", "download-recipe-json": "Senast hämtad JSON",
"github": "GitHub", "github": "GitHub",
"log-lines": "Loggrader", "log-lines": "Loggrader",
"not-demo": "Inte Demo", "not-demo": "Inte demo",
"portfolio": "Portfölj", "portfolio": "Portfölj",
"production": "Produktion", "production": "Produktion",
"support": "Support", "support": "Support",
@ -599,10 +599,10 @@
"create-recipe-from-an-image": "Skapa recept från en bild", "create-recipe-from-an-image": "Skapa recept från en bild",
"create-recipe-from-an-image-description": "Skapa ett recept genom att ladda upp en bild på det. Mealie kommer att försöka extrahera texten från bilden med hjälp av AI och skapa ett recept från det.", "create-recipe-from-an-image-description": "Skapa ett recept genom att ladda upp en bild på det. Mealie kommer att försöka extrahera texten från bilden med hjälp av AI och skapa ett recept från det.",
"crop-and-rotate-the-image": "Beskär och rotera bilden så att endast texten är synlig och den är åt rätt håll.", "crop-and-rotate-the-image": "Beskär och rotera bilden så att endast texten är synlig och den är åt rätt håll.",
"create-from-images": "Create from Images", "create-from-images": "Skapa från bild",
"should-translate-description": "Översätt receptet till mitt språk", "should-translate-description": "Översätt receptet till mitt språk",
"please-wait-image-procesing": "Vänligen vänta, bilden bearbetas. Detta kan ta lite tid.", "please-wait-image-procesing": "Vänligen vänta, bilden bearbetas. Detta kan ta lite tid.",
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.", "please-wait-images-processing": "Bilderna behandlas. Detta kan ta lite tid.",
"bulk-url-import": "Massimport från URL", "bulk-url-import": "Massimport från URL",
"debug-scraper": "Felsökningsskrapa", "debug-scraper": "Felsökningsskrapa",
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Skapa ett recept genom att ange namnet. Alla recept måste ha unika namn.", "create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Skapa ett recept genom att ange namnet. Alla recept måste ha unika namn.",
@ -662,9 +662,9 @@
}, },
"reset-servings-count": "Nollställ antal portioner", "reset-servings-count": "Nollställ antal portioner",
"not-linked-ingredients": "Ytterligare ingredienser", "not-linked-ingredients": "Ytterligare ingredienser",
"upload-another-image": "Upload another image", "upload-another-image": "Ladda upp en annan bild",
"upload-images": "Upload images", "upload-images": "Ladda upp bilder",
"upload-more-images": "Upload more images" "upload-more-images": "Ladda upp fler bilder"
}, },
"recipe-finder": { "recipe-finder": {
"recipe-finder": "Sök recept", "recipe-finder": "Sök recept",
@ -1084,7 +1084,7 @@
"use-abbv": "Använd förkortning", "use-abbv": "Använd förkortning",
"fraction": "Bråktal", "fraction": "Bråktal",
"example-unit-singular": "ex: Matsked", "example-unit-singular": "ex: Matsked",
"example-unit-plural": "ex: Matskedar", "example-unit-plural": "ex: matskedar",
"example-unit-abbreviation-singular": "ex: msk", "example-unit-abbreviation-singular": "ex: msk",
"example-unit-abbreviation-plural": "ex: msk" "example-unit-abbreviation-plural": "ex: msk"
}, },

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

@ -241,48 +241,48 @@ export default defineNuxtConfig({
i18n: { i18n: {
locales: [ locales: [
// CODE_GEN_ID: MESSAGE_LOCALES // CODE_GEN_ID: MESSAGE_LOCALES
{ code: "hu-HU", file: "hu-HU.ts" },
{ code: "no-NO", file: "no-NO.ts" },
{ code: "nl-NL", file: "nl-NL.ts" },
{ code: "pl-PL", file: "pl-PL.ts" },
{ code: "da-DK", file: "da-DK.ts" },
{ code: "fr-CA", file: "fr-CA.ts" },
{ code: "fr-BE", file: "fr-BE.ts" },
{ code: "it-IT", file: "it-IT.ts" },
{ code: "sl-SI", file: "sl-SI.ts" },
{ code: "sr-SP", file: "sr-SP.ts" },
{ code: "is-IS", file: "is-IS.ts" },
{ code: "ja-JP", file: "ja-JP.ts" },
{ code: "fr-FR", file: "fr-FR.ts" },
{ code: "ca-ES", file: "ca-ES.ts" },
{ code: "tr-TR", file: "tr-TR.ts" }, { code: "tr-TR", file: "tr-TR.ts" },
{ code: "fi-FI", file: "fi-FI.ts" },
{ code: "hr-HR", file: "hr-HR.ts" },
{ code: "pt-BR", file: "pt-BR.ts" },
{ code: "sk-SK", file: "sk-SK.ts" },
{ code: "zh-CN", file: "zh-CN.ts" }, { code: "zh-CN", file: "zh-CN.ts" },
{ code: "pt-PT", file: "pt-PT.ts" }, { code: "ja-JP", file: "ja-JP.ts" },
{ code: "en-GB", file: "en-GB.ts" }, { code: "en-GB", file: "en-GB.ts" },
{ code: "ca-ES", file: "ca-ES.ts" },
{ code: "it-IT", file: "it-IT.ts" },
{ code: "pl-PL", file: "pl-PL.ts" },
{ code: "pt-PT", file: "pt-PT.ts" },
{ code: "ro-RO", file: "ro-RO.ts" }, { code: "ro-RO", file: "ro-RO.ts" },
{ code: "cs-CZ", file: "cs-CZ.ts" }, { code: "sr-SP", file: "sr-SP.ts" },
{ code: "et-EE", file: "et-EE.ts" }, { code: "hr-HR", file: "hr-HR.ts" },
{ code: "en-US", file: "en-US.ts" },
{ code: "lv-LV", file: "lv-LV.ts" },
{ code: "ko-KR", file: "ko-KR.ts" },
{ code: "bg-BG", file: "bg-BG.ts" },
{ code: "gl-ES", file: "gl-ES.ts" },
{ code: "de-DE", file: "de-DE.ts" }, { code: "de-DE", file: "de-DE.ts" },
{ code: "lt-LT", file: "lt-LT.ts" },
{ code: "ru-RU", file: "ru-RU.ts" },
{ code: "he-IL", file: "he-IL.ts" },
{ code: "el-GR", file: "el-GR.ts" },
{ code: "zh-TW", file: "zh-TW.ts" }, { code: "zh-TW", file: "zh-TW.ts" },
{ code: "af-ZA", file: "af-ZA.ts" }, { code: "af-ZA", file: "af-ZA.ts" },
{ code: "fr-CA", file: "fr-CA.ts" },
{ code: "he-IL", file: "he-IL.ts" },
{ code: "pt-BR", file: "pt-BR.ts" },
{ code: "cs-CZ", file: "cs-CZ.ts" },
{ code: "fr-FR", file: "fr-FR.ts" },
{ code: "ru-RU", file: "ru-RU.ts" },
{ code: "is-IS", file: "is-IS.ts" },
{ code: "sk-SK", file: "sk-SK.ts" },
{ code: "el-GR", file: "el-GR.ts" },
{ code: "fr-BE", file: "fr-BE.ts" },
{ code: "da-DK", file: "da-DK.ts" },
{ code: "hu-HU", file: "hu-HU.ts" },
{ code: "es-ES", file: "es-ES.ts" }, { code: "es-ES", file: "es-ES.ts" },
{ code: "gl-ES", file: "gl-ES.ts" },
{ code: "no-NO", file: "no-NO.ts" },
{ code: "lt-LT", file: "lt-LT.ts" },
{ code: "en-US", file: "en-US.ts" },
{ code: "sv-SE", file: "sv-SE.ts" }, { code: "sv-SE", file: "sv-SE.ts" },
{ code: "ar-SA", file: "ar-SA.ts" }, { code: "ko-KR", file: "ko-KR.ts" },
{ code: "vi-VN", file: "vi-VN.ts" }, { code: "bg-BG", file: "bg-BG.ts" },
{ code: "sl-SI", file: "sl-SI.ts" },
{ code: "uk-UA", file: "uk-UA.ts" }, { code: "uk-UA", file: "uk-UA.ts" },
{ code: "et-EE", file: "et-EE.ts" },
{ code: "lv-LV", file: "lv-LV.ts" },
{ code: "ar-SA", file: "ar-SA.ts" },
{ code: "nl-NL", file: "nl-NL.ts" },
{ code: "vi-VN", file: "vi-VN.ts" },
{ code: "fi-FI", file: "fi-FI.ts" },
// END: MESSAGE_LOCALES // END: MESSAGE_LOCALES
], ],
strategy: "no_prefix", strategy: "no_prefix",

View file

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

View file

@ -14,7 +14,6 @@
:items="groups" :items="groups"
item-title="name" item-title="name"
item-value="id" item-value="id"
:return-object="false"
variant="filled" variant="filled"
:label="$t('household.household-group')" :label="$t('household.household-group')"
:rules="[validators.required]" :rules="[validators.required]"
@ -94,10 +93,7 @@
icon icon
color="error" color="error"
variant="text" variant="text"
@click.stop=" @click.stop="confirmDialog = true; deleteTarget = item.id"
confirmDialog = true;
deleteTarget = +item.id;
"
> >
<v-icon> <v-icon>
{{ $globals.icons.delete }} {{ $globals.icons.delete }}
@ -114,7 +110,7 @@
</v-container> </v-container>
</template> </template>
<script lang="ts"> <script setup lang="ts">
import { fieldTypes } from "~/composables/forms"; import { fieldTypes } from "~/composables/forms";
import { useGroups } from "~/composables/use-groups"; import { useGroups } from "~/composables/use-groups";
import { useAdminHouseholds } from "~/composables/use-households"; import { useAdminHouseholds } from "~/composables/use-households";
@ -122,92 +118,73 @@ import { validators } from "~/composables/use-validators";
import type { HouseholdInDB } from "~/lib/api/types/household"; import type { HouseholdInDB } from "~/lib/api/types/household";
import type { VForm } from "~/types/auto-forms"; import type { VForm } from "~/types/auto-forms";
export default defineNuxtComponent({ definePageMeta({
setup() { layout: "admin",
definePageMeta({ });
layout: "admin",
});
const i18n = useI18n(); const i18n = useI18n();
// Set page title useSeoMeta({
useSeoMeta({ title: i18n.t("household.manage-households"),
title: i18n.t("household.manage-households"), });
});
const { groups } = useGroups(); const { groups } = useGroups();
const { households, refreshAllHouseholds, deleteHousehold, createHousehold } = useAdminHouseholds(); const { households, deleteHousehold, createHousehold } = useAdminHouseholds();
const refNewHouseholdForm = ref<VForm | null>(null);
const state = reactive({ const refNewHouseholdForm = ref<VForm | null>(null);
createDialog: false,
confirmDialog: false,
loading: false,
deleteTarget: 0,
search: "",
headers: [
{
title: i18n.t("household.household"),
align: "start",
sortable: false,
value: "id",
},
{ title: i18n.t("general.name"), value: "name" },
{ title: i18n.t("group.group"), value: "group" },
{ title: i18n.t("user.total-users"), value: "users" },
{ title: i18n.t("user.webhooks-enabled"), value: "webhookEnable" },
{ title: i18n.t("general.delete"), value: "actions" },
],
updateMode: false,
createHouseholdForm: {
items: [
{
label: i18n.t("household.household-name"),
varName: "name",
type: fieldTypes.TEXT,
rules: ["required"],
},
],
data: {
groupId: "",
name: "",
},
},
});
function openDialog() { const createDialog = ref(false);
state.createDialog = true; const confirmDialog = ref(false);
state.createHouseholdForm.data.name = ""; const deleteTarget = ref<string>("");
state.createHouseholdForm.data.groupId = ""; const search = ref("");
} const updateMode = ref(false);
const router = useRouter(); const headers = [
{
title: i18n.t("household.household"),
align: "start",
sortable: false,
value: "id",
},
{ title: i18n.t("general.name"), value: "name" },
{ title: i18n.t("group.group"), value: "group" },
{ title: i18n.t("user.total-users"), value: "users" },
{ title: i18n.t("user.webhooks-enabled"), value: "webhookEnable" },
{ title: i18n.t("general.delete"), value: "actions" },
];
function handleRowClick(item: HouseholdInDB) { const createHouseholdForm = reactive({
router.push(`/admin/manage/households/${item.id}`); items: [
} {
label: i18n.t("household.household-name"),
async function handleCreateSubmit() { varName: "name",
if (!refNewHouseholdForm.value?.validate()) { type: fieldTypes.TEXT,
return; rules: ["required"],
} },
],
state.createDialog = false; data: {
await createHousehold(state.createHouseholdForm.data); groupId: "",
} name: "",
return {
...toRefs(state),
refNewHouseholdForm,
groups,
households,
validators,
refreshAllHouseholds,
deleteHousehold,
handleCreateSubmit,
openDialog,
handleRowClick,
};
}, },
}); });
function openDialog() {
createDialog.value = true;
createHouseholdForm.data.name = "";
createHouseholdForm.data.groupId = "";
}
const router = useRouter();
function handleRowClick(item: HouseholdInDB) {
router.push(`/admin/manage/households/${item.id}`);
}
async function handleCreateSubmit() {
if (!refNewHouseholdForm.value?.validate()) {
return;
}
createDialog.value = false;
await createHousehold(createHouseholdForm.data);
}
</script> </script>

View file

@ -21,26 +21,23 @@
<v-card variant="outlined"> <v-card variant="outlined">
<v-card-text> <v-card-text>
<v-select <v-select
v-if="groups" v-model="selectedGroup"
v-model="selectedGroupId" :items="groups || []"
:items="groups"
item-title="name" item-title="name"
item-value="id" return-object
:return-object="false"
variant="filled" variant="filled"
:label="$t('group.user-group')" :label="$t('group.user-group')"
:rules="[validators.required]" :rules="[validators.required]"
/> />
<v-select <v-select
v-model="newUserData.household" v-model="newUserData.household"
:disabled="!selectedGroupId" :disabled="!selectedGroup"
:items="households" :items="households"
item-title="name" item-title="name"
item-value="name" item-value="name"
:return-object="false"
variant="filled" variant="filled"
:label="$t('household.user-household')" :label="$t('household.user-household')"
:hint="selectedGroupId ? '' : $t('group.you-must-select-a-group-before-selecting-a-household')" :hint="selectedGroup ? '' : $t('group.you-must-select-a-group-before-selecting-a-household')"
persistent-hint persistent-hint
:rules="[validators.required]" :rules="[validators.required]"
/> />
@ -60,82 +57,51 @@
</v-container> </v-container>
</template> </template>
<script lang="ts"> <script setup lang="ts">
import { useAdminApi } from "~/composables/api"; import { useAdminApi } from "~/composables/api";
import { useGroups } from "~/composables/use-groups"; import { useGroups } from "~/composables/use-groups";
import { useAdminHouseholds } from "~/composables/use-households";
import { useUserForm } from "~/composables/use-users"; import { useUserForm } from "~/composables/use-users";
import { validators } from "~/composables/use-validators"; import { validators } from "~/composables/use-validators";
import type { UserIn } from "~/lib/api/types/user"; import type { GroupInDB, UserIn } from "~/lib/api/types/user";
import type { VForm } from "~/types/auto-forms"; import type { VForm } from "~/types/auto-forms";
export default defineNuxtComponent({ definePageMeta({
setup() { layout: "admin",
definePageMeta({
layout: "admin",
});
const { userForm } = useUserForm();
const { groups } = useGroups();
const { useHouseholdsInGroup } = useAdminHouseholds();
const router = useRouter();
// ==============================================
// New User Form
const refNewUserForm = ref<VForm | null>(null);
const adminApi = useAdminApi();
const selectedGroupId = ref<string>("");
const households = useHouseholdsInGroup(selectedGroupId);
const selectedGroup = computed(() => {
return groups.value?.find(group => group.id === selectedGroupId.value);
});
const state = reactive({
newUserData: {
username: "",
fullName: "",
email: "",
admin: false,
group: selectedGroup.value?.name || "",
household: "",
advanced: false,
canInvite: false,
canManage: false,
canOrganize: false,
password: "",
authMethod: "Mealie",
},
});
watch(selectedGroup, (newGroup) => {
state.newUserData.group = newGroup?.name || "";
state.newUserData.household = "";
});
async function handleSubmit() {
if (!refNewUserForm.value?.validate()) return;
const { response } = await adminApi.users.createOne(state.newUserData as UserIn);
if (response?.status === 201) {
router.push("/admin/manage/users");
}
}
return {
...toRefs(state),
userForm,
refNewUserForm,
handleSubmit,
groups,
selectedGroupId,
households,
validators,
};
},
}); });
const { userForm } = useUserForm();
const { groups } = useGroups();
const router = useRouter();
const refNewUserForm = ref<VForm | null>(null);
const adminApi = useAdminApi();
const selectedGroup = ref<GroupInDB | undefined>(undefined);
const households = computed(() => selectedGroup.value?.households || []);
const newUserData = ref({
username: "",
fullName: "",
email: "",
admin: false,
group: computed(() => selectedGroup.value?.name || ""),
household: "",
advanced: false,
canInvite: false,
canManage: false,
canOrganize: false,
password: "",
authMethod: "Mealie",
});
async function handleSubmit() {
if (!refNewUserForm.value?.validate()) return;
const { response } = await adminApi.users.createOne(newUserData.value as UserIn);
if (response?.status === 201) {
router.push("/admin/manage/users");
}
}
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

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

@ -5,7 +5,6 @@
:close-on-content-click="false" :close-on-content-click="false"
transition="scale-transition" transition="scale-transition"
offset-y offset-y
max-width="290px"
min-width="auto" min-width="auto"
> >
<template #activator="{ props }"> <template #activator="{ props }">
@ -20,29 +19,26 @@
{{ $d(weekRange.start, "short") }} - {{ $d(weekRange.end, "short") }} {{ $d(weekRange.start, "short") }} - {{ $d(weekRange.end, "short") }}
</v-btn> </v-btn>
</template> </template>
<v-date-picker
v-model="state.range" <v-card>
hide-header <v-date-picker
:multiple="'range'" v-model="state.range"
:first-day-of-week="firstDayOfWeek" hide-header
:local="$i18n.locale" :multiple="'range'"
> :first-day-of-week="firstDayOfWeek"
<v-text-field :local="$i18n.locale"
v-model="numberOfDays"
type="number"
:label="$t('meal-plan.numberOfDays-label')"
:hint="$t('meal-plan.numberOfDays-hint')"
persistent-hint
/> />
<v-spacer />
<v-btn <v-card-text>
variant="text" <v-text-field
color="primary" v-model="numberOfDays"
@click="state.picker = false" type="number"
> :label="$t('meal-plan.numberOfDays-label')"
{{ $t("general.ok") }} :hint="$t('meal-plan.numberOfDays-hint')"
</v-btn> persistent-hint
</v-date-picker> />
</v-card-text>
</v-card>
</v-menu> </v-menu>
<div class="d-flex flex-wrap align-center justify-space-between mb-2"> <div class="d-flex flex-wrap align-center justify-space-between mb-2">
@ -115,15 +111,11 @@ export default defineNuxtComponent({
const weekRange = computed(() => { const weekRange = computed(() => {
const sorted = [...state.value.range].sort((a, b) => a.getTime() - b.getTime()); const sorted = [...state.value.range].sort((a, b) => a.getTime() - b.getTime());
if (sorted.length === 2) { const start = sorted[0];
return { const end = sorted[sorted.length - 1];
start: sorted[0],
end: sorted[1], if (start && end) {
}; return { start, end };
// return {
// start: parseYYYYMMDD(sorted[0]),
// end: parseYYYYMMDD(sorted[1]),
// };
} }
return { return {
start: new Date(), start: new Date(),

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

@ -6,8 +6,8 @@
"unique-name-error": "Les noms de recette doivent être uniques", "unique-name-error": "Les noms de recette doivent être uniques",
"recipe-created": "Recette créée", "recipe-created": "Recette créée",
"recipe-defaults": { "recipe-defaults": {
"ingredient-note": "100g de farine", "ingredient-note": "1 Tasse de farine",
"step-text": "Les étapes de la recette ainsi que les autres champs de la page de recette supportent la syntaxe markdown.\n\n**Ajouter un lien**\n\n[Mon lien](https://demo.mealie.io)\n" "step-text": "Les étapes de la recette ainsi que les autres champs de la page de recette supportent la syntaxe Markdown.\n\n**Ajouter un lien**\n\n[Mon lien](https://demo.mealie.io)\n"
}, },
"servings-text": { "servings-text": {
"makes": "Fait", "makes": "Fait",
@ -73,7 +73,7 @@
"subject": "E-mail de test Mealie", "subject": "E-mail de test Mealie",
"header_text": "E-mail de test", "header_text": "E-mail de test",
"message_top": "Ceci est un mail de test.", "message_top": "Ceci est un mail de test.",
"message_bottom": "Veuillez cliquer sur le bouton ci-dessus pour accepter l'invitation.", "message_bottom": "Veuillez cliquer sur le bouton ci-dessus pour tester l'E-mail.",
"button_text": "Ouvrir Mealie" "button_text": "Ouvrir Mealie"
} }
} }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -22,112 +22,112 @@
"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": "zucchini", "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": [],
@ -138,31 +138,31 @@
"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": "kales"
}, },
"arugula": { "arugula": {
@ -186,14 +186,14 @@
"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": [],
@ -298,55 +298,55 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "serrano pepper", "name": "serrano pepper",
"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": [],
"description": "", "description": "",
"name": "watercress", "name": "νεροκάρδαμο",
"plural_name": "watercress" "plural_name": "νεροκάρδαμα"
}, },
"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": [],
@ -368,7 +368,7 @@
}, },
"napa cabbage": { "napa cabbage": {
"aliases": [ "aliases": [
"chinese leaves" "κινέζικα φύλλα"
], ],
"description": "", "description": "",
"name": "napa cabbage", "name": "napa cabbage",
@ -377,44 +377,44 @@
"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": [],
"description": "", "description": "",
"name": "thai chile pepper", "name": "πιπεριά τσίλι ταϊλάνδης",
"plural_name": "thai chile peppers" "plural_name": "πιπεριές τσίλι ταϊλάνδης"
}, },
"bok choy": { "bok choy": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bok choy", "name": "μποκ τσόι",
"plural_name": "bok choy" "plural_name": "μποκ τσόι"
}, },
"okra": { "okra": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "okra", "name": "μπάμια",
"plural_name": "okra" "plural_name": "μπάμια"
}, },
"acorn squash": { "acorn squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "acorn squash", "name": "βελανοειδής κολοκύθα",
"plural_name": "acorn squashes" "plural_name": "βελανοειδείς κολοκύθες"
}, },
"corn cob": { "corn cob": {
"aliases": [], "aliases": [],
@ -443,8 +443,8 @@
"plantain": { "plantain": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "plantain", "name": "μπανάνες Αντιλλών",
"plural_name": "plantains" "plural_name": "μπανάνες Αντιλλών"
}, },
"leaf lettuce": { "leaf lettuce": {
"aliases": [], "aliases": [],
@ -559,14 +559,14 @@
"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": [],
@ -577,8 +577,8 @@
"frisee": { "frisee": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "frisee", "name": "κατσαρό αντίδι",
"plural_name": "frisees" "plural_name": "κατσαρά αντίδια"
}, },
"anaheim pepper": { "anaheim pepper": {
"aliases": [], "aliases": [],
@ -648,7 +648,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "apple", "name": "apple",
"plural_name": "apples" "plural_name": "μήλα"
}, },
"banana": { "banana": {
"aliases": [], "aliases": [],

View file

@ -5,7 +5,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "garlic",
"plural_name": "garlics" "plural_name": "garlic"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
@ -28,8 +28,8 @@
"scallion": { "scallion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "scallion", "name": "spring onion",
"plural_name": "scallions" "plural_name": "spring onions"
}, },
"zucchini": { "zucchini": {
"aliases": [], "aliases": [],
@ -59,7 +59,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celery", "name": "celery",
"plural_name": "celeries" "plural_name": "celery"
}, },
"jalapeno": { "jalapeno": {
"aliases": [], "aliases": [],
@ -95,13 +95,13 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spinach", "name": "spinach",
"plural_name": "spinaches" "plural_name": "spinach"
}, },
"sweet corn": { "sweet corn": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet corn", "name": "sweetcorn",
"plural_name": "sweet corns" "plural_name": "sweetcorn"
}, },
"chile pepper": { "chile pepper": {
"aliases": [ "aliases": [
@ -121,7 +121,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "broccoli", "name": "broccoli",
"plural_name": "broccolis" "plural_name": "broccoli"
}, },
"heart of palm": { "heart of palm": {
"aliases": [], "aliases": [],
@ -156,20 +156,20 @@
"asparagu": { "asparagu": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "asparagu", "name": "asparagus",
"plural_name": "asparagus" "plural_name": "asparagus"
}, },
"kale": { "kale": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kale", "name": "kale",
"plural_name": "kales" "plural_name": "kale"
}, },
"arugula": { "arugula": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "arugula", "name": "rocket",
"plural_name": "arugulas" "plural_name": "rocket"
}, },
"leek": { "leek": {
"aliases": [], "aliases": [],
@ -180,8 +180,8 @@
"eggplant": { "eggplant": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "eggplant", "name": "aubergine",
"plural_name": "eggplants" "plural_name": "aubergines"
}, },
"lettuce": { "lettuce": {
"aliases": [], "aliases": [],
@ -222,8 +222,8 @@
"sun dried tomato": { "sun dried tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sun dried tomato", "name": "sun-dried tomato",
"plural_name": "sun dried tomatoes" "plural_name": "sun-dried tomatoes"
}, },
"radish": { "radish": {
"aliases": [], "aliases": [],
@ -256,7 +256,7 @@
], ],
"description": "", "description": "",
"name": "summer squash", "name": "summer squash",
"plural_name": "summer squashes" "plural_name": "courgettes"
}, },
"mixed green": { "mixed green": {
"aliases": [], "aliases": [],
@ -523,7 +523,7 @@
"rutabaga": { "rutabaga": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rutabaga", "name": "swede",
"plural_name": "rutabagas" "plural_name": "rutabagas"
}, },
"belgian endive": { "belgian endive": {
@ -589,7 +589,7 @@
"cres": { "cres": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cres", "name": "cress",
"plural_name": "cress" "plural_name": "cress"
}, },
"broccoli slaw": { "broccoli slaw": {
@ -701,8 +701,8 @@
"craisin": { "craisin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "craisin", "name": "dried cranberry",
"plural_name": "craisins" "plural_name": "dried cranberries"
}, },
"pear": { "pear": {
"aliases": [], "aliases": [],
@ -732,7 +732,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rhubarb", "name": "rhubarb",
"plural_name": "rhubarbs" "plural_name": "rhubarb"
}, },
"dried apricot": { "dried apricot": {
"aliases": [], "aliases": [],
@ -1091,7 +1091,7 @@
"physali": { "physali": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "physali", "name": "physalis",
"plural_name": "physalis" "plural_name": "physalis"
}, },
"tamarillo": { "tamarillo": {
@ -11491,7 +11491,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "soy sauce", "name": "soy sauce",
"plural_name": "soy sauces" "plural_name": "soy sauce"
}, },
"dijon mustard": { "dijon mustard": {
"aliases": [], "aliases": [],
@ -11611,7 +11611,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dark soy sauce", "name": "dark soy sauce",
"plural_name": "dark soy sauces" "plural_name": "dark soy sauce"
}, },
"coconut amino": { "coconut amino": {
"aliases": [], "aliases": [],
@ -11971,7 +11971,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mushroom soy sauce", "name": "mushroom soy sauce",
"plural_name": "mushroom soy sauces" "plural_name": "mushroom soy sauce"
}, },
"yuzu kosho": { "yuzu kosho": {
"aliases": [], "aliases": [],
@ -12705,7 +12705,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "peanut butter", "name": "peanut butter",
"plural_name": "peanut butters" "plural_name": "peanut butter"
}, },
"tomato paste": { "tomato paste": {
"aliases": [], "aliases": [],

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": [],

File diff suppressed because it is too large Load diff

View file

@ -4,50 +4,50 @@
"garlic": { "garlic": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "allo",
"plural_name": "garlics" "plural_name": "allos"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion", "name": "cebola",
"plural_name": "onions" "plural_name": "cebolas"
}, },
"bell pepper": { "bell pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bell pepper", "name": "pimento",
"plural_name": "bell peppers" "plural_name": "pimentos"
}, },
"carrot": { "carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carrot", "name": "cenoura",
"plural_name": "carrots" "plural_name": "cenouras"
}, },
"scallion": { "scallion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "scallion", "name": "ceboliño",
"plural_name": "scallions" "plural_name": "ceboliños"
}, },
"zucchini": { "zucchini": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "zucchini", "name": "cabaciña",
"plural_name": "zucchinis" "plural_name": "cabaciñas"
}, },
"potato": { "potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "potato", "name": "pataca",
"plural_name": "potatoes" "plural_name": "patacas"
}, },
"red onion": { "red onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red onion", "name": "cebola roxa",
"plural_name": "red onions" "plural_name": "cebolas roxas"
}, },
"yellow onion": { "yellow onion": {
"aliases": [], "aliases": [],
@ -82,20 +82,20 @@
"cherry tomato": { "cherry tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry tomato", "name": "tomate-cereixa",
"plural_name": "cherry tomatoes" "plural_name": "tomates-cereixa"
}, },
"cucumber": { "cucumber": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cucumber", "name": "cogombro",
"plural_name": "cucumbers" "plural_name": "cogombros"
}, },
"spinach": { "spinach": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spinach", "name": "espinaca",
"plural_name": "spinaches" "plural_name": "espinacas"
}, },
"sweet corn": { "sweet corn": {
"aliases": [], "aliases": [],
@ -114,14 +114,14 @@
"sweet potato": { "sweet potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet potato", "name": "pataca-doce",
"plural_name": "sweet potatoes" "plural_name": "patacas-doces"
}, },
"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": [],
@ -138,8 +138,8 @@
"pumpkin": { "pumpkin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pumpkin", "name": "cabaza",
"plural_name": "pumpkins" "plural_name": "cabazas"
}, },
"cauliflower": { "cauliflower": {
"aliases": [], "aliases": [],
@ -150,8 +150,8 @@
"cabbage": { "cabbage": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cabbage", "name": "repolo",
"plural_name": "cabbages" "plural_name": "repolos"
}, },
"asparagu": { "asparagu": {
"aliases": [], "aliases": [],
@ -174,8 +174,8 @@
"leek": { "leek": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "leek", "name": "porro",
"plural_name": "leeks" "plural_name": "porros"
}, },
"eggplant": { "eggplant": {
"aliases": [], "aliases": [],
@ -186,8 +186,8 @@
"lettuce": { "lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lettuce", "name": "leituga",
"plural_name": "lettuces" "plural_name": "leitugas"
}, },
"butternut squash": { "butternut squash": {
"aliases": [], "aliases": [],
@ -309,8 +309,8 @@
"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": [],
@ -339,8 +339,8 @@
"chard": { "chard": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chard", "name": "acelga",
"plural_name": "chards" "plural_name": "acelgas"
}, },
"pimiento": { "pimiento": {
"aliases": [], "aliases": [],
@ -629,8 +629,8 @@
"tomato": { "tomato": {
"aliases": [], "aliases": [],
"description": "Yes they are a fruit", "description": "Yes they are a fruit",
"name": "tomato", "name": "tomate",
"plural_name": "tomatoes" "plural_name": "tomates"
}, },
"lemon": { "lemon": {
"aliases": [], "aliases": [],
@ -641,14 +641,14 @@
"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": "mazá",
"plural_name": "apples" "plural_name": "mazás"
}, },
"banana": { "banana": {
"aliases": [], "aliases": [],
@ -659,14 +659,14 @@
"orange": { "orange": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "orange", "name": "laranxa",
"plural_name": "oranges" "plural_name": "laranxas"
}, },
"raisin": { "raisin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "raisin", "name": "uva-pasa",
"plural_name": "raisins" "plural_name": "uvas-pasas"
}, },
"pineapple": { "pineapple": {
"aliases": [], "aliases": [],
@ -695,8 +695,8 @@
"coconut": { "coconut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "coconut", "name": "coco",
"plural_name": "coconuts" "plural_name": "cocos"
}, },
"craisin": { "craisin": {
"aliases": [], "aliases": [],
@ -707,14 +707,14 @@
"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": [],
@ -923,8 +923,8 @@
"dragon fruit": { "dragon fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dragon fruit", "name": "pitaia",
"plural_name": "dragon fruits" "plural_name": "pitaias"
}, },
"mixed fruit": { "mixed fruit": {
"aliases": [], "aliases": [],
@ -1477,8 +1477,8 @@
"cherry": { "cherry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry", "name": "cereixa",
"plural_name": "cherries" "plural_name": "cereixas"
}, },
"blackberry": { "blackberry": {
"aliases": [], "aliases": [],
@ -2027,8 +2027,8 @@
"cheese": { "cheese": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cheese", "name": "queixo",
"plural_name": "cheeses" "plural_name": "queixos"
}, },
"mozzarella": { "mozzarella": {
"aliases": [], "aliases": [],
@ -2613,20 +2613,20 @@
"butter": { "butter": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "butter", "name": "manteiga",
"plural_name": "butter" "plural_name": "manteigas"
}, },
"egg": { "egg": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "egg", "name": "ovo",
"plural_name": "eggs" "plural_name": "ovos"
}, },
"milk": { "milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "milk", "name": "leite",
"plural_name": "milks" "plural_name": "leites"
}, },
"heavy cream": { "heavy cream": {
"aliases": [], "aliases": [],
@ -2649,8 +2649,8 @@
"yogurt": { "yogurt": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yogurt", "name": "iogurte",
"plural_name": "yogurts" "plural_name": "iogurtes"
}, },
"greek yogurt": { "greek yogurt": {
"aliases": [], "aliases": [],
@ -3279,7 +3279,7 @@
"rice milk": { "rice milk": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rice milk", "name": "leite de arroz",
"plural_name": "rice milks" "plural_name": "rice milks"
}, },
"vegan sour cream": { "vegan sour cream": {
@ -4081,8 +4081,8 @@
"rabbit": { "rabbit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rabbit", "name": "coello",
"plural_name": "rabbits" "plural_name": "coellos"
}, },
"pork cutlet": { "pork cutlet": {
"aliases": [], "aliases": [],

File diff suppressed because it is too large Load diff

View file

@ -4,31 +4,31 @@
"garlic": { "garlic": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "fokhagyma",
"plural_name": "garlics" "plural_name": "fokhagyma"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion", "name": "hagyma",
"plural_name": "onions" "plural_name": "hagyma"
}, },
"bell pepper": { "bell pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bell pepper", "name": "kaliforniai paprika",
"plural_name": "bell peppers" "plural_name": "kaliforniai paprika"
}, },
"carrot": { "carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carrot", "name": "sárgarépa",
"plural_name": "carrots" "plural_name": "sárgarépa"
}, },
"scallion": { "scallion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "scallion", "name": "újhagyma",
"plural_name": "zöldhagyma" "plural_name": "zöldhagyma"
}, },
"zucchini": { "zucchini": {
@ -52,8 +52,8 @@
"yellow onion": { "yellow onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yellow onion", "name": "vöröshagyma",
"plural_name": "yellow onions" "plural_name": "vöröshagyma"
}, },
"celery": { "celery": {
"aliases": [], "aliases": [],
@ -82,8 +82,8 @@
"cherry tomato": { "cherry tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry tomato", "name": "koktélparadicsom",
"plural_name": "cherry tomatoes" "plural_name": "koktélparadicsom"
}, },
"cucumber": { "cucumber": {
"aliases": [], "aliases": [],
@ -105,11 +105,11 @@
}, },
"chile pepper": { "chile pepper": {
"aliases": [ "aliases": [
"capsicum" "kaliforniai paprika"
], ],
"description": "", "description": "",
"name": "chile pepper", "name": "chili paprika",
"plural_name": "chile peppers" "plural_name": "chili paprika"
}, },
"sweet potato": { "sweet potato": {
"aliases": [], "aliases": [],
@ -126,20 +126,20 @@
"heart of palm": { "heart of palm": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "heart of palm", "name": "pálmarügy",
"plural_name": "heart of palms" "plural_name": "pálmarügy"
}, },
"baby green": { "baby green": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby green", "name": "salátakeverék",
"plural_name": "baby greens" "plural_name": "salátakeverék"
}, },
"pumpkin": { "pumpkin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pumpkin", "name": "sütőtök",
"plural_name": "pumpkins" "plural_name": "sütőtök"
}, },
"cauliflower": { "cauliflower": {
"aliases": [], "aliases": [],
@ -151,258 +151,258 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "káposzta", "name": "káposzta",
"plural_name": "cabbages" "plural_name": "fejes káposzta"
}, },
"asparagu": { "asparagu": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "asparagu", "name": "spárga",
"plural_name": "asparagus" "plural_name": "spárga"
}, },
"kale": { "kale": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kale", "name": "kelkáposzta",
"plural_name": "kales" "plural_name": "kelkáposzta"
}, },
"arugula": { "arugula": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "arugula", "name": "rukkola",
"plural_name": "arugulas" "plural_name": "rukkola"
}, },
"leek": { "leek": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "leek", "name": "póréhagyma",
"plural_name": "leeks" "plural_name": "póréhagyma"
}, },
"eggplant": { "eggplant": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "eggplant", "name": "padlizsán",
"plural_name": "eggplants" "plural_name": "padlizsán"
}, },
"lettuce": { "lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lettuce", "name": "saláta",
"plural_name": "lettuces" "plural_name": "saláta"
}, },
"butternut squash": { "butternut squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "butternut squash", "name": "kanadai sütőtök",
"plural_name": "butternut squashes" "plural_name": "kanadai sütőtök"
}, },
"romaine": { "romaine": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "romaine", "name": "római saláta",
"plural_name": "romaines" "plural_name": "római saláta"
}, },
"beetroot": { "beetroot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "beetroot", "name": "cékla",
"plural_name": "beetroots" "plural_name": "cékla"
}, },
"brussels sprout": { "brussels sprout": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "brussels sprout", "name": "kelbimbó",
"plural_name": "brussels sprouts" "plural_name": "kelbimbó"
}, },
"fennel": { "fennel": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "fennel", "name": "édeskömény",
"plural_name": "fennels" "plural_name": "édeskömény"
}, },
"sun dried tomato": { "sun dried tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sun dried tomato", "name": "szárított paradicsom",
"plural_name": "sun dried tomatoes" "plural_name": "szárított paradicsom"
}, },
"radish": { "radish": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "radish", "name": "retek",
"plural_name": "radishes" "plural_name": "retkek"
}, },
"red cabbage": { "red cabbage": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red cabbage", "name": "vöröskáposzta",
"plural_name": "red cabbages" "plural_name": "vöröskáposzta"
}, },
"artichoke": { "artichoke": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "artichoke", "name": "articsóka",
"plural_name": "artichokes" "plural_name": "articsóka"
}, },
"new potato": { "new potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "new potato", "name": "újburgonya",
"plural_name": "new potatoes" "plural_name": "újburgonya"
}, },
"summer squash": { "summer squash": {
"aliases": [ "aliases": [
"courgette", "cukkini",
"gem squash" "kis tök"
], ],
"description": "", "description": "",
"name": "summer squash", "name": "főzőtök",
"plural_name": "summer squashes" "plural_name": "főzőtök"
}, },
"mixed green": { "mixed green": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed green", "name": "salátakeverék",
"plural_name": "mixed greens" "plural_name": "salátakeverék"
}, },
"parsnip": { "parsnip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "parsnip", "name": "paszternák",
"plural_name": "parsnips" "plural_name": "paszternák"
}, },
"baby carrot": { "baby carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby carrot", "name": "bébirépa",
"plural_name": "baby carrots" "plural_name": "bébirépa"
}, },
"mixed vegetable": { "mixed vegetable": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed vegetable", "name": "zöldségkeverék",
"plural_name": "mixed vegetables" "plural_name": "zöldségkeverék"
}, },
"poblano pepper": { "poblano pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "poblano pepper", "name": "poblano paprika",
"plural_name": "poblano peppers" "plural_name": "poblano paprika"
}, },
"sweet pepper": { "sweet pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet pepper", "name": "édes paprika",
"plural_name": "sweet peppers" "plural_name": "édes paprika"
}, },
"serrano pepper": { "serrano pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "serrano pepper", "name": "serrano paprika",
"plural_name": "serrano peppers" "plural_name": "serrano paprika"
}, },
"cayenne pepper": { "cayenne pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cayenne pepper", "name": "cayenne bors",
"plural_name": "cayenne peppers" "plural_name": "cayenne bors"
}, },
"green tomato": { "green tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "green tomato", "name": "zöld paradicsom",
"plural_name": "green tomatoes" "plural_name": "zöld paradicsom"
}, },
"watercress": { "watercress": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "watercress", "name": "vízitorma",
"plural_name": "watercress" "plural_name": "vízitorma"
}, },
"iceberg": { "iceberg": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "iceberg", "name": "jégsaláta",
"plural_name": "icebergs" "plural_name": "jégsaláta"
}, },
"mashed potato": { "mashed potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mashed potato", "name": "burgonyapüré",
"plural_name": "mashed potatoes" "plural_name": "burgonyapüré"
}, },
"horseradish": { "horseradish": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "horseradish", "name": "torma",
"plural_name": "horseradishes" "plural_name": "torma"
}, },
"chard": { "chard": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chard", "name": "mángold",
"plural_name": "chards" "plural_name": "mángold"
}, },
"pimiento": { "pimiento": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pimiento", "name": "kápia paprika",
"plural_name": "pimientoes" "plural_name": "kápia paprika"
}, },
"spaghetti squash": { "spaghetti squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spaghetti squash", "name": "spagettitök",
"plural_name": "spaghetti squashes" "plural_name": "spagettitök"
}, },
"butter lettuce": { "butter lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "butter lettuce", "name": "fejes saláta",
"plural_name": "butter lettuces" "plural_name": "fejes saláta"
}, },
"hash brown": { "hash brown": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "hash brown", "name": "tócsni",
"plural_name": "hash browns" "plural_name": "tócsni"
}, },
"napa cabbage": { "napa cabbage": {
"aliases": [ "aliases": [
"chinese leaves" "kínai kel"
], ],
"description": "", "description": "",
"name": "napa cabbage", "name": "kínai kel",
"plural_name": "napa cabbages" "plural_name": "kínai kel"
}, },
"celeriac": { "celeriac": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celeriac", "name": "zeller",
"plural_name": "celeriacs" "plural_name": "zeller"
}, },
"water chestnut": { "water chestnut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "water chestnut", "name": "vízigesztenye",
"plural_name": "water chestnuts" "plural_name": "vízigesztenye"
}, },
"turnip": { "turnip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "turnip", "name": "tarlórépa",
"plural_name": "turnips" "plural_name": "tarlórépa"
}, },
"thai chile pepper": { "thai chile pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "thai chile pepper", "name": "thai csili paprika",
"plural_name": "thai chile peppers" "plural_name": "thai csili paprika"
}, },
"bok choy": { "bok choy": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bok choy", "name": "bordáskel",
"plural_name": "bok choy" "plural_name": "bordáskel"
}, },
"okra": { "okra": {
"aliases": [], "aliases": [],
@ -413,130 +413,130 @@
"acorn squash": { "acorn squash": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "acorn squash", "name": "makktök",
"plural_name": "acorn squashes" "plural_name": "makktök"
}, },
"corn cob": { "corn cob": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "corn cob", "name": "kukoricacső",
"plural_name": "corn cobs" "plural_name": "kukoricacső"
}, },
"radicchio": { "radicchio": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "radicchio", "name": "vörös cikória",
"plural_name": "radicchio" "plural_name": "vörös cikória"
}, },
"pearl onion": { "pearl onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pearl onion", "name": "gyöngyhagyma",
"plural_name": "pearl onions" "plural_name": "gyöngyhagyma"
}, },
"tenderstem broccoli": { "tenderstem broccoli": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "tenderstem broccoli", "name": "brokkolini",
"plural_name": "tenderstem broccolis" "plural_name": "brokkolini"
}, },
"plantain": { "plantain": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "plantain", "name": "főzőbanán",
"plural_name": "plantains" "plural_name": "főzőbanán"
}, },
"leaf lettuce": { "leaf lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "leaf lettuce", "name": "saláta",
"plural_name": "leaf lettuces" "plural_name": "saláta"
}, },
"pepperoncini": { "pepperoncini": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pepperoncini", "name": "pepperoncini paprika",
"plural_name": "pepperoncinis" "plural_name": "pepperoncini paprika"
}, },
"baby bok choy": { "baby bok choy": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby bok choy", "name": "bébi bordáskel",
"plural_name": "baby bok choys" "plural_name": "bébi bordáskel"
}, },
"jicama": { "jicama": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "jicama", "name": "jícama",
"plural_name": "jicamas" "plural_name": "jícama"
}, },
"endive": { "endive": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "endive", "name": "endívia",
"plural_name": "endives" "plural_name": "endívia"
}, },
"habanero pepper": { "habanero pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "habanero pepper", "name": "habanero paprika",
"plural_name": "habanero peppers" "plural_name": "habanero paprika"
}, },
"corn husk": { "corn husk": {
"aliases": [ "aliases": [
"maize" "csemegekukorica"
], ],
"description": "", "description": "",
"name": "corn husk", "name": "kukoricacsuhé",
"plural_name": "corn husks" "plural_name": "kukoricacsuhé"
}, },
"collard green": { "collard green": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "collard green", "name": "leveles kel",
"plural_name": "collard greens" "plural_name": "leveles kel"
}, },
"french-fried onion": { "french-fried onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "french-fried onion", "name": "ropogós sült hagyma",
"plural_name": "french-fried onions" "plural_name": "ropogós sült hagyma"
}, },
"daikon": { "daikon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "daikon", "name": "jégcsapretek",
"plural_name": "daikons" "plural_name": "jégcsapretek"
}, },
"baby corn": { "baby corn": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "baby corn", "name": "bébikukorica",
"plural_name": "baby corns" "plural_name": "bébikukorica"
}, },
"broccoli rabe": { "broccoli rabe": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "broccoli rabe", "name": "rapini",
"plural_name": "broccoli rabes" "plural_name": "rapini"
}, },
"rutabaga": { "rutabaga": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rutabaga", "name": "karórépa",
"plural_name": "rutabagas" "plural_name": "karórépa"
}, },
"belgian endive": { "belgian endive": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "belgian endive", "name": "cikória",
"plural_name": "belgian endives" "plural_name": "cikória"
}, },
"yam": { "yam": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yam", "name": "jamgyökér",
"plural_name": "yams" "plural_name": "jamgyökér"
}, },
"ancho chile pepper": { "ancho chile pepper": {
"aliases": [], "aliases": [],
@ -602,25 +602,25 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "arbol chile pepper", "name": "arbol chile pepper",
"plural_name": "arbol chile peppers" "plural_name": "arbol csili paprika"
}, },
"golden beet": { "golden beet": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "golden beet", "name": "sárga cékla",
"plural_name": "golden beets" "plural_name": "sárga cékla"
}, },
"pea shoot": { "pea shoot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pea shoot", "name": "borsócsíra",
"plural_name": "pea shoots" "plural_name": "borsócsíra"
}, },
"alfalfa": { "alfalfa": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "alfalfa", "name": "lucernacsíra",
"plural_name": "alfalfas" "plural_name": "lucernacsíra"
} }
} }
}, },
@ -628,129 +628,129 @@
"foods": { "foods": {
"tomato": { "tomato": {
"aliases": [], "aliases": [],
"description": "Yes they are a fruit", "description": "Igen, gyümölcs",
"name": "tomato", "name": "paradicsom",
"plural_name": "tomatoes" "plural_name": "paradicsom"
}, },
"lemon": { "lemon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lemon", "name": "citrom",
"plural_name": "lemons" "plural_name": "citrom"
}, },
"lime": { "lime": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lime", "name": "zöldcitrom",
"plural_name": "limes" "plural_name": "zöldcitrom"
}, },
"apple": { "apple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "apple", "name": "alma",
"plural_name": "apples" "plural_name": "alma"
}, },
"banana": { "banana": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "banana", "name": "banán",
"plural_name": "bananas" "plural_name": "banán"
}, },
"orange": { "orange": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "orange", "name": "narancs",
"plural_name": "oranges" "plural_name": "narancs"
}, },
"raisin": { "raisin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "raisin", "name": "mazsola",
"plural_name": "raisins" "plural_name": "mazsola"
}, },
"pineapple": { "pineapple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pineapple", "name": "ananász",
"plural_name": "pineapples" "plural_name": "ananász"
}, },
"mango": { "mango": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mango", "name": "mangó",
"plural_name": "mangoes" "plural_name": "mangó"
}, },
"peach": { "peach": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "peach", "name": "őszibarack",
"plural_name": "peaches" "plural_name": "őszibarack"
}, },
"date": { "date": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "date", "name": "datolya",
"plural_name": "dates" "plural_name": "datolya"
}, },
"coconut": { "coconut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "coconut", "name": "kókuszdió",
"plural_name": "coconuts" "plural_name": "kókuszdió"
}, },
"craisin": { "craisin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "craisin", "name": "aszalt vörösáfonya",
"plural_name": "craisins" "plural_name": "aszalt vörösáfonya"
}, },
"pear": { "pear": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pear", "name": "körte",
"plural_name": "pears" "plural_name": "körte"
}, },
"grape": { "grape": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "grape", "name": "szőlő",
"plural_name": "grapes" "plural_name": "szőlő"
}, },
"pomegranate": { "pomegranate": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pomegranate", "name": "gránátalma",
"plural_name": "pomegranates" "plural_name": "gránátalma"
}, },
"watermelon": { "watermelon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "watermelon", "name": "görögdinnye",
"plural_name": "watermelons" "plural_name": "görögdinnye"
}, },
"rhubarb": { "rhubarb": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rhubarb", "name": "rebarbara",
"plural_name": "rhubarbs" "plural_name": "rebarbara"
}, },
"dried apricot": { "dried apricot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dried apricot", "name": "aszalt sárgabarack",
"plural_name": "dried apricots" "plural_name": "aszalt sárgabarack"
}, },
"kiwi": { "kiwi": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kiwi", "name": "kivi",
"plural_name": "kiwis" "plural_name": "kivi"
}, },
"grapefruit": { "grapefruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "grapefruit", "name": "grapefruit",
"plural_name": "grapefruits" "plural_name": "grapefruit"
}, },
"plum": { "plum": {
"aliases": [], "aliases": [],
@ -905,86 +905,86 @@
"banana chip": { "banana chip": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "banana chip", "name": "banánchips",
"plural_name": "banana chips" "plural_name": "banánchips"
}, },
"kumquat": { "kumquat": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kumquat", "name": "törpemandarin",
"plural_name": "kumquats" "plural_name": "törpemandarin"
}, },
"jackfruit": { "jackfruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "jackfruit", "name": "jackfruit",
"plural_name": "jackfruits" "plural_name": "jackfruit"
}, },
"dragon fruit": { "dragon fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "dragon fruit", "name": "sárkánygyümölcs",
"plural_name": "dragon fruits" "plural_name": "sárkánygyümölcs"
}, },
"mixed fruit": { "mixed fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mixed fruit", "name": "vegyes gyümölcs",
"plural_name": "mixed fruits" "plural_name": "vegyes gyümölcs"
}, },
"asian pear": { "asian pear": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "asian pear", "name": "japán körte",
"plural_name": "asian pears" "plural_name": "japán körte"
}, },
"lychee": { "lychee": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lychee", "name": "licsi",
"plural_name": "lychees" "plural_name": "licsi"
}, },
"young coconut": { "young coconut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "young coconut", "name": "zsenge kókuszdió",
"plural_name": "young coconuts" "plural_name": "zsenge kókuszdió"
}, },
"kaffir lime": { "kaffir lime": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kaffir lime", "name": "kaffir lime",
"plural_name": "kaffir limes" "plural_name": "kaffir lime"
}, },
"star fruit": { "star fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "star fruit", "name": "csillaggyümölcs",
"plural_name": "star fruits" "plural_name": "csillaggyümölcs"
}, },
"green papaya": { "green papaya": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "green papaya", "name": "zöld papaya",
"plural_name": "green papayas" "plural_name": "zöld papaya"
}, },
"pomelo": { "pomelo": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pomelo", "name": "pomelo",
"plural_name": "pomeloes" "plural_name": "pomelo"
}, },
"chestnut puree": { "chestnut puree": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "chestnut puree", "name": "gesztenyepüré",
"plural_name": "chestnut purees" "plural_name": "gesztenyepüré"
}, },
"prickly pear": { "prickly pear": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "prickly pear", "name": "kaktuszfüge",
"plural_name": "prickly pears" "plural_name": "kaktuszfüge"
}, },
"calamansi": { "calamansi": {
"aliases": [], "aliases": [],

View file

@ -4,98 +4,98 @@
"garlic": { "garlic": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "aglio",
"plural_name": "garlics" "plural_name": "agli"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion", "name": "cipolla",
"plural_name": "onions" "plural_name": "cipolle"
}, },
"bell pepper": { "bell pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bell pepper", "name": "peperone",
"plural_name": "bell peppers" "plural_name": "peperoni"
}, },
"carrot": { "carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carrot", "name": "carota",
"plural_name": "carrots" "plural_name": "carote"
}, },
"scallion": { "scallion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "scallion", "name": "cipollotto",
"plural_name": "scallions" "plural_name": "cipollotti"
}, },
"zucchini": { "zucchini": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "zucchini", "name": "zucchino",
"plural_name": "zucchinis" "plural_name": "zucchini"
}, },
"potato": { "potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "potato", "name": "patata",
"plural_name": "potatoes" "plural_name": "patate"
}, },
"red onion": { "red onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red onion", "name": "cipolla rossa",
"plural_name": "red onions" "plural_name": "cipolle rosse"
}, },
"yellow onion": { "yellow onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "yellow onion", "name": "cipolla gialla",
"plural_name": "yellow onions" "plural_name": "cipolle gialle"
}, },
"celery": { "celery": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celery", "name": "sedano",
"plural_name": "celeries" "plural_name": "sedani"
}, },
"jalapeno": { "jalapeno": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "jalapeno", "name": "jalapeño",
"plural_name": "jalapenoes" "plural_name": "jalapeño"
}, },
"avocado": { "avocado": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "avocado", "name": "avocado",
"plural_name": "avocados" "plural_name": "avocado"
}, },
"shallot": { "shallot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "shallot", "name": "scalogno",
"plural_name": "shallots" "plural_name": "scalogni"
}, },
"cherry tomato": { "cherry tomato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry tomato", "name": "pomodorino",
"plural_name": "cherry tomatoes" "plural_name": "pomodorini"
}, },
"cucumber": { "cucumber": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cucumber", "name": "cetriolo",
"plural_name": "cucumbers" "plural_name": "cetrioli"
}, },
"spinach": { "spinach": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spinach", "name": "spinaci",
"plural_name": "spinaches" "plural_name": "spinaci"
}, },
"sweet corn": { "sweet corn": {
"aliases": [], "aliases": [],
@ -108,26 +108,26 @@
"capsicum" "capsicum"
], ],
"description": "", "description": "",
"name": "chile pepper", "name": "peperoncino",
"plural_name": "chile peppers" "plural_name": "peperoncini"
}, },
"sweet potato": { "sweet potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet potato", "name": "patata dolce",
"plural_name": "sweet potatoes" "plural_name": "patate dolci"
}, },
"broccoli": { "broccoli": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "broccoli", "name": "broccolo",
"plural_name": "broccolis" "plural_name": "broccoli"
}, },
"heart of palm": { "heart of palm": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "heart of palm", "name": "cuore di palma",
"plural_name": "heart of palms" "plural_name": "cuori di palma"
}, },
"baby green": { "baby green": {
"aliases": [], "aliases": [],
@ -138,19 +138,19 @@
"pumpkin": { "pumpkin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pumpkin", "name": "zucca",
"plural_name": "pumpkins" "plural_name": "zucche"
}, },
"cauliflower": { "cauliflower": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cauliflower", "name": "cavolfiore",
"plural_name": "cauliflowers" "plural_name": "cavolfiori"
}, },
"cabbage": { "cabbage": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cabbage", "name": "cavolo",
"plural_name": "cabbages" "plural_name": "cabbages"
}, },
"asparagu": { "asparagu": {

File diff suppressed because it is too large Load diff

View file

@ -4,14 +4,14 @@
"garlic": { "garlic": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "hvitløk",
"plural_name": "garlics" "plural_name": "garlics"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion", "name": "løk",
"plural_name": "onions" "plural_name": "løker"
}, },
"bell pepper": { "bell pepper": {
"aliases": [], "aliases": [],
@ -22,8 +22,8 @@
"carrot": { "carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carrot", "name": "gulrot",
"plural_name": "carrots" "plural_name": "gulroter"
}, },
"scallion": { "scallion": {
"aliases": [], "aliases": [],
@ -40,14 +40,14 @@
"potato": { "potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "potato", "name": "potet",
"plural_name": "potatoes" "plural_name": "poteter"
}, },
"red onion": { "red onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red onion", "name": "rødløk",
"plural_name": "red onions" "plural_name": "rødløker"
}, },
"yellow onion": { "yellow onion": {
"aliases": [], "aliases": [],
@ -58,8 +58,8 @@
"celery": { "celery": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "celery", "name": "seleri",
"plural_name": "celeries" "plural_name": "selerier"
}, },
"jalapeno": { "jalapeno": {
"aliases": [], "aliases": [],
@ -70,14 +70,14 @@
"avocado": { "avocado": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "avocado", "name": "avakado",
"plural_name": "avocados" "plural_name": "avokadoer"
}, },
"shallot": { "shallot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "shallot", "name": "sjalottløk",
"plural_name": "shallots" "plural_name": "sjalottløk"
}, },
"cherry tomato": { "cherry tomato": {
"aliases": [], "aliases": [],
@ -88,13 +88,13 @@
"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": "spinaches"
}, },
"sweet corn": { "sweet corn": {
@ -105,7 +105,7 @@
}, },
"chile pepper": { "chile pepper": {
"aliases": [ "aliases": [
"capsicum" "chilipepper"
], ],
"description": "", "description": "",
"name": "chile pepper", "name": "chile pepper",
@ -114,13 +114,13 @@
"sweet potato": { "sweet potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sweet potato", "name": "søtpotet",
"plural_name": "sweet potatoes" "plural_name": "sweet potatoes"
}, },
"broccoli": { "broccoli": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "broccoli", "name": "brokkoli",
"plural_name": "broccolis" "plural_name": "broccolis"
}, },
"heart of palm": { "heart of palm": {
@ -138,19 +138,19 @@
"pumpkin": { "pumpkin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pumpkin", "name": "gresskar",
"plural_name": "pumpkins" "plural_name": "pumpkins"
}, },
"cauliflower": { "cauliflower": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cauliflower", "name": "blomkål",
"plural_name": "cauliflowers" "plural_name": "cauliflowers"
}, },
"cabbage": { "cabbage": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cabbage", "name": "kål",
"plural_name": "cabbages" "plural_name": "cabbages"
}, },
"asparagu": { "asparagu": {
@ -180,13 +180,13 @@
"eggplant": { "eggplant": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "eggplant", "name": "aubergine",
"plural_name": "eggplants" "plural_name": "eggplants"
}, },
"lettuce": { "lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lettuce", "name": "salat",
"plural_name": "lettuces" "plural_name": "lettuces"
}, },
"butternut squash": { "butternut squash": {
@ -229,7 +229,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "radish", "name": "radish",
"plural_name": "radishes" "plural_name": "reddiker"
}, },
"red cabbage": { "red cabbage": {
"aliases": [], "aliases": [],
@ -327,8 +327,8 @@
"mashed potato": { "mashed potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "mashed potato", "name": "potetmos",
"plural_name": "mashed potatoes" "plural_name": "potetmos"
}, },
"horseradish": { "horseradish": {
"aliases": [], "aliases": [],
@ -363,8 +363,8 @@
"hash brown": { "hash brown": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "hash brown", "name": "røstipotet",
"plural_name": "hash browns" "plural_name": "røstipoteter"
}, },
"napa cabbage": { "napa cabbage": {
"aliases": [ "aliases": [
@ -629,14 +629,14 @@
"tomato": { "tomato": {
"aliases": [], "aliases": [],
"description": "Yes they are a fruit", "description": "Yes they are a fruit",
"name": "tomato", "name": "tomat",
"plural_name": "tomatoes" "plural_name": "tomater"
}, },
"lemon": { "lemon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lemon", "name": "sitron",
"plural_name": "lemons" "plural_name": "sitroner"
}, },
"lime": { "lime": {
"aliases": [], "aliases": [],
@ -647,32 +647,32 @@
"apple": { "apple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "apple", "name": "eple",
"plural_name": "apples" "plural_name": "apples"
}, },
"banana": { "banana": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "banana", "name": "banan",
"plural_name": "bananas" "plural_name": "bananas"
}, },
"orange": { "orange": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "orange", "name": "appelsin",
"plural_name": "oranges" "plural_name": "oranges"
}, },
"raisin": { "raisin": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "raisin", "name": "rosin",
"plural_name": "raisins" "plural_name": "rosiner"
}, },
"pineapple": { "pineapple": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pineapple", "name": "ananas",
"plural_name": "pineapples" "plural_name": "ananaser"
}, },
"mango": { "mango": {
"aliases": [], "aliases": [],
@ -683,20 +683,20 @@
"peach": { "peach": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "peach", "name": "fersken",
"plural_name": "peaches" "plural_name": "peaches"
}, },
"date": { "date": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "date", "name": "daddel",
"plural_name": "dates" "plural_name": "dadler"
}, },
"coconut": { "coconut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "coconut", "name": "kokosnøtt",
"plural_name": "coconuts" "plural_name": "kokosnøtter"
}, },
"craisin": { "craisin": {
"aliases": [], "aliases": [],
@ -707,14 +707,14 @@
"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": "druer"
}, },
"pomegranate": { "pomegranate": {
"aliases": [], "aliases": [],
@ -725,13 +725,13 @@
"watermelon": { "watermelon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "watermelon", "name": "vannmelon",
"plural_name": "watermelons" "plural_name": "vannmeloner"
}, },
"rhubarb": { "rhubarb": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "rhubarb", "name": "rabarbra",
"plural_name": "rhubarbs" "plural_name": "rhubarbs"
}, },
"dried apricot": { "dried apricot": {
@ -767,7 +767,7 @@
"apricot": { "apricot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "apricot", "name": "aprikos",
"plural_name": "apricots" "plural_name": "apricots"
}, },
"currant": { "currant": {
@ -785,8 +785,8 @@
"prune": { "prune": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "prune", "name": "sviske",
"plural_name": "prunes" "plural_name": "svisker"
}, },
"cantaloupe": { "cantaloupe": {
"aliases": [], "aliases": [],
@ -1715,8 +1715,8 @@
"walnut": { "walnut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "walnut", "name": "valnøtt",
"plural_name": "walnuts" "plural_name": "valnøtter"
}, },
"pecan": { "pecan": {
"aliases": [], "aliases": [],
@ -1727,14 +1727,14 @@
"almond": { "almond": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "almond", "name": "mandel",
"plural_name": "almonds" "plural_name": "almonds"
}, },
"sesame seed": { "sesame seed": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sesame seed", "name": "sesamfrø",
"plural_name": "sesame seeds" "plural_name": "sesamfrø"
}, },
"cashew": { "cashew": {
"aliases": [], "aliases": [],
@ -1781,26 +1781,26 @@
"pumpkin seed": { "pumpkin seed": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "pumpkin seed", "name": "gresskarfrø",
"plural_name": "pumpkin seeds" "plural_name": "pumpkin seeds"
}, },
"hazelnut": { "hazelnut": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "hazelnut", "name": "hasselnøtt",
"plural_name": "hazelnuts" "plural_name": "hazelnuts"
}, },
"poppy seed": { "poppy seed": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "poppy seed", "name": "valmuefrø",
"plural_name": "poppy seeds" "plural_name": "valmuefrø"
}, },
"sunflower seed": { "sunflower seed": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sunflower seed", "name": "solsikkefrø",
"plural_name": "sunflower seeds" "plural_name": "solsikkefrø"
}, },
"macadamia": { "macadamia": {
"aliases": [], "aliases": [],
@ -2009,7 +2009,7 @@
"cheddars" "cheddars"
], ],
"description": "", "description": "",
"name": "cheddar cheese", "name": "cheddarost",
"plural_name": "cheddar cheeses" "plural_name": "cheddar cheeses"
}, },
"cream cheese": { "cream cheese": {
@ -2613,8 +2613,8 @@
"butter": { "butter": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "butter", "name": "smør",
"plural_name": "butter" "plural_name": "smør"
}, },
"egg": { "egg": {
"aliases": [], "aliases": [],
@ -6423,7 +6423,7 @@
"sugar": { "sugar": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "sugar", "name": "sukker",
"plural_name": "sugars" "plural_name": "sugars"
}, },
"brown sugar": { "brown sugar": {
@ -6431,7 +6431,7 @@
"turbinado sugar" "turbinado sugar"
], ],
"description": "", "description": "",
"name": "brown sugar", "name": "brunt sukker",
"plural_name": "brown sugars" "plural_name": "brown sugars"
}, },
"confectioners sugar": { "confectioners sugar": {

View file

@ -4,26 +4,26 @@
"garlic": { "garlic": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "czosnek",
"plural_name": "garlics" "plural_name": "garlics"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion", "name": "cebula",
"plural_name": "onions" "plural_name": "cebule"
}, },
"bell pepper": { "bell pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bell pepper", "name": "papryka słodka",
"plural_name": "bell peppers" "plural_name": "bell peppers"
}, },
"carrot": { "carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carrot", "name": "marchew",
"plural_name": "carrots" "plural_name": "marchewki"
}, },
"scallion": { "scallion": {
"aliases": [], "aliases": [],
@ -34,20 +34,20 @@
"zucchini": { "zucchini": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "zucchini", "name": "cukinia",
"plural_name": "zucchinis" "plural_name": "zucchinis"
}, },
"potato": { "potato": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "potato", "name": "ziemniak",
"plural_name": "potatoes" "plural_name": "ziemniaki"
}, },
"red onion": { "red onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "red onion", "name": "czerwona cebula",
"plural_name": "red onions" "plural_name": "czerwone cebule"
}, },
"yellow onion": { "yellow onion": {
"aliases": [], "aliases": [],
@ -70,13 +70,13 @@
"avocado": { "avocado": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "avocado", "name": "awokado",
"plural_name": "avocados" "plural_name": "avocados"
}, },
"shallot": { "shallot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "shallot", "name": "szalotka",
"plural_name": "shallots" "plural_name": "shallots"
}, },
"cherry tomato": { "cherry tomato": {
@ -88,14 +88,14 @@
"cucumber": { "cucumber": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cucumber", "name": "ogórek",
"plural_name": "cucumbers" "plural_name": "ogórki"
}, },
"spinach": { "spinach": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "spinach", "name": "szpinak",
"plural_name": "spinaches" "plural_name": "szpinak"
}, },
"sweet corn": { "sweet corn": {
"aliases": [], "aliases": [],

File diff suppressed because it is too large Load diff

View file

@ -4,26 +4,26 @@
"garlic": { "garlic": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "garlic", "name": "alho",
"plural_name": "garlics" "plural_name": "garlics"
}, },
"onion": { "onion": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "onion", "name": "cebola",
"plural_name": "onions" "plural_name": "cebolas"
}, },
"bell pepper": { "bell pepper": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "bell pepper", "name": "pimentão",
"plural_name": "bell peppers" "plural_name": "pimentões"
}, },
"carrot": { "carrot": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "carrot", "name": "cenoura",
"plural_name": "carrots" "plural_name": "cenouras"
}, },
"scallion": { "scallion": {
"aliases": [], "aliases": [],
@ -41,7 +41,7 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "potato", "name": "potato",
"plural_name": "potatoes" "plural_name": "batatas"
}, },
"red onion": { "red onion": {
"aliases": [], "aliases": [],
@ -713,8 +713,8 @@
"grape": { "grape": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "grape", "name": "uva",
"plural_name": "grapes" "plural_name": "uvas"
}, },
"pomegranate": { "pomegranate": {
"aliases": [], "aliases": [],
@ -725,8 +725,8 @@
"watermelon": { "watermelon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "watermelon", "name": "melancia",
"plural_name": "watermelons" "plural_name": "melancias"
}, },
"rhubarb": { "rhubarb": {
"aliases": [], "aliases": [],
@ -761,8 +761,8 @@
"fig": { "fig": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "fig", "name": "figo",
"plural_name": "figs" "plural_name": "figos"
}, },
"apricot": { "apricot": {
"aliases": [], "aliases": [],
@ -803,13 +803,13 @@
"passion fruit": { "passion fruit": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "passion fruit", "name": "maracujá",
"plural_name": "passion fruits" "plural_name": "maracujás"
}, },
"papaya": { "papaya": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "papaya", "name": "mamão",
"plural_name": "papayas" "plural_name": "papayas"
}, },
"tamarind": { "tamarind": {
@ -821,7 +821,7 @@
"nectarine": { "nectarine": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "nectarine", "name": "nectarina",
"plural_name": "nectarines" "plural_name": "nectarines"
}, },
"dried fig": { "dried fig": {
@ -869,8 +869,8 @@
"melon": { "melon": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "melon", "name": "melão",
"plural_name": "melons" "plural_name": "melões"
}, },
"tangerine": { "tangerine": {
"aliases": [], "aliases": [],
@ -899,8 +899,8 @@
"guava": { "guava": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "guava", "name": "goiaba",
"plural_name": "guavas" "plural_name": "goiabas"
}, },
"banana chip": { "banana chip": {
"aliases": [], "aliases": [],
@ -1453,8 +1453,8 @@
"strawberry": { "strawberry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "strawberry", "name": "morango",
"plural_name": "strawberries" "plural_name": "morangos"
}, },
"blueberry": { "blueberry": {
"aliases": [], "aliases": [],
@ -1477,7 +1477,7 @@
"cherry": { "cherry": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "cherry", "name": "cereja",
"plural_name": "cherries" "plural_name": "cherries"
}, },
"blackberry": { "blackberry": {

View file

@ -34,7 +34,7 @@
"zucchini": { "zucchini": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "zucchini", "name": "цукини",
"plural_name": "zucchinis" "plural_name": "zucchinis"
}, },
"potato": { "potato": {

View file

@ -151,43 +151,43 @@
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "zelje", "name": "zelje",
"plural_name": "cabbages" "plural_name": "zelje"
}, },
"asparagu": { "asparagu": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "asparagu", "name": "beluši",
"plural_name": "asparagus" "plural_name": "beluši"
}, },
"kale": { "kale": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "kale", "name": "ohrovt",
"plural_name": "kales" "plural_name": "ohrovt"
}, },
"arugula": { "arugula": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "arugula", "name": "rukola",
"plural_name": "arugulas" "plural_name": "rukola"
}, },
"leek": { "leek": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "leek", "name": "por",
"plural_name": "leeks" "plural_name": "por"
}, },
"eggplant": { "eggplant": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "eggplant", "name": "jajčevec",
"plural_name": "eggplants" "plural_name": "jajčevci"
}, },
"lettuce": { "lettuce": {
"aliases": [], "aliases": [],
"description": "", "description": "",
"name": "lettuce", "name": "solata",
"plural_name": "lettuces" "plural_name": "solata"
}, },
"butternut squash": { "butternut squash": {
"aliases": [], "aliases": [],

File diff suppressed because it is too large Load diff

View file

@ -39,7 +39,7 @@
"name": "אוכל קפוא" "name": "אוכל קפוא"
}, },
{ {
"name": "אוכל בריאותי" "name": "אוכל בריאות"
}, },
{ {
"name": "משק בית" "name": "משק בית"

View file

@ -18,8 +18,8 @@
"abbreviation": "c" "abbreviation": "c"
}, },
"fluid-ounce": { "fluid-ounce": {
"name": "fluid ounce", "name": "vätskeuns",
"plural_name": "flytande ounces", "plural_name": "vätskeuns",
"description": "", "description": "",
"abbreviation": "fl oz" "abbreviation": "fl oz"
}, },
@ -122,7 +122,7 @@
}, },
"bunch": { "bunch": {
"name": "bunt", "name": "bunt",
"plural_name": "buntar", "plural_name": "knippen",
"description": "", "description": "",
"abbreviation": "" "abbreviation": ""
}, },

View file

@ -94,6 +94,7 @@ class AdminBackupController(BaseAdminController):
if not dest.is_file(): if not dest.is_file():
raise HTTPException(status.HTTP_400_BAD_REQUEST) raise HTTPException(status.HTTP_400_BAD_REQUEST)
return SuccessResponse.respond("Upload successful")
@router.post("/{file_name}/restore", response_model=SuccessResponse) @router.post("/{file_name}/restore", response_model=SuccessResponse)
def import_one(self, file_name: str): def import_one(self, file_name: str):

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,9 +96,7 @@ 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"
@ -98,25 +112,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,
} }

433
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"
@ -758,14 +759,14 @@ test = ["pytest", "pytest-cov", "pytest-mpl", "pytest-subtests"]
[[package]] [[package]]
name = "freezegun" name = "freezegun"
version = "1.5.2" version = "1.5.3"
description = "Let your Python tests travel through time" description = "Let your Python tests travel through time"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
groups = ["dev"] groups = ["dev"]
files = [ files = [
{file = "freezegun-1.5.2-py3-none-any.whl", hash = "sha256:5aaf3ba229cda57afab5bd311f0108d86b6fb119ae89d2cd9c43ec8c1733c85b"}, {file = "freezegun-1.5.3-py3-none-any.whl", hash = "sha256:1ce20ee4be61349ba52c3af64f5eaba8d08ff51acfcf1b3ea671f03e54c818f1"},
{file = "freezegun-1.5.2.tar.gz", hash = "sha256:a54ae1d2f9c02dbf42e02c18a3ab95ab4295818b549a34dac55592d72a905181"}, {file = "freezegun-1.5.3.tar.gz", hash = "sha256:d7c6204e33a50affd7c7aa284f4f92e04e96f72d63313b89ceaaf60d9c64bc5e"},
] ]
[package.dependencies] [package.dependencies]
@ -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.94.0" 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.94.0-py3-none-any.whl", hash = "sha256:159c43b811669abe9bb4aafdc57a049966dfde2eac94b151aac3eb63bf9825b4"}, {file = "openai-1.97.0-py3-none-any.whl", hash = "sha256:a1c24d96f4609f3f7f51c9e1c2606d97cc6e334833438659cfd687e9c972c610"},
{file = "openai-1.94.0.tar.gz", hash = "sha256:31c6c213cc80365d54632296c4aef7cda1800003ca5c784ac50a05d6bc05c197"}, {file = "openai-1.97.0.tar.gz", hash = "sha256:0be349569ccaa4fb54f97bb808423fd29ccaeb1246ee1be762e0c81a47bae0aa"},
] ]
[package.dependencies] [package.dependencies]
@ -1837,91 +1838,91 @@ tqdm = ">4"
typing-extensions = ">=4.11,<5" typing-extensions = ">=4.11,<5"
[package.extras] [package.extras]
aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.6)"] aiohttp = ["aiohttp", "httpx-aiohttp (>=0.1.8)"]
datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"] datalib = ["numpy (>=1)", "pandas (>=1.2.3)", "pandas-stubs (>=1.1.0.11)"]
realtime = ["websockets (>=13,<16)"] realtime = ["websockets (>=13,<16)"]
voice-helpers = ["numpy (>=2.0.2)", "sounddevice (>=0.5.1)"] 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]
@ -3236,30 +3237,30 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]] [[package]]
name = "ruff" name = "ruff"
version = "0.12.3" version = "0.12.4"
description = "An extremely fast Python linter and code formatter, written in Rust." description = "An extremely fast Python linter and code formatter, written in Rust."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
groups = ["dev"] groups = ["dev"]
files = [ files = [
{file = "ruff-0.12.3-py3-none-linux_armv6l.whl", hash = "sha256:47552138f7206454eaf0c4fe827e546e9ddac62c2a3d2585ca54d29a890137a2"}, {file = "ruff-0.12.4-py3-none-linux_armv6l.whl", hash = "sha256:cb0d261dac457ab939aeb247e804125a5d521b21adf27e721895b0d3f83a0d0a"},
{file = "ruff-0.12.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:0a9153b000c6fe169bb307f5bd1b691221c4286c133407b8827c406a55282041"}, {file = "ruff-0.12.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:55c0f4ca9769408d9b9bac530c30d3e66490bd2beb2d3dae3e4128a1f05c7442"},
{file = "ruff-0.12.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fa6b24600cf3b750e48ddb6057e901dd5b9aa426e316addb2a1af185a7509882"}, {file = "ruff-0.12.4-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a8224cc3722c9ad9044da7f89c4c1ec452aef2cfe3904365025dd2f51daeae0e"},
{file = "ruff-0.12.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2506961bf6ead54887ba3562604d69cb430f59b42133d36976421bc8bd45901"}, {file = "ruff-0.12.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9949d01d64fa3672449a51ddb5d7548b33e130240ad418884ee6efa7a229586"},
{file = "ruff-0.12.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4faaff1f90cea9d3033cbbcdf1acf5d7fb11d8180758feb31337391691f3df0"}, {file = "ruff-0.12.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:be0593c69df9ad1465e8a2d10e3defd111fdb62dcd5be23ae2c06da77e8fcffb"},
{file = "ruff-0.12.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40dced4a79d7c264389de1c59467d5d5cefd79e7e06d1dfa2c75497b5269a5a6"}, {file = "ruff-0.12.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7dea966bcb55d4ecc4cc3270bccb6f87a337326c9dcd3c07d5b97000dbff41c"},
{file = "ruff-0.12.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:0262d50ba2767ed0fe212aa7e62112a1dcbfd46b858c5bf7bbd11f326998bafc"}, {file = "ruff-0.12.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:afcfa3ab5ab5dd0e1c39bf286d829e042a15e966b3726eea79528e2e24d8371a"},
{file = "ruff-0.12.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12371aec33e1a3758597c5c631bae9a5286f3c963bdfb4d17acdd2d395406687"}, {file = "ruff-0.12.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c057ce464b1413c926cdb203a0f858cd52f3e73dcb3270a3318d1630f6395bb3"},
{file = "ruff-0.12.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:560f13b6baa49785665276c963edc363f8ad4b4fc910a883e2625bdb14a83a9e"}, {file = "ruff-0.12.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64b90d1122dc2713330350626b10d60818930819623abbb56535c6466cce045"},
{file = "ruff-0.12.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023040a3499f6f974ae9091bcdd0385dd9e9eb4942f231c23c57708147b06311"}, {file = "ruff-0.12.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2abc48f3d9667fdc74022380b5c745873499ff827393a636f7a59da1515e7c57"},
{file = "ruff-0.12.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:883d844967bffff5ab28bba1a4d246c1a1b2933f48cb9840f3fdc5111c603b07"}, {file = "ruff-0.12.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:2b2449dc0c138d877d629bea151bee8c0ae3b8e9c43f5fcaafcd0c0d0726b184"},
{file = "ruff-0.12.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:2120d3aa855ff385e0e562fdee14d564c9675edbe41625c87eeab744a7830d12"}, {file = "ruff-0.12.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:56e45bb11f625db55f9b70477062e6a1a04d53628eda7784dce6e0f55fd549eb"},
{file = "ruff-0.12.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:6b16647cbb470eaf4750d27dddc6ebf7758b918887b56d39e9c22cce2049082b"}, {file = "ruff-0.12.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:478fccdb82ca148a98a9ff43658944f7ab5ec41c3c49d77cd99d44da019371a1"},
{file = "ruff-0.12.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:e1417051edb436230023575b149e8ff843a324557fe0a265863b7602df86722f"}, {file = "ruff-0.12.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0fc426bec2e4e5f4c4f182b9d2ce6a75c85ba9bcdbe5c6f2a74fcb8df437df4b"},
{file = "ruff-0.12.3-py3-none-win32.whl", hash = "sha256:dfd45e6e926deb6409d0616078a666ebce93e55e07f0fb0228d4b2608b2c248d"}, {file = "ruff-0.12.4-py3-none-win32.whl", hash = "sha256:4de27977827893cdfb1211d42d84bc180fceb7b72471104671c59be37041cf93"},
{file = "ruff-0.12.3-py3-none-win_amd64.whl", hash = "sha256:a946cf1e7ba3209bdef039eb97647f1c77f6f540e5845ec9c114d3af8df873e7"}, {file = "ruff-0.12.4-py3-none-win_amd64.whl", hash = "sha256:fe0b9e9eb23736b453143d72d2ceca5db323963330d5b7859d60d101147d461a"},
{file = "ruff-0.12.3-py3-none-win_arm64.whl", hash = "sha256:5f9c7c9c8f84c2d7f27e93674d27136fbf489720251544c4da7fb3d742e011b1"}, {file = "ruff-0.12.4-py3-none-win_arm64.whl", hash = "sha256:0618ec4442a83ab545e5b71202a5c0ed7791e8471435b94e655b570a5031a98e"},
{file = "ruff-0.12.3.tar.gz", hash = "sha256:f1b5a4b6668fd7b7ea3697d8d98857390b40c1320a63a178eee6be0899ea2d77"}, {file = "ruff-0.12.4.tar.gz", hash = "sha256:13efa16df6c6eeb7d0f091abae50f58e9522f3843edb40d56ad52a5a4a4b6873"},
] ]
[[package]] [[package]]
@ -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 = "2.8.0" version = "3.0.1"
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