@restaround/react 1.0.56 → 1.0.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/components/PublicMenu/CartItem/OptionsInfo/OptionsInfo.d.ts +9 -0
  2. package/dist/components/PublicMenu/CartItem/OptionsInfo/index.d.ts +1 -0
  3. package/dist/components/PublicMenu/ProductAddons/ProductAddons.d.ts +14 -0
  4. package/dist/components/PublicMenu/ProductAddons/index.d.ts +1 -0
  5. package/dist/components/PublicMenu/ProductDetails/ProductDetails.d.ts +1 -1
  6. package/dist/components/PublicMenu/ProductQuantity/ProductQuantity.d.ts +3 -1
  7. package/dist/components/PublicMenu/ProductVariants/ProductVariants.d.ts +9 -0
  8. package/dist/components/PublicMenu/ProductVariants/index.d.ts +1 -0
  9. package/dist/hooks/cart.d.ts +6 -1
  10. package/dist/hooks/product.d.ts +7 -2
  11. package/dist/index.esm.js +1 -1
  12. package/dist/index.esm.js.map +1 -1
  13. package/dist/index.js +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/dist/models/addon.d.ts +30 -0
  16. package/dist/models/index.esm.js.map +1 -1
  17. package/dist/models/index.js.map +1 -1
  18. package/dist/models/order.d.ts +3 -0
  19. package/dist/models/product.d.ts +2 -0
  20. package/dist/store/cart.d.ts +5 -3
  21. package/dist/styles/ui.css +1 -1
  22. package/dist/styles/ui.css.map +1 -1
  23. package/dist/utils/addon.d.ts +14 -0
  24. package/dist/utils/cart.d.ts +2 -0
  25. package/dist/utils/cart.test.d.ts +1 -0
  26. package/dist/utils/common.d.ts +1 -1
  27. package/dist/utils/index.d.ts +6 -2
  28. package/dist/utils/index.esm.js +1 -1
  29. package/dist/utils/index.esm.js.map +1 -1
  30. package/dist/utils/index.js +1 -1
  31. package/dist/utils/index.js.map +1 -1
  32. package/dist/utils/models/addon.d.ts +30 -0
  33. package/dist/utils/models/order.d.ts +3 -0
  34. package/dist/utils/models/product.d.ts +2 -0
  35. package/dist/utils/product.d.ts +19 -1
  36. package/dist/utils/utils/addon.d.ts +14 -0
  37. package/dist/utils/utils/cart.d.ts +2 -0
  38. package/dist/utils/utils/cart.test.d.ts +1 -0
  39. package/dist/utils/utils/common.d.ts +1 -1
  40. package/dist/utils/utils/index.d.ts +6 -2
  41. package/dist/utils/utils/product.d.ts +19 -1
  42. package/package.json +17 -11
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../../src/utils/image.ts","../../../src/utils/category.ts","../../../src/utils/constants.ts","../../../src/utils/url.ts","../../../src/utils/common.ts","../../../src/utils/product.ts"],"sourcesContent":["export const IMAGE_BASE_URL = \"https://images.restaround.co\";\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.restaround.co/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverImageSource = (coverImage?: string) => {\n\tif (!coverImage) return \"https://images.restaround.co/restaround-doodle.webp\";\n\n\tif (coverImage.includes(\"base64\") || coverImage.startsWith(\"https://\")) return coverImage;\n\n\treturn `${IMAGE_BASE_URL}/${coverImage}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n","import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { Category, CategoryTranslation } from \"../models/category\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name;\n};\n","export const CO_DOMAIN = \"restaround.co\";\nexport const AZ_DOMAIN = \"restaround.az\";\nexport const EE_DOMAIN = \"restaround.ee\";\nexport const NL_DOMAIN = \"restaround.nl\";\n\nexport const DOMAINS = [CO_DOMAIN, AZ_DOMAIN, EE_DOMAIN, NL_DOMAIN]; // Supported domains list\n","import { CO_DOMAIN, DOMAINS } from \"./constants\";\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst domain = DOMAINS.includes(hostname) ? hostname : CO_DOMAIN;\n\tconst locale = language || \"en\";\n\treturn { url: `https://${domain}/${locale}`, domain };\n};\n","export const calculateTotalPrice = (price: number, quantity: number, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tProduct,\n\tProductTranslation,\n\tProductVariant,\n\tProductVariantTranslations,\n} from \"src/models/product\";\n\nimport { calculateTotalPrice } from \"./common\";\n\nexport const getProductTranslation = (product: Product, language: string): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\n};\n\nexport const getProductPrice = (\n\tproduct: Product,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1\n) => {\n\tconst { price, vat } = product || {};\n\tconst totalPrice = calculateTotalPrice(price, quantity, vat);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariant = (product: Product, variantId: number): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Product;\n\tquantity?: number;\n}) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\tconst totalPrice = calculateTotalPrice(price, quantity, vat);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (\n\tvariant: ProductVariant,\n\tlanguage: string\n): ProductVariantTranslations => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslations;\n};\n\nexport const getProductCartPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n}) => {\n\tif (variantId) {\n\t\treturn getProductVariantPrice({\n\t\t\tvariantId,\n\t\t\tcurrency,\n\t\t\tlanguage,\n\t\t\tproduct,\n\t\t\tquantity,\n\t\t});\n\t}\n\n\treturn getProductPrice(product, currency, language, quantity);\n};\n"],"names":["IMAGE_BASE_URL","getImageSource","image","includes","startsWith","getLogoImageSource","logoImage","getCoverImageSource","coverImage","keyStr","triplet","e1","e2","e3","charAt","rgbDataURL","r","g","b","getCategoryTranslation","category","language","_b","_a","translations","find","call","item","getCategoryNameById","categoryId","categories","id","isEmpty","name","CO_DOMAIN","DOMAINS","getBaseUrl","hostname","domain","url","calculateTotalPrice","price","quantity","vat","getProductTranslation","product","getProductPrice","currency","totalPrice","formattedTotalPrice","priceFormatter","getProductVariant","variantId","variants","getProductVariantPrice","variant","getProductVariantTranslation","getProductCartPrice"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../../src/utils/addon.ts","../../../src/utils/common.ts","../../../src/utils/cart.ts","../../../src/utils/category.ts","../../../src/utils/image.ts","../../../src/utils/menu.ts","../../../src/models/addon.ts","../../../src/utils/product.ts","../../../src/utils/constants.ts","../../../src/utils/url.ts"],"sourcesContent":["import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tMenuAddon,\n\tMenuAddonOption,\n\tMenuAddonOptionTranslation,\n\tMenuAddonTranslation,\n} from \"src/models/addon\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): MenuAddonTranslation => {\n\treturn (addon?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonTranslation;\n};\n\nexport const getAddonOptionTranslation = (\n\toption: MenuAddonOption,\n\tlanguage: string\n): MenuAddonOptionTranslation => {\n\treturn (option?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonOptionTranslation;\n};\n\nexport const getOptionPrice = ({\n\toption,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n}: {\n\toption: MenuAddonOption;\n\tcurrency?: string;\n\tlanguage?: string;\n}) => {\n\tconst { price } = option || {};\n\n\treturn {\n\t\ttotalPrice: price,\n\t\tformattedTotalPrice: priceFormatter(price, currency, language),\n\t};\n};\n\nexport const getAddonOptionRawPrice = (addon: MenuAddon, optionId: number): number => {\n\treturn (addon?.options || []).find(({ id }) => id === optionId)?.price || 0;\n};\n\nexport const getOptionTitles = (\n\toptions: MenuAddonOption[],\n\toptionIds: number | number[],\n\tlanguage: string\n): string => {\n\tif (Array.isArray(optionIds)) {\n\t\treturn options\n\t\t\t.filter(({ id }) => optionIds.includes(id))\n\t\t\t.map(({ translations }) => translations.find((t) => t.language === language)?.title || \"\")\n\t\t\t.filter(Boolean)\n\t\t\t.join(\", \");\n\t} else {\n\t\tconst option = options.find(({ id }) => id === optionIds);\n\t\treturn option?.translations.find((t) => t.language === language)?.title || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon.translations.find((t) => t.language === language)?.title || \"\";\n};\n","export const calculateTotalPrice = (price: number = 0, quantity: number = 1, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { CartItem } from \"src/models/order\";\nimport { SelectedAddons } from \"src/models/addon\";\n\nimport { calculateTotalPrice } from \"./common\";\n\nexport const getCartPrice = (item: CartItem, currency: string = \"USD\", language: string = \"en\") => {\n\tconst { price, vat, quantity, optionsPrice } = item || {};\n\tconst productPrice = calculateTotalPrice(price, quantity, vat);\n\tconst totalPrice = productPrice + optionsPrice * quantity;\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const generateCartId = (\n\tproductId: number,\n\tvariantId: number | null,\n\tselectedAddons: SelectedAddons\n): string => {\n\tif (!productId) throw new Error(\"Product ID is required\");\n\n\t// Build the cart ID base with productId and variantId\n\tlet cartId = `${productId}`;\n\tif (variantId) {\n\t\tcartId += `-${variantId}`;\n\t}\n\n\t// Build the addon part of the ID\n\tconst addonIdsPart = Object.entries(selectedAddons || {})\n\t\t.map(([addonId, option]) => {\n\t\t\tif (!addonId || !option) return null; // Skip invalid entries\n\t\t\tconst optionIds = Array.isArray(option) ? option.filter(Boolean).join(\"-\") : `${option}`;\n\t\t\tif (!optionIds) return null;\n\t\t\treturn `${addonId}-${optionIds}`;\n\t\t})\n\t\t.filter(Boolean) // Remove null/undefined values\n\t\t.join(\"-\");\n\n\t// Append addonIdsPart if it's not empty\n\tif (addonIdsPart) {\n\t\tcartId += `-${addonIdsPart}`;\n\t}\n\n\treturn cartId;\n};\n","import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { Category, CategoryTranslation } from \"../models/category\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name;\n};\n","export const IMAGE_BASE_URL = \"https://images.restaround.co\";\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.restaround.co/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverImageSource = (coverImage?: string) => {\n\tif (!coverImage) return \"https://images.restaround.co/restaround-doodle.webp\";\n\n\tif (coverImage.includes(\"base64\") || coverImage.startsWith(\"https://\")) return coverImage;\n\n\treturn `${IMAGE_BASE_URL}/${coverImage}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n","import { Category, CategoryProductMap, Product } from \"src/models\";\n\nexport const prepareCategoryAndProductMap = (\n\tcategories: Category[],\n\tproducts: Product[]\n): CategoryProductMap[] => {\n\tconst productMap = products.reduce<Record<number, Product[]>>((map, product) => {\n\t\tconst categoryId = Number(product.categoryId);\n\t\tif (!map[categoryId]) {\n\t\t\tmap[categoryId] = [];\n\t\t}\n\t\tmap[categoryId].push(product);\n\t\treturn map;\n\t}, {});\n\n\treturn categories\n\t\t.map((category) => ({\n\t\t\t...category,\n\t\t\tproducts: (productMap[Number(category.id)] || []) as Product[],\n\t\t}))\n\t\t.filter((category) => category?.products?.length > 0);\n};\n","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOptionTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: number;\n\ttranslations: MenuAddonOptionTranslation[];\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\ttranslations: MenuAddonTranslation[];\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n}\n\nexport interface SelectedAddons {\n\t[key: number]: number | number[];\n}\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tProduct,\n\tProductTranslation,\n\tProductVariant,\n\tProductVariantTranslations,\n} from \"src/models/product\";\n\nimport { calculateTotalPrice } from \"./common\";\nimport { MenuAddon, MenuAddonSelectType, SelectedAddons } from \"src/models/addon\";\n\nimport { getAddonOptionRawPrice } from \"./addon\";\n\nexport const getProductTranslation = (product: Product, language: string): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\n};\n\nexport const getProductRawPrice = (product: Product, quantity: number = 1) => {\n\tconst { price = 0, vat = 0 } = product || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductPrice = (\n\tproduct: Product,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1\n) => {\n\tconst totalPrice = getProductRawPrice(product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariant = (product: Product, variantId: number): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getSelectedOptionsTotalPrice = (\n\tproduct: Product,\n\tselectedAddons: SelectedAddons = {},\n\tquantity: number\n): number => {\n\t// Filter addons that are selected by the user\n\tconst selectedAddonsList = (product?.addons || []).filter((addon) =>\n\t\tObject.prototype.hasOwnProperty.call(selectedAddons, addon.id)\n\t);\n\n\t// Calculate the total price\n\tconst optionsTotalPrice = selectedAddonsList.reduce((total: number, addon: MenuAddon) => {\n\t\tconst { id: addonId, selectType } = addon;\n\n\t\t// Handle SINGLE selection\n\t\tif (selectType === MenuAddonSelectType.SINGLE) {\n\t\t\tconst selectedOptionId = selectedAddons[addonId] as number;\n\t\t\treturn total + getAddonOptionRawPrice(addon, selectedOptionId);\n\t\t}\n\n\t\t// Handle MULTIPLE selection\n\t\tconst selectedOptionIds = (selectedAddons[addonId] || []) as number[];\n\t\tconst multipleOptionsPrice = selectedOptionIds.reduce(\n\t\t\t(multipleTotal, optionId) => multipleTotal + getAddonOptionRawPrice(addon, optionId),\n\t\t\t0\n\t\t);\n\n\t\treturn total + multipleOptionsPrice;\n\t}, 0);\n\n\treturn optionsTotalPrice * quantity;\n};\n\nexport const getProductVariantRawPrice = (\n\tvariantId: number,\n\tproduct: Product,\n\tquantity?: number\n) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Product;\n\tquantity?: number;\n}) => {\n\tconst totalPrice = getProductVariantRawPrice(variantId, product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (\n\tvariant: ProductVariant,\n\tlanguage: string\n): ProductVariantTranslations => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslations;\n};\n\nexport const getProductCartRawPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tselectedAddons: SelectedAddons;\n\tnoVat?: boolean;\n}): { price: number; optionsPrice: number; total: number } => {\n\tif (isEmpty(product)) return { price: 0, optionsPrice: 0, total: 0 };\n\n\tconst productData: Product = { ...product, vat: noVat ? 0 : product.vat };\n\tconst selectedOptionsTotalPrice = getSelectedOptionsTotalPrice(\n\t\tproductData,\n\t\tselectedAddons,\n\t\tquantity\n\t);\n\tconst price = variantId\n\t\t? getProductVariantRawPrice(variantId, productData, quantity)\n\t\t: getProductRawPrice(productData, quantity);\n\n\treturn {\n\t\tprice,\n\t\toptionsPrice: selectedOptionsTotalPrice,\n\t\ttotal: price + selectedOptionsTotalPrice,\n\t};\n};\n\nexport const getProductCartPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n\tselectedAddons: SelectedAddons;\n\tnoVat?: boolean;\n}) => {\n\tconst { total } = getProductCartRawPrice({\n\t\tproduct,\n\t\tvariantId,\n\t\tquantity,\n\t\tselectedAddons,\n\t\tnoVat,\n\t});\n\n\treturn {\n\t\ttotalPrice: total,\n\t\tformattedTotalPrice: priceFormatter(total, currency, language),\n\t};\n};\n\nexport const getProductAddon = (product: Product, addonId: number): MenuAddon => {\n\treturn (product?.addons || []).find(({ id }) => id === addonId) || ({} as MenuAddon);\n};\n","export const CO_DOMAIN = \"restaround.co\";\nexport const AZ_DOMAIN = \"restaround.az\";\nexport const EE_DOMAIN = \"restaround.ee\";\nexport const NL_DOMAIN = \"restaround.nl\";\n\nexport const DOMAINS = [CO_DOMAIN, AZ_DOMAIN, EE_DOMAIN, NL_DOMAIN]; // Supported domains list\n","import { CO_DOMAIN, DOMAINS } from \"./constants\";\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst domain = DOMAINS.includes(hostname) ? hostname : CO_DOMAIN;\n\tconst locale = language || \"en\";\n\treturn { url: `https://${domain}/${locale}`, domain };\n};\n"],"names":["getAddonTranslation","addon","language","_b","_a","translations","find","call","item","getAddonOptionTranslation","option","getOptionPrice","currency","price","totalPrice","formattedTotalPrice","priceFormatter","getAddonOptionRawPrice","optionId","options","id","getOptionTitles","optionIds","Array","isArray","filter","includes","map","t","title","Boolean","join","getAddonTitle","calculateTotalPrice","quantity","vat","getCartPrice","optionsPrice","generateCartId","productId","variantId","selectedAddons","Error","cartId","addonIdsPart","Object","entries","addonId","getCategoryTranslation","category","getCategoryNameById","categoryId","categories","isEmpty","name","IMAGE_BASE_URL","getImageSource","image","startsWith","getLogoImageSource","logoImage","getCoverImageSource","coverImage","keyStr","triplet","e1","e2","e3","charAt","rgbDataURL","r","g","b","prepareCategoryAndProductMap","products","productMap","reduce","product","Number","push","assign","length","MenuAddonSelectType","getProductTranslation","getProductRawPrice","getProductPrice","getProductVariant","variants","getSelectedOptionsTotalPrice","addons","prototype","hasOwnProperty","total","selectType","SINGLE","selectedOptionId","multipleTotal","getProductVariantRawPrice","variant","getProductVariantPrice","getProductVariantTranslation","getProductCartRawPrice","noVat","productData","selectedOptionsTotalPrice","getProductCartPrice","getProductAddon","CO_DOMAIN","DOMAINS","getBaseUrl","hostname","domain","url"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";var t=require("@sorocraft/js-utils");const r="https://images.restaround.co",a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",e=(t,r,e)=>a.charAt(t>>2)+a.charAt((3&t)<<4|r>>4)+a.charAt((15&r)<<2|e>>6)+a.charAt(63&e),o=(t,r)=>{var a,e;return(null===(e=null===(a=null==t?void 0:t.translations)||void 0===a?void 0:a.find)||void 0===e?void 0:e.call(a,(t=>t.language===r)))||{}},n="restaround.co",i=[n,"restaround.az","restaround.ee","restaround.nl"],s=(t,r,a=0)=>t*r*(1+a/100),l=(r,a,e,o=1)=>{const{price:n,vat:i}=r||{},l=s(n,o,i);return{totalPrice:l,formattedTotalPrice:t.priceFormatter(l,a,e)}},u=(t,r)=>{var a,e;return(null===(e=null===(a=null==t?void 0:t.variants)||void 0===a?void 0:a.find)||void 0===e?void 0:e.call(a,(t=>t.id===r)))||{}},d=({variantId:r,currency:a="USD",language:e="en",product:o,quantity:n=1})=>{const i=u(o,r),{vat:l}=o||{},{price:d}=i||{},c=s(d,n,l);return{totalPrice:c,formattedTotalPrice:t.priceFormatter(c,a,e)}};exports.IMAGE_BASE_URL=r,exports.getBaseUrl=(t,r)=>{const a=i.includes(t)?t:n;return{url:`https://${a}/${r||"en"}`,domain:a}},exports.getCategoryNameById=(r,a,e)=>{var n;const i=null===(n=null==a?void 0:a.find)||void 0===n?void 0:n.call(a,(({id:t})=>t===r));if(t.isEmpty(i))return"";const{name:s}=o(i,e);return s},exports.getCategoryTranslation=o,exports.getCoverImageSource=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${r}/${t}`:"https://images.restaround.co/restaround-doodle.webp",exports.getImageSource=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${r}/${t}`:"",exports.getLogoImageSource=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${r}/${t}`:"https://images.restaround.co/no-photo-128.webp",exports.getProductCartPrice=({product:t,variantId:r,quantity:a=1,currency:e,language:o})=>r?d({variantId:r,currency:e,language:o,product:t,quantity:a}):l(t,e,o,a),exports.getProductPrice=l,exports.getProductTranslation=(t,r)=>{var a,e;return(null===(e=null===(a=null==t?void 0:t.translations)||void 0===a?void 0:a.find)||void 0===e?void 0:e.call(a,(t=>t.language===r)))||{}},exports.getProductVariant=u,exports.getProductVariantPrice=d,exports.getProductVariantTranslation=(t,r)=>{var a,e;return(null===(e=null===(a=null==t?void 0:t.translations)||void 0===a?void 0:a.find)||void 0===e?void 0:e.call(a,(t=>t.language===r)))||{}},exports.rgbDataURL=(t,r,a)=>`data:image/gif;base64,R0lGODlhAQABAPAA${e(0,t,r)+e(a,255,255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;
1
+ "use strict";var t=require("@sorocraft/js-utils");const r=(t,r)=>{var e;return(null===(e=((null==t?void 0:t.options)||[]).find((({id:t})=>t===r)))||void 0===e?void 0:e.price)||0},e=(t=0,r=1,e=0)=>t*r*(1+e/100),o=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},n="https://images.restaround.co",a="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",i=(t,r,e)=>a.charAt(t>>2)+a.charAt((3&t)<<4|r>>4)+a.charAt((15&r)<<2|e>>6)+a.charAt(63&e);var l;!function(t){t.SINGLE="SINGLE",t.MULTIPLE="MULTIPLE"}(l||(l={}));const d=(t,r=1)=>{const{price:o=0,vat:n=0}=t||{};return e(o,r,n)},s=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.variants)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.id===r)))||{}},u=(t,e={},o)=>((null==t?void 0:t.addons)||[]).filter((t=>Object.prototype.hasOwnProperty.call(e,t.id))).reduce(((t,o)=>{const{id:n,selectType:a}=o;if(a===l.SINGLE){const a=e[n];return t+r(o,a)}return t+(e[n]||[]).reduce(((t,e)=>t+r(o,e)),0)}),0)*o,c=(t,r,o)=>{const n=s(r,t),{vat:a}=r||{},{price:i}=n||{};return e(i,o,a)},p=({product:r,variantId:e,quantity:o=1,selectedAddons:n,noVat:a=!1})=>{if(t.isEmpty(r))return{price:0,optionsPrice:0,total:0};const i=Object.assign(Object.assign({},r),{vat:a?0:r.vat}),l=u(i,n,o),s=e?c(e,i,o):d(i,o);return{price:s,optionsPrice:l,total:s+l}},v="restaround.co",g=[v,"restaround.az","restaround.ee","restaround.nl"];exports.IMAGE_BASE_URL=n,exports.calculateTotalPrice=e,exports.generateCartId=(t,r,e)=>{if(!t)throw new Error("Product ID is required");let o=`${t}`;r&&(o+=`-${r}`);const n=Object.entries(e||{}).map((([t,r])=>{if(!t||!r)return null;const e=Array.isArray(r)?r.filter(Boolean).join("-"):`${r}`;return e?`${t}-${e}`:null})).filter(Boolean).join("-");return n&&(o+=`-${n}`),o},exports.getAddonOptionRawPrice=r,exports.getAddonOptionTranslation=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},exports.getAddonTitle=(t,r)=>{var e;return(null===(e=t.translations.find((t=>t.language===r)))||void 0===e?void 0:e.title)||""},exports.getAddonTranslation=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},exports.getBaseUrl=(t,r)=>{const e=g.includes(t)?t:v;return{url:`https://${e}/${r||"en"}`,domain:e}},exports.getCartPrice=(r,o="USD",n="en")=>{const{price:a,vat:i,quantity:l,optionsPrice:d}=r||{},s=e(a,l,i)+d*l;return{totalPrice:s,formattedTotalPrice:t.priceFormatter(s,o,n)}},exports.getCategoryNameById=(r,e,n)=>{var a;const i=null===(a=null==e?void 0:e.find)||void 0===a?void 0:a.call(e,(({id:t})=>t===r));if(t.isEmpty(i))return"";const{name:l}=o(i,n);return l},exports.getCategoryTranslation=o,exports.getCoverImageSource=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${n}/${t}`:"https://images.restaround.co/restaround-doodle.webp",exports.getImageSource=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${n}/${t}`:"",exports.getLogoImageSource=t=>t?t.includes("base64")||t.startsWith("https://")?t:`${n}/${t}`:"https://images.restaround.co/no-photo-128.webp",exports.getOptionPrice=({option:r,currency:e="USD",language:o="en"})=>{const{price:n}=r||{};return{totalPrice:n,formattedTotalPrice:t.priceFormatter(n,e,o)}},exports.getOptionTitles=(t,r,e)=>{var o;if(Array.isArray(r))return t.filter((({id:t})=>r.includes(t))).map((({translations:t})=>{var r;return(null===(r=t.find((t=>t.language===e)))||void 0===r?void 0:r.title)||""})).filter(Boolean).join(", ");{const n=t.find((({id:t})=>t===r));return(null===(o=null==n?void 0:n.translations.find((t=>t.language===e)))||void 0===o?void 0:o.title)||""}},exports.getProductAddon=(t,r)=>((null==t?void 0:t.addons)||[]).find((({id:t})=>t===r))||{},exports.getProductCartPrice=({product:r,variantId:e,quantity:o=1,currency:n,language:a,selectedAddons:i,noVat:l=!1})=>{const{total:d}=p({product:r,variantId:e,quantity:o,selectedAddons:i,noVat:l});return{totalPrice:d,formattedTotalPrice:t.priceFormatter(d,n,a)}},exports.getProductCartRawPrice=p,exports.getProductPrice=(r,e,o,n=1)=>{const a=d(r,n);return{totalPrice:a,formattedTotalPrice:t.priceFormatter(a,e,o)}},exports.getProductRawPrice=d,exports.getProductTranslation=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},exports.getProductVariant=s,exports.getProductVariantPrice=({variantId:r,currency:e="USD",language:o="en",product:n,quantity:a=1})=>{const i=c(r,n,a);return{totalPrice:i,formattedTotalPrice:t.priceFormatter(i,e,o)}},exports.getProductVariantRawPrice=c,exports.getProductVariantTranslation=(t,r)=>{var e,o;return(null===(o=null===(e=null==t?void 0:t.translations)||void 0===e?void 0:e.find)||void 0===o?void 0:o.call(e,(t=>t.language===r)))||{}},exports.getSelectedOptionsTotalPrice=u,exports.prepareCategoryAndProductMap=(t,r)=>{const e=r.reduce(((t,r)=>{const e=Number(r.categoryId);return t[e]||(t[e]=[]),t[e].push(r),t}),{});return t.map((t=>Object.assign(Object.assign({},t),{products:e[Number(t.id)]||[]}))).filter((t=>{var r;return(null===(r=null==t?void 0:t.products)||void 0===r?void 0:r.length)>0}))},exports.rgbDataURL=(t,r,e)=>`data:image/gif;base64,R0lGODlhAQABAPAA${i(0,t,r)+i(e,255,255)}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;
2
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/utils/image.ts","../../../src/utils/category.ts","../../../src/utils/constants.ts","../../../src/utils/common.ts","../../../src/utils/product.ts","../../../src/utils/url.ts"],"sourcesContent":["export const IMAGE_BASE_URL = \"https://images.restaround.co\";\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.restaround.co/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverImageSource = (coverImage?: string) => {\n\tif (!coverImage) return \"https://images.restaround.co/restaround-doodle.webp\";\n\n\tif (coverImage.includes(\"base64\") || coverImage.startsWith(\"https://\")) return coverImage;\n\n\treturn `${IMAGE_BASE_URL}/${coverImage}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n","import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { Category, CategoryTranslation } from \"../models/category\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name;\n};\n","export const CO_DOMAIN = \"restaround.co\";\nexport const AZ_DOMAIN = \"restaround.az\";\nexport const EE_DOMAIN = \"restaround.ee\";\nexport const NL_DOMAIN = \"restaround.nl\";\n\nexport const DOMAINS = [CO_DOMAIN, AZ_DOMAIN, EE_DOMAIN, NL_DOMAIN]; // Supported domains list\n","export const calculateTotalPrice = (price: number, quantity: number, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tProduct,\n\tProductTranslation,\n\tProductVariant,\n\tProductVariantTranslations,\n} from \"src/models/product\";\n\nimport { calculateTotalPrice } from \"./common\";\n\nexport const getProductTranslation = (product: Product, language: string): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\n};\n\nexport const getProductPrice = (\n\tproduct: Product,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1\n) => {\n\tconst { price, vat } = product || {};\n\tconst totalPrice = calculateTotalPrice(price, quantity, vat);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariant = (product: Product, variantId: number): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Product;\n\tquantity?: number;\n}) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\tconst totalPrice = calculateTotalPrice(price, quantity, vat);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (\n\tvariant: ProductVariant,\n\tlanguage: string\n): ProductVariantTranslations => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslations;\n};\n\nexport const getProductCartPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n}) => {\n\tif (variantId) {\n\t\treturn getProductVariantPrice({\n\t\t\tvariantId,\n\t\t\tcurrency,\n\t\t\tlanguage,\n\t\t\tproduct,\n\t\t\tquantity,\n\t\t});\n\t}\n\n\treturn getProductPrice(product, currency, language, quantity);\n};\n","import { CO_DOMAIN, DOMAINS } from \"./constants\";\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst domain = DOMAINS.includes(hostname) ? hostname : CO_DOMAIN;\n\tconst locale = language || \"en\";\n\treturn { url: `https://${domain}/${locale}`, domain };\n};\n"],"names":["IMAGE_BASE_URL","keyStr","triplet","e1","e2","e3","charAt","getCategoryTranslation","category","language","_b","_a","translations","find","call","item","CO_DOMAIN","DOMAINS","calculateTotalPrice","price","quantity","vat","getProductPrice","product","currency","totalPrice","formattedTotalPrice","priceFormatter","getProductVariant","variantId","variants","id","getProductVariantPrice","variant","hostname","domain","includes","url","categoryId","categories","isEmpty","name","coverImage","startsWith","image","logoImage","r","g","b"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/utils/addon.ts","../../../src/utils/common.ts","../../../src/utils/category.ts","../../../src/utils/image.ts","../../../src/models/addon.ts","../../../src/utils/product.ts","../../../src/utils/constants.ts","../../../src/utils/cart.ts","../../../src/utils/url.ts","../../../src/utils/menu.ts"],"sourcesContent":["import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tMenuAddon,\n\tMenuAddonOption,\n\tMenuAddonOptionTranslation,\n\tMenuAddonTranslation,\n} from \"src/models/addon\";\n\nexport const getAddonTranslation = (addon: MenuAddon, language: string): MenuAddonTranslation => {\n\treturn (addon?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonTranslation;\n};\n\nexport const getAddonOptionTranslation = (\n\toption: MenuAddonOption,\n\tlanguage: string\n): MenuAddonOptionTranslation => {\n\treturn (option?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as MenuAddonOptionTranslation;\n};\n\nexport const getOptionPrice = ({\n\toption,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n}: {\n\toption: MenuAddonOption;\n\tcurrency?: string;\n\tlanguage?: string;\n}) => {\n\tconst { price } = option || {};\n\n\treturn {\n\t\ttotalPrice: price,\n\t\tformattedTotalPrice: priceFormatter(price, currency, language),\n\t};\n};\n\nexport const getAddonOptionRawPrice = (addon: MenuAddon, optionId: number): number => {\n\treturn (addon?.options || []).find(({ id }) => id === optionId)?.price || 0;\n};\n\nexport const getOptionTitles = (\n\toptions: MenuAddonOption[],\n\toptionIds: number | number[],\n\tlanguage: string\n): string => {\n\tif (Array.isArray(optionIds)) {\n\t\treturn options\n\t\t\t.filter(({ id }) => optionIds.includes(id))\n\t\t\t.map(({ translations }) => translations.find((t) => t.language === language)?.title || \"\")\n\t\t\t.filter(Boolean)\n\t\t\t.join(\", \");\n\t} else {\n\t\tconst option = options.find(({ id }) => id === optionIds);\n\t\treturn option?.translations.find((t) => t.language === language)?.title || \"\";\n\t}\n};\n\nexport const getAddonTitle = (addon: MenuAddon, language: string): string => {\n\treturn addon.translations.find((t) => t.language === language)?.title || \"\";\n};\n","export const calculateTotalPrice = (price: number = 0, quantity: number = 1, vat: number = 0) => {\n\treturn price * quantity * (1 + vat / 100);\n};\n","import { isEmpty } from \"@sorocraft/js-utils\";\n\nimport { Category, CategoryTranslation } from \"../models/category\";\n\nexport const getCategoryTranslation = (\n\tcategory: Category,\n\tlanguage: string\n): CategoryTranslation => {\n\treturn (category?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as CategoryTranslation;\n};\n\nexport const getCategoryNameById = (\n\tcategoryId: number,\n\tcategories: Category[],\n\tlanguage: string\n): string => {\n\tconst category = categories?.find?.(({ id }) => id === categoryId);\n\n\tif (isEmpty(category)) return \"\";\n\n\tconst { name } = getCategoryTranslation(category, language);\n\n\treturn name;\n};\n","export const IMAGE_BASE_URL = \"https://images.restaround.co\";\n\nexport const getImageSource = (image?: string) => {\n\tif (!image) return \"\";\n\n\tif (image.includes(\"base64\") || image.startsWith(\"https://\")) return image;\n\n\treturn `${IMAGE_BASE_URL}/${image}`;\n};\n\nexport const getLogoImageSource = (logoImage?: string) => {\n\tif (!logoImage) return \"https://images.restaround.co/no-photo-128.webp\";\n\n\tif (logoImage.includes(\"base64\") || logoImage.startsWith(\"https://\")) return logoImage;\n\n\treturn `${IMAGE_BASE_URL}/${logoImage}`;\n};\n\nexport const getCoverImageSource = (coverImage?: string) => {\n\tif (!coverImage) return \"https://images.restaround.co/restaround-doodle.webp\";\n\n\tif (coverImage.includes(\"base64\") || coverImage.startsWith(\"https://\")) return coverImage;\n\n\treturn `${IMAGE_BASE_URL}/${coverImage}`;\n};\n\nconst keyStr = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n\nconst triplet = (e1: number, e2: number, e3: number) =>\n\tkeyStr.charAt(e1 >> 2) +\n\tkeyStr.charAt(((e1 & 3) << 4) | (e2 >> 4)) +\n\tkeyStr.charAt(((e2 & 15) << 2) | (e3 >> 6)) +\n\tkeyStr.charAt(e3 & 63);\n\nexport const rgbDataURL = (r: number, g: number, b: number) =>\n\t`data:image/gif;base64,R0lGODlhAQABAPAA${\n\t\ttriplet(0, r, g) + triplet(b, 255, 255)\n\t}/yH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==`;\n","export enum MenuAddonSelectType {\n\tSINGLE = \"SINGLE\",\n\tMULTIPLE = \"MULTIPLE\",\n}\n\nexport interface MenuAddonTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOptionTranslation {\n\tid?: number;\n\ttitle: string;\n\tlanguage: string;\n}\n\nexport interface MenuAddonOption {\n\tid?: number;\n\tprice: number;\n\ttranslations: MenuAddonOptionTranslation[];\n\tremove?: boolean;\n}\n\nexport interface MenuAddon {\n\tid?: number;\n\tselectType: MenuAddonSelectType;\n\ttranslations: MenuAddonTranslation[];\n\toptions: MenuAddonOption[];\n\tbusinessId?: number;\n}\n\nexport interface SelectedAddons {\n\t[key: number]: number | number[];\n}\n","import { isEmpty, priceFormatter } from \"@sorocraft/js-utils\";\n\nimport {\n\tProduct,\n\tProductTranslation,\n\tProductVariant,\n\tProductVariantTranslations,\n} from \"src/models/product\";\n\nimport { calculateTotalPrice } from \"./common\";\nimport { MenuAddon, MenuAddonSelectType, SelectedAddons } from \"src/models/addon\";\n\nimport { getAddonOptionRawPrice } from \"./addon\";\n\nexport const getProductTranslation = (product: Product, language: string): ProductTranslation => {\n\treturn (product?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductTranslation;\n};\n\nexport const getProductRawPrice = (product: Product, quantity: number = 1) => {\n\tconst { price = 0, vat = 0 } = product || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductPrice = (\n\tproduct: Product,\n\tcurrency: string,\n\tlanguage: string,\n\tquantity: number = 1\n) => {\n\tconst totalPrice = getProductRawPrice(product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariant = (product: Product, variantId: number): ProductVariant => {\n\treturn product?.variants?.find?.((item) => item.id === variantId) || ({} as ProductVariant);\n};\n\nexport const getSelectedOptionsTotalPrice = (\n\tproduct: Product,\n\tselectedAddons: SelectedAddons = {},\n\tquantity: number\n): number => {\n\t// Filter addons that are selected by the user\n\tconst selectedAddonsList = (product?.addons || []).filter((addon) =>\n\t\tObject.prototype.hasOwnProperty.call(selectedAddons, addon.id)\n\t);\n\n\t// Calculate the total price\n\tconst optionsTotalPrice = selectedAddonsList.reduce((total: number, addon: MenuAddon) => {\n\t\tconst { id: addonId, selectType } = addon;\n\n\t\t// Handle SINGLE selection\n\t\tif (selectType === MenuAddonSelectType.SINGLE) {\n\t\t\tconst selectedOptionId = selectedAddons[addonId] as number;\n\t\t\treturn total + getAddonOptionRawPrice(addon, selectedOptionId);\n\t\t}\n\n\t\t// Handle MULTIPLE selection\n\t\tconst selectedOptionIds = (selectedAddons[addonId] || []) as number[];\n\t\tconst multipleOptionsPrice = selectedOptionIds.reduce(\n\t\t\t(multipleTotal, optionId) => multipleTotal + getAddonOptionRawPrice(addon, optionId),\n\t\t\t0\n\t\t);\n\n\t\treturn total + multipleOptionsPrice;\n\t}, 0);\n\n\treturn optionsTotalPrice * quantity;\n};\n\nexport const getProductVariantRawPrice = (\n\tvariantId: number,\n\tproduct: Product,\n\tquantity?: number\n) => {\n\tconst variant = getProductVariant(product, variantId);\n\tconst { vat } = product || {};\n\tconst { price } = variant || {};\n\treturn calculateTotalPrice(price, quantity, vat);\n};\n\nexport const getProductVariantPrice = ({\n\tvariantId,\n\tcurrency = \"USD\",\n\tlanguage = \"en\",\n\tproduct,\n\tquantity = 1,\n}: {\n\tvariantId: number;\n\tcurrency?: string;\n\tlanguage?: string;\n\tproduct: Product;\n\tquantity?: number;\n}) => {\n\tconst totalPrice = getProductVariantRawPrice(variantId, product, quantity);\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const getProductVariantTranslation = (\n\tvariant: ProductVariant,\n\tlanguage: string\n): ProductVariantTranslations => {\n\treturn (variant?.translations?.find?.((item) => item.language === language) ||\n\t\t{}) as ProductVariantTranslations;\n};\n\nexport const getProductCartRawPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tselectedAddons: SelectedAddons;\n\tnoVat?: boolean;\n}): { price: number; optionsPrice: number; total: number } => {\n\tif (isEmpty(product)) return { price: 0, optionsPrice: 0, total: 0 };\n\n\tconst productData: Product = { ...product, vat: noVat ? 0 : product.vat };\n\tconst selectedOptionsTotalPrice = getSelectedOptionsTotalPrice(\n\t\tproductData,\n\t\tselectedAddons,\n\t\tquantity\n\t);\n\tconst price = variantId\n\t\t? getProductVariantRawPrice(variantId, productData, quantity)\n\t\t: getProductRawPrice(productData, quantity);\n\n\treturn {\n\t\tprice,\n\t\toptionsPrice: selectedOptionsTotalPrice,\n\t\ttotal: price + selectedOptionsTotalPrice,\n\t};\n};\n\nexport const getProductCartPrice = ({\n\tproduct,\n\tvariantId,\n\tquantity = 1,\n\tcurrency,\n\tlanguage,\n\tselectedAddons,\n\tnoVat = false,\n}: {\n\tproduct: Product;\n\tvariantId: number | null;\n\tquantity: number;\n\tcurrency: string;\n\tlanguage: string;\n\tselectedAddons: SelectedAddons;\n\tnoVat?: boolean;\n}) => {\n\tconst { total } = getProductCartRawPrice({\n\t\tproduct,\n\t\tvariantId,\n\t\tquantity,\n\t\tselectedAddons,\n\t\tnoVat,\n\t});\n\n\treturn {\n\t\ttotalPrice: total,\n\t\tformattedTotalPrice: priceFormatter(total, currency, language),\n\t};\n};\n\nexport const getProductAddon = (product: Product, addonId: number): MenuAddon => {\n\treturn (product?.addons || []).find(({ id }) => id === addonId) || ({} as MenuAddon);\n};\n","export const CO_DOMAIN = \"restaround.co\";\nexport const AZ_DOMAIN = \"restaround.az\";\nexport const EE_DOMAIN = \"restaround.ee\";\nexport const NL_DOMAIN = \"restaround.nl\";\n\nexport const DOMAINS = [CO_DOMAIN, AZ_DOMAIN, EE_DOMAIN, NL_DOMAIN]; // Supported domains list\n","import { priceFormatter } from \"@sorocraft/js-utils\";\n\nimport { CartItem } from \"src/models/order\";\nimport { SelectedAddons } from \"src/models/addon\";\n\nimport { calculateTotalPrice } from \"./common\";\n\nexport const getCartPrice = (item: CartItem, currency: string = \"USD\", language: string = \"en\") => {\n\tconst { price, vat, quantity, optionsPrice } = item || {};\n\tconst productPrice = calculateTotalPrice(price, quantity, vat);\n\tconst totalPrice = productPrice + optionsPrice * quantity;\n\n\treturn {\n\t\ttotalPrice: totalPrice,\n\t\tformattedTotalPrice: priceFormatter(totalPrice, currency, language),\n\t};\n};\n\nexport const generateCartId = (\n\tproductId: number,\n\tvariantId: number | null,\n\tselectedAddons: SelectedAddons\n): string => {\n\tif (!productId) throw new Error(\"Product ID is required\");\n\n\t// Build the cart ID base with productId and variantId\n\tlet cartId = `${productId}`;\n\tif (variantId) {\n\t\tcartId += `-${variantId}`;\n\t}\n\n\t// Build the addon part of the ID\n\tconst addonIdsPart = Object.entries(selectedAddons || {})\n\t\t.map(([addonId, option]) => {\n\t\t\tif (!addonId || !option) return null; // Skip invalid entries\n\t\t\tconst optionIds = Array.isArray(option) ? option.filter(Boolean).join(\"-\") : `${option}`;\n\t\t\tif (!optionIds) return null;\n\t\t\treturn `${addonId}-${optionIds}`;\n\t\t})\n\t\t.filter(Boolean) // Remove null/undefined values\n\t\t.join(\"-\");\n\n\t// Append addonIdsPart if it's not empty\n\tif (addonIdsPart) {\n\t\tcartId += `-${addonIdsPart}`;\n\t}\n\n\treturn cartId;\n};\n","import { CO_DOMAIN, DOMAINS } from \"./constants\";\n\nexport const getBaseUrl = (hostname: string, language: string) => {\n\tconst domain = DOMAINS.includes(hostname) ? hostname : CO_DOMAIN;\n\tconst locale = language || \"en\";\n\treturn { url: `https://${domain}/${locale}`, domain };\n};\n","import { Category, CategoryProductMap, Product } from \"src/models\";\n\nexport const prepareCategoryAndProductMap = (\n\tcategories: Category[],\n\tproducts: Product[]\n): CategoryProductMap[] => {\n\tconst productMap = products.reduce<Record<number, Product[]>>((map, product) => {\n\t\tconst categoryId = Number(product.categoryId);\n\t\tif (!map[categoryId]) {\n\t\t\tmap[categoryId] = [];\n\t\t}\n\t\tmap[categoryId].push(product);\n\t\treturn map;\n\t}, {});\n\n\treturn categories\n\t\t.map((category) => ({\n\t\t\t...category,\n\t\t\tproducts: (productMap[Number(category.id)] || []) as Product[],\n\t\t}))\n\t\t.filter((category) => category?.products?.length > 0);\n};\n"],"names":["getAddonOptionRawPrice","addon","optionId","_a","options","find","id","price","calculateTotalPrice","quantity","vat","getCategoryTranslation","category","language","_b","translations","call","item","IMAGE_BASE_URL","keyStr","triplet","e1","e2","e3","charAt","MenuAddonSelectType","getProductRawPrice","product","getProductVariant","variantId","variants","getSelectedOptionsTotalPrice","selectedAddons","addons","filter","Object","prototype","hasOwnProperty","reduce","total","addonId","selectType","SINGLE","selectedOptionId","multipleTotal","getProductVariantRawPrice","variant","getProductCartRawPrice","noVat","isEmpty","optionsPrice","productData","assign","selectedOptionsTotalPrice","CO_DOMAIN","DOMAINS","productId","Error","cartId","addonIdsPart","entries","map","option","optionIds","Array","isArray","Boolean","join","t","title","hostname","domain","includes","url","currency","totalPrice","formattedTotalPrice","priceFormatter","categoryId","categories","name","coverImage","startsWith","image","logoImage","products","productMap","Number","push","length","r","g","b"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ export declare enum MenuAddonSelectType {
2
+ SINGLE = "SINGLE",
3
+ MULTIPLE = "MULTIPLE"
4
+ }
5
+ export interface MenuAddonTranslation {
6
+ id?: number;
7
+ title: string;
8
+ language: string;
9
+ }
10
+ export interface MenuAddonOptionTranslation {
11
+ id?: number;
12
+ title: string;
13
+ language: string;
14
+ }
15
+ export interface MenuAddonOption {
16
+ id?: number;
17
+ price: number;
18
+ translations: MenuAddonOptionTranslation[];
19
+ remove?: boolean;
20
+ }
21
+ export interface MenuAddon {
22
+ id?: number;
23
+ selectType: MenuAddonSelectType;
24
+ translations: MenuAddonTranslation[];
25
+ options: MenuAddonOption[];
26
+ businessId?: number;
27
+ }
28
+ export interface SelectedAddons {
29
+ [key: number]: number | number[];
30
+ }
@@ -1,3 +1,4 @@
1
+ import { SelectedAddons } from "./addon";
1
2
  export declare enum OrderType {
2
3
  DINEIN = "dine-in",
3
4
  TAKEAWAY = "takeaway",
@@ -36,8 +37,10 @@ export interface CartItem {
36
37
  productId: number;
37
38
  variantId?: number;
38
39
  price: number;
40
+ optionsPrice?: number;
39
41
  quantity: number;
40
42
  vat?: number;
43
+ selectedAddons?: SelectedAddons;
41
44
  }
42
45
  export interface Cart {
43
46
  [key: string]: CartItem;
@@ -1,3 +1,4 @@
1
+ import { MenuAddon } from "./addon";
1
2
  export interface ProductTranslation {
2
3
  id: number;
3
4
  name: string;
@@ -28,6 +29,7 @@ export interface Product {
28
29
  image1024?: string;
29
30
  translations: ProductTranslation[];
30
31
  variants: ProductVariant[];
32
+ addons: MenuAddon[];
31
33
  }
32
34
  export declare enum ProductView {
33
35
  LIST = "list",
@@ -1,10 +1,14 @@
1
1
  import { Product, ProductTranslation, ProductVariant, ProductVariantTranslations } from "src/models/product";
2
+ import { MenuAddon, SelectedAddons } from "src/models/addon";
2
3
  export declare const getProductTranslation: (product: Product, language: string) => ProductTranslation;
4
+ export declare const getProductRawPrice: (product: Product, quantity?: number) => number;
3
5
  export declare const getProductPrice: (product: Product, currency: string, language: string, quantity?: number) => {
4
6
  totalPrice: number;
5
7
  formattedTotalPrice: string;
6
8
  };
7
9
  export declare const getProductVariant: (product: Product, variantId: number) => ProductVariant;
10
+ export declare const getSelectedOptionsTotalPrice: (product: Product, selectedAddons: SelectedAddons, quantity: number) => number;
11
+ export declare const getProductVariantRawPrice: (variantId: number, product: Product, quantity?: number) => number;
8
12
  export declare const getProductVariantPrice: ({ variantId, currency, language, product, quantity, }: {
9
13
  variantId: number;
10
14
  currency?: string;
@@ -16,13 +20,27 @@ export declare const getProductVariantPrice: ({ variantId, currency, language, p
16
20
  formattedTotalPrice: string;
17
21
  };
18
22
  export declare const getProductVariantTranslation: (variant: ProductVariant, language: string) => ProductVariantTranslations;
19
- export declare const getProductCartPrice: ({ product, variantId, quantity, currency, language, }: {
23
+ export declare const getProductCartRawPrice: ({ product, variantId, quantity, selectedAddons, noVat, }: {
24
+ product: Product;
25
+ variantId: number | null;
26
+ quantity: number;
27
+ selectedAddons: SelectedAddons;
28
+ noVat?: boolean;
29
+ }) => {
30
+ price: number;
31
+ optionsPrice: number;
32
+ total: number;
33
+ };
34
+ export declare const getProductCartPrice: ({ product, variantId, quantity, currency, language, selectedAddons, noVat, }: {
20
35
  product: Product;
21
36
  variantId: number | null;
22
37
  quantity: number;
23
38
  currency: string;
24
39
  language: string;
40
+ selectedAddons: SelectedAddons;
41
+ noVat?: boolean;
25
42
  }) => {
26
43
  totalPrice: number;
27
44
  formattedTotalPrice: string;
28
45
  };
46
+ export declare const getProductAddon: (product: Product, addonId: number) => MenuAddon;
@@ -0,0 +1,14 @@
1
+ import { MenuAddon, MenuAddonOption, MenuAddonOptionTranslation, MenuAddonTranslation } from "src/models/addon";
2
+ export declare const getAddonTranslation: (addon: MenuAddon, language: string) => MenuAddonTranslation;
3
+ export declare const getAddonOptionTranslation: (option: MenuAddonOption, language: string) => MenuAddonOptionTranslation;
4
+ export declare const getOptionPrice: ({ option, currency, language, }: {
5
+ option: MenuAddonOption;
6
+ currency?: string;
7
+ language?: string;
8
+ }) => {
9
+ totalPrice: number;
10
+ formattedTotalPrice: string;
11
+ };
12
+ export declare const getAddonOptionRawPrice: (addon: MenuAddon, optionId: number) => number;
13
+ export declare const getOptionTitles: (options: MenuAddonOption[], optionIds: number | number[], language: string) => string;
14
+ export declare const getAddonTitle: (addon: MenuAddon, language: string) => string;
@@ -1,5 +1,7 @@
1
1
  import { CartItem } from "src/models/order";
2
+ import { SelectedAddons } from "src/models/addon";
2
3
  export declare const getCartPrice: (item: CartItem, currency?: string, language?: string) => {
3
4
  totalPrice: number;
4
5
  formattedTotalPrice: string;
5
6
  };
7
+ export declare const generateCartId: (productId: number, variantId: number | null, selectedAddons: SelectedAddons) => string;
@@ -0,0 +1 @@
1
+ export {};
@@ -1 +1 @@
1
- export declare const calculateTotalPrice: (price: number, quantity: number, vat?: number) => number;
1
+ export declare const calculateTotalPrice: (price?: number, quantity?: number, vat?: number) => number;
@@ -1,4 +1,8 @@
1
- export * from "./image";
1
+ export * from "./addon";
2
+ export * from "./cart";
2
3
  export * from "./category";
3
- export * from "./url";
4
+ export * from "./common";
5
+ export * from "./image";
6
+ export * from "./menu";
4
7
  export * from "./product";
8
+ export * from "./url";
@@ -1,10 +1,14 @@
1
1
  import { Product, ProductTranslation, ProductVariant, ProductVariantTranslations } from "src/models/product";
2
+ import { MenuAddon, SelectedAddons } from "src/models/addon";
2
3
  export declare const getProductTranslation: (product: Product, language: string) => ProductTranslation;
4
+ export declare const getProductRawPrice: (product: Product, quantity?: number) => number;
3
5
  export declare const getProductPrice: (product: Product, currency: string, language: string, quantity?: number) => {
4
6
  totalPrice: number;
5
7
  formattedTotalPrice: string;
6
8
  };
7
9
  export declare const getProductVariant: (product: Product, variantId: number) => ProductVariant;
10
+ export declare const getSelectedOptionsTotalPrice: (product: Product, selectedAddons: SelectedAddons, quantity: number) => number;
11
+ export declare const getProductVariantRawPrice: (variantId: number, product: Product, quantity?: number) => number;
8
12
  export declare const getProductVariantPrice: ({ variantId, currency, language, product, quantity, }: {
9
13
  variantId: number;
10
14
  currency?: string;
@@ -16,13 +20,27 @@ export declare const getProductVariantPrice: ({ variantId, currency, language, p
16
20
  formattedTotalPrice: string;
17
21
  };
18
22
  export declare const getProductVariantTranslation: (variant: ProductVariant, language: string) => ProductVariantTranslations;
19
- export declare const getProductCartPrice: ({ product, variantId, quantity, currency, language, }: {
23
+ export declare const getProductCartRawPrice: ({ product, variantId, quantity, selectedAddons, noVat, }: {
24
+ product: Product;
25
+ variantId: number | null;
26
+ quantity: number;
27
+ selectedAddons: SelectedAddons;
28
+ noVat?: boolean;
29
+ }) => {
30
+ price: number;
31
+ optionsPrice: number;
32
+ total: number;
33
+ };
34
+ export declare const getProductCartPrice: ({ product, variantId, quantity, currency, language, selectedAddons, noVat, }: {
20
35
  product: Product;
21
36
  variantId: number | null;
22
37
  quantity: number;
23
38
  currency: string;
24
39
  language: string;
40
+ selectedAddons: SelectedAddons;
41
+ noVat?: boolean;
25
42
  }) => {
26
43
  totalPrice: number;
27
44
  formattedTotalPrice: string;
28
45
  };
46
+ export declare const getProductAddon: (product: Product, addonId: number) => MenuAddon;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@restaround/react",
3
- "version": "1.0.56",
3
+ "version": "1.0.59",
4
4
  "description": "React Library by restaround.co",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -38,6 +38,7 @@
38
38
  }
39
39
  },
40
40
  "scripts": {
41
+ "test": "jest",
41
42
  "clean": "rimraf dist",
42
43
  "build": "npm run clean && rollup -c",
43
44
  "dev": "npm run clean && rollup -c -w",
@@ -49,27 +50,32 @@
49
50
  "homepage": "https://restaround.co",
50
51
  "peerDependencies": {
51
52
  "@sorocraft/js-utils": ">=1.0.24",
52
- "@sorocraft/ui": ">=1.0.102",
53
- "react": ">=18.3.1",
54
- "react-dom": ">=18.3.1"
53
+ "@sorocraft/ui": ">=1.0.116",
54
+ "react": ">=19.0.0",
55
+ "react-dom": ">=19.0.0"
55
56
  },
56
57
  "devDependencies": {
57
58
  "@rollup/plugin-commonjs": "^28.0.2",
58
59
  "@rollup/plugin-node-resolve": "^16.0.0",
59
60
  "@rollup/plugin-terser": "^0.4.4",
60
61
  "@rollup/plugin-typescript": "^12.1.2",
61
- "@types/react": "^19.0.2",
62
- "@types/react-dom": "^19.0.2",
62
+ "@types/jest": "^29.5.14",
63
+ "@types/react": "^19.0.8",
64
+ "@types/react-dom": "^19.0.3",
63
65
  "autoprefixer": "^10.4.20",
64
- "eslint": "^9.17.0",
65
- "eslint-plugin-react": "^7.37.3",
66
+ "eslint": "^9.18.0",
67
+ "eslint-plugin-react": "^7.37.4",
68
+ "jest": "^29.7.0",
69
+ "jest-environment-jsdom": "^29.7.0",
66
70
  "rimraf": "^6.0.1",
67
71
  "rollup-plugin-copy": "^3.5.0",
68
72
  "rollup-plugin-peer-deps-external": "^2.2.4",
69
73
  "rollup-plugin-postcss": "^4.0.2",
70
- "sass": "^1.83.0",
74
+ "sass": "^1.83.4",
75
+ "ts-jest": "^29.2.5",
76
+ "ts-node": "^10.9.2",
71
77
  "tslib": "^2.8.1",
72
- "typescript": "^5.7.2",
73
- "typescript-eslint": "^8.18.2"
78
+ "typescript": "^5.7.3",
79
+ "typescript-eslint": "^8.21.0"
74
80
  }
75
81
  }