types.ts•1.57 kB
import { z } from 'zod';
export const ProductSchema = z.object({
code: z.string(),
product_name: z.string().optional(),
brands: z.string().optional(),
categories: z.string().optional(),
ingredients_text: z.string().optional(),
nutriments: z.record(z.union([z.string(), z.number()])).optional(),
nutriscore_grade: z.string().optional(),
nova_group: z.union([z.string(), z.number()]).optional(),
ecoscore_grade: z.string().optional(),
image_url: z.string().optional(),
image_front_url: z.string().optional(),
quantity: z.string().optional(),
packaging: z.string().optional(),
labels: z.string().optional(),
countries: z.string().optional(),
manufacturing_places: z.string().optional(),
stores: z.string().optional(),
created_datetime: z.union([z.string(), z.number()]).optional(),
last_modified_datetime: z.union([z.string(), z.number()]).optional(),
});
export const ProductResponseSchema = z.object({
status: z.number(),
status_verbose: z.string(),
product: ProductSchema.optional(),
});
export const SearchResponseSchema = z.object({
count: z.number(),
page: z.number(),
page_count: z.number(),
page_size: z.number(),
products: z.array(ProductSchema),
});
export type Product = z.infer<typeof ProductSchema>;
export type ProductResponse = z.infer<typeof ProductResponseSchema>;
export type SearchResponse = z.infer<typeof SearchResponseSchema>;
export interface OpenFoodFactsConfig {
baseUrl: string;
userAgent: string;
rateLimits: {
products: number;
search: number;
facets: number;
};
}