@yoryoboy/bi-mcp 1.11.0 → 1.13.0

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 (237) hide show
  1. package/README.md +4 -5
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/index.js +398 -8
  4. package/dist/index.js.map +2 -2
  5. package/dist/mcp-use.json +2 -2
  6. package/dist/src/config/__tests__/meta.test.js +35 -0
  7. package/dist/src/config/__tests__/meta.test.js.map +7 -0
  8. package/dist/src/config/meta-store.js +109 -0
  9. package/dist/src/config/meta-store.js.map +7 -0
  10. package/dist/src/config/meta.js +0 -2
  11. package/dist/src/config/meta.js.map +2 -2
  12. package/dist/src/meta/__tests__/meta-utils.test.js +155 -0
  13. package/dist/src/meta/__tests__/meta-utils.test.js.map +7 -0
  14. package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js +265 -0
  15. package/dist/src/services/mercadolibre/__tests__/mercadolibre-api.test.js.map +7 -0
  16. package/dist/src/services/mercadolibre/__tests__/mercadolibre-items.test.js +311 -0
  17. package/dist/src/services/mercadolibre/__tests__/mercadolibre-items.test.js.map +7 -0
  18. package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js +220 -0
  19. package/dist/src/services/mercadolibre/__tests__/mercadolibre-orders.test.js.map +7 -0
  20. package/dist/src/services/meta/__tests__/meta-ads.test.js +126 -0
  21. package/dist/src/services/meta/__tests__/meta-ads.test.js.map +7 -0
  22. package/dist/src/services/meta/__tests__/meta-api.test.js +70 -0
  23. package/dist/src/services/meta/__tests__/meta-api.test.js.map +7 -0
  24. package/dist/src/services/meta/meta-ads.js +94 -40
  25. package/dist/src/services/meta/meta-ads.js.map +2 -2
  26. package/dist/src/services/meta/meta-api.js +8 -6
  27. package/dist/src/services/meta/meta-api.js.map +2 -2
  28. package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js +165 -0
  29. package/dist/src/services/vtex/__tests__/vtex-catalog-write-batch.test.js.map +7 -0
  30. package/dist/src/services/vtex/__tests__/vtex-catalog-write-eans.test.js +92 -0
  31. package/dist/src/services/vtex/__tests__/vtex-catalog-write-eans.test.js.map +7 -0
  32. package/dist/src/services/vtex/__tests__/vtex-catalog-write-products.test.js +41 -0
  33. package/dist/src/services/vtex/__tests__/vtex-catalog-write-products.test.js.map +7 -0
  34. package/dist/src/services/vtex/__tests__/vtex-catalog.test.js +80 -0
  35. package/dist/src/services/vtex/__tests__/vtex-catalog.test.js.map +7 -0
  36. package/dist/src/services/vtex/__tests__/vtex-orders-write-http.test.js +85 -0
  37. package/dist/src/services/vtex/__tests__/vtex-orders-write-http.test.js.map +7 -0
  38. package/dist/src/services/vtex/__tests__/vtex-orders-write-state-validation.test.js +251 -0
  39. package/dist/src/services/vtex/__tests__/vtex-orders-write-state-validation.test.js.map +7 -0
  40. package/dist/src/services/vtex/__tests__/vtex-write.test.js +111 -0
  41. package/dist/src/services/vtex/__tests__/vtex-write.test.js.map +7 -0
  42. package/dist/src/services/vtex/vtex-catalog-write.js +194 -1
  43. package/dist/src/services/vtex/vtex-catalog-write.js.map +2 -2
  44. package/dist/src/services/vtex/vtex-catalog.js +118 -1
  45. package/dist/src/services/vtex/vtex-catalog.js.map +2 -2
  46. package/dist/src/services/vtex/vtex-pricing-write.js +5 -0
  47. package/dist/src/services/vtex/vtex-pricing-write.js.map +2 -2
  48. package/dist/src/services/vtex/vtex-write.js +67 -1
  49. package/dist/src/services/vtex/vtex-write.js.map +2 -2
  50. package/dist/src/tools/config/list-profiles.js +37 -6
  51. package/dist/src/tools/config/list-profiles.js.map +2 -2
  52. package/dist/src/tools/index.js.map +2 -2
  53. package/dist/src/tools/mercadolibre/__tests__/helpers.test.js +37 -0
  54. package/dist/src/tools/mercadolibre/__tests__/helpers.test.js.map +7 -0
  55. package/dist/src/tools/mercadolibre/__tests__/profile-resolution.test.js +30 -0
  56. package/dist/src/tools/mercadolibre/__tests__/profile-resolution.test.js.map +7 -0
  57. package/dist/src/tools/mercadolibre/profile-resolution.js +4 -50
  58. package/dist/src/tools/mercadolibre/profile-resolution.js.map +2 -2
  59. package/dist/src/tools/meta/__tests__/pagination.test.js +133 -0
  60. package/dist/src/tools/meta/__tests__/pagination.test.js.map +7 -0
  61. package/dist/src/tools/meta/__tests__/profile-access.test.js +262 -0
  62. package/dist/src/tools/meta/__tests__/profile-access.test.js.map +7 -0
  63. package/dist/src/tools/meta/__tests__/read-tools.test.js +722 -0
  64. package/dist/src/tools/meta/__tests__/read-tools.test.js.map +7 -0
  65. package/dist/src/tools/meta/__tests__/schemas.test.js +103 -0
  66. package/dist/src/tools/meta/__tests__/schemas.test.js.map +7 -0
  67. package/dist/src/tools/meta/account-overview.js +37 -19
  68. package/dist/src/tools/meta/account-overview.js.map +2 -2
  69. package/dist/src/tools/meta/ad-account-info.js +31 -6
  70. package/dist/src/tools/meta/ad-account-info.js.map +2 -2
  71. package/dist/src/tools/meta/ads-performance.js +35 -21
  72. package/dist/src/tools/meta/ads-performance.js.map +2 -2
  73. package/dist/src/tools/meta/campaign-performance.js +35 -18
  74. package/dist/src/tools/meta/campaign-performance.js.map +2 -2
  75. package/dist/src/tools/meta/list-accessible-ad-accounts.js +39 -10
  76. package/dist/src/tools/meta/list-accessible-ad-accounts.js.map +2 -2
  77. package/dist/src/tools/meta/list-accessible-businesses.js +37 -13
  78. package/dist/src/tools/meta/list-accessible-businesses.js.map +2 -2
  79. package/dist/src/tools/meta/placement-mix.js +37 -22
  80. package/dist/src/tools/meta/placement-mix.js.map +2 -2
  81. package/dist/src/tools/meta/profile-access.js +215 -0
  82. package/dist/src/tools/meta/profile-access.js.map +7 -0
  83. package/dist/src/tools/meta/schema-helpers.js +19 -0
  84. package/dist/src/tools/meta/schema-helpers.js.map +7 -0
  85. package/dist/src/tools/meta/time-series.js +40 -23
  86. package/dist/src/tools/meta/time-series.js.map +2 -2
  87. package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js +233 -0
  88. package/dist/src/tools/vtex/__tests__/catalog-admin-batch.test.js.map +7 -0
  89. package/dist/src/tools/vtex/__tests__/catalog-admin-categories.test.js +649 -0
  90. package/dist/src/tools/vtex/__tests__/catalog-admin-categories.test.js.map +7 -0
  91. package/dist/src/tools/vtex/__tests__/catalog-admin-product-specifications.test.js +339 -0
  92. package/dist/src/tools/vtex/__tests__/catalog-admin-product-specifications.test.js.map +7 -0
  93. package/dist/src/tools/vtex/__tests__/catalog-admin-products-skus.test.js +235 -0
  94. package/dist/src/tools/vtex/__tests__/catalog-admin-products-skus.test.js.map +7 -0
  95. package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js +372 -0
  96. package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js.map +7 -0
  97. package/dist/src/tools/vtex/__tests__/catalog-navigation-surface.test.js +57 -0
  98. package/dist/src/tools/vtex/__tests__/catalog-navigation-surface.test.js.map +7 -0
  99. package/dist/src/tools/vtex/__tests__/write-helpers.test.js +97 -0
  100. package/dist/src/tools/vtex/__tests__/write-helpers.test.js.map +7 -0
  101. package/dist/src/tools/vtex/activate-sku.js +1 -48
  102. package/dist/src/tools/vtex/activate-sku.js.map +2 -2
  103. package/dist/src/tools/vtex/associate-specification.js +3 -54
  104. package/dist/src/tools/vtex/associate-specification.js.map +2 -2
  105. package/dist/src/tools/vtex/attach-catalog-image.js +3 -57
  106. package/dist/src/tools/vtex/attach-catalog-image.js.map +2 -2
  107. package/dist/src/tools/vtex/catalog-admin-batch.js +298 -0
  108. package/dist/src/tools/vtex/catalog-admin-batch.js.map +7 -0
  109. package/dist/src/tools/vtex/catalog-admin-categories.js +542 -0
  110. package/dist/src/tools/vtex/catalog-admin-categories.js.map +7 -0
  111. package/dist/src/tools/vtex/catalog-admin-product-specifications.js +275 -0
  112. package/dist/src/tools/vtex/catalog-admin-product-specifications.js.map +7 -0
  113. package/dist/src/tools/vtex/catalog-admin-products-skus.js +475 -0
  114. package/dist/src/tools/vtex/catalog-admin-products-skus.js.map +7 -0
  115. package/dist/src/tools/vtex/catalog-navigation-reads.js +430 -0
  116. package/dist/src/tools/vtex/catalog-navigation-reads.js.map +7 -0
  117. package/dist/src/tools/vtex/create-brand.js +1 -64
  118. package/dist/src/tools/vtex/create-brand.js.map +2 -2
  119. package/dist/src/tools/vtex/create-category.js +1 -76
  120. package/dist/src/tools/vtex/create-category.js.map +2 -2
  121. package/dist/src/tools/vtex/create-product-with-sku.js +3 -114
  122. package/dist/src/tools/vtex/create-product-with-sku.js.map +2 -2
  123. package/dist/src/tools/vtex/create-specification-value.js +3 -47
  124. package/dist/src/tools/vtex/create-specification-value.js.map +2 -2
  125. package/dist/src/tools/vtex/create-specification.js +1 -80
  126. package/dist/src/tools/vtex/create-specification.js.map +2 -2
  127. package/dist/src/tools/vtex/deactivate-sku.js +1 -48
  128. package/dist/src/tools/vtex/deactivate-sku.js.map +2 -2
  129. package/dist/src/tools/vtex/delete-all-product-specifications.js +9 -0
  130. package/dist/src/tools/vtex/delete-all-product-specifications.js.map +7 -0
  131. package/dist/src/tools/vtex/delete-all-sku-specifications.js +9 -0
  132. package/dist/src/tools/vtex/delete-all-sku-specifications.js.map +7 -0
  133. package/dist/src/tools/vtex/delete-brand.js +9 -0
  134. package/dist/src/tools/vtex/delete-brand.js.map +7 -0
  135. package/dist/src/tools/vtex/delete-catalog-image.js +9 -0
  136. package/dist/src/tools/vtex/delete-catalog-image.js.map +7 -0
  137. package/dist/src/tools/vtex/delete-product-specification.js +9 -0
  138. package/dist/src/tools/vtex/delete-product-specification.js.map +7 -0
  139. package/dist/src/tools/vtex/delete-sku-price.js +55 -0
  140. package/dist/src/tools/vtex/delete-sku-price.js.map +7 -0
  141. package/dist/src/tools/vtex/delete-sku-specification.js +9 -0
  142. package/dist/src/tools/vtex/delete-sku-specification.js.map +7 -0
  143. package/dist/src/tools/vtex/get-brand.js +6 -0
  144. package/dist/src/tools/vtex/get-brand.js.map +7 -0
  145. package/dist/src/tools/vtex/get-category-tree.js +6 -0
  146. package/dist/src/tools/vtex/get-category-tree.js.map +7 -0
  147. package/dist/src/tools/vtex/get-category.js +6 -0
  148. package/dist/src/tools/vtex/get-category.js.map +7 -0
  149. package/dist/src/tools/vtex/get-product-specifications.js +9 -0
  150. package/dist/src/tools/vtex/get-product-specifications.js.map +7 -0
  151. package/dist/src/tools/vtex/get-product.js +6 -0
  152. package/dist/src/tools/vtex/get-product.js.map +7 -0
  153. package/dist/src/tools/vtex/get-sku.js +6 -0
  154. package/dist/src/tools/vtex/get-sku.js.map +7 -0
  155. package/dist/src/tools/vtex/index.js +23 -1
  156. package/dist/src/tools/vtex/index.js.map +2 -2
  157. package/dist/src/tools/vtex/list-brands.js +6 -0
  158. package/dist/src/tools/vtex/list-brands.js.map +7 -0
  159. package/dist/src/tools/vtex/list-categories.js +6 -0
  160. package/dist/src/tools/vtex/list-categories.js.map +7 -0
  161. package/dist/src/tools/vtex/list-products-by-category.js +6 -0
  162. package/dist/src/tools/vtex/list-products-by-category.js.map +7 -0
  163. package/dist/src/tools/vtex/list-products.js +6 -0
  164. package/dist/src/tools/vtex/list-products.js.map +7 -0
  165. package/dist/src/tools/vtex/list-skus-by-product.js +6 -0
  166. package/dist/src/tools/vtex/list-skus-by-product.js.map +7 -0
  167. package/dist/src/tools/vtex/list-specification-groups.js +9 -0
  168. package/dist/src/tools/vtex/list-specification-groups.js.map +7 -0
  169. package/dist/src/tools/vtex/move-category.js +6 -0
  170. package/dist/src/tools/vtex/move-category.js.map +7 -0
  171. package/dist/src/tools/vtex/profile-resolution.js +4 -51
  172. package/dist/src/tools/vtex/profile-resolution.js.map +2 -2
  173. package/dist/src/tools/vtex/update-brand.js +6 -0
  174. package/dist/src/tools/vtex/update-brand.js.map +7 -0
  175. package/dist/src/tools/vtex/update-category.js +6 -0
  176. package/dist/src/tools/vtex/update-category.js.map +7 -0
  177. package/dist/src/tools/vtex/update-product-basic-fields.js +3 -65
  178. package/dist/src/tools/vtex/update-product-basic-fields.js.map +2 -2
  179. package/dist/src/tools/vtex/update-sku-basic-fields.js +1 -87
  180. package/dist/src/tools/vtex/update-sku-basic-fields.js.map +2 -2
  181. package/dist/src/tools/vtex/update-sku-price.js +21 -1
  182. package/dist/src/tools/vtex/update-sku-price.js.map +2 -2
  183. package/dist/src/tools/vtex/write-helpers.js +104 -14
  184. package/dist/src/tools/vtex/write-helpers.js.map +2 -2
  185. package/dist/src/utils/provider-profile-selection.js +117 -0
  186. package/dist/src/utils/provider-profile-selection.js.map +7 -0
  187. package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js +678 -0
  188. package/dist/tests/meli/mercadolibre-tool-handlers-medium-batch4.test.js.map +7 -0
  189. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js +564 -0
  190. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch5.test.js.map +7 -0
  191. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js +387 -0
  192. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch6.test.js.map +7 -0
  193. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js +368 -0
  194. package/dist/tests/meli/mercadolibre-tool-handlers-monster-batch7.test.js.map +7 -0
  195. package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js +626 -0
  196. package/dist/tests/meli/mercadolibre-tool-handlers-small.test.js.map +7 -0
  197. package/dist/tests/meli/mercadolibre-tool-handlers-write-batch8.test.js +480 -0
  198. package/dist/tests/meli/mercadolibre-tool-handlers-write-batch8.test.js.map +7 -0
  199. package/dist/tests/setup.js +2 -0
  200. package/dist/tests/setup.js.map +7 -0
  201. package/dist/tests/smoke/test-harness.test.js +7 -0
  202. package/dist/tests/smoke/test-harness.test.js.map +7 -0
  203. package/dist/tests/vtex/read-only-utils.test.js +161 -0
  204. package/dist/tests/vtex/read-only-utils.test.js.map +7 -0
  205. package/dist/tests/vtex/vtex-catalog-admin-docs.test.js +24 -0
  206. package/dist/tests/vtex/vtex-catalog-admin-docs.test.js.map +7 -0
  207. package/dist/tests/vtex/vtex-catalog-admin-surface.test.js +30 -0
  208. package/dist/tests/vtex/vtex-catalog-admin-surface.test.js.map +7 -0
  209. package/dist/tests/vtex/vtex-catalog-write-tools.test.js +712 -0
  210. package/dist/tests/vtex/vtex-catalog-write-tools.test.js.map +7 -0
  211. package/dist/tests/vtex/vtex-catalog.service.test.js +51 -0
  212. package/dist/tests/vtex/vtex-catalog.service.test.js.map +7 -0
  213. package/dist/tests/vtex/vtex-inventory-tools.test.js +201 -0
  214. package/dist/tests/vtex/vtex-inventory-tools.test.js.map +7 -0
  215. package/dist/tests/vtex/vtex-logistics.service.test.js +134 -0
  216. package/dist/tests/vtex/vtex-logistics.service.test.js.map +7 -0
  217. package/dist/tests/vtex/vtex-order-details.tool.test.js +141 -0
  218. package/dist/tests/vtex/vtex-order-details.tool.test.js.map +7 -0
  219. package/dist/tests/vtex/vtex-order-write-tools.test.js +483 -0
  220. package/dist/tests/vtex/vtex-order-write-tools.test.js.map +7 -0
  221. package/dist/tests/vtex/vtex-orders-summary.tool.test.js +185 -0
  222. package/dist/tests/vtex/vtex-orders-summary.tool.test.js.map +7 -0
  223. package/dist/tests/vtex/vtex-orders.service.test.js +120 -0
  224. package/dist/tests/vtex/vtex-orders.service.test.js.map +7 -0
  225. package/dist/tests/vtex/vtex-pricing-write-tools.test.js +202 -0
  226. package/dist/tests/vtex/vtex-pricing-write-tools.test.js.map +7 -0
  227. package/dist/tests/vtex/vtex-pricing-write.service.test.js +106 -0
  228. package/dist/tests/vtex/vtex-pricing-write.service.test.js.map +7 -0
  229. package/dist/tests/vtex/vtex-pricing.service.test.js +88 -0
  230. package/dist/tests/vtex/vtex-pricing.service.test.js.map +7 -0
  231. package/dist/tests/vtex/vtex-small-tools.test.js +190 -0
  232. package/dist/tests/vtex/vtex-small-tools.test.js.map +7 -0
  233. package/dist/tests/vtex/vtex-write-simple-tools.test.js +647 -0
  234. package/dist/tests/vtex/vtex-write-simple-tools.test.js.map +7 -0
  235. package/dist/vitest.config.js +15 -0
  236. package/dist/vitest.config.js.map +7 -0
  237. package/package.json +6 -2
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../tests/vtex/vtex-pricing-write-tools.test.ts"],
4
+ "sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { z } from \"zod\";\n\nimport { getSkuPrice } from \"../../src/services/vtex/vtex-pricing.js\";\nimport {\n\tdeleteFixedPricesForPriceTable,\n\tupsertFixedPricesForPriceTable,\n} from \"../../src/services/vtex/vtex-pricing-write.js\";\nimport { deleteFixedPriceHandler } from \"../../src/tools/vtex/delete-fixed-price.js\";\nimport { upsertFixedPriceHandler } from \"../../src/tools/vtex/upsert-fixed-price.js\";\nimport {\n\tbuildWriteSuccessResponse,\n\thandleVtexWriteError,\n\tresolveVtexWriteProfile,\n} from \"../../src/tools/vtex/write-helpers.js\";\n\nvi.mock(\"../../src/tools/vtex/write-helpers.js\", () => ({\n\tvtexProfileIdSchemaField: z.string().optional(),\n\tconfirmationSchemaField: z.boolean().optional(),\n\tconfirmationNoteSchemaField: z.string().optional(),\n\tresolveVtexWriteProfile: vi.fn(),\n\tbuildWriteSuccessResponse: vi.fn((params: unknown) => ({\n\t\tkind: \"success\",\n\t\tparams,\n\t})),\n\thandleVtexWriteError: vi.fn((err: unknown, fallback: string) => ({\n\t\tkind: \"error\",\n\t\tfallback,\n\t\terr,\n\t})),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-pricing.js\", () => ({\n\tgetSkuPrice: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-pricing-write.js\", () => ({\n\tupsertFixedPricesForPriceTable: vi.fn(),\n\tdeleteFixedPricesForPriceTable: vi.fn(),\n}));\n\ndescribe(\"VTEX pricing write tools\", () => {\n\tbeforeEach(() => {\n\t\tvi.clearAllMocks();\n\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\tok: true,\n\t\t\tvalue: { profileId: \"profile-1\" },\n\t\t});\n\t});\n\n\tdescribe(\"upsertFixedPriceHandler\", () => {\n\t\tconst fixedPrices = [\n\t\t\t{\n\t\t\t\tvalue: 12999,\n\t\t\t\tlistPrice: 14999,\n\t\t\t\tminQuantity: 1,\n\t\t\t\tdateRange: {\n\t\t\t\t\tfrom: \"2026-06-01T00:00:00Z\",\n\t\t\t\t\tto: \"2026-06-30T23:59:59Z\",\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\n\t\tit(\"fetches before and after price snapshots around the upsert\", async () => {\n\t\t\tconst beforePrice = { itemId: \"sku-1\", fixedPrices: [] };\n\t\t\tconst afterPrice = { itemId: \"sku-1\", fixedPrices };\n\t\t\tvi.mocked(getSkuPrice)\n\t\t\t\t.mockResolvedValueOnce(beforePrice as never)\n\t\t\t\t.mockResolvedValueOnce(afterPrice as never);\n\n\t\t\tconst result = await upsertFixedPriceHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tskuId: \"sku-1\",\n\t\t\t\tpriceTableId: \"trade-1\",\n\t\t\t\tfixedPrices,\n\t\t\t});\n\n\t\t\texpect(getSkuPrice).toHaveBeenNthCalledWith(1, \"profile-1\", \"sku-1\");\n\t\t\texpect(upsertFixedPricesForPriceTable).toHaveBeenCalledWith(\n\t\t\t\t\"profile-1\",\n\t\t\t\t\"sku-1\",\n\t\t\t\t\"trade-1\",\n\t\t\t\tfixedPrices,\n\t\t\t);\n\t\t\texpect(getSkuPrice).toHaveBeenNthCalledWith(2, \"profile-1\", \"sku-1\");\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"upsert_fixed_price\",\n\t\t\t\tresourceId: \"sku-1\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"Fixed prices updated successfully for the selected price table.\",\n\t\t\t\tbefore: beforePrice,\n\t\t\t\tafter: afterPrice,\n\t\t\t\tdetails: {\n\t\t\t\t\tsku_id: \"sku-1\",\n\t\t\t\t\tprice_table_id: \"trade-1\",\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"success\",\n\t\t\t\tparams: expect.objectContaining({ operation: \"upsert_fixed_price\" }),\n\t\t\t});\n\t\t});\n\n\t\tit(\"returns profile selection payload when profile resolution fails\", async () => {\n\t\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\t\tok: false,\n\t\t\t\tresponse: { selection: true },\n\t\t\t} as never);\n\n\t\t\tconst result = await upsertFixedPriceHandler({\n\t\t\t\tskuId: \"sku-1\",\n\t\t\t\tpriceTableId: \"trade-1\",\n\t\t\t\tfixedPrices,\n\t\t\t});\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(getSkuPrice).not.toHaveBeenCalled();\n\t\t\texpect(upsertFixedPricesForPriceTable).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(getSkuPrice).mockResolvedValue({ itemId: \"sku-1\" } as never);\n\t\t\tvi.mocked(upsertFixedPricesForPriceTable).mockRejectedValue(\n\t\t\t\tnew Error(\"boom\"),\n\t\t\t);\n\n\t\t\tconst result = await upsertFixedPriceHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tskuId: \"sku-1\",\n\t\t\t\tpriceTableId: \"trade-1\",\n\t\t\t\tfixedPrices,\n\t\t\t});\n\n\t\t\texpect(handleVtexWriteError).toHaveBeenCalledWith(\n\t\t\t\texpect.any(Error),\n\t\t\t\t\"Failed to update fixed prices for SKU sku-1 on price table trade-1\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback:\n\t\t\t\t\t\"Failed to update fixed prices for SKU sku-1 on price table trade-1\",\n\t\t\t\terr: expect.any(Error),\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe(\"deleteFixedPriceHandler\", () => {\n\t\tit(\"fetches before and after price snapshots around the delete\", async () => {\n\t\t\tconst beforePrice = {\n\t\t\t\titemId: \"sku-2\",\n\t\t\t\tfixedPrices: [{ tradePolicyId: \"trade-2\", value: 9999 }],\n\t\t\t};\n\t\t\tconst afterPrice = { itemId: \"sku-2\", fixedPrices: [] };\n\t\t\tvi.mocked(getSkuPrice)\n\t\t\t\t.mockResolvedValueOnce(beforePrice as never)\n\t\t\t\t.mockResolvedValueOnce(afterPrice as never);\n\n\t\t\tconst result = await deleteFixedPriceHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tskuId: \"sku-2\",\n\t\t\t\tpriceTableId: \"trade-2\",\n\t\t\t});\n\n\t\t\texpect(getSkuPrice).toHaveBeenNthCalledWith(1, \"profile-1\", \"sku-2\");\n\t\t\texpect(deleteFixedPricesForPriceTable).toHaveBeenCalledWith(\n\t\t\t\t\"profile-1\",\n\t\t\t\t\"sku-2\",\n\t\t\t\t\"trade-2\",\n\t\t\t);\n\t\t\texpect(getSkuPrice).toHaveBeenNthCalledWith(2, \"profile-1\", \"sku-2\");\n\t\t\texpect(buildWriteSuccessResponse).toHaveBeenCalledWith({\n\t\t\t\tprofileId: \"profile-1\",\n\t\t\t\toperation: \"delete_fixed_price\",\n\t\t\t\tresourceId: \"sku-2\",\n\t\t\t\triskLevel: \"low\",\n\t\t\t\tmessage: \"Fixed prices deleted successfully for the selected price table.\",\n\t\t\t\tbefore: beforePrice,\n\t\t\t\tafter: afterPrice,\n\t\t\t\tdetails: {\n\t\t\t\t\tsku_id: \"sku-2\",\n\t\t\t\t\tprice_table_id: \"trade-2\",\n\t\t\t\t},\n\t\t\t});\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"success\",\n\t\t\t\tparams: expect.objectContaining({ operation: \"delete_fixed_price\" }),\n\t\t\t});\n\t\t});\n\n\t\tit(\"returns profile selection payload when profile resolution fails\", async () => {\n\t\t\tvi.mocked(resolveVtexWriteProfile).mockResolvedValue({\n\t\t\t\tok: false,\n\t\t\t\tresponse: { selection: true },\n\t\t\t} as never);\n\n\t\t\tconst result = await deleteFixedPriceHandler({\n\t\t\t\tskuId: \"sku-2\",\n\t\t\t\tpriceTableId: \"trade-2\",\n\t\t\t});\n\n\t\t\texpect(result).toEqual({ selection: true });\n\t\t\texpect(getSkuPrice).not.toHaveBeenCalled();\n\t\t\texpect(deleteFixedPricesForPriceTable).not.toHaveBeenCalled();\n\t\t});\n\n\t\tit(\"maps service errors through handleVtexWriteError\", async () => {\n\t\t\tvi.mocked(getSkuPrice).mockResolvedValue({ itemId: \"sku-2\" } as never);\n\t\t\tvi.mocked(deleteFixedPricesForPriceTable).mockRejectedValue(\n\t\t\t\tnew Error(\"boom\"),\n\t\t\t);\n\n\t\t\tconst result = await deleteFixedPriceHandler({\n\t\t\t\tprofileId: \"custom\",\n\t\t\t\tskuId: \"sku-2\",\n\t\t\t\tpriceTableId: \"trade-2\",\n\t\t\t});\n\n\t\t\texpect(handleVtexWriteError).toHaveBeenCalledWith(\n\t\t\t\texpect.any(Error),\n\t\t\t\t\"Failed to delete fixed prices for SKU sku-2 on price table trade-2\",\n\t\t\t);\n\t\t\texpect(result).toEqual({\n\t\t\t\tkind: \"error\",\n\t\t\t\tfallback:\n\t\t\t\t\t\"Failed to delete fixed prices for SKU sku-2 on price table trade-2\",\n\t\t\t\terr: expect.any(Error),\n\t\t\t});\n\t\t});\n\t});\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,106 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { getVtexApiClients } from "../../src/services/vtex/vtex-api.js";
3
+ import {
4
+ deleteFixedPricesForPriceTable,
5
+ deleteSkuPrice,
6
+ patchFixedPrices,
7
+ updateSkuPrice,
8
+ upsertFixedPricesForPriceTable
9
+ } from "../../src/services/vtex/vtex-pricing-write.js";
10
+ vi.mock("../../src/services/vtex/vtex-api.js", () => ({
11
+ getVtexApiClients: vi.fn()
12
+ }));
13
+ describe("vtex-pricing-write service", () => {
14
+ const pricingPut = vi.fn();
15
+ const pricingPatch = vi.fn();
16
+ const pricingPost = vi.fn();
17
+ const pricingDelete = vi.fn();
18
+ beforeEach(() => {
19
+ vi.clearAllMocks();
20
+ vi.mocked(getVtexApiClients).mockResolvedValue({
21
+ config: {
22
+ accountName: "test-account",
23
+ apiKey: "key",
24
+ apiToken: "token",
25
+ baseUrl: "https://example.vtex.com",
26
+ pricingBaseUrl: "https://pricing.example.vtex.com"
27
+ },
28
+ vtexApi: {
29
+ get: vi.fn()
30
+ },
31
+ vtexPricingApi: {
32
+ put: pricingPut,
33
+ patch: pricingPatch,
34
+ post: pricingPost,
35
+ delete: pricingDelete
36
+ }
37
+ });
38
+ });
39
+ it("updates a sku price through the pricing client", async () => {
40
+ const payload = {
41
+ basePrice: 100,
42
+ costPrice: 80,
43
+ markup: 25,
44
+ listPrice: 120
45
+ };
46
+ pricingPut.mockResolvedValue({ data: null });
47
+ await updateSkuPrice("profile-1", "sku-123", payload);
48
+ expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
49
+ expect(pricingPut).toHaveBeenCalledWith("/pricing/prices/sku-123", payload);
50
+ });
51
+ it("patches fixed prices through the pricing client", async () => {
52
+ const payload = [
53
+ {
54
+ minQuantity: 1,
55
+ value: 100,
56
+ listPrice: 120
57
+ }
58
+ ];
59
+ pricingPatch.mockResolvedValue({ data: null });
60
+ await patchFixedPrices("profile-1", "sku-123", payload);
61
+ expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
62
+ expect(pricingPatch).toHaveBeenCalledWith(
63
+ "/pricing/prices/sku-123/fixed",
64
+ payload
65
+ );
66
+ });
67
+ it("upserts fixed prices for a price table through the pricing client", async () => {
68
+ const payload = [
69
+ {
70
+ minQuantity: 1,
71
+ value: 100,
72
+ dateRange: {
73
+ from: "2026-06-01T00:00:00Z",
74
+ to: "2026-06-30T23:59:59Z"
75
+ }
76
+ }
77
+ ];
78
+ pricingPost.mockResolvedValue({ data: null });
79
+ await upsertFixedPricesForPriceTable(
80
+ "profile-1",
81
+ "sku-123",
82
+ "trade-1",
83
+ payload
84
+ );
85
+ expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
86
+ expect(pricingPost).toHaveBeenCalledWith(
87
+ "/pricing/prices/sku-123/fixed/trade-1",
88
+ payload
89
+ );
90
+ });
91
+ it("deletes fixed prices for a price table through the pricing client", async () => {
92
+ pricingDelete.mockResolvedValue({ data: null });
93
+ await deleteFixedPricesForPriceTable("profile-1", "sku-123", "trade-1");
94
+ expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
95
+ expect(pricingDelete).toHaveBeenCalledWith(
96
+ "/pricing/prices/sku-123/fixed/trade-1"
97
+ );
98
+ });
99
+ it("deletes a sku price through the pricing client", async () => {
100
+ pricingDelete.mockResolvedValue({ data: null });
101
+ await deleteSkuPrice("profile-1", "sku-123");
102
+ expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
103
+ expect(pricingDelete).toHaveBeenCalledWith("/pricing/prices/sku-123");
104
+ });
105
+ });
106
+ //# sourceMappingURL=vtex-pricing-write.service.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../tests/vtex/vtex-pricing-write.service.test.ts"],
4
+ "sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { getVtexApiClients } from \"../../src/services/vtex/vtex-api.js\";\nimport {\n\tdeleteFixedPricesForPriceTable,\n\tdeleteSkuPrice,\n\tpatchFixedPrices,\n\tupdateSkuPrice,\n\tupsertFixedPricesForPriceTable,\n} from \"../../src/services/vtex/vtex-pricing-write.js\";\n\nvi.mock(\"../../src/services/vtex/vtex-api.js\", () => ({\n\tgetVtexApiClients: vi.fn(),\n}));\n\ndescribe(\"vtex-pricing-write service\", () => {\n\tconst pricingPut = vi.fn();\n\tconst pricingPatch = vi.fn();\n\tconst pricingPost = vi.fn();\n\tconst pricingDelete = vi.fn();\n\n\tbeforeEach(() => {\n\t\tvi.clearAllMocks();\n\n\t\tvi.mocked(getVtexApiClients).mockResolvedValue({\n\t\t\tconfig: {\n\t\t\t\taccountName: \"test-account\",\n\t\t\t\tapiKey: \"key\",\n\t\t\t\tapiToken: \"token\",\n\t\t\t\tbaseUrl: \"https://example.vtex.com\",\n\t\t\t\tpricingBaseUrl: \"https://pricing.example.vtex.com\",\n\t\t\t},\n\t\t\tvtexApi: {\n\t\t\t\tget: vi.fn(),\n\t\t\t} as never,\n\t\t\tvtexPricingApi: {\n\t\t\t\tput: pricingPut,\n\t\t\t\tpatch: pricingPatch,\n\t\t\t\tpost: pricingPost,\n\t\t\t\tdelete: pricingDelete,\n\t\t\t} as never,\n\t\t});\n\t});\n\n\tit(\"updates a sku price through the pricing client\", async () => {\n\t\tconst payload = {\n\t\t\tbasePrice: 100,\n\t\t\tcostPrice: 80,\n\t\t\tmarkup: 25,\n\t\t\tlistPrice: 120,\n\t\t};\n\t\tpricingPut.mockResolvedValue({ data: null });\n\n\t\tawait updateSkuPrice(\"profile-1\", \"sku-123\", payload);\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingPut).toHaveBeenCalledWith(\"/pricing/prices/sku-123\", payload);\n\t});\n\n\tit(\"patches fixed prices through the pricing client\", async () => {\n\t\tconst payload = [\n\t\t\t{\n\t\t\t\tminQuantity: 1,\n\t\t\t\tvalue: 100,\n\t\t\t\tlistPrice: 120,\n\t\t\t},\n\t\t];\n\t\tpricingPatch.mockResolvedValue({ data: null });\n\n\t\tawait patchFixedPrices(\"profile-1\", \"sku-123\", payload);\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingPatch).toHaveBeenCalledWith(\n\t\t\t\"/pricing/prices/sku-123/fixed\",\n\t\t\tpayload,\n\t\t);\n\t});\n\n\tit(\"upserts fixed prices for a price table through the pricing client\", async () => {\n\t\tconst payload = [\n\t\t\t{\n\t\t\t\tminQuantity: 1,\n\t\t\t\tvalue: 100,\n\t\t\t\tdateRange: {\n\t\t\t\t\tfrom: \"2026-06-01T00:00:00Z\",\n\t\t\t\t\tto: \"2026-06-30T23:59:59Z\",\n\t\t\t\t},\n\t\t\t},\n\t\t];\n\t\tpricingPost.mockResolvedValue({ data: null });\n\n\t\tawait upsertFixedPricesForPriceTable(\n\t\t\t\"profile-1\",\n\t\t\t\"sku-123\",\n\t\t\t\"trade-1\",\n\t\t\tpayload,\n\t\t);\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingPost).toHaveBeenCalledWith(\n\t\t\t\"/pricing/prices/sku-123/fixed/trade-1\",\n\t\t\tpayload,\n\t\t);\n\t});\n\n\tit(\"deletes fixed prices for a price table through the pricing client\", async () => {\n\t\tpricingDelete.mockResolvedValue({ data: null });\n\n\t\tawait deleteFixedPricesForPriceTable(\"profile-1\", \"sku-123\", \"trade-1\");\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingDelete).toHaveBeenCalledWith(\n\t\t\t\"/pricing/prices/sku-123/fixed/trade-1\",\n\t\t);\n\t});\n\n\tit(\"deletes a sku price through the pricing client\", async () => {\n\t\tpricingDelete.mockResolvedValue({ data: null });\n\n\t\tawait deleteSkuPrice(\"profile-1\", \"sku-123\");\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingDelete).toHaveBeenCalledWith(\"/pricing/prices/sku-123\");\n\t});\n});\n"],
5
+ "mappings": "AAAA,SAAS,YAAY,UAAU,QAAQ,IAAI,UAAU;AAErD,SAAS,yBAAyB;AAClC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,GAAG,KAAK,uCAAuC,OAAO;AAAA,EACrD,mBAAmB,GAAG,GAAG;AAC1B,EAAE;AAEF,SAAS,8BAA8B,MAAM;AAC5C,QAAM,aAAa,GAAG,GAAG;AACzB,QAAM,eAAe,GAAG,GAAG;AAC3B,QAAM,cAAc,GAAG,GAAG;AAC1B,QAAM,gBAAgB,GAAG,GAAG;AAE5B,aAAW,MAAM;AAChB,OAAG,cAAc;AAEjB,OAAG,OAAO,iBAAiB,EAAE,kBAAkB;AAAA,MAC9C,QAAQ;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,gBAAgB;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,QACR,KAAK,GAAG,GAAG;AAAA,MACZ;AAAA,MACA,gBAAgB;AAAA,QACf,KAAK;AAAA,QACL,OAAO;AAAA,QACP,MAAM;AAAA,QACN,QAAQ;AAAA,MACT;AAAA,IACD,CAAC;AAAA,EACF,CAAC;AAED,KAAG,kDAAkD,YAAY;AAChE,UAAM,UAAU;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,WAAW;AAAA,IACZ;AACA,eAAW,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAE3C,UAAM,eAAe,aAAa,WAAW,OAAO;AAEpD,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,UAAU,EAAE,qBAAqB,2BAA2B,OAAO;AAAA,EAC3E,CAAC;AAED,KAAG,mDAAmD,YAAY;AACjE,UAAM,UAAU;AAAA,MACf;AAAA,QACC,aAAa;AAAA,QACb,OAAO;AAAA,QACP,WAAW;AAAA,MACZ;AAAA,IACD;AACA,iBAAa,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAE7C,UAAM,iBAAiB,aAAa,WAAW,OAAO;AAEtD,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,YAAY,EAAE;AAAA,MACpB;AAAA,MACA;AAAA,IACD;AAAA,EACD,CAAC;AAED,KAAG,qEAAqE,YAAY;AACnF,UAAM,UAAU;AAAA,MACf;AAAA,QACC,aAAa;AAAA,QACb,OAAO;AAAA,QACP,WAAW;AAAA,UACV,MAAM;AAAA,UACN,IAAI;AAAA,QACL;AAAA,MACD;AAAA,IACD;AACA,gBAAY,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAE5C,UAAM;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAEA,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,WAAW,EAAE;AAAA,MACnB;AAAA,MACA;AAAA,IACD;AAAA,EACD,CAAC;AAED,KAAG,qEAAqE,YAAY;AACnF,kBAAc,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAE9C,UAAM,+BAA+B,aAAa,WAAW,SAAS;AAEtE,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,aAAa,EAAE;AAAA,MACrB;AAAA,IACD;AAAA,EACD,CAAC;AAED,KAAG,kDAAkD,YAAY;AAChE,kBAAc,kBAAkB,EAAE,MAAM,KAAK,CAAC;AAE9C,UAAM,eAAe,aAAa,SAAS;AAE3C,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,aAAa,EAAE,qBAAqB,yBAAyB;AAAA,EACrE,CAAC;AACF,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,88 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import {
3
+ getComputedPrice,
4
+ getSkuPrice
5
+ } from "../../src/services/vtex/vtex-pricing.js";
6
+ import { getVtexApiClients } from "../../src/services/vtex/vtex-api.js";
7
+ vi.mock("../../src/services/vtex/vtex-api.js", () => ({
8
+ getVtexApiClients: vi.fn()
9
+ }));
10
+ describe("vtex-pricing service", () => {
11
+ const pricingGet = vi.fn();
12
+ beforeEach(() => {
13
+ vi.clearAllMocks();
14
+ vi.mocked(getVtexApiClients).mockResolvedValue({
15
+ config: {
16
+ accountName: "test-account",
17
+ apiKey: "key",
18
+ apiToken: "token",
19
+ baseUrl: "https://example.vtex.com",
20
+ pricingBaseUrl: "https://pricing.example.vtex.com"
21
+ },
22
+ vtexApi: {
23
+ get: vi.fn()
24
+ },
25
+ vtexPricingApi: {
26
+ get: pricingGet
27
+ }
28
+ });
29
+ });
30
+ it("fetches a SKU price through the pricing client and returns response data", async () => {
31
+ pricingGet.mockResolvedValue({
32
+ data: {
33
+ itemId: "sku-123",
34
+ listPrice: 15e3,
35
+ costPrice: 1e4,
36
+ markup: 1.5,
37
+ basePrice: 14e3,
38
+ fixedPrices: []
39
+ }
40
+ });
41
+ const result = await getSkuPrice("profile-1", "sku-123");
42
+ expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
43
+ expect(pricingGet).toHaveBeenCalledWith("/pricing/prices/sku-123");
44
+ expect(result).toEqual({
45
+ itemId: "sku-123",
46
+ listPrice: 15e3,
47
+ costPrice: 1e4,
48
+ markup: 1.5,
49
+ basePrice: 14e3,
50
+ fixedPrices: []
51
+ });
52
+ });
53
+ it("fetches computed pricing with the provided params", async () => {
54
+ pricingGet.mockResolvedValue({
55
+ data: {
56
+ tradePolicyId: "1",
57
+ listPrice: 16e3,
58
+ costPrice: 1e4,
59
+ sellingPrice: 15e3,
60
+ priceValidUntil: "2026-06-30T00:00:00Z"
61
+ }
62
+ });
63
+ const result = await getComputedPrice("profile-1", "sku-123", "default", {
64
+ categoryId: 10,
65
+ brandId: 20,
66
+ quantity: 3
67
+ });
68
+ expect(getVtexApiClients).toHaveBeenCalledWith("profile-1");
69
+ expect(pricingGet).toHaveBeenCalledWith(
70
+ "/pricing/prices/sku-123/computed/default",
71
+ {
72
+ params: {
73
+ categoryId: 10,
74
+ brandId: 20,
75
+ quantity: 3
76
+ }
77
+ }
78
+ );
79
+ expect(result).toEqual({
80
+ tradePolicyId: "1",
81
+ listPrice: 16e3,
82
+ costPrice: 1e4,
83
+ sellingPrice: 15e3,
84
+ priceValidUntil: "2026-06-30T00:00:00Z"
85
+ });
86
+ });
87
+ });
88
+ //# sourceMappingURL=vtex-pricing.service.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../tests/vtex/vtex-pricing.service.test.ts"],
4
+ "sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport {\n\tgetComputedPrice,\n\tgetSkuPrice,\n} from \"../../src/services/vtex/vtex-pricing.js\";\nimport { getVtexApiClients } from \"../../src/services/vtex/vtex-api.js\";\n\nvi.mock(\"../../src/services/vtex/vtex-api.js\", () => ({\n\tgetVtexApiClients: vi.fn(),\n}));\n\ndescribe(\"vtex-pricing service\", () => {\n\tconst pricingGet = vi.fn();\n\n\tbeforeEach(() => {\n\t\tvi.clearAllMocks();\n\n\t\tvi.mocked(getVtexApiClients).mockResolvedValue({\n\t\t\tconfig: {\n\t\t\t\taccountName: \"test-account\",\n\t\t\t\tapiKey: \"key\",\n\t\t\t\tapiToken: \"token\",\n\t\t\t\tbaseUrl: \"https://example.vtex.com\",\n\t\t\t\tpricingBaseUrl: \"https://pricing.example.vtex.com\",\n\t\t\t},\n\t\t\tvtexApi: {\n\t\t\t\tget: vi.fn(),\n\t\t\t} as never,\n\t\t\tvtexPricingApi: {\n\t\t\t\tget: pricingGet,\n\t\t\t} as never,\n\t\t});\n\t});\n\n\tit(\"fetches a SKU price through the pricing client and returns response data\", async () => {\n\t\tpricingGet.mockResolvedValue({\n\t\t\tdata: {\n\t\t\t\titemId: \"sku-123\",\n\t\t\t\tlistPrice: 15000,\n\t\t\t\tcostPrice: 10000,\n\t\t\t\tmarkup: 1.5,\n\t\t\t\tbasePrice: 14000,\n\t\t\t\tfixedPrices: [],\n\t\t\t},\n\t\t});\n\n\t\tconst result = await getSkuPrice(\"profile-1\", \"sku-123\");\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingGet).toHaveBeenCalledWith(\"/pricing/prices/sku-123\");\n\t\texpect(result).toEqual({\n\t\t\titemId: \"sku-123\",\n\t\t\tlistPrice: 15000,\n\t\t\tcostPrice: 10000,\n\t\t\tmarkup: 1.5,\n\t\t\tbasePrice: 14000,\n\t\t\tfixedPrices: [],\n\t\t});\n\t});\n\n\tit(\"fetches computed pricing with the provided params\", async () => {\n\t\tpricingGet.mockResolvedValue({\n\t\t\tdata: {\n\t\t\t\ttradePolicyId: \"1\",\n\t\t\t\tlistPrice: 16000,\n\t\t\t\tcostPrice: 10000,\n\t\t\t\tsellingPrice: 15000,\n\t\t\t\tpriceValidUntil: \"2026-06-30T00:00:00Z\",\n\t\t\t},\n\t\t});\n\n\t\tconst result = await getComputedPrice(\"profile-1\", \"sku-123\", \"default\", {\n\t\t\tcategoryId: 10,\n\t\t\tbrandId: 20,\n\t\t\tquantity: 3,\n\t\t});\n\n\t\texpect(getVtexApiClients).toHaveBeenCalledWith(\"profile-1\");\n\t\texpect(pricingGet).toHaveBeenCalledWith(\n\t\t\t\"/pricing/prices/sku-123/computed/default\",\n\t\t\t{\n\t\t\t\tparams: {\n\t\t\t\t\tcategoryId: 10,\n\t\t\t\t\tbrandId: 20,\n\t\t\t\t\tquantity: 3,\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t\texpect(result).toEqual({\n\t\t\ttradePolicyId: \"1\",\n\t\t\tlistPrice: 16000,\n\t\t\tcostPrice: 10000,\n\t\t\tsellingPrice: 15000,\n\t\t\tpriceValidUntil: \"2026-06-30T00:00:00Z\",\n\t\t});\n\t});\n});\n"],
5
+ "mappings": "AAAA,SAAS,YAAY,UAAU,QAAQ,IAAI,UAAU;AAErD;AAAA,EACC;AAAA,EACA;AAAA,OACM;AACP,SAAS,yBAAyB;AAElC,GAAG,KAAK,uCAAuC,OAAO;AAAA,EACrD,mBAAmB,GAAG,GAAG;AAC1B,EAAE;AAEF,SAAS,wBAAwB,MAAM;AACtC,QAAM,aAAa,GAAG,GAAG;AAEzB,aAAW,MAAM;AAChB,OAAG,cAAc;AAEjB,OAAG,OAAO,iBAAiB,EAAE,kBAAkB;AAAA,MAC9C,QAAQ;AAAA,QACP,aAAa;AAAA,QACb,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,SAAS;AAAA,QACT,gBAAgB;AAAA,MACjB;AAAA,MACA,SAAS;AAAA,QACR,KAAK,GAAG,GAAG;AAAA,MACZ;AAAA,MACA,gBAAgB;AAAA,QACf,KAAK;AAAA,MACN;AAAA,IACD,CAAC;AAAA,EACF,CAAC;AAED,KAAG,4EAA4E,YAAY;AAC1F,eAAW,kBAAkB;AAAA,MAC5B,MAAM;AAAA,QACL,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,aAAa,CAAC;AAAA,MACf;AAAA,IACD,CAAC;AAED,UAAM,SAAS,MAAM,YAAY,aAAa,SAAS;AAEvD,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,UAAU,EAAE,qBAAqB,yBAAyB;AACjE,WAAO,MAAM,EAAE,QAAQ;AAAA,MACtB,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW;AAAA,MACX,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,aAAa,CAAC;AAAA,IACf,CAAC;AAAA,EACF,CAAC;AAED,KAAG,qDAAqD,YAAY;AACnE,eAAW,kBAAkB;AAAA,MAC5B,MAAM;AAAA,QACL,eAAe;AAAA,QACf,WAAW;AAAA,QACX,WAAW;AAAA,QACX,cAAc;AAAA,QACd,iBAAiB;AAAA,MAClB;AAAA,IACD,CAAC;AAED,UAAM,SAAS,MAAM,iBAAiB,aAAa,WAAW,WAAW;AAAA,MACxE,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,UAAU;AAAA,IACX,CAAC;AAED,WAAO,iBAAiB,EAAE,qBAAqB,WAAW;AAC1D,WAAO,UAAU,EAAE;AAAA,MAClB;AAAA,MACA;AAAA,QACC,QAAQ;AAAA,UACP,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,UAAU;AAAA,QACX;AAAA,MACD;AAAA,IACD;AACA,WAAO,MAAM,EAAE,QAAQ;AAAA,MACtB,eAAe;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX,cAAc;AAAA,MACd,iBAAiB;AAAA,IAClB,CAAC;AAAA,EACF,CAAC;AACF,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,190 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { computedPriceHandler } from "../../src/tools/vtex/computed-price.js";
3
+ import { productOffersHandler } from "../../src/tools/vtex/product-offers.js";
4
+ import { resolveVtexProfileOrSelection } from "../../src/tools/vtex/profile-resolution.js";
5
+ import { skuOffersHandler } from "../../src/tools/vtex/sku-offers.js";
6
+ import { skuPriceHandler } from "../../src/tools/vtex/sku-price.js";
7
+ import {
8
+ getProductOffers,
9
+ getSkuOffers
10
+ } from "../../src/services/vtex/vtex-catalog.js";
11
+ import { formatVtexError } from "../../src/services/vtex/vtex-api.js";
12
+ import {
13
+ getComputedPrice,
14
+ getSkuPrice
15
+ } from "../../src/services/vtex/vtex-pricing.js";
16
+ vi.mock("mcp-use/server", () => ({
17
+ object: vi.fn((payload) => ({ kind: "object", payload })),
18
+ error: vi.fn((message) => ({ kind: "error", message }))
19
+ }));
20
+ vi.mock("../../src/tools/vtex/profile-resolution.js", () => ({
21
+ resolveVtexProfileOrSelection: vi.fn()
22
+ }));
23
+ vi.mock("../../src/services/vtex/vtex-pricing.js", () => ({
24
+ getSkuPrice: vi.fn(),
25
+ getComputedPrice: vi.fn()
26
+ }));
27
+ vi.mock("../../src/services/vtex/vtex-catalog.js", () => ({
28
+ getProductOffers: vi.fn(),
29
+ getSkuOffers: vi.fn()
30
+ }));
31
+ vi.mock("../../src/services/vtex/vtex-api.js", () => ({
32
+ formatVtexError: vi.fn(
33
+ (err, fallback) => `formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`
34
+ )
35
+ }));
36
+ describe("small VTEX read-only tools", () => {
37
+ beforeEach(() => {
38
+ vi.clearAllMocks();
39
+ vi.mocked(resolveVtexProfileOrSelection).mockResolvedValue({
40
+ ok: true,
41
+ value: { profileId: "profile-1" }
42
+ });
43
+ });
44
+ it("formats sku price output", async () => {
45
+ vi.mocked(getSkuPrice).mockResolvedValue({
46
+ itemId: "sku-123",
47
+ listPrice: 15e3,
48
+ costPrice: 1e4,
49
+ markup: 1.5,
50
+ basePrice: 14e3,
51
+ fixedPrices: [
52
+ {
53
+ minQuantity: 2,
54
+ tradePolicyId: "1",
55
+ dateRange: { from: "2026-06-01", to: "2026-06-30" },
56
+ value: 12e3,
57
+ listPrice: 16e3
58
+ }
59
+ ]
60
+ });
61
+ const result = await skuPriceHandler({
62
+ profileId: "custom",
63
+ itemId: "sku-123"
64
+ });
65
+ expect(resolveVtexProfileOrSelection).toHaveBeenCalledWith("custom");
66
+ expect(getSkuPrice).toHaveBeenCalledWith("profile-1", "sku-123");
67
+ expect(result).toEqual({
68
+ kind: "object",
69
+ payload: {
70
+ profile_id: "profile-1",
71
+ item_id: "sku-123",
72
+ list_price: 150,
73
+ cost_price: 100,
74
+ base_price: 140,
75
+ markup: 1.5,
76
+ fixed_prices: [
77
+ {
78
+ min_quantity: 2,
79
+ trade_policy_id: "1",
80
+ date_range: { from: "2026-06-01", to: "2026-06-30" },
81
+ value: 120,
82
+ list_price: 160
83
+ }
84
+ ]
85
+ }
86
+ });
87
+ });
88
+ it("formats computed price output", async () => {
89
+ vi.mocked(getComputedPrice).mockResolvedValue({
90
+ tradePolicyId: "1",
91
+ listPrice: 16e3,
92
+ costPrice: 1e4,
93
+ sellingPrice: 15e3,
94
+ priceValidUntil: "2026-06-30T00:00:00Z"
95
+ });
96
+ const result = await computedPriceHandler({
97
+ profileId: "custom",
98
+ itemId: "sku-123",
99
+ priceTableId: "default",
100
+ categoryId: 10,
101
+ brandId: 20,
102
+ quantity: 3
103
+ });
104
+ expect(getComputedPrice).toHaveBeenCalledWith(
105
+ "profile-1",
106
+ "sku-123",
107
+ "default",
108
+ {
109
+ categoryId: 10,
110
+ brandId: 20,
111
+ quantity: 3
112
+ }
113
+ );
114
+ expect(result).toEqual({
115
+ kind: "object",
116
+ payload: {
117
+ profile_id: "profile-1",
118
+ item_id: "sku-123",
119
+ price_table_id: "default",
120
+ trade_policy_id: "1",
121
+ list_price: 160,
122
+ cost_price: 100,
123
+ selling_price: 150,
124
+ price_valid_until: "2026-06-30T00:00:00Z"
125
+ }
126
+ });
127
+ });
128
+ it("formats product offers output with snake_case keys", async () => {
129
+ vi.mocked(getProductOffers).mockResolvedValue([
130
+ { sellerId: "1", availableQuantity: 4, listPrice: 15e3 }
131
+ ]);
132
+ const result = await productOffersHandler({
133
+ profileId: "custom",
134
+ productId: "prod-1"
135
+ });
136
+ expect(getProductOffers).toHaveBeenCalledWith("profile-1", "prod-1");
137
+ expect(result).toEqual({
138
+ kind: "object",
139
+ payload: {
140
+ profile_id: "profile-1",
141
+ product_id: "prod-1",
142
+ offers: [{ seller_id: "1", available_quantity: 4, list_price: 15e3 }]
143
+ }
144
+ });
145
+ });
146
+ it("formats sku offers output with snake_case keys", async () => {
147
+ vi.mocked(getSkuOffers).mockResolvedValue([
148
+ { sellerId: "1", availableQuantity: 2, tradePolicyId: "3" }
149
+ ]);
150
+ const result = await skuOffersHandler({
151
+ profileId: "custom",
152
+ productId: "prod-1",
153
+ skuId: "sku-9"
154
+ });
155
+ expect(getSkuOffers).toHaveBeenCalledWith("profile-1", "prod-1", "sku-9");
156
+ expect(result).toEqual({
157
+ kind: "object",
158
+ payload: {
159
+ profile_id: "profile-1",
160
+ product_id: "prod-1",
161
+ sku_id: "sku-9",
162
+ offers: [
163
+ { seller_id: "1", available_quantity: 2, trade_policy_id: "3" }
164
+ ]
165
+ }
166
+ });
167
+ });
168
+ it("returns profile selection payload unchanged when resolution fails", async () => {
169
+ vi.mocked(resolveVtexProfileOrSelection).mockResolvedValue({
170
+ ok: false,
171
+ response: { selection: true }
172
+ });
173
+ const result = await skuPriceHandler({ itemId: "sku-123" });
174
+ expect(result).toEqual({ selection: true });
175
+ expect(getSkuPrice).not.toHaveBeenCalled();
176
+ });
177
+ it("formats service failures through formatVtexError", async () => {
178
+ vi.mocked(getSkuPrice).mockRejectedValue(new Error("boom"));
179
+ const result = await skuPriceHandler({
180
+ profileId: "custom",
181
+ itemId: "sku-123"
182
+ });
183
+ expect(formatVtexError).toHaveBeenCalled();
184
+ expect(result).toEqual({
185
+ kind: "error",
186
+ message: "formatted:Failed to fetch SKU price for item sku-123:boom"
187
+ });
188
+ });
189
+ });
190
+ //# sourceMappingURL=vtex-small-tools.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../tests/vtex/vtex-small-tools.test.ts"],
4
+ "sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { computedPriceHandler } from \"../../src/tools/vtex/computed-price.js\";\nimport { productOffersHandler } from \"../../src/tools/vtex/product-offers.js\";\nimport { resolveVtexProfileOrSelection } from \"../../src/tools/vtex/profile-resolution.js\";\nimport { skuOffersHandler } from \"../../src/tools/vtex/sku-offers.js\";\nimport { skuPriceHandler } from \"../../src/tools/vtex/sku-price.js\";\nimport {\n\tgetProductOffers,\n\tgetSkuOffers,\n} from \"../../src/services/vtex/vtex-catalog.js\";\nimport { formatVtexError } from \"../../src/services/vtex/vtex-api.js\";\nimport {\n\tgetComputedPrice,\n\tgetSkuPrice,\n} from \"../../src/services/vtex/vtex-pricing.js\";\n\nvi.mock(\"mcp-use/server\", () => ({\n\tobject: vi.fn((payload: unknown) => ({ kind: \"object\", payload })),\n\terror: vi.fn((message: string) => ({ kind: \"error\", message })),\n}));\n\nvi.mock(\"../../src/tools/vtex/profile-resolution.js\", () => ({\n\tresolveVtexProfileOrSelection: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-pricing.js\", () => ({\n\tgetSkuPrice: vi.fn(),\n\tgetComputedPrice: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-catalog.js\", () => ({\n\tgetProductOffers: vi.fn(),\n\tgetSkuOffers: vi.fn(),\n}));\n\nvi.mock(\"../../src/services/vtex/vtex-api.js\", () => ({\n\tformatVtexError: vi.fn(\n\t\t(err: unknown, fallback: string) =>\n\t\t\t`formatted:${fallback}:${err instanceof Error ? err.message : String(err)}`,\n\t),\n}));\n\ndescribe(\"small VTEX read-only tools\", () => {\n\tbeforeEach(() => {\n\t\tvi.clearAllMocks();\n\t\tvi.mocked(resolveVtexProfileOrSelection).mockResolvedValue({\n\t\t\tok: true,\n\t\t\tvalue: { profileId: \"profile-1\" },\n\t\t});\n\t});\n\n\tit(\"formats sku price output\", async () => {\n\t\tvi.mocked(getSkuPrice).mockResolvedValue({\n\t\t\titemId: \"sku-123\",\n\t\t\tlistPrice: 15000,\n\t\t\tcostPrice: 10000,\n\t\t\tmarkup: 1.5,\n\t\t\tbasePrice: 14000,\n\t\t\tfixedPrices: [\n\t\t\t\t{\n\t\t\t\t\tminQuantity: 2,\n\t\t\t\t\ttradePolicyId: \"1\",\n\t\t\t\t\tdateRange: { from: \"2026-06-01\", to: \"2026-06-30\" },\n\t\t\t\t\tvalue: 12000,\n\t\t\t\t\tlistPrice: 16000,\n\t\t\t\t},\n\t\t\t],\n\t\t});\n\n\t\tconst result = await skuPriceHandler({\n\t\t\tprofileId: \"custom\",\n\t\t\titemId: \"sku-123\",\n\t\t});\n\n\t\texpect(resolveVtexProfileOrSelection).toHaveBeenCalledWith(\"custom\");\n\t\texpect(getSkuPrice).toHaveBeenCalledWith(\"profile-1\", \"sku-123\");\n\t\texpect(result).toEqual({\n\t\t\tkind: \"object\",\n\t\t\tpayload: {\n\t\t\t\tprofile_id: \"profile-1\",\n\t\t\t\titem_id: \"sku-123\",\n\t\t\t\tlist_price: 150,\n\t\t\t\tcost_price: 100,\n\t\t\t\tbase_price: 140,\n\t\t\t\tmarkup: 1.5,\n\t\t\t\tfixed_prices: [\n\t\t\t\t\t{\n\t\t\t\t\t\tmin_quantity: 2,\n\t\t\t\t\t\ttrade_policy_id: \"1\",\n\t\t\t\t\t\tdate_range: { from: \"2026-06-01\", to: \"2026-06-30\" },\n\t\t\t\t\t\tvalue: 120,\n\t\t\t\t\t\tlist_price: 160,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"formats computed price output\", async () => {\n\t\tvi.mocked(getComputedPrice).mockResolvedValue({\n\t\t\ttradePolicyId: \"1\",\n\t\t\tlistPrice: 16000,\n\t\t\tcostPrice: 10000,\n\t\t\tsellingPrice: 15000,\n\t\t\tpriceValidUntil: \"2026-06-30T00:00:00Z\",\n\t\t});\n\n\t\tconst result = await computedPriceHandler({\n\t\t\tprofileId: \"custom\",\n\t\t\titemId: \"sku-123\",\n\t\t\tpriceTableId: \"default\",\n\t\t\tcategoryId: 10,\n\t\t\tbrandId: 20,\n\t\t\tquantity: 3,\n\t\t});\n\n\t\texpect(getComputedPrice).toHaveBeenCalledWith(\n\t\t\t\"profile-1\",\n\t\t\t\"sku-123\",\n\t\t\t\"default\",\n\t\t\t{\n\t\t\t\tcategoryId: 10,\n\t\t\t\tbrandId: 20,\n\t\t\t\tquantity: 3,\n\t\t\t},\n\t\t);\n\t\texpect(result).toEqual({\n\t\t\tkind: \"object\",\n\t\t\tpayload: {\n\t\t\t\tprofile_id: \"profile-1\",\n\t\t\t\titem_id: \"sku-123\",\n\t\t\t\tprice_table_id: \"default\",\n\t\t\t\ttrade_policy_id: \"1\",\n\t\t\t\tlist_price: 160,\n\t\t\t\tcost_price: 100,\n\t\t\t\tselling_price: 150,\n\t\t\t\tprice_valid_until: \"2026-06-30T00:00:00Z\",\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"formats product offers output with snake_case keys\", async () => {\n\t\tvi.mocked(getProductOffers).mockResolvedValue([\n\t\t\t{ sellerId: \"1\", availableQuantity: 4, listPrice: 15000 },\n\t\t]);\n\n\t\tconst result = await productOffersHandler({\n\t\t\tprofileId: \"custom\",\n\t\t\tproductId: \"prod-1\",\n\t\t});\n\n\t\texpect(getProductOffers).toHaveBeenCalledWith(\"profile-1\", \"prod-1\");\n\t\texpect(result).toEqual({\n\t\t\tkind: \"object\",\n\t\t\tpayload: {\n\t\t\t\tprofile_id: \"profile-1\",\n\t\t\t\tproduct_id: \"prod-1\",\n\t\t\t\toffers: [{ seller_id: \"1\", available_quantity: 4, list_price: 15000 }],\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"formats sku offers output with snake_case keys\", async () => {\n\t\tvi.mocked(getSkuOffers).mockResolvedValue([\n\t\t\t{ sellerId: \"1\", availableQuantity: 2, tradePolicyId: \"3\" },\n\t\t]);\n\n\t\tconst result = await skuOffersHandler({\n\t\t\tprofileId: \"custom\",\n\t\t\tproductId: \"prod-1\",\n\t\t\tskuId: \"sku-9\",\n\t\t});\n\n\t\texpect(getSkuOffers).toHaveBeenCalledWith(\"profile-1\", \"prod-1\", \"sku-9\");\n\t\texpect(result).toEqual({\n\t\t\tkind: \"object\",\n\t\t\tpayload: {\n\t\t\t\tprofile_id: \"profile-1\",\n\t\t\t\tproduct_id: \"prod-1\",\n\t\t\t\tsku_id: \"sku-9\",\n\t\t\t\toffers: [\n\t\t\t\t\t{ seller_id: \"1\", available_quantity: 2, trade_policy_id: \"3\" },\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\t});\n\n\tit(\"returns profile selection payload unchanged when resolution fails\", async () => {\n\t\tvi.mocked(resolveVtexProfileOrSelection).mockResolvedValue({\n\t\t\tok: false,\n\t\t\tresponse: { selection: true },\n\t\t} as never);\n\n\t\tconst result = await skuPriceHandler({ itemId: \"sku-123\" });\n\n\t\texpect(result).toEqual({ selection: true });\n\t\texpect(getSkuPrice).not.toHaveBeenCalled();\n\t});\n\n\tit(\"formats service failures through formatVtexError\", async () => {\n\t\tvi.mocked(getSkuPrice).mockRejectedValue(new Error(\"boom\"));\n\n\t\tconst result = await skuPriceHandler({\n\t\t\tprofileId: \"custom\",\n\t\t\titemId: \"sku-123\",\n\t\t});\n\n\t\texpect(formatVtexError).toHaveBeenCalled();\n\t\texpect(result).toEqual({\n\t\t\tkind: \"error\",\n\t\t\tmessage: \"formatted:Failed to fetch SKU price for item sku-123:boom\",\n\t\t});\n\t});\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }