@yoryoboy/bi-mcp 1.14.0 → 1.14.3

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 (35) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/index.js +3 -3
  3. package/dist/index.js.map +1 -1
  4. package/dist/mcp-use.json +2 -2
  5. package/dist/src/services/vtex/__tests__/vtex-catalog.test.js +2 -5
  6. package/dist/src/services/vtex/__tests__/vtex-catalog.test.js.map +2 -2
  7. package/dist/src/services/vtex/__tests__/vtex-payments.test.js +12 -9
  8. package/dist/src/services/vtex/__tests__/vtex-payments.test.js.map +2 -2
  9. package/dist/src/services/vtex/vtex-catalog.js +1 -1
  10. package/dist/src/services/vtex/vtex-catalog.js.map +2 -2
  11. package/dist/src/services/vtex/vtex-payments.js +11 -5
  12. package/dist/src/services/vtex/vtex-payments.js.map +2 -2
  13. package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js +21 -2
  14. package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.js.map +2 -2
  15. package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js +4 -173
  16. package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js.map +2 -2
  17. package/dist/src/tools/vtex/__tests__/payment-rules.test.js +1 -0
  18. package/dist/src/tools/vtex/__tests__/payment-rules.test.js.map +2 -2
  19. package/dist/src/tools/vtex/catalog-admin-products-skus.js +1 -1
  20. package/dist/src/tools/vtex/catalog-admin-products-skus.js.map +1 -1
  21. package/dist/src/tools/vtex/catalog-navigation-reads.js +1 -1
  22. package/dist/src/tools/vtex/catalog-navigation-reads.js.map +2 -2
  23. package/dist/src/tools/vtex/commercial-conditions.js +35 -150
  24. package/dist/src/tools/vtex/commercial-conditions.js.map +2 -2
  25. package/dist/src/tools/vtex/create-sku.js +1 -1
  26. package/dist/src/tools/vtex/create-sku.js.map +1 -1
  27. package/dist/src/tools/vtex/payment-rules.js +81 -38
  28. package/dist/src/tools/vtex/payment-rules.js.map +2 -2
  29. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +12 -4
  30. package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +2 -2
  31. package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js +121 -12
  32. package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js.map +2 -2
  33. package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js +15 -23
  34. package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js.map +2 -2
  35. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/services/vtex/vtex-catalog.ts"],
4
- "sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport type ProductOffersResponse = Record<string, unknown>[];\nexport type VtexCatalogRecord = Record<string, unknown>;\n\nexport interface VtexCatalogListResponse<TRecord extends VtexCatalogRecord = VtexCatalogRecord> {\n items: TRecord[];\n total: number;\n}\n\nexport interface VtexProductIdListResponse {\n productIds: Array<string | number>;\n total: number;\n}\n\nfunction readTotalFromHeaders(headers: unknown, fallback: number): number {\n if (!headers || typeof headers !== \"object\") {\n return fallback;\n }\n\n const record = headers as Record<string, unknown>;\n const rawRange = record.resources ?? record[\"content-range\"] ?? record[\"Content-Range\"];\n const range = Array.isArray(rawRange) ? rawRange[0] : rawRange;\n\n if (typeof range !== \"string\") {\n return fallback;\n }\n\n const match = range.match(/\\/(\\d+)$/);\n if (!match) {\n return fallback;\n }\n\n const total = Number(match[1]);\n return Number.isFinite(total) ? total : fallback;\n}\n\nfunction toRecordArray(data: unknown): VtexCatalogRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.filter((item): item is VtexCatalogRecord => item !== null && typeof item === \"object\");\n}\n\nfunction toProductIds(data: unknown): Array<string | number> {\n if (Array.isArray(data)) {\n return data.filter((item): item is string | number => typeof item === \"string\" || typeof item === \"number\");\n }\n\n if (data && typeof data === \"object\") {\n return Object.keys(data);\n }\n\n return [];\n}\n\nfunction readTotal(data: unknown, fallback: number): number {\n if (!data || typeof data !== \"object\") {\n return fallback;\n }\n\n const record = data as Record<string, unknown>;\n const range = record.range;\n if (range && typeof range === \"object\") {\n const total = (range as Record<string, unknown>).total;\n if (typeof total === \"number\") {\n return total;\n }\n }\n\n if (typeof record.total === \"number\") {\n return record.total;\n }\n\n return fallback;\n}\n\nexport async function getCategoryTree(\n profileId: string,\n depth = 5\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(`/api/catalog_system/pub/category/tree/${depth}`);\n\n return toRecordArray(response.data);\n}\n\nexport async function listCategories(\n profileId: string,\n page: number,\n pageSize: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/category/list\", {\n params: { page, pageSize },\n });\n const items = toRecordArray(response.data);\n\n return { items, total: readTotal(response.data, items.length) };\n}\n\nexport async function listBrands(\n profileId: string,\n page: number,\n pageSize: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/brand/list\", {\n params: { page, pageSize },\n });\n const items = toRecordArray(response.data);\n\n return { items, total: readTotal(response.data, items.length) };\n}\n\nexport async function listSpecificationGroupsByCategory(\n profileId: string,\n categoryId: string\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\n `/api/catalog_system/pvt/specification/groupbycategory/${categoryId}`\n );\n\n return toRecordArray(response.data);\n}\n\nexport async function listProducts(\n profileId: string,\n from: number,\n to: number,\n keyword?: string\n): Promise<VtexProductIdListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/products/GetProductAndSkuIds\", {\n params: {\n _from: from,\n _to: to,\n keyword,\n },\n });\n const data = response.data && typeof response.data === \"object\" && \"data\" in response.data\n ? (response.data as Record<string, unknown>).data\n : response.data;\n const productIds = toProductIds(data);\n\n return { productIds, total: readTotal(response.data, productIds.length) };\n}\n\nexport async function listProductsByCategory(\n profileId: string,\n categoryId: string,\n from: number,\n to: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pub/products/search\", {\n params: {\n category: categoryId,\n _from: from,\n _to: to,\n },\n });\n const items = toRecordArray(response.data);\n const totalFromHeaders = readTotalFromHeaders(response.headers, items.length);\n\n return { items, total: readTotal(response.data, totalFromHeaders) };\n}\n\nexport async function listSkusByProduct(\n profileId: string,\n productId: string\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\n `/api/catalog_system/pvt/sku/stockkeepingunitByProductId/${productId}`\n );\n\n return toRecordArray(response.data);\n}\n\nexport async function getProductOffers(\n profileId: string,\n productId: string\n): Promise<ProductOffersResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}`\n );\n\n return response.data;\n}\n\nexport async function getSkuOffers(\n profileId: string,\n productId: string,\n skuId: string\n): Promise<ProductOffersResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}/sku/${skuId}`\n );\n\n return response.data;\n}\n"],
5
- "mappings": "AAAA,SAAS,yBAAyB;AAelC,SAAS,qBAAqB,SAAkB,UAA0B;AACxE,MAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AACf,QAAM,WAAW,OAAO,aAAa,OAAO,eAAe,KAAK,OAAO,eAAe;AACtF,QAAM,QAAQ,MAAM,QAAQ,QAAQ,IAAI,SAAS,CAAC,IAAI;AAEtD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,MAAM,UAAU;AACpC,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,OAAO,MAAM,CAAC,CAAC;AAC7B,SAAO,OAAO,SAAS,KAAK,IAAI,QAAQ;AAC1C;AAEA,SAAS,cAAc,MAAoC;AACzD,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,KAAK,OAAO,CAAC,SAAoC,SAAS,QAAQ,OAAO,SAAS,QAAQ;AACnG;AAEA,SAAS,aAAa,MAAuC;AAC3D,MAAI,MAAM,QAAQ,IAAI,GAAG;AACvB,WAAO,KAAK,OAAO,CAAC,SAAkC,OAAO,SAAS,YAAY,OAAO,SAAS,QAAQ;AAAA,EAC5G;AAEA,MAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,WAAO,OAAO,KAAK,IAAI;AAAA,EACzB;AAEA,SAAO,CAAC;AACV;AAEA,SAAS,UAAU,MAAe,UAA0B;AAC1D,MAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS;AACf,QAAM,QAAQ,OAAO;AACrB,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,QAAS,MAAkC;AACjD,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,OAAO,OAAO,UAAU,UAAU;AACpC,WAAO,OAAO;AAAA,EAChB;AAEA,SAAO;AACT;AAEA,eAAsB,gBACpB,WACA,QAAQ,GACsB;AAC9B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,yCAAyC,KAAK,EAAE;AAE5F,SAAO,cAAc,SAAS,IAAI;AACpC;AAEA,eAAsB,eACpB,WACA,MACA,UACkC;AAClC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,yCAAyC;AAAA,IACnF,QAAQ,EAAE,MAAM,SAAS;AAAA,EAC3B,CAAC;AACD,QAAM,QAAQ,cAAc,SAAS,IAAI;AAEzC,SAAO,EAAE,OAAO,OAAO,UAAU,SAAS,MAAM,MAAM,MAAM,EAAE;AAChE;AAEA,eAAsB,WACpB,WACA,MACA,UACkC;AAClC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,sCAAsC;AAAA,IAChF,QAAQ,EAAE,MAAM,SAAS;AAAA,EAC3B,CAAC;AACD,QAAM,QAAQ,cAAc,SAAS,IAAI;AAEzC,SAAO,EAAE,OAAO,OAAO,UAAU,SAAS,MAAM,MAAM,MAAM,EAAE;AAChE;AAEA,eAAsB,kCACpB,WACA,YAC8B;AAC9B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,yDAAyD,UAAU;AAAA,EACrE;AAEA,SAAO,cAAc,SAAS,IAAI;AACpC;AAEA,eAAsB,aACpB,WACA,MACA,IACA,SACoC;AACpC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,wDAAwD;AAAA,IAClG,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,OAAO,SAAS,QAAQ,OAAO,SAAS,SAAS,YAAY,UAAU,SAAS,OACjF,SAAS,KAAiC,OAC3C,SAAS;AACb,QAAM,aAAa,aAAa,IAAI;AAEpC,SAAO,EAAE,YAAY,OAAO,UAAU,SAAS,MAAM,WAAW,MAAM,EAAE;AAC1E;AAEA,eAAsB,uBACpB,WACA,YACA,MACA,IACkC;AAClC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,2CAA2C;AAAA,IACrF,QAAQ;AAAA,MACN,UAAU;AAAA,MACV,OAAO;AAAA,MACP,KAAK;AAAA,IACP;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,cAAc,SAAS,IAAI;AACzC,QAAM,mBAAmB,qBAAqB,SAAS,SAAS,MAAM,MAAM;AAE5E,SAAO,EAAE,OAAO,OAAO,UAAU,SAAS,MAAM,gBAAgB,EAAE;AACpE;AAEA,eAAsB,kBACpB,WACA,WAC8B;AAC9B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,2DAA2D,SAAS;AAAA,EACtE;AAEA,SAAO,cAAc,SAAS,IAAI;AACpC;AAEA,eAAsB,iBACpB,WACA,WACgC;AAChC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,2CAA2C,SAAS;AAAA,EACtD;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,aACpB,WACA,WACA,OACgC;AAChC,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,2CAA2C,SAAS,QAAQ,KAAK;AAAA,EACnE;AAEA,SAAO,SAAS;AAClB;",
4
+ "sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport type ProductOffersResponse = Record<string, unknown>[];\nexport type VtexCatalogRecord = Record<string, unknown>;\n\nexport interface VtexCatalogListResponse<TRecord extends VtexCatalogRecord = VtexCatalogRecord> {\n items: TRecord[];\n total: number;\n}\n\nexport interface VtexProductIdListResponse {\n productIds: Array<string | number>;\n total: number;\n}\n\nfunction readTotalFromHeaders(headers: unknown, fallback: number): number {\n if (!headers || typeof headers !== \"object\") {\n return fallback;\n }\n\n const record = headers as Record<string, unknown>;\n const rawRange = record.resources ?? record[\"content-range\"] ?? record[\"Content-Range\"];\n const range = Array.isArray(rawRange) ? rawRange[0] : rawRange;\n\n if (typeof range !== \"string\") {\n return fallback;\n }\n\n const match = range.match(/\\/(\\d+)$/);\n if (!match) {\n return fallback;\n }\n\n const total = Number(match[1]);\n return Number.isFinite(total) ? total : fallback;\n}\n\nfunction toRecordArray(data: unknown): VtexCatalogRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.filter((item): item is VtexCatalogRecord => item !== null && typeof item === \"object\");\n}\n\nfunction toProductIds(data: unknown): Array<string | number> {\n if (Array.isArray(data)) {\n return data.filter((item): item is string | number => typeof item === \"string\" || typeof item === \"number\");\n }\n\n if (data && typeof data === \"object\") {\n return Object.keys(data);\n }\n\n return [];\n}\n\nfunction readTotal(data: unknown, fallback: number): number {\n if (!data || typeof data !== \"object\") {\n return fallback;\n }\n\n const record = data as Record<string, unknown>;\n const range = record.range;\n if (range && typeof range === \"object\") {\n const total = (range as Record<string, unknown>).total;\n if (typeof total === \"number\") {\n return total;\n }\n }\n\n if (typeof record.total === \"number\") {\n return record.total;\n }\n\n return fallback;\n}\n\nexport async function getCategoryTree(\n profileId: string,\n depth = 5\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(`/api/catalog_system/pub/category/tree/${depth}`);\n\n return toRecordArray(response.data);\n}\n\nexport async function listCategories(\n profileId: string,\n page: number,\n pageSize: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/category/list\", {\n params: { page, pageSize },\n });\n const items = toRecordArray(response.data);\n\n return { items, total: readTotal(response.data, items.length) };\n}\n\nexport async function listBrands(\n profileId: string,\n page: number,\n pageSize: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/brand/list\", {\n params: { page, pageSize },\n });\n const items = toRecordArray(response.data);\n\n return { items, total: readTotal(response.data, items.length) };\n}\n\nexport async function listSpecificationGroupsByCategory(\n profileId: string,\n categoryId: string\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\n `/api/catalog_system/pvt/specification/groupbycategory/${categoryId}`\n );\n\n return toRecordArray(response.data);\n}\n\nexport async function listProducts(\n profileId: string,\n from: number,\n to: number,\n keyword?: string\n): Promise<VtexProductIdListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/products/GetProductAndSkuIds\", {\n params: {\n _from: from,\n _to: to,\n keyword,\n },\n });\n const data = response.data && typeof response.data === \"object\" && \"data\" in response.data\n ? (response.data as Record<string, unknown>).data\n : response.data;\n const productIds = toProductIds(data);\n\n return { productIds, total: readTotal(response.data, productIds.length) };\n}\n\nexport async function listProductsByCategory(\n profileId: string,\n categoryId: string,\n from: number,\n to: number\n): Promise<VtexCatalogListResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pub/products/search\", {\n params: {\n fq: `C:/${categoryId}/`,\n _from: from,\n _to: to,\n },\n });\n const items = toRecordArray(response.data);\n const totalFromHeaders = readTotalFromHeaders(response.headers, items.length);\n\n return { items, total: readTotal(response.data, totalFromHeaders) };\n}\n\nexport async function listSkusByProduct(\n profileId: string,\n productId: string\n): Promise<VtexCatalogRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\n `/api/catalog_system/pvt/sku/stockkeepingunitByProductId/${productId}`\n );\n\n return toRecordArray(response.data);\n}\n\nexport async function getProductOffers(\n profileId: string,\n productId: string\n): Promise<ProductOffersResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}`\n );\n\n return response.data;\n}\n\nexport async function getSkuOffers(\n profileId: string,\n productId: string,\n skuId: string\n): Promise<ProductOffersResponse> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<ProductOffersResponse>(\n `/api/catalog_system/pub/products/offers/${productId}/sku/${skuId}`\n );\n\n return response.data;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -8,17 +8,23 @@ function toRecordArray(data) {
8
8
  function normalizeCommercialConditionId(value) {
9
9
  return String(value);
10
10
  }
11
+ function matchesCommercialConditionSearch(record, search) {
12
+ if (!search) {
13
+ return true;
14
+ }
15
+ const normalizedSearch = search.trim().toLowerCase();
16
+ const name = [record.name, record.Name].find((value) => typeof value === "string");
17
+ return typeof name === "string" && name.toLowerCase().includes(normalizedSearch);
18
+ }
11
19
  async function listCommercialConditions(profileId, search) {
12
20
  const { vtexApi } = await getVtexApiClients(profileId);
13
- const response = await vtexApi.get("/api/payments/pvt/commercial-condition", {
14
- params: search ? { search } : void 0
15
- });
16
- return toRecordArray(response.data);
21
+ const response = await vtexApi.get("/api/catalog_system/pvt/commercialcondition/list");
22
+ return toRecordArray(response.data).filter((record) => matchesCommercialConditionSearch(record, search));
17
23
  }
18
24
  async function getCommercialCondition(profileId, commercialConditionId) {
19
25
  const { vtexApi } = await getVtexApiClients(profileId);
20
26
  const response = await vtexApi.get(
21
- `/api/payments/pvt/commercial-condition/${normalizeCommercialConditionId(commercialConditionId)}`
27
+ `/api/catalog_system/pvt/commercialcondition/${normalizeCommercialConditionId(commercialConditionId)}`
22
28
  );
23
29
  return response.data;
24
30
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/services/vtex/vtex-payments.ts"],
4
- "sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport type VtexPaymentRecord = Record<string, unknown>;\n\nfunction toRecordArray(data: unknown): VtexPaymentRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.filter((item): item is VtexPaymentRecord => item !== null && typeof item === \"object\");\n}\n\nfunction normalizeCommercialConditionId(value: number): string {\n return String(value);\n}\n\nexport async function listCommercialConditions(\n profileId: string,\n search?: string\n): Promise<VtexPaymentRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/payments/pvt/commercial-condition\", {\n params: search ? { search } : undefined,\n });\n\n return toRecordArray(response.data);\n}\n\nexport async function getCommercialCondition(\n profileId: string,\n commercialConditionId: number\n): Promise<VtexPaymentRecord> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<VtexPaymentRecord>(\n `/api/payments/pvt/commercial-condition/${normalizeCommercialConditionId(commercialConditionId)}`\n );\n\n return response.data;\n}\n\nexport async function listPaymentRules(\n profileId: string,\n filters?: { commercialConditionId?: number }\n): Promise<VtexPaymentRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/pvt/rules\", {\n params:\n filters?.commercialConditionId === undefined\n ? undefined\n : { commercialConditionId: normalizeCommercialConditionId(filters.commercialConditionId) },\n });\n\n return toRecordArray(response.data);\n}\n\nexport async function getPaymentRule(profileId: string, ruleId: number): Promise<VtexPaymentRecord> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<VtexPaymentRecord>(`/api/pvt/rules/${ruleId}`);\n\n return response.data;\n}\n"],
5
- "mappings": "AAAA,SAAS,yBAAyB;AAIlC,SAAS,cAAc,MAAoC;AACzD,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,KAAK,OAAO,CAAC,SAAoC,SAAS,QAAQ,OAAO,SAAS,QAAQ;AACnG;AAEA,SAAS,+BAA+B,OAAuB;AAC7D,SAAO,OAAO,KAAK;AACrB;AAEA,eAAsB,yBACpB,WACA,QAC8B;AAC9B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,0CAA0C;AAAA,IACpF,QAAQ,SAAS,EAAE,OAAO,IAAI;AAAA,EAChC,CAAC;AAED,SAAO,cAAc,SAAS,IAAI;AACpC;AAEA,eAAsB,uBACpB,WACA,uBAC4B;AAC5B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,0CAA0C,+BAA+B,qBAAqB,CAAC;AAAA,EACjG;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,iBACpB,WACA,SAC8B;AAC9B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,kBAAkB;AAAA,IAC5D,QACE,SAAS,0BAA0B,SAC/B,SACA,EAAE,uBAAuB,+BAA+B,QAAQ,qBAAqB,EAAE;AAAA,EAC/F,CAAC;AAED,SAAO,cAAc,SAAS,IAAI;AACpC;AAEA,eAAsB,eAAe,WAAmB,QAA4C;AAClG,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAuB,kBAAkB,MAAM,EAAE;AAEhF,SAAO,SAAS;AAClB;",
4
+ "sourcesContent": ["import { getVtexApiClients } from \"./vtex-api.js\";\n\nexport type VtexPaymentRecord = Record<string, unknown>;\n\nfunction toRecordArray(data: unknown): VtexPaymentRecord[] {\n if (!Array.isArray(data)) {\n return [];\n }\n\n return data.filter((item): item is VtexPaymentRecord => item !== null && typeof item === \"object\");\n}\n\nfunction normalizeCommercialConditionId(value: number): string {\n return String(value);\n}\n\nfunction matchesCommercialConditionSearch(record: VtexPaymentRecord, search?: string): boolean {\n if (!search) {\n return true;\n }\n\n const normalizedSearch = search.trim().toLowerCase();\n const name = [record.name, record.Name].find((value): value is string => typeof value === \"string\");\n\n return typeof name === \"string\" && name.toLowerCase().includes(normalizedSearch);\n}\n\nexport async function listCommercialConditions(\n profileId: string,\n search?: string\n): Promise<VtexPaymentRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/catalog_system/pvt/commercialcondition/list\");\n\n return toRecordArray(response.data).filter((record) => matchesCommercialConditionSearch(record, search));\n}\n\nexport async function getCommercialCondition(\n profileId: string,\n commercialConditionId: number\n): Promise<VtexPaymentRecord> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<VtexPaymentRecord>(\n `/api/catalog_system/pvt/commercialcondition/${normalizeCommercialConditionId(commercialConditionId)}`\n );\n\n return response.data;\n}\n\nexport async function listPaymentRules(\n profileId: string,\n filters?: { commercialConditionId?: number }\n): Promise<VtexPaymentRecord[]> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<unknown>(\"/api/pvt/rules\", {\n params:\n filters?.commercialConditionId === undefined\n ? undefined\n : { commercialConditionId: normalizeCommercialConditionId(filters.commercialConditionId) },\n });\n\n return toRecordArray(response.data);\n}\n\nexport async function getPaymentRule(profileId: string, ruleId: number): Promise<VtexPaymentRecord> {\n const { vtexApi } = await getVtexApiClients(profileId);\n const response = await vtexApi.get<VtexPaymentRecord>(`/api/pvt/rules/${ruleId}`);\n\n return response.data;\n}\n"],
5
+ "mappings": "AAAA,SAAS,yBAAyB;AAIlC,SAAS,cAAc,MAAoC;AACzD,MAAI,CAAC,MAAM,QAAQ,IAAI,GAAG;AACxB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,KAAK,OAAO,CAAC,SAAoC,SAAS,QAAQ,OAAO,SAAS,QAAQ;AACnG;AAEA,SAAS,+BAA+B,OAAuB;AAC7D,SAAO,OAAO,KAAK;AACrB;AAEA,SAAS,iCAAiC,QAA2B,QAA0B;AAC7F,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,QAAM,mBAAmB,OAAO,KAAK,EAAE,YAAY;AACnD,QAAM,OAAO,CAAC,OAAO,MAAM,OAAO,IAAI,EAAE,KAAK,CAAC,UAA2B,OAAO,UAAU,QAAQ;AAElG,SAAO,OAAO,SAAS,YAAY,KAAK,YAAY,EAAE,SAAS,gBAAgB;AACjF;AAEA,eAAsB,yBACpB,WACA,QAC8B;AAC9B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,kDAAkD;AAE9F,SAAO,cAAc,SAAS,IAAI,EAAE,OAAO,CAAC,WAAW,iCAAiC,QAAQ,MAAM,CAAC;AACzG;AAEA,eAAsB,uBACpB,WACA,uBAC4B;AAC5B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,+CAA+C,+BAA+B,qBAAqB,CAAC;AAAA,EACtG;AAEA,SAAO,SAAS;AAClB;AAEA,eAAsB,iBACpB,WACA,SAC8B;AAC9B,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAa,kBAAkB;AAAA,IAC5D,QACE,SAAS,0BAA0B,SAC/B,SACA,EAAE,uBAAuB,+BAA+B,QAAQ,qBAAqB,EAAE;AAAA,EAC/F,CAAC;AAED,SAAO,cAAc,SAAS,IAAI;AACpC;AAEA,eAAsB,eAAe,WAAmB,QAA4C;AAClG,QAAM,EAAE,QAAQ,IAAI,MAAM,kBAAkB,SAAS;AACrD,QAAM,WAAW,MAAM,QAAQ,IAAuB,kBAAkB,MAAM,EAAE;AAEhF,SAAO,SAAS;AAClB;",
6
6
  "names": []
7
7
  }
@@ -293,6 +293,21 @@ describe("catalog navigation read wrappers", () => {
293
293
  brandId: 7,
294
294
  categoryId: "23",
295
295
  productReference: "RUN-001"
296
+ },
297
+ {
298
+ productId: "102",
299
+ productName: "Trail",
300
+ brand: "Acme",
301
+ brandId: 7,
302
+ categoryId: "999",
303
+ productReference: "TRL-002"
304
+ },
305
+ {
306
+ productId: "103",
307
+ productName: "No Category",
308
+ brand: "Acme",
309
+ brandId: 7,
310
+ productReference: "NC-003"
296
311
  }
297
312
  ],
298
313
  total: 12
@@ -338,7 +353,7 @@ describe("catalog navigation read wrappers", () => {
338
353
  total: 12,
339
354
  page: 2,
340
355
  pageSize: 25,
341
- returned: 1,
356
+ returned: 3,
342
357
  has_more: false
343
358
  },
344
359
  profile_id: "profile-1",
@@ -351,7 +366,11 @@ describe("catalog navigation read wrappers", () => {
351
366
  "category_id",
352
367
  "product_reference"
353
368
  ],
354
- rows: [["101", "Runner", "Acme", 7, "23", "RUN-001"]]
369
+ rows: [
370
+ ["101", "Runner", "Acme", 7, "23", "RUN-001"],
371
+ ["102", "Trail", "Acme", 7, "999", "TRL-002"],
372
+ ["103", "No Category", "Acme", 7, null, "NC-003"]
373
+ ]
355
374
  }
356
375
  });
357
376
  expect(skus).toEqual({
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/tools/vtex/__tests__/catalog-navigation-reads.test.ts"],
4
- "sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst getCategoryTreeMock = vi.fn();\nconst listCategoriesMock = vi.fn();\nconst listBrandsMock = vi.fn();\nconst listSpecificationGroupsByCategoryMock = vi.fn();\nconst listProductsMock = vi.fn();\nconst listProductsByCategoryMock = vi.fn();\nconst listSkusByProductMock = vi.fn();\nconst getBrandMock = vi.fn();\nconst getCategoryMock = vi.fn();\nconst getProductMock = vi.fn();\nconst getProductSpecificationsMock = vi.fn();\nconst getSkuMock = vi.fn();\nconst resolveVtexProfileOrSelectionMock = vi.fn();\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-catalog.js\", () => ({\n getCategoryTree: getCategoryTreeMock,\n listCategories: listCategoriesMock,\n listBrands: listBrandsMock,\n listSpecificationGroupsByCategory: listSpecificationGroupsByCategoryMock,\n listProducts: listProductsMock,\n listProductsByCategory: listProductsByCategoryMock,\n listSkusByProduct: listSkusByProductMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-catalog-write.js\", () => ({\n getBrand: getBrandMock,\n getCategory: getCategoryMock,\n getProduct: getProductMock,\n getProductSpecifications: getProductSpecificationsMock,\n getSku: getSkuMock,\n}));\n\nvi.mock(\"../profile-resolution.js\", () => ({\n resolveVtexProfileOrSelection: resolveVtexProfileOrSelectionMock,\n}));\n\nconst sharedModule = await import(\"../catalog-navigation-reads.js\");\nconst getCategoryTreeModule = await import(\"../get-category-tree.js\");\nconst listCategoriesModule = await import(\"../list-categories.js\");\nconst getCategoryModule = await import(\"../get-category.js\");\nconst getBrandModule = await import(\"../get-brand.js\");\nconst listBrandsModule = await import(\"../list-brands.js\");\nconst listSpecificationGroupsModule = await import(\"../list-specification-groups.js\");\nconst getProductModule = await import(\"../get-product.js\");\nconst getProductSpecificationsModule = await import(\"../get-product-specifications.js\");\nconst listProductsModule = await import(\"../list-products.js\");\nconst listProductsByCategoryModule = await import(\"../list-products-by-category.js\");\nconst getSkuModule = await import(\"../get-sku.js\");\nconst listSkusByProductModule = await import(\"../list-skus-by-product.js\");\n\ndescribe(\"catalog navigation read wrappers\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n resolveVtexProfileOrSelectionMock.mockResolvedValue({\n ok: true,\n value: { profileId: \"profile-1\" },\n });\n });\n\n it(\"keeps stable public exports delegated to the shared module\", () => {\n expect(getCategoryTreeModule.getCategoryTreeSchema).toBe(sharedModule.getCategoryTreeSchema);\n expect(getCategoryTreeModule.getCategoryTreeHandler).toBe(sharedModule.getCategoryTreeHandler);\n expect(listCategoriesModule.listCategoriesSchema).toBe(sharedModule.listCategoriesSchema);\n expect(listCategoriesModule.listCategoriesHandler).toBe(sharedModule.listCategoriesHandler);\n expect(getCategoryModule.getCategorySchema).toBe(sharedModule.getCategorySchema);\n expect(getCategoryModule.getCategoryHandler).toBe(sharedModule.getCategoryHandler);\n expect(getBrandModule.getBrandSchema).toBe(sharedModule.getBrandSchema);\n expect(getBrandModule.getBrandHandler).toBe(sharedModule.getBrandHandler);\n expect(listBrandsModule.listBrandsSchema).toBe(sharedModule.listBrandsSchema);\n expect(listBrandsModule.listBrandsHandler).toBe(sharedModule.listBrandsHandler);\n expect(listSpecificationGroupsModule.listSpecificationGroupsSchema).toBe(\n sharedModule.listSpecificationGroupsSchema\n );\n expect(listSpecificationGroupsModule.listSpecificationGroupsHandler).toBe(\n sharedModule.listSpecificationGroupsHandler\n );\n expect(getProductModule.getProductSchema).toBe(sharedModule.getProductSchema);\n expect(getProductModule.getProductHandler).toBe(sharedModule.getProductHandler);\n expect(getProductSpecificationsModule.getProductSpecificationsSchema).toBe(\n sharedModule.getProductSpecificationsSchema\n );\n expect(getProductSpecificationsModule.getProductSpecificationsHandler).toBe(\n sharedModule.getProductSpecificationsHandler\n );\n expect(listProductsModule.listProductsSchema).toBe(sharedModule.listProductsSchema);\n expect(listProductsModule.listProductsHandler).toBe(sharedModule.listProductsHandler);\n expect(listProductsByCategoryModule.listProductsByCategorySchema).toBe(\n sharedModule.listProductsByCategorySchema\n );\n expect(listProductsByCategoryModule.listProductsByCategoryHandler).toBe(\n sharedModule.listProductsByCategoryHandler\n );\n expect(getSkuModule.getSkuSchema).toBe(sharedModule.getSkuSchema);\n expect(getSkuModule.getSkuHandler).toBe(sharedModule.getSkuHandler);\n expect(listSkusByProductModule.listSkusByProductSchema).toBe(sharedModule.listSkusByProductSchema);\n expect(listSkusByProductModule.listSkusByProductHandler).toBe(sharedModule.listSkusByProductHandler);\n });\n\n it(\"validates profile and catalog identifiers\", () => {\n expect(() => sharedModule.getCategorySchema.parse({ profileId: \" \", categoryId: \"10\" })).toThrow();\n expect(() => sharedModule.getBrandSchema.parse({ profileId: \"profile-1\", brandId: \"\" })).toThrow();\n expect(() => sharedModule.listSpecificationGroupsSchema.parse({ categoryId: \"\" })).toThrow();\n expect(() => sharedModule.getProductSchema.parse({ profileId: \"profile-1\", productId: \"\" })).toThrow();\n expect(() =>\n sharedModule.listProductsByCategorySchema.parse({ profileId: \"profile-1\", categoryId: \"\" })\n ).toThrow();\n expect(() =>\n sharedModule.getProductSpecificationsSchema.parse({ profileId: \"profile-1\", productId: \"\" })\n ).toThrow();\n expect(() => sharedModule.getSkuSchema.parse({ profileId: \"profile-1\", skuId: \"\" })).toThrow();\n expect(() =>\n sharedModule.listSkusByProductSchema.parse({ profileId: \"profile-1\", productId: \"\" })\n ).toThrow();\n });\n\n it(\"enforces the real VTEX category product page size cap\", () => {\n expect(\n sharedModule.listProductsByCategorySchema.parse({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 50,\n })\n ).toEqual({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 50,\n });\n\n expect(() =>\n sharedModule.listProductsByCategorySchema.parse({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 51,\n })\n ).toThrow();\n });\n\n it(\"delegates category tree reads with the default VTEX depth\", async () => {\n getCategoryTreeMock.mockResolvedValue([{ id: 1, name: \"Root\", children: [{ id: 2, name: \"Child\" }] }]);\n\n const result = await sharedModule.getCategoryTreeHandler({ profileId: \"profile-1\" });\n\n expect(resolveVtexProfileOrSelectionMock).toHaveBeenCalledWith(\"profile-1\");\n expect(getCategoryTreeMock).toHaveBeenCalledWith(\"profile-1\", 5);\n expect(result).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n depth: 5,\n categories: [{ id: 1, name: \"Root\", children: [{ id: 2, name: \"Child\" }] }],\n },\n });\n });\n\n it(\"returns the profile-selection response instead of silently defaulting when profileId is omitted\", async () => {\n resolveVtexProfileOrSelectionMock.mockResolvedValueOnce({\n ok: false,\n response: { selection_required: true, profiles: [{ id: \"profile-1\" }] },\n });\n\n const result = await sharedModule.getCategoryTreeHandler({});\n\n expect(resolveVtexProfileOrSelectionMock).toHaveBeenCalledWith(undefined);\n expect(getCategoryTreeMock).not.toHaveBeenCalled();\n expect(result).toEqual({ selection_required: true, profiles: [{ id: \"profile-1\" }] });\n });\n\n it(\"delegates shallow category tree reads with depth=1\", async () => {\n getCategoryTreeMock.mockResolvedValue([{ id: 1, name: \"Root\" }]);\n\n const result = await sharedModule.getCategoryTreeHandler({ profileId: \"profile-1\", depth: 1 });\n\n expect(getCategoryTreeMock).toHaveBeenCalledWith(\"profile-1\", 1);\n expect(result).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n depth: 1,\n categories: [{ id: 1, name: \"Root\" }],\n },\n });\n });\n\n it(\"formats category and brand lists as compact rows with continuation metadata\", async () => {\n listCategoriesMock.mockResolvedValue({\n items: [\n { Id: 10, Name: \"Shoes\", FatherCategoryId: null, IsActive: true, ShowInStoreFront: true },\n { Id: 11, Name: \"Boots\", FatherCategoryId: 10, IsActive: false, ShowInStoreFront: false },\n ],\n total: 5,\n });\n listBrandsMock.mockResolvedValue({\n items: [{ Id: 7, Name: \"Acme\", Active: true, MenuHome: false }],\n total: 1,\n });\n\n const categories = await sharedModule.listCategoriesHandler({\n profileId: \"profile-1\",\n page: 1,\n pageSize: 2,\n });\n const brands = await sharedModule.listBrandsHandler({ profileId: \"profile-1\", page: 1, pageSize: 25 });\n\n expect(listCategoriesMock).toHaveBeenCalledWith(\"profile-1\", 1, 2);\n expect(categories).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 5,\n page: 1,\n pageSize: 2,\n returned: 2,\n has_more: true,\n next_page: 2,\n continuation: \"Call vtex_list_categories again with page=2 and pageSize=2 to continue.\",\n },\n profile_id: \"profile-1\",\n rows_schema: [\"id\", \"name\", \"parent_id\", \"is_active\", \"show_in_storefront\"],\n rows: [\n [10, \"Shoes\", null, true, true],\n [11, \"Boots\", 10, false, false],\n ],\n },\n });\n expect(brands).toEqual({\n kind: \"object\",\n value: {\n metadata: { total: 1, page: 1, pageSize: 25, returned: 1, has_more: false },\n profile_id: \"profile-1\",\n rows_schema: [\"id\", \"name\", \"is_active\", \"menu_home\"],\n rows: [[7, \"Acme\", true, false]],\n },\n });\n });\n\n it(\"lists specification groups for a category with optional name filtering\", async () => {\n listSpecificationGroupsByCategoryMock.mockResolvedValue([\n { Id: 70, Name: \"General\", CategoryId: 292 },\n { Id: 71, Name: \"Material\", CategoryId: 292 },\n ]);\n\n const result = await sharedModule.listSpecificationGroupsHandler({\n profileId: \"profile-1\",\n categoryId: \"292\",\n nameContains: \"mater\",\n });\n\n expect(listSpecificationGroupsByCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"292\");\n expect(result).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 2,\n returned: 1,\n has_more: false,\n name_contains: \"mater\",\n },\n profile_id: \"profile-1\",\n category_id: \"292\",\n rows_schema: [\"id\", \"name\", \"category_id\"],\n rows: [[71, \"Material\", 292]],\n },\n });\n });\n\n it(\"delegates detail reads and strips nulls from normalized payloads\", async () => {\n getCategoryMock.mockResolvedValue({ Id: 10, Name: \"Shoes\", Empty: null });\n getBrandMock.mockResolvedValue({ Id: 7, Name: \"Acme\", Text: null });\n getProductMock.mockResolvedValue({ Id: 200, Name: \"Runner\", Description: null });\n getProductSpecificationsMock.mockResolvedValue([\n { Id: 90, Name: \"Material\", Value: \"Leather\", Empty: null },\n ]);\n getSkuMock.mockResolvedValue({ Id: 300, Name: \"Runner 42\", Ean: null });\n\n const category = await sharedModule.getCategoryHandler({ profileId: \"profile-1\", categoryId: \"10\" });\n const brand = await sharedModule.getBrandHandler({ profileId: \"profile-1\", brandId: \"7\" });\n const product = await sharedModule.getProductHandler({ profileId: \"profile-1\", productId: \"200\" });\n const specifications = await sharedModule.getProductSpecificationsHandler({\n profileId: \"profile-1\",\n productId: \"200\",\n });\n const sku = await sharedModule.getSkuHandler({ profileId: \"profile-1\", skuId: \"300\" });\n\n expect(getCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"10\");\n expect(getBrandMock).toHaveBeenCalledWith(\"profile-1\", \"7\");\n expect(getProductMock).toHaveBeenCalledWith(\"profile-1\", \"200\");\n expect(getProductSpecificationsMock).toHaveBeenCalledWith(\"profile-1\", \"200\");\n expect(getSkuMock).toHaveBeenCalledWith(\"profile-1\", \"300\");\n expect(category).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", category_id: \"10\", category: { id: 10, name: \"Shoes\" } } });\n expect(brand).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", brand_id: \"7\", brand: { id: 7, name: \"Acme\" } } });\n expect(product).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", product_id: \"200\", product: { id: 200, name: \"Runner\" } } });\n expect(specifications).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n product_id: \"200\",\n specifications: [{ id: 90, name: \"Material\", value: \"Leather\" }],\n },\n });\n expect(sku).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", sku_id: \"300\", sku: { id: 300, name: \"Runner 42\" } } });\n });\n\n it(\"formats product lists and SKU lists with compact token-efficient rows\", async () => {\n listProductsMock.mockResolvedValue({ productIds: [101, 102], total: 3 });\n listProductsByCategoryMock.mockResolvedValue({\n items: [\n {\n productId: \"101\",\n productName: \"Runner\",\n brand: \"Acme\",\n brandId: 7,\n categoryId: \"23\",\n productReference: \"RUN-001\",\n },\n ],\n total: 12,\n });\n listSkusByProductMock.mockResolvedValue([\n { Id: 501, Name: \"Runner 40\", IsActive: true, RefId: \"RUN-40\" },\n { Id: 502, Name: \"Runner 41\", IsActive: false, RefId: \"RUN-41\" },\n ]);\n\n const products = await sharedModule.listProductsHandler({\n profileId: \"profile-1\",\n page: 2,\n pageSize: 2,\n keyword: \"runner\",\n });\n const categoryProducts = await sharedModule.listProductsByCategoryHandler({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 2,\n pageSize: 25,\n });\n const skus = await sharedModule.listSkusByProductHandler({ profileId: \"profile-1\", productId: \"101\" });\n\n expect(listProductsMock).toHaveBeenCalledWith(\"profile-1\", 3, 4, \"runner\");\n expect(listProductsByCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"23\", 25, 49);\n expect(products).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 3,\n page: 2,\n pageSize: 2,\n returned: 2,\n has_more: false,\n },\n profile_id: \"profile-1\",\n rows_schema: [\"product_id\"],\n rows: [[101], [102]],\n },\n });\n expect(categoryProducts).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 12,\n page: 2,\n pageSize: 25,\n returned: 1,\n has_more: false,\n },\n profile_id: \"profile-1\",\n category_id: \"23\",\n rows_schema: [\n \"product_id\",\n \"product_name\",\n \"brand\",\n \"brand_id\",\n \"category_id\",\n \"product_reference\",\n ],\n rows: [[\"101\", \"Runner\", \"Acme\", 7, \"23\", \"RUN-001\"]],\n },\n });\n expect(skus).toEqual({\n kind: \"object\",\n value: {\n metadata: { total: 2, returned: 2, has_more: false },\n profile_id: \"profile-1\",\n product_id: \"101\",\n rows_schema: [\"id\", \"name\", \"is_active\", \"ref_id\"],\n rows: [\n [501, \"Runner 40\", true, \"RUN-40\"],\n [502, \"Runner 41\", false, \"RUN-41\"],\n ],\n },\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst getCategoryTreeMock = vi.fn();\nconst listCategoriesMock = vi.fn();\nconst listBrandsMock = vi.fn();\nconst listSpecificationGroupsByCategoryMock = vi.fn();\nconst listProductsMock = vi.fn();\nconst listProductsByCategoryMock = vi.fn();\nconst listSkusByProductMock = vi.fn();\nconst getBrandMock = vi.fn();\nconst getCategoryMock = vi.fn();\nconst getProductMock = vi.fn();\nconst getProductSpecificationsMock = vi.fn();\nconst getSkuMock = vi.fn();\nconst resolveVtexProfileOrSelectionMock = vi.fn();\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-catalog.js\", () => ({\n getCategoryTree: getCategoryTreeMock,\n listCategories: listCategoriesMock,\n listBrands: listBrandsMock,\n listSpecificationGroupsByCategory: listSpecificationGroupsByCategoryMock,\n listProducts: listProductsMock,\n listProductsByCategory: listProductsByCategoryMock,\n listSkusByProduct: listSkusByProductMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-catalog-write.js\", () => ({\n getBrand: getBrandMock,\n getCategory: getCategoryMock,\n getProduct: getProductMock,\n getProductSpecifications: getProductSpecificationsMock,\n getSku: getSkuMock,\n}));\n\nvi.mock(\"../profile-resolution.js\", () => ({\n resolveVtexProfileOrSelection: resolveVtexProfileOrSelectionMock,\n}));\n\nconst sharedModule = await import(\"../catalog-navigation-reads.js\");\nconst getCategoryTreeModule = await import(\"../get-category-tree.js\");\nconst listCategoriesModule = await import(\"../list-categories.js\");\nconst getCategoryModule = await import(\"../get-category.js\");\nconst getBrandModule = await import(\"../get-brand.js\");\nconst listBrandsModule = await import(\"../list-brands.js\");\nconst listSpecificationGroupsModule = await import(\"../list-specification-groups.js\");\nconst getProductModule = await import(\"../get-product.js\");\nconst getProductSpecificationsModule = await import(\"../get-product-specifications.js\");\nconst listProductsModule = await import(\"../list-products.js\");\nconst listProductsByCategoryModule = await import(\"../list-products-by-category.js\");\nconst getSkuModule = await import(\"../get-sku.js\");\nconst listSkusByProductModule = await import(\"../list-skus-by-product.js\");\n\ndescribe(\"catalog navigation read wrappers\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n resolveVtexProfileOrSelectionMock.mockResolvedValue({\n ok: true,\n value: { profileId: \"profile-1\" },\n });\n });\n\n it(\"keeps stable public exports delegated to the shared module\", () => {\n expect(getCategoryTreeModule.getCategoryTreeSchema).toBe(sharedModule.getCategoryTreeSchema);\n expect(getCategoryTreeModule.getCategoryTreeHandler).toBe(sharedModule.getCategoryTreeHandler);\n expect(listCategoriesModule.listCategoriesSchema).toBe(sharedModule.listCategoriesSchema);\n expect(listCategoriesModule.listCategoriesHandler).toBe(sharedModule.listCategoriesHandler);\n expect(getCategoryModule.getCategorySchema).toBe(sharedModule.getCategorySchema);\n expect(getCategoryModule.getCategoryHandler).toBe(sharedModule.getCategoryHandler);\n expect(getBrandModule.getBrandSchema).toBe(sharedModule.getBrandSchema);\n expect(getBrandModule.getBrandHandler).toBe(sharedModule.getBrandHandler);\n expect(listBrandsModule.listBrandsSchema).toBe(sharedModule.listBrandsSchema);\n expect(listBrandsModule.listBrandsHandler).toBe(sharedModule.listBrandsHandler);\n expect(listSpecificationGroupsModule.listSpecificationGroupsSchema).toBe(\n sharedModule.listSpecificationGroupsSchema\n );\n expect(listSpecificationGroupsModule.listSpecificationGroupsHandler).toBe(\n sharedModule.listSpecificationGroupsHandler\n );\n expect(getProductModule.getProductSchema).toBe(sharedModule.getProductSchema);\n expect(getProductModule.getProductHandler).toBe(sharedModule.getProductHandler);\n expect(getProductSpecificationsModule.getProductSpecificationsSchema).toBe(\n sharedModule.getProductSpecificationsSchema\n );\n expect(getProductSpecificationsModule.getProductSpecificationsHandler).toBe(\n sharedModule.getProductSpecificationsHandler\n );\n expect(listProductsModule.listProductsSchema).toBe(sharedModule.listProductsSchema);\n expect(listProductsModule.listProductsHandler).toBe(sharedModule.listProductsHandler);\n expect(listProductsByCategoryModule.listProductsByCategorySchema).toBe(\n sharedModule.listProductsByCategorySchema\n );\n expect(listProductsByCategoryModule.listProductsByCategoryHandler).toBe(\n sharedModule.listProductsByCategoryHandler\n );\n expect(getSkuModule.getSkuSchema).toBe(sharedModule.getSkuSchema);\n expect(getSkuModule.getSkuHandler).toBe(sharedModule.getSkuHandler);\n expect(listSkusByProductModule.listSkusByProductSchema).toBe(sharedModule.listSkusByProductSchema);\n expect(listSkusByProductModule.listSkusByProductHandler).toBe(sharedModule.listSkusByProductHandler);\n });\n\n it(\"validates profile and catalog identifiers\", () => {\n expect(() => sharedModule.getCategorySchema.parse({ profileId: \" \", categoryId: \"10\" })).toThrow();\n expect(() => sharedModule.getBrandSchema.parse({ profileId: \"profile-1\", brandId: \"\" })).toThrow();\n expect(() => sharedModule.listSpecificationGroupsSchema.parse({ categoryId: \"\" })).toThrow();\n expect(() => sharedModule.getProductSchema.parse({ profileId: \"profile-1\", productId: \"\" })).toThrow();\n expect(() =>\n sharedModule.listProductsByCategorySchema.parse({ profileId: \"profile-1\", categoryId: \"\" })\n ).toThrow();\n expect(() =>\n sharedModule.getProductSpecificationsSchema.parse({ profileId: \"profile-1\", productId: \"\" })\n ).toThrow();\n expect(() => sharedModule.getSkuSchema.parse({ profileId: \"profile-1\", skuId: \"\" })).toThrow();\n expect(() =>\n sharedModule.listSkusByProductSchema.parse({ profileId: \"profile-1\", productId: \"\" })\n ).toThrow();\n });\n\n it(\"enforces the real VTEX category product page size cap\", () => {\n expect(\n sharedModule.listProductsByCategorySchema.parse({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 50,\n })\n ).toEqual({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 50,\n });\n\n expect(() =>\n sharedModule.listProductsByCategorySchema.parse({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 1,\n pageSize: 51,\n })\n ).toThrow();\n });\n\n it(\"delegates category tree reads with the default VTEX depth\", async () => {\n getCategoryTreeMock.mockResolvedValue([{ id: 1, name: \"Root\", children: [{ id: 2, name: \"Child\" }] }]);\n\n const result = await sharedModule.getCategoryTreeHandler({ profileId: \"profile-1\" });\n\n expect(resolveVtexProfileOrSelectionMock).toHaveBeenCalledWith(\"profile-1\");\n expect(getCategoryTreeMock).toHaveBeenCalledWith(\"profile-1\", 5);\n expect(result).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n depth: 5,\n categories: [{ id: 1, name: \"Root\", children: [{ id: 2, name: \"Child\" }] }],\n },\n });\n });\n\n it(\"returns the profile-selection response instead of silently defaulting when profileId is omitted\", async () => {\n resolveVtexProfileOrSelectionMock.mockResolvedValueOnce({\n ok: false,\n response: { selection_required: true, profiles: [{ id: \"profile-1\" }] },\n });\n\n const result = await sharedModule.getCategoryTreeHandler({});\n\n expect(resolveVtexProfileOrSelectionMock).toHaveBeenCalledWith(undefined);\n expect(getCategoryTreeMock).not.toHaveBeenCalled();\n expect(result).toEqual({ selection_required: true, profiles: [{ id: \"profile-1\" }] });\n });\n\n it(\"delegates shallow category tree reads with depth=1\", async () => {\n getCategoryTreeMock.mockResolvedValue([{ id: 1, name: \"Root\" }]);\n\n const result = await sharedModule.getCategoryTreeHandler({ profileId: \"profile-1\", depth: 1 });\n\n expect(getCategoryTreeMock).toHaveBeenCalledWith(\"profile-1\", 1);\n expect(result).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n depth: 1,\n categories: [{ id: 1, name: \"Root\" }],\n },\n });\n });\n\n it(\"formats category and brand lists as compact rows with continuation metadata\", async () => {\n listCategoriesMock.mockResolvedValue({\n items: [\n { Id: 10, Name: \"Shoes\", FatherCategoryId: null, IsActive: true, ShowInStoreFront: true },\n { Id: 11, Name: \"Boots\", FatherCategoryId: 10, IsActive: false, ShowInStoreFront: false },\n ],\n total: 5,\n });\n listBrandsMock.mockResolvedValue({\n items: [{ Id: 7, Name: \"Acme\", Active: true, MenuHome: false }],\n total: 1,\n });\n\n const categories = await sharedModule.listCategoriesHandler({\n profileId: \"profile-1\",\n page: 1,\n pageSize: 2,\n });\n const brands = await sharedModule.listBrandsHandler({ profileId: \"profile-1\", page: 1, pageSize: 25 });\n\n expect(listCategoriesMock).toHaveBeenCalledWith(\"profile-1\", 1, 2);\n expect(categories).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 5,\n page: 1,\n pageSize: 2,\n returned: 2,\n has_more: true,\n next_page: 2,\n continuation: \"Call vtex_list_categories again with page=2 and pageSize=2 to continue.\",\n },\n profile_id: \"profile-1\",\n rows_schema: [\"id\", \"name\", \"parent_id\", \"is_active\", \"show_in_storefront\"],\n rows: [\n [10, \"Shoes\", null, true, true],\n [11, \"Boots\", 10, false, false],\n ],\n },\n });\n expect(brands).toEqual({\n kind: \"object\",\n value: {\n metadata: { total: 1, page: 1, pageSize: 25, returned: 1, has_more: false },\n profile_id: \"profile-1\",\n rows_schema: [\"id\", \"name\", \"is_active\", \"menu_home\"],\n rows: [[7, \"Acme\", true, false]],\n },\n });\n });\n\n it(\"lists specification groups for a category with optional name filtering\", async () => {\n listSpecificationGroupsByCategoryMock.mockResolvedValue([\n { Id: 70, Name: \"General\", CategoryId: 292 },\n { Id: 71, Name: \"Material\", CategoryId: 292 },\n ]);\n\n const result = await sharedModule.listSpecificationGroupsHandler({\n profileId: \"profile-1\",\n categoryId: \"292\",\n nameContains: \"mater\",\n });\n\n expect(listSpecificationGroupsByCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"292\");\n expect(result).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 2,\n returned: 1,\n has_more: false,\n name_contains: \"mater\",\n },\n profile_id: \"profile-1\",\n category_id: \"292\",\n rows_schema: [\"id\", \"name\", \"category_id\"],\n rows: [[71, \"Material\", 292]],\n },\n });\n });\n\n it(\"delegates detail reads and strips nulls from normalized payloads\", async () => {\n getCategoryMock.mockResolvedValue({ Id: 10, Name: \"Shoes\", Empty: null });\n getBrandMock.mockResolvedValue({ Id: 7, Name: \"Acme\", Text: null });\n getProductMock.mockResolvedValue({ Id: 200, Name: \"Runner\", Description: null });\n getProductSpecificationsMock.mockResolvedValue([\n { Id: 90, Name: \"Material\", Value: \"Leather\", Empty: null },\n ]);\n getSkuMock.mockResolvedValue({ Id: 300, Name: \"Runner 42\", Ean: null });\n\n const category = await sharedModule.getCategoryHandler({ profileId: \"profile-1\", categoryId: \"10\" });\n const brand = await sharedModule.getBrandHandler({ profileId: \"profile-1\", brandId: \"7\" });\n const product = await sharedModule.getProductHandler({ profileId: \"profile-1\", productId: \"200\" });\n const specifications = await sharedModule.getProductSpecificationsHandler({\n profileId: \"profile-1\",\n productId: \"200\",\n });\n const sku = await sharedModule.getSkuHandler({ profileId: \"profile-1\", skuId: \"300\" });\n\n expect(getCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"10\");\n expect(getBrandMock).toHaveBeenCalledWith(\"profile-1\", \"7\");\n expect(getProductMock).toHaveBeenCalledWith(\"profile-1\", \"200\");\n expect(getProductSpecificationsMock).toHaveBeenCalledWith(\"profile-1\", \"200\");\n expect(getSkuMock).toHaveBeenCalledWith(\"profile-1\", \"300\");\n expect(category).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", category_id: \"10\", category: { id: 10, name: \"Shoes\" } } });\n expect(brand).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", brand_id: \"7\", brand: { id: 7, name: \"Acme\" } } });\n expect(product).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", product_id: \"200\", product: { id: 200, name: \"Runner\" } } });\n expect(specifications).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n product_id: \"200\",\n specifications: [{ id: 90, name: \"Material\", value: \"Leather\" }],\n },\n });\n expect(sku).toEqual({ kind: \"object\", value: { profile_id: \"profile-1\", sku_id: \"300\", sku: { id: 300, name: \"Runner 42\" } } });\n });\n\n it(\"formats product lists and SKU lists with compact token-efficient rows\", async () => {\n listProductsMock.mockResolvedValue({ productIds: [101, 102], total: 3 });\n listProductsByCategoryMock.mockResolvedValue({\n items: [\n {\n productId: \"101\",\n productName: \"Runner\",\n brand: \"Acme\",\n brandId: 7,\n categoryId: \"23\",\n productReference: \"RUN-001\",\n },\n {\n productId: \"102\",\n productName: \"Trail\",\n brand: \"Acme\",\n brandId: 7,\n categoryId: \"999\",\n productReference: \"TRL-002\",\n },\n {\n productId: \"103\",\n productName: \"No Category\",\n brand: \"Acme\",\n brandId: 7,\n productReference: \"NC-003\",\n },\n ],\n total: 12,\n });\n listSkusByProductMock.mockResolvedValue([\n { Id: 501, Name: \"Runner 40\", IsActive: true, RefId: \"RUN-40\" },\n { Id: 502, Name: \"Runner 41\", IsActive: false, RefId: \"RUN-41\" },\n ]);\n\n const products = await sharedModule.listProductsHandler({\n profileId: \"profile-1\",\n page: 2,\n pageSize: 2,\n keyword: \"runner\",\n });\n const categoryProducts = await sharedModule.listProductsByCategoryHandler({\n profileId: \"profile-1\",\n categoryId: \"23\",\n page: 2,\n pageSize: 25,\n });\n const skus = await sharedModule.listSkusByProductHandler({ profileId: \"profile-1\", productId: \"101\" });\n\n expect(listProductsMock).toHaveBeenCalledWith(\"profile-1\", 3, 4, \"runner\");\n expect(listProductsByCategoryMock).toHaveBeenCalledWith(\"profile-1\", \"23\", 25, 49);\n expect(products).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 3,\n page: 2,\n pageSize: 2,\n returned: 2,\n has_more: false,\n },\n profile_id: \"profile-1\",\n rows_schema: [\"product_id\"],\n rows: [[101], [102]],\n },\n });\n expect(categoryProducts).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 12,\n page: 2,\n pageSize: 25,\n returned: 3,\n has_more: false,\n },\n profile_id: \"profile-1\",\n category_id: \"23\",\n rows_schema: [\n \"product_id\",\n \"product_name\",\n \"brand\",\n \"brand_id\",\n \"category_id\",\n \"product_reference\",\n ],\n rows: [\n [\"101\", \"Runner\", \"Acme\", 7, \"23\", \"RUN-001\"],\n [\"102\", \"Trail\", \"Acme\", 7, \"999\", \"TRL-002\"],\n [\"103\", \"No Category\", \"Acme\", 7, null, \"NC-003\"],\n ],\n },\n });\n expect(skus).toEqual({\n kind: \"object\",\n value: {\n metadata: { total: 2, returned: 2, has_more: false },\n profile_id: \"profile-1\",\n product_id: \"101\",\n rows_schema: [\"id\", \"name\", \"is_active\", \"ref_id\"],\n rows: [\n [501, \"Runner 40\", true, \"RUN-40\"],\n [502, \"Runner 41\", false, \"RUN-41\"],\n ],\n },\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -4,13 +4,6 @@ const objectMock = vi.fn((value) => ({ kind: "object", value }));
4
4
  const errorMock = vi.fn((message) => ({ kind: "error", message }));
5
5
  const listCommercialConditionsMock = vi.fn();
6
6
  const getCommercialConditionMock = vi.fn();
7
- const createCommercialConditionMock = vi.fn();
8
- const updateCommercialConditionMock = vi.fn();
9
- const deleteCommercialConditionMock = vi.fn();
10
- const resolveVtexWriteProfileMock = vi.fn();
11
- const buildWriteSuccessResponseMock = vi.fn((value) => ({ kind: "write", value }));
12
- const handleVtexWriteErrorMock = vi.fn((_err, fallback) => ({ kind: "error", message: fallback }));
13
- const requireExplicitConfirmationMock = vi.fn();
14
7
  vi.mock("mcp-use/server", () => ({
15
8
  object: objectMock,
16
9
  error: errorMock
@@ -19,27 +12,13 @@ vi.mock("../../../services/vtex/vtex-payments.js", () => ({
19
12
  listCommercialConditions: listCommercialConditionsMock,
20
13
  getCommercialCondition: getCommercialConditionMock
21
14
  }));
22
- vi.mock("../../../services/vtex/vtex-payments-write.js", () => ({
23
- createCommercialCondition: createCommercialConditionMock,
24
- updateCommercialCondition: updateCommercialConditionMock,
25
- deleteCommercialCondition: deleteCommercialConditionMock
26
- }));
27
15
  vi.mock("../write-helpers.js", () => ({
28
- confirmationSchemaField: z.boolean().optional().describe("confirmed"),
29
- resolveVtexWriteProfile: resolveVtexWriteProfileMock,
30
- buildWriteSuccessResponse: buildWriteSuccessResponseMock,
31
- handleVtexWriteError: handleVtexWriteErrorMock,
32
- requireExplicitConfirmation: requireExplicitConfirmationMock
16
+ vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe("profile")
33
17
  }));
34
18
  const module = await import("../commercial-conditions.js");
35
19
  describe("vtex_commercial_conditions tool", () => {
36
20
  beforeEach(() => {
37
21
  vi.clearAllMocks();
38
- resolveVtexWriteProfileMock.mockResolvedValue({
39
- ok: true,
40
- value: { profileId: "profile-1" }
41
- });
42
- requireExplicitConfirmationMock.mockReturnValue(null);
43
22
  });
44
23
  it("requires profileId and validates numeric commercialConditionId across actions", () => {
45
24
  expect(() => module.commercialConditionsSchema.parse({ action: "list" })).toThrow();
@@ -73,42 +52,12 @@ describe("vtex_commercial_conditions tool", () => {
73
52
  commercialConditionId: 10
74
53
  });
75
54
  expect(
76
- module.commercialConditionsSchema.parse({
55
+ () => module.commercialConditionsSchema.parse({
77
56
  action: "create",
78
57
  profileId: "profile-1",
79
58
  name: "9 cuotas"
80
59
  })
81
- ).toEqual({
82
- action: "create",
83
- profileId: "profile-1",
84
- name: "9 cuotas"
85
- });
86
- expect(
87
- module.commercialConditionsSchema.parse({
88
- action: "update",
89
- profileId: "profile-1",
90
- commercialConditionId: 10,
91
- name: "12 cuotas"
92
- })
93
- ).toEqual({
94
- action: "update",
95
- profileId: "profile-1",
96
- commercialConditionId: 10,
97
- name: "12 cuotas"
98
- });
99
- expect(
100
- module.commercialConditionsSchema.parse({
101
- action: "delete",
102
- profileId: "profile-1",
103
- commercialConditionId: 10,
104
- confirmed: true
105
- })
106
- ).toEqual({
107
- action: "delete",
108
- profileId: "profile-1",
109
- commercialConditionId: 10,
110
- confirmed: true
111
- });
60
+ ).toThrow();
112
61
  });
113
62
  it("returns compact list responses for commercial conditions", async () => {
114
63
  listCommercialConditionsMock.mockResolvedValue([
@@ -137,45 +86,13 @@ describe("vtex_commercial_conditions tool", () => {
137
86
  }
138
87
  });
139
88
  });
140
- it("creates, updates, gets and deletes commercial conditions through the service layer", async () => {
89
+ it("gets commercial conditions through the service layer", async () => {
141
90
  getCommercialConditionMock.mockResolvedValueOnce({ id: 10, name: "9 cuotas", isActive: true });
142
- getCommercialConditionMock.mockResolvedValueOnce({
143
- id: 10,
144
- name: "9 cuotas",
145
- description: "Promo base",
146
- isActive: true
147
- });
148
- createCommercialConditionMock.mockResolvedValue({ id: 10, Name: "9 cuotas" });
149
- updateCommercialConditionMock.mockResolvedValue({
150
- id: 10,
151
- Name: "12 cuotas",
152
- Description: "Promo base",
153
- IsActive: true
154
- });
155
- deleteCommercialConditionMock.mockResolvedValue(void 0);
156
91
  const fetched = await module.commercialConditionsHandler({
157
92
  action: "get",
158
93
  profileId: "profile-1",
159
94
  commercialConditionId: 10
160
95
  });
161
- const created = await module.commercialConditionsHandler({
162
- action: "create",
163
- profileId: "profile-1",
164
- name: "9 cuotas",
165
- description: "Promo"
166
- });
167
- const updated = await module.commercialConditionsHandler({
168
- action: "update",
169
- profileId: "profile-1",
170
- commercialConditionId: 10,
171
- name: "12 cuotas"
172
- });
173
- const deleted = await module.commercialConditionsHandler({
174
- action: "delete",
175
- profileId: "profile-1",
176
- commercialConditionId: 10,
177
- confirmed: true
178
- });
179
96
  expect(getCommercialConditionMock).toHaveBeenCalledWith("profile-1", 10);
180
97
  expect(fetched).toEqual({
181
98
  kind: "object",
@@ -185,92 +102,6 @@ describe("vtex_commercial_conditions tool", () => {
185
102
  condition: { id: 10, name: "9 cuotas", is_active: true }
186
103
  }
187
104
  });
188
- expect(createCommercialConditionMock).toHaveBeenCalledWith("profile-1", {
189
- Name: "9 cuotas",
190
- Description: "Promo"
191
- });
192
- expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(
193
- 1,
194
- expect.objectContaining({
195
- operation: "commercial_conditions_create",
196
- resourceId: "10",
197
- message: "Commercial condition created. You can now link it to payment rules or SKU assignments as needed.",
198
- after: { id: 10, Name: "9 cuotas" }
199
- })
200
- );
201
- expect(getCommercialConditionMock).toHaveBeenNthCalledWith(2, "profile-1", 10);
202
- expect(updateCommercialConditionMock).toHaveBeenCalledWith("profile-1", 10, {
203
- Name: "12 cuotas"
204
- });
205
- expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(
206
- 2,
207
- expect.objectContaining({
208
- operation: "commercial_conditions_update",
209
- resourceId: "10",
210
- message: "Commercial condition updated. Review linked payment rules and checkout behavior to confirm the intended installment strategy.",
211
- before: {
212
- id: 10,
213
- name: "9 cuotas",
214
- description: "Promo base",
215
- isActive: true
216
- },
217
- after: {
218
- id: 10,
219
- Name: "12 cuotas",
220
- Description: "Promo base",
221
- IsActive: true
222
- }
223
- })
224
- );
225
- expect(deleteCommercialConditionMock).toHaveBeenCalledWith("profile-1", 10);
226
- expect(created).toMatchObject({
227
- kind: "write",
228
- value: {
229
- operation: "commercial_conditions_create",
230
- riskLevel: "low",
231
- message: "Commercial condition created. You can now link it to payment rules or SKU assignments as needed."
232
- }
233
- });
234
- expect(updated).toMatchObject({
235
- kind: "write",
236
- value: {
237
- operation: "commercial_conditions_update",
238
- riskLevel: "medium",
239
- message: "Commercial condition updated. Review linked payment rules and checkout behavior to confirm the intended installment strategy."
240
- }
241
- });
242
- expect(deleted).toMatchObject({
243
- kind: "write",
244
- value: {
245
- operation: "commercial_conditions_delete",
246
- riskLevel: "high",
247
- warnings: [
248
- "Deleting a commercial condition can break linked payment rules and installment visibility until dependent rules are updated."
249
- ]
250
- }
251
- });
252
- expect(JSON.stringify(created)).not.toContain("sandbox");
253
- expect(JSON.stringify(created)).not.toContain("production");
254
- expect(JSON.stringify(created)).not.toContain("legacy");
255
- expect(JSON.stringify(updated)).not.toContain("sandbox");
256
- expect(JSON.stringify(updated)).not.toContain("production");
257
- expect(JSON.stringify(updated)).not.toContain("legacy");
258
- });
259
- it("requires explicit confirmation before deleting a commercial condition", async () => {
260
- requireExplicitConfirmationMock.mockReturnValueOnce({
261
- kind: "object",
262
- value: { success: false, risk_level: "high" }
263
- });
264
- const result = await module.commercialConditionsHandler({
265
- action: "delete",
266
- profileId: "profile-1",
267
- commercialConditionId: 10
268
- });
269
- expect(deleteCommercialConditionMock).not.toHaveBeenCalled();
270
- expect(result).toEqual({
271
- kind: "object",
272
- value: { success: false, risk_level: "high" }
273
- });
274
105
  });
275
106
  });
276
107
  //# sourceMappingURL=commercial-conditions.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/tools/vtex/__tests__/commercial-conditions.test.ts"],
4
- "sourcesContent": ["import { z } from \"zod\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\nconst listCommercialConditionsMock = vi.fn();\nconst getCommercialConditionMock = vi.fn();\nconst createCommercialConditionMock = vi.fn();\nconst updateCommercialConditionMock = vi.fn();\nconst deleteCommercialConditionMock = vi.fn();\nconst resolveVtexWriteProfileMock = vi.fn();\nconst buildWriteSuccessResponseMock = vi.fn((value) => ({ kind: \"write\", value }));\nconst handleVtexWriteErrorMock = vi.fn((_err, fallback) => ({ kind: \"error\", message: fallback }));\nconst requireExplicitConfirmationMock = vi.fn();\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-payments.js\", () => ({\n listCommercialConditions: listCommercialConditionsMock,\n getCommercialCondition: getCommercialConditionMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-payments-write.js\", () => ({\n createCommercialCondition: createCommercialConditionMock,\n updateCommercialCondition: updateCommercialConditionMock,\n deleteCommercialCondition: deleteCommercialConditionMock,\n}));\n\nvi.mock(\"../write-helpers.js\", () => ({\n confirmationSchemaField: z.boolean().optional().describe(\"confirmed\"),\n resolveVtexWriteProfile: resolveVtexWriteProfileMock,\n buildWriteSuccessResponse: buildWriteSuccessResponseMock,\n handleVtexWriteError: handleVtexWriteErrorMock,\n requireExplicitConfirmation: requireExplicitConfirmationMock,\n}));\n\nconst module = await import(\"../commercial-conditions.js\");\n\ndescribe(\"vtex_commercial_conditions tool\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n resolveVtexWriteProfileMock.mockResolvedValue({\n ok: true,\n value: { profileId: \"profile-1\" },\n });\n requireExplicitConfirmationMock.mockReturnValue(null);\n });\n\n it(\"requires profileId and validates numeric commercialConditionId across actions\", () => {\n expect(() => module.commercialConditionsSchema.parse({ action: \"list\" })).toThrow();\n expect(() =>\n module.commercialConditionsSchema.parse({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 1.5,\n })\n ).toThrow();\n\n expect(\n module.commercialConditionsSchema.parse({\n action: \"list\",\n profileId: \"profile-1\",\n search: \"9 cuotas\",\n })\n ).toEqual({\n action: \"list\",\n profileId: \"profile-1\",\n search: \"9 cuotas\",\n });\n\n expect(\n module.commercialConditionsSchema.parse({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n })\n ).toEqual({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n });\n\n expect(\n module.commercialConditionsSchema.parse({\n action: \"create\",\n profileId: \"profile-1\",\n name: \"9 cuotas\",\n })\n ).toEqual({\n action: \"create\",\n profileId: \"profile-1\",\n name: \"9 cuotas\",\n });\n\n expect(\n module.commercialConditionsSchema.parse({\n action: \"update\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n name: \"12 cuotas\",\n })\n ).toEqual({\n action: \"update\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n name: \"12 cuotas\",\n });\n\n expect(\n module.commercialConditionsSchema.parse({\n action: \"delete\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n confirmed: true,\n })\n ).toEqual({\n action: \"delete\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n confirmed: true,\n });\n });\n\n it(\"returns compact list responses for commercial conditions\", async () => {\n listCommercialConditionsMock.mockResolvedValue([\n { id: 10, name: \"9 cuotas\", isActive: true },\n { id: 11, name: \"12 cuotas\", IsActive: false },\n ]);\n\n const result = await module.commercialConditionsHandler({\n action: \"list\",\n profileId: \"profile-1\",\n search: \"cuotas\",\n });\n\n expect(listCommercialConditionsMock).toHaveBeenCalledWith(\"profile-1\", \"cuotas\");\n expect(result).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 2,\n profile_id: \"profile-1\",\n search: \"cuotas\",\n },\n conditions_schema: [\"id\", \"name\", \"is_active\"],\n conditions: [\n [10, \"9 cuotas\", true],\n [11, \"12 cuotas\", false],\n ],\n },\n });\n });\n\n it(\"creates, updates, gets and deletes commercial conditions through the service layer\", async () => {\n getCommercialConditionMock.mockResolvedValueOnce({ id: 10, name: \"9 cuotas\", isActive: true });\n getCommercialConditionMock.mockResolvedValueOnce({\n id: 10,\n name: \"9 cuotas\",\n description: \"Promo base\",\n isActive: true,\n });\n createCommercialConditionMock.mockResolvedValue({ id: 10, Name: \"9 cuotas\" });\n updateCommercialConditionMock.mockResolvedValue({\n id: 10,\n Name: \"12 cuotas\",\n Description: \"Promo base\",\n IsActive: true,\n });\n deleteCommercialConditionMock.mockResolvedValue(undefined);\n\n const fetched = await module.commercialConditionsHandler({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n });\n const created = await module.commercialConditionsHandler({\n action: \"create\",\n profileId: \"profile-1\",\n name: \"9 cuotas\",\n description: \"Promo\",\n });\n const updated = await module.commercialConditionsHandler({\n action: \"update\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n name: \"12 cuotas\",\n });\n const deleted = await module.commercialConditionsHandler({\n action: \"delete\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n confirmed: true,\n });\n\n expect(getCommercialConditionMock).toHaveBeenCalledWith(\"profile-1\", 10);\n expect(fetched).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n commercial_condition_id: 10,\n condition: { id: 10, name: \"9 cuotas\", is_active: true },\n },\n });\n expect(createCommercialConditionMock).toHaveBeenCalledWith(\"profile-1\", {\n Name: \"9 cuotas\",\n Description: \"Promo\",\n });\n expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n operation: \"commercial_conditions_create\",\n resourceId: \"10\",\n message:\n \"Commercial condition created. You can now link it to payment rules or SKU assignments as needed.\",\n after: { id: 10, Name: \"9 cuotas\" },\n })\n );\n expect(getCommercialConditionMock).toHaveBeenNthCalledWith(2, \"profile-1\", 10);\n expect(updateCommercialConditionMock).toHaveBeenCalledWith(\"profile-1\", 10, {\n Name: \"12 cuotas\",\n });\n expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(\n 2,\n expect.objectContaining({\n operation: \"commercial_conditions_update\",\n resourceId: \"10\",\n message:\n \"Commercial condition updated. Review linked payment rules and checkout behavior to confirm the intended installment strategy.\",\n before: {\n id: 10,\n name: \"9 cuotas\",\n description: \"Promo base\",\n isActive: true,\n },\n after: {\n id: 10,\n Name: \"12 cuotas\",\n Description: \"Promo base\",\n IsActive: true,\n },\n })\n );\n expect(deleteCommercialConditionMock).toHaveBeenCalledWith(\"profile-1\", 10);\n expect(created).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"commercial_conditions_create\",\n riskLevel: \"low\",\n message:\n \"Commercial condition created. You can now link it to payment rules or SKU assignments as needed.\",\n },\n });\n expect(updated).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"commercial_conditions_update\",\n riskLevel: \"medium\",\n message:\n \"Commercial condition updated. Review linked payment rules and checkout behavior to confirm the intended installment strategy.\",\n },\n });\n expect(deleted).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"commercial_conditions_delete\",\n riskLevel: \"high\",\n warnings: [\n \"Deleting a commercial condition can break linked payment rules and installment visibility until dependent rules are updated.\",\n ],\n },\n });\n expect(JSON.stringify(created)).not.toContain(\"sandbox\");\n expect(JSON.stringify(created)).not.toContain(\"production\");\n expect(JSON.stringify(created)).not.toContain(\"legacy\");\n expect(JSON.stringify(updated)).not.toContain(\"sandbox\");\n expect(JSON.stringify(updated)).not.toContain(\"production\");\n expect(JSON.stringify(updated)).not.toContain(\"legacy\");\n });\n\n it(\"requires explicit confirmation before deleting a commercial condition\", async () => {\n requireExplicitConfirmationMock.mockReturnValueOnce({\n kind: \"object\",\n value: { success: false, risk_level: \"high\" },\n });\n\n const result = await module.commercialConditionsHandler({\n action: \"delete\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n });\n\n expect(deleteCommercialConditionMock).not.toHaveBeenCalled();\n expect(result).toEqual({\n kind: \"object\",\n value: { success: false, risk_level: \"high\" },\n });\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,SAAS;AAClB,SAAS,YAAY,UAAU,QAAQ,IAAI,UAAU;AAErD,MAAM,aAAa,GAAG,GAAG,CAAC,WAAW,EAAE,MAAM,UAAU,MAAM,EAAE;AAC/D,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,EAAE,MAAM,SAAS,QAAQ,EAAE;AACjE,MAAM,+BAA+B,GAAG,GAAG;AAC3C,MAAM,6BAA6B,GAAG,GAAG;AACzC,MAAM,gCAAgC,GAAG,GAAG;AAC5C,MAAM,gCAAgC,GAAG,GAAG;AAC5C,MAAM,gCAAgC,GAAG,GAAG;AAC5C,MAAM,8BAA8B,GAAG,GAAG;AAC1C,MAAM,gCAAgC,GAAG,GAAG,CAAC,WAAW,EAAE,MAAM,SAAS,MAAM,EAAE;AACjF,MAAM,2BAA2B,GAAG,GAAG,CAAC,MAAM,cAAc,EAAE,MAAM,SAAS,SAAS,SAAS,EAAE;AACjG,MAAM,kCAAkC,GAAG,GAAG;AAE9C,GAAG,KAAK,kBAAkB,OAAO;AAAA,EAC/B,QAAQ;AAAA,EACR,OAAO;AACT,EAAE;AAEF,GAAG,KAAK,2CAA2C,OAAO;AAAA,EACxD,0BAA0B;AAAA,EAC1B,wBAAwB;AAC1B,EAAE;AAEF,GAAG,KAAK,iDAAiD,OAAO;AAAA,EAC9D,2BAA2B;AAAA,EAC3B,2BAA2B;AAAA,EAC3B,2BAA2B;AAC7B,EAAE;AAEF,GAAG,KAAK,uBAAuB,OAAO;AAAA,EACpC,yBAAyB,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,WAAW;AAAA,EACpE,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,sBAAsB;AAAA,EACtB,6BAA6B;AAC/B,EAAE;AAEF,MAAM,SAAS,MAAM,OAAO,6BAA6B;AAEzD,SAAS,mCAAmC,MAAM;AAChD,aAAW,MAAM;AACf,OAAG,cAAc;AACjB,gCAA4B,kBAAkB;AAAA,MAC5C,IAAI;AAAA,MACJ,OAAO,EAAE,WAAW,YAAY;AAAA,IAClC,CAAC;AACD,oCAAgC,gBAAgB,IAAI;AAAA,EACtD,CAAC;AAED,KAAG,iFAAiF,MAAM;AACxF,WAAO,MAAM,OAAO,2BAA2B,MAAM,EAAE,QAAQ,OAAO,CAAC,CAAC,EAAE,QAAQ;AAClF;AAAA,MAAO,MACL,OAAO,2BAA2B,MAAM;AAAA,QACtC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,uBAAuB;AAAA,MACzB,CAAC;AAAA,IACH,EAAE,QAAQ;AAEV;AAAA,MACE,OAAO,2BAA2B,MAAM;AAAA,QACtC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,QAAQ;AAAA,MACV,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AAED;AAAA,MACE,OAAO,2BAA2B,MAAM;AAAA,QACtC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,uBAAuB;AAAA,MACzB,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,uBAAuB;AAAA,IACzB,CAAC;AAED;AAAA,MACE,OAAO,2BAA2B,MAAM;AAAA,QACtC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,MAAM;AAAA,MACR,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,MAAM;AAAA,IACR,CAAC;AAED;AAAA,MACE,OAAO,2BAA2B,MAAM;AAAA,QACtC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,uBAAuB;AAAA,QACvB,MAAM;AAAA,MACR,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,uBAAuB;AAAA,MACvB,MAAM;AAAA,IACR,CAAC;AAED;AAAA,MACE,OAAO,2BAA2B,MAAM;AAAA,QACtC,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,uBAAuB;AAAA,QACvB,WAAW;AAAA,MACb,CAAC;AAAA,IACH,EAAE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,uBAAuB;AAAA,MACvB,WAAW;AAAA,IACb,CAAC;AAAA,EACH,CAAC;AAED,KAAG,4DAA4D,YAAY;AACzE,iCAA6B,kBAAkB;AAAA,MAC7C,EAAE,IAAI,IAAI,MAAM,YAAY,UAAU,KAAK;AAAA,MAC3C,EAAE,IAAI,IAAI,MAAM,aAAa,UAAU,MAAM;AAAA,IAC/C,CAAC;AAED,UAAM,SAAS,MAAM,OAAO,4BAA4B;AAAA,MACtD,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,CAAC;AAED,WAAO,4BAA4B,EAAE,qBAAqB,aAAa,QAAQ;AAC/E,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,UAAU;AAAA,UACR,OAAO;AAAA,UACP,YAAY;AAAA,UACZ,QAAQ;AAAA,QACV;AAAA,QACA,mBAAmB,CAAC,MAAM,QAAQ,WAAW;AAAA,QAC7C,YAAY;AAAA,UACV,CAAC,IAAI,YAAY,IAAI;AAAA,UACrB,CAAC,IAAI,aAAa,KAAK;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,KAAG,sFAAsF,YAAY;AACnG,+BAA2B,sBAAsB,EAAE,IAAI,IAAI,MAAM,YAAY,UAAU,KAAK,CAAC;AAC7F,+BAA2B,sBAAsB;AAAA,MAC/C,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AACD,kCAA8B,kBAAkB,EAAE,IAAI,IAAI,MAAM,WAAW,CAAC;AAC5E,kCAA8B,kBAAkB;AAAA,MAC9C,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ,CAAC;AACD,kCAA8B,kBAAkB,MAAS;AAEzD,UAAM,UAAU,MAAM,OAAO,4BAA4B;AAAA,MACvD,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,uBAAuB;AAAA,IACzB,CAAC;AACD,UAAM,UAAU,MAAM,OAAO,4BAA4B;AAAA,MACvD,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AACD,UAAM,UAAU,MAAM,OAAO,4BAA4B;AAAA,MACvD,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,uBAAuB;AAAA,MACvB,MAAM;AAAA,IACR,CAAC;AACD,UAAM,UAAU,MAAM,OAAO,4BAA4B;AAAA,MACvD,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,uBAAuB;AAAA,MACvB,WAAW;AAAA,IACb,CAAC;AAED,WAAO,0BAA0B,EAAE,qBAAqB,aAAa,EAAE;AACvE,WAAO,OAAO,EAAE,QAAQ;AAAA,MACtB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,yBAAyB;AAAA,QACzB,WAAW,EAAE,IAAI,IAAI,MAAM,YAAY,WAAW,KAAK;AAAA,MACzD;AAAA,IACF,CAAC;AACD,WAAO,6BAA6B,EAAE,qBAAqB,aAAa;AAAA,MACtE,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AACD,WAAO,6BAA6B,EAAE;AAAA,MACpC;AAAA,MACA,OAAO,iBAAiB;AAAA,QACtB,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,SACE;AAAA,QACF,OAAO,EAAE,IAAI,IAAI,MAAM,WAAW;AAAA,MACpC,CAAC;AAAA,IACH;AACA,WAAO,0BAA0B,EAAE,wBAAwB,GAAG,aAAa,EAAE;AAC7E,WAAO,6BAA6B,EAAE,qBAAqB,aAAa,IAAI;AAAA,MAC1E,MAAM;AAAA,IACR,CAAC;AACD,WAAO,6BAA6B,EAAE;AAAA,MACpC;AAAA,MACA,OAAO,iBAAiB;AAAA,QACtB,WAAW;AAAA,QACX,YAAY;AAAA,QACZ,SACE;AAAA,QACF,QAAQ;AAAA,UACN,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,UAAU;AAAA,QACZ;AAAA,QACA,OAAO;AAAA,UACL,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,aAAa;AAAA,UACb,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO,6BAA6B,EAAE,qBAAqB,aAAa,EAAE;AAC1E,WAAO,OAAO,EAAE,cAAc;AAAA,MAC5B,MAAM;AAAA,MACN,OAAO;AAAA,QACL,WAAW;AAAA,QACX,WAAW;AAAA,QACX,SACE;AAAA,MACJ;AAAA,IACF,CAAC;AACD,WAAO,OAAO,EAAE,cAAc;AAAA,MAC5B,MAAM;AAAA,MACN,OAAO;AAAA,QACL,WAAW;AAAA,QACX,WAAW;AAAA,QACX,SACE;AAAA,MACJ;AAAA,IACF,CAAC;AACD,WAAO,OAAO,EAAE,cAAc;AAAA,MAC5B,MAAM;AAAA,MACN,OAAO;AAAA,QACL,WAAW;AAAA,QACX,WAAW;AAAA,QACX,UAAU;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,UAAU,SAAS;AACvD,WAAO,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,UAAU,YAAY;AAC1D,WAAO,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,UAAU,QAAQ;AACtD,WAAO,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,UAAU,SAAS;AACvD,WAAO,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,UAAU,YAAY;AAC1D,WAAO,KAAK,UAAU,OAAO,CAAC,EAAE,IAAI,UAAU,QAAQ;AAAA,EACxD,CAAC;AAED,KAAG,yEAAyE,YAAY;AACtF,oCAAgC,oBAAoB;AAAA,MAClD,MAAM;AAAA,MACN,OAAO,EAAE,SAAS,OAAO,YAAY,OAAO;AAAA,IAC9C,CAAC;AAED,UAAM,SAAS,MAAM,OAAO,4BAA4B;AAAA,MACtD,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,uBAAuB;AAAA,IACzB,CAAC;AAED,WAAO,6BAA6B,EAAE,IAAI,iBAAiB;AAC3D,WAAO,MAAM,EAAE,QAAQ;AAAA,MACrB,MAAM;AAAA,MACN,OAAO,EAAE,SAAS,OAAO,YAAY,OAAO;AAAA,IAC9C,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
4
+ "sourcesContent": ["import { z } from \"zod\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nconst objectMock = vi.fn((value) => ({ kind: \"object\", value }));\nconst errorMock = vi.fn((message) => ({ kind: \"error\", message }));\nconst listCommercialConditionsMock = vi.fn();\nconst getCommercialConditionMock = vi.fn();\n\nvi.mock(\"mcp-use/server\", () => ({\n object: objectMock,\n error: errorMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-payments.js\", () => ({\n listCommercialConditions: listCommercialConditionsMock,\n getCommercialCondition: getCommercialConditionMock,\n}));\n\nvi.mock(\"../write-helpers.js\", () => ({\n vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe(\"profile\"),\n}));\n\nconst module = await import(\"../commercial-conditions.js\");\n\ndescribe(\"vtex_commercial_conditions tool\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"requires profileId and validates numeric commercialConditionId across actions\", () => {\n expect(() => module.commercialConditionsSchema.parse({ action: \"list\" })).toThrow();\n expect(() =>\n module.commercialConditionsSchema.parse({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 1.5,\n })\n ).toThrow();\n\n expect(\n module.commercialConditionsSchema.parse({\n action: \"list\",\n profileId: \"profile-1\",\n search: \"9 cuotas\",\n })\n ).toEqual({\n action: \"list\",\n profileId: \"profile-1\",\n search: \"9 cuotas\",\n });\n\n expect(\n module.commercialConditionsSchema.parse({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n })\n ).toEqual({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n });\n\n expect(() =>\n module.commercialConditionsSchema.parse({\n action: \"create\",\n profileId: \"profile-1\",\n name: \"9 cuotas\",\n })\n ).toThrow();\n });\n\n it(\"returns compact list responses for commercial conditions\", async () => {\n listCommercialConditionsMock.mockResolvedValue([\n { id: 10, name: \"9 cuotas\", isActive: true },\n { id: 11, name: \"12 cuotas\", IsActive: false },\n ]);\n\n const result = await module.commercialConditionsHandler({\n action: \"list\",\n profileId: \"profile-1\",\n search: \"cuotas\",\n });\n\n expect(listCommercialConditionsMock).toHaveBeenCalledWith(\"profile-1\", \"cuotas\");\n expect(result).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 2,\n profile_id: \"profile-1\",\n search: \"cuotas\",\n },\n conditions_schema: [\"id\", \"name\", \"is_active\"],\n conditions: [\n [10, \"9 cuotas\", true],\n [11, \"12 cuotas\", false],\n ],\n },\n });\n });\n\n it(\"gets commercial conditions through the service layer\", async () => {\n getCommercialConditionMock.mockResolvedValueOnce({ id: 10, name: \"9 cuotas\", isActive: true });\n\n const fetched = await module.commercialConditionsHandler({\n action: \"get\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n });\n\n expect(getCommercialConditionMock).toHaveBeenCalledWith(\"profile-1\", 10);\n expect(fetched).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n commercial_condition_id: 10,\n condition: { id: 10, name: \"9 cuotas\", is_active: true },\n },\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -25,6 +25,7 @@ vi.mock("../../../services/vtex/vtex-payments-write.js", () => ({
25
25
  deletePaymentRule: deletePaymentRuleMock
26
26
  }));
27
27
  vi.mock("../write-helpers.js", () => ({
28
+ vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe("profile"),
28
29
  confirmationSchemaField: z.boolean().optional().describe("confirmed"),
29
30
  resolveVtexWriteProfile: resolveVtexWriteProfileMock,
30
31
  buildWriteSuccessResponse: buildWriteSuccessResponseMock,