@yoryoboy/bi-mcp 1.14.0 → 1.14.2
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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp-use.json +2 -2
- package/dist/src/services/vtex/__tests__/vtex-payments.test.js +12 -9
- package/dist/src/services/vtex/__tests__/vtex-payments.test.js.map +2 -2
- package/dist/src/services/vtex/vtex-payments.js +11 -5
- package/dist/src/services/vtex/vtex-payments.js.map +2 -2
- package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js +4 -173
- package/dist/src/tools/vtex/__tests__/commercial-conditions.test.js.map +2 -2
- package/dist/src/tools/vtex/__tests__/payment-rules.test.js +1 -0
- package/dist/src/tools/vtex/__tests__/payment-rules.test.js.map +2 -2
- package/dist/src/tools/vtex/catalog-admin-products-skus.js +1 -1
- package/dist/src/tools/vtex/catalog-admin-products-skus.js.map +1 -1
- package/dist/src/tools/vtex/commercial-conditions.js +35 -150
- package/dist/src/tools/vtex/commercial-conditions.js.map +2 -2
- package/dist/src/tools/vtex/create-sku.js +1 -1
- package/dist/src/tools/vtex/create-sku.js.map +1 -1
- package/dist/src/tools/vtex/payment-rules.js +81 -38
- package/dist/src/tools/vtex/payment-rules.js.map +2 -2
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js +12 -4
- package/dist/tests/vtex/vtex-commercial-conditions-docs.test.js.map +2 -2
- package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js +121 -12
- package/dist/tests/vtex/vtex-commercial-conditions-surface.test.js.map +2 -2
- package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js +15 -23
- package/dist/tests/vtex/vtex-commercial-conditions-workflow.test.js.map +2 -2
- package/package.json +1 -1
|
@@ -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
|
-
|
|
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
|
-
).
|
|
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("
|
|
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;
|
|
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,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/tools/vtex/__tests__/payment-rules.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 listPaymentRulesMock = vi.fn();\nconst getPaymentRuleMock = vi.fn();\nconst createPaymentRuleMock = vi.fn();\nconst updatePaymentRuleMock = vi.fn();\nconst deletePaymentRuleMock = 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 listPaymentRules: listPaymentRulesMock,\n getPaymentRule: getPaymentRuleMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-payments-write.js\", () => ({\n createPaymentRule: createPaymentRuleMock,\n updatePaymentRule: updatePaymentRuleMock,\n deletePaymentRule: deletePaymentRuleMock,\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(\"../payment-rules.js\");\n\ndescribe(\"vtex_payment_rules 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 payment rule action payloads\", () => {\n expect(() => module.paymentRulesSchema.parse({ action: \"list\" })).toThrow();\n expect(() =>\n module.paymentRulesSchema.parse({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n })\n ).toThrow(/installments/i);\n\n expect(\n module.paymentRulesSchema.parse({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n salesChannel: \"1\",\n restrictedByCondition: true,\n installments: [\n { count: 9, interest: false },\n { count: 12, interest: true },\n ],\n })\n ).toEqual({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n salesChannel: \"1\",\n restrictedByCondition: true,\n installments: [\n { count: 9, interest: false },\n { count: 12, interest: true },\n ],\n });\n\n expect(\n module.paymentRulesSchema.parse({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 77,\n confirmed: true,\n })\n ).toEqual({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 77,\n confirmed: true,\n });\n });\n\n it(\"returns compact list responses for payment rules\", async () => {\n listPaymentRulesMock.mockResolvedValue([\n {\n id: 51,\n commercialConditionId: 10,\n paymentSystem: \"2\",\n salesChannel: \"1\",\n restrictedByCondition: true,\n },\n ]);\n\n const result = await module.paymentRulesHandler({\n action: \"list\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n });\n\n expect(listPaymentRulesMock).toHaveBeenCalledWith(\"profile-1\", { commercialConditionId: 10 });\n expect(result).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 1,\n profile_id: \"profile-1\",\n filters: { commercial_condition_id: 10 },\n },\n payment_rules_schema: [\n \"id\",\n \"commercial_condition_id\",\n \"payment_system\",\n \"sales_channel\",\n \"restricted_by_condition\",\n ],\n payment_rules: [[51, 10, \"2\", \"1\", true]],\n },\n });\n });\n\n it(\"gets, creates, updates and deletes payment rules through the service layer\", async () => {\n getPaymentRuleMock.mockResolvedValue({\n id: 51,\n commercialConditionId: 10,\n paymentSystem: \"2\",\n installments: [{ count: 9, interest: false }],\n });\n createPaymentRuleMock.mockResolvedValue({ id: 51, paymentSystem: \"2\" });\n updatePaymentRuleMock.mockResolvedValue({ id: 51, paymentSystem: \"2\" });\n deletePaymentRuleMock.mockResolvedValue(undefined);\n\n const fetched = await module.paymentRulesHandler({\n action: \"get\",\n profileId: \"profile-1\",\n ruleId: 51,\n });\n const created = await module.paymentRulesHandler({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n installments: [{ count: 9, interest: false }],\n });\n const updated = await module.paymentRulesHandler({\n action: \"update\",\n profileId: \"profile-1\",\n ruleId: 51,\n installments: [{ count: 12, interest: true }],\n });\n const deleted = await module.paymentRulesHandler({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 51,\n confirmed: true,\n });\n\n expect(getPaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", 51);\n expect(fetched).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n rule_id: 51,\n payment_rule: {\n id: 51,\n commercial_condition_id: 10,\n payment_system: \"2\",\n installments: [{ count: 9, interest: false }],\n },\n },\n });\n expect(createPaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", {\n commercialConditionId: 10,\n paymentSystem: \"2\",\n installments: [{ count: 9, interest: false }],\n });\n expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n operation: \"payment_rules_create\",\n resourceId: \"51\",\n message:\n \"Payment rule created. Review checkout installments and condition targeting to confirm the expected shopper experience.\",\n after: { id: 51, paymentSystem: \"2\" },\n })\n );\n expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(\n 2,\n expect.objectContaining({\n operation: \"payment_rules_update\",\n resourceId: \"51\",\n message:\n \"Payment rule updated. Review checkout installments to confirm the expected payment options.\",\n after: { id: 51, paymentSystem: \"2\" },\n })\n );\n expect(updatePaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", 51, {\n installments: [{ count: 12, interest: true }],\n });\n expect(deletePaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", 51);\n expect(created).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_create\",\n riskLevel: \"medium\",\n message:\n \"Payment rule created. Review checkout installments and condition targeting to confirm the expected shopper experience.\",\n },\n });\n expect(updated).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_update\",\n riskLevel: \"medium\",\n message:\n \"Payment rule updated. Review checkout installments to confirm the expected payment options.\",\n },\n });\n expect(deleted).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_delete\",\n riskLevel: \"high\",\n warnings: [\n \"Deleting a payment rule can immediately remove installment options from checkout for affected shoppers.\",\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 payment rule\", async () => {\n requireExplicitConfirmationMock.mockReturnValueOnce({\n kind: \"object\",\n value: { success: false, risk_level: \"high\" },\n });\n\n const result = await module.paymentRulesHandler({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 51,\n });\n\n expect(deletePaymentRuleMock).not.toHaveBeenCalled();\n expect(result).toEqual({\n kind: \"object\",\n value: { success: false, risk_level: \"high\" },\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
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 listPaymentRulesMock = vi.fn();\nconst getPaymentRuleMock = vi.fn();\nconst createPaymentRuleMock = vi.fn();\nconst updatePaymentRuleMock = vi.fn();\nconst deletePaymentRuleMock = 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 listPaymentRules: listPaymentRulesMock,\n getPaymentRule: getPaymentRuleMock,\n}));\n\nvi.mock(\"../../../services/vtex/vtex-payments-write.js\", () => ({\n createPaymentRule: createPaymentRuleMock,\n updatePaymentRule: updatePaymentRuleMock,\n deletePaymentRule: deletePaymentRuleMock,\n}));\n\nvi.mock(\"../write-helpers.js\", () => ({\n vtexProfileIdSchemaField: z.string().trim().min(1).optional().describe(\"profile\"),\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(\"../payment-rules.js\");\n\ndescribe(\"vtex_payment_rules 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 payment rule action payloads\", () => {\n expect(() => module.paymentRulesSchema.parse({ action: \"list\" })).toThrow();\n expect(() =>\n module.paymentRulesSchema.parse({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n })\n ).toThrow(/installments/i);\n\n expect(\n module.paymentRulesSchema.parse({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n salesChannel: \"1\",\n restrictedByCondition: true,\n installments: [\n { count: 9, interest: false },\n { count: 12, interest: true },\n ],\n })\n ).toEqual({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n salesChannel: \"1\",\n restrictedByCondition: true,\n installments: [\n { count: 9, interest: false },\n { count: 12, interest: true },\n ],\n });\n\n expect(\n module.paymentRulesSchema.parse({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 77,\n confirmed: true,\n })\n ).toEqual({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 77,\n confirmed: true,\n });\n });\n\n it(\"returns compact list responses for payment rules\", async () => {\n listPaymentRulesMock.mockResolvedValue([\n {\n id: 51,\n commercialConditionId: 10,\n paymentSystem: \"2\",\n salesChannel: \"1\",\n restrictedByCondition: true,\n },\n ]);\n\n const result = await module.paymentRulesHandler({\n action: \"list\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n });\n\n expect(listPaymentRulesMock).toHaveBeenCalledWith(\"profile-1\", { commercialConditionId: 10 });\n expect(result).toEqual({\n kind: \"object\",\n value: {\n metadata: {\n total: 1,\n profile_id: \"profile-1\",\n filters: { commercial_condition_id: 10 },\n },\n payment_rules_schema: [\n \"id\",\n \"commercial_condition_id\",\n \"payment_system\",\n \"sales_channel\",\n \"restricted_by_condition\",\n ],\n payment_rules: [[51, 10, \"2\", \"1\", true]],\n },\n });\n });\n\n it(\"gets, creates, updates and deletes payment rules through the service layer\", async () => {\n getPaymentRuleMock.mockResolvedValue({\n id: 51,\n commercialConditionId: 10,\n paymentSystem: \"2\",\n installments: [{ count: 9, interest: false }],\n });\n createPaymentRuleMock.mockResolvedValue({ id: 51, paymentSystem: \"2\" });\n updatePaymentRuleMock.mockResolvedValue({ id: 51, paymentSystem: \"2\" });\n deletePaymentRuleMock.mockResolvedValue(undefined);\n\n const fetched = await module.paymentRulesHandler({\n action: \"get\",\n profileId: \"profile-1\",\n ruleId: 51,\n });\n const created = await module.paymentRulesHandler({\n action: \"create\",\n profileId: \"profile-1\",\n commercialConditionId: 10,\n paymentSystem: \"2\",\n installments: [{ count: 9, interest: false }],\n });\n const updated = await module.paymentRulesHandler({\n action: \"update\",\n profileId: \"profile-1\",\n ruleId: 51,\n installments: [{ count: 12, interest: true }],\n });\n const deleted = await module.paymentRulesHandler({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 51,\n confirmed: true,\n });\n\n expect(getPaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", 51);\n expect(fetched).toEqual({\n kind: \"object\",\n value: {\n profile_id: \"profile-1\",\n rule_id: 51,\n payment_rule: {\n id: 51,\n commercial_condition_id: 10,\n payment_system: \"2\",\n installments: [{ count: 9, interest: false }],\n },\n },\n });\n expect(createPaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", {\n commercialConditionId: 10,\n paymentSystem: \"2\",\n installments: [{ count: 9, interest: false }],\n });\n expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(\n 1,\n expect.objectContaining({\n operation: \"payment_rules_create\",\n resourceId: \"51\",\n message:\n \"Payment rule created. Review checkout installments and condition targeting to confirm the expected shopper experience.\",\n after: { id: 51, paymentSystem: \"2\" },\n })\n );\n expect(buildWriteSuccessResponseMock).toHaveBeenNthCalledWith(\n 2,\n expect.objectContaining({\n operation: \"payment_rules_update\",\n resourceId: \"51\",\n message:\n \"Payment rule updated. Review checkout installments to confirm the expected payment options.\",\n after: { id: 51, paymentSystem: \"2\" },\n })\n );\n expect(updatePaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", 51, {\n installments: [{ count: 12, interest: true }],\n });\n expect(deletePaymentRuleMock).toHaveBeenCalledWith(\"profile-1\", 51);\n expect(created).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_create\",\n riskLevel: \"medium\",\n message:\n \"Payment rule created. Review checkout installments and condition targeting to confirm the expected shopper experience.\",\n },\n });\n expect(updated).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_update\",\n riskLevel: \"medium\",\n message:\n \"Payment rule updated. Review checkout installments to confirm the expected payment options.\",\n },\n });\n expect(deleted).toMatchObject({\n kind: \"write\",\n value: {\n operation: \"payment_rules_delete\",\n riskLevel: \"high\",\n warnings: [\n \"Deleting a payment rule can immediately remove installment options from checkout for affected shoppers.\",\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 payment rule\", async () => {\n requireExplicitConfirmationMock.mockReturnValueOnce({\n kind: \"object\",\n value: { success: false, risk_level: \"high\" },\n });\n\n const result = await module.paymentRulesHandler({\n action: \"delete\",\n profileId: \"profile-1\",\n ruleId: 51,\n });\n\n expect(deletePaymentRuleMock).not.toHaveBeenCalled();\n expect(result).toEqual({\n kind: \"object\",\n value: { success: false, risk_level: \"high\" },\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -126,7 +126,7 @@ const updateSkuBasicFieldsSchema = z.object({
|
|
|
126
126
|
unitMultiplier: z.number().positive().optional().describe("Unit multiplier."),
|
|
127
127
|
manufacturerCode: z.string().optional().describe("Manufacturer code."),
|
|
128
128
|
commercialConditionId: z.number().int().positive().optional().describe(
|
|
129
|
-
"Commercial condition ID. Use vtex_commercial_conditions to
|
|
129
|
+
"Commercial condition ID. Use vtex_commercial_conditions to inspect available condition IDs and vtex_payment_rules to configure linked installment/payment behavior."
|
|
130
130
|
),
|
|
131
131
|
isActive: z.boolean().optional().describe("Whether the SKU should remain active."),
|
|
132
132
|
activateIfPossible: z.boolean().optional().describe("Whether VTEX should auto-activate the SKU when possible.")
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/vtex/catalog-admin-products-skus.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\n\nimport {\n addSkuEan,\n attachSkuImage,\n createProduct,\n createSku,\n getSkuImages,\n replaceSkuEans,\n updateProductBasicFields as applyProductBasicFields,\n updateSkuBasicFields as applySkuBasicFields,\n updateSkuImage,\n} from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\ntype CatalogWriteExecutor<TParams extends { profileId?: string }, TResult> = {\n params: TParams;\n operation: string;\n message: string;\n fallbackError: string;\n riskLevel: \"low\" | \"medium\" | \"high\";\n execute: (resolvedProfileId: string, params: TParams) => Promise<TResult>;\n resourceId: (result: TResult, params: TParams) => string | undefined;\n before?: (result: TResult, params: TParams) => Record<string, unknown> | null;\n after?: (result: TResult, params: TParams) => Record<string, unknown> | null;\n details?: (result: TResult, params: TParams) => Record<string, unknown> | undefined;\n};\n\nasync function executeCatalogWrite<TParams extends { profileId?: string }, TResult>({\n params,\n operation,\n message,\n fallbackError,\n riskLevel,\n execute,\n resourceId,\n before,\n after,\n details,\n}: CatalogWriteExecutor<TParams, TResult>) {\n try {\n const profileResolution = await resolveVtexWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n const result = await execute(resolvedProfileId, params);\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation,\n resourceId: resourceId(result, params),\n riskLevel,\n message,\n before: before?.(result, params),\n after: after?.(result, params) ?? (result as Record<string, unknown>),\n details: details?.(result, params),\n });\n } catch (err) {\n return handleVtexWriteError(err, fallbackError);\n }\n}\n\nexport const updateProductBasicFieldsSchema = z\n .object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().min(1).describe(\"VTEX product identifier.\"),\n name: z.string().min(1).optional().describe(\"New product name.\"),\n categoryId: z.number().int().positive().optional().describe(\"New category identifier.\"),\n brandId: z.number().int().positive().optional().describe(\"New brand identifier.\"),\n description: z.string().optional().describe(\"New product description.\"),\n descriptionShort: z.string().optional().describe(\"New short description.\"),\n title: z.string().optional().describe(\"New SEO title.\"),\n linkId: z.string().optional().describe(\"New product slug.\"),\n refId: z.string().optional().describe(\"New internal reference code.\"),\n isVisible: z.boolean().optional().describe(\"Whether the product should remain visible in listings.\"),\n isActive: z.boolean().optional().describe(\"Whether the product should remain active.\"),\n keyWords: z.string().optional().describe(\"New keywords string.\"),\n releaseDate: z.string().optional().describe(\"New release date in ISO format.\"),\n metaTagDescription: z.string().optional().describe(\"New meta description.\"),\n showWithoutStock: z\n .boolean()\n .optional()\n .describe(\"Whether the product can stay visible without stock.\"),\n })\n .refine(\n (value) =>\n value.name !== undefined ||\n value.categoryId !== undefined ||\n value.brandId !== undefined ||\n value.description !== undefined ||\n value.descriptionShort !== undefined ||\n value.title !== undefined ||\n value.linkId !== undefined ||\n value.refId !== undefined ||\n value.isVisible !== undefined ||\n value.isActive !== undefined ||\n value.keyWords !== undefined ||\n value.releaseDate !== undefined ||\n value.metaTagDescription !== undefined ||\n value.showWithoutStock !== undefined,\n {\n message: \"At least one product field must be provided.\",\n path: [\"name\"],\n }\n );\n\nexport async function updateProductBasicFieldsHandler({\n profileId,\n productId,\n ...updates\n}: z.infer<typeof updateProductBasicFieldsSchema>) {\n return executeCatalogWrite({\n params: { profileId, productId, ...updates },\n operation: \"update_product_basic_fields\",\n message: \"Product fields updated successfully.\",\n fallbackError: `Failed to update product ${productId}`,\n riskLevel: \"medium\",\n execute: (resolvedProfileId, currentParams) => {\n const { profileId: _ignoredProfileId, productId: _ignoredProductId, ...productUpdates } = currentParams;\n return applyProductBasicFields(resolvedProfileId, currentParams.productId, productUpdates);\n },\n resourceId: (_result, currentParams) => currentParams.productId,\n before: (result) => result.before,\n after: (result) => result.after,\n details: (_result, currentParams) => ({\n product_id: currentParams.productId,\n }),\n });\n}\n\nexport const updateProductBrandSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().min(1).describe(\"VTEX product identifier.\"),\n brandId: z.number().int().positive().describe(\"Brand identifier to set on the product.\"),\n});\n\nexport async function updateProductBrandHandler(params: z.infer<typeof updateProductBrandSchema>) {\n return updateProductBasicFieldsHandler({\n profileId: params.profileId,\n productId: params.productId,\n brandId: params.brandId,\n });\n}\n\nexport const updateSkuBasicFieldsSchema = z\n .object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n name: z.string().min(1).optional().describe(\"New SKU name.\"),\n refId: z.string().optional().describe(\"New SKU reference code.\"),\n ean: z\n .string()\n .optional()\n .describe(\"New EAN. When informed, existing EAN values are replaced with this one.\"),\n packagedHeight: z.number().nonnegative().optional().describe(\"Packaged height.\"),\n packagedLength: z.number().nonnegative().optional().describe(\"Packaged length.\"),\n packagedWidth: z.number().nonnegative().optional().describe(\"Packaged width.\"),\n packagedWeightKg: z.number().nonnegative().optional().describe(\"Packaged weight in kg.\"),\n height: z.number().nonnegative().optional().describe(\"Physical height.\"),\n length: z.number().nonnegative().optional().describe(\"Physical length.\"),\n width: z.number().nonnegative().optional().describe(\"Physical width.\"),\n weightKg: z.number().nonnegative().optional().describe(\"Physical weight in kg.\"),\n measurementUnit: z.string().optional().describe(\"Measurement unit.\"),\n unitMultiplier: z.number().positive().optional().describe(\"Unit multiplier.\"),\n manufacturerCode: z.string().optional().describe(\"Manufacturer code.\"),\n commercialConditionId: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Commercial condition ID. Use vtex_commercial_conditions to manage condition records and vtex_payment_rules to configure linked installment/payment behavior.\"\n ),\n isActive: z.boolean().optional().describe(\"Whether the SKU should remain active.\"),\n activateIfPossible: z\n .boolean()\n .optional()\n .describe(\"Whether VTEX should auto-activate the SKU when possible.\"),\n })\n .refine(\n (value) =>\n value.name !== undefined ||\n value.refId !== undefined ||\n value.ean !== undefined ||\n value.packagedHeight !== undefined ||\n value.packagedLength !== undefined ||\n value.packagedWidth !== undefined ||\n value.packagedWeightKg !== undefined ||\n value.height !== undefined ||\n value.length !== undefined ||\n value.width !== undefined ||\n value.weightKg !== undefined ||\n value.measurementUnit !== undefined ||\n value.unitMultiplier !== undefined ||\n value.manufacturerCode !== undefined ||\n value.commercialConditionId !== undefined ||\n value.isActive !== undefined ||\n value.activateIfPossible !== undefined,\n {\n message: \"At least one SKU field must be provided.\",\n path: [\"name\"],\n }\n );\n\nexport async function updateSkuBasicFieldsHandler({\n profileId,\n skuId,\n ean,\n ...updates\n}: z.infer<typeof updateSkuBasicFieldsSchema>) {\n return executeCatalogWrite({\n params: { profileId, skuId, ean, ...updates },\n operation: \"update_sku_basic_fields\",\n message: \"SKU fields updated successfully.\",\n fallbackError: `Failed to update SKU ${skuId}`,\n riskLevel: \"medium\",\n execute: async (resolvedProfileId, currentParams) => {\n const {\n profileId: _ignoredProfileId,\n skuId: _ignoredSkuId,\n ean: _ignoredEan,\n ...skuUpdates\n } = currentParams;\n const skuUpdate = await applySkuBasicFields(resolvedProfileId, currentParams.skuId, skuUpdates);\n\n const eans =\n currentParams.ean === undefined\n ? undefined\n : await replaceSkuEans(resolvedProfileId, currentParams.skuId, [currentParams.ean]);\n\n return {\n skuUpdate,\n eans,\n };\n },\n resourceId: (_result, currentParams) => currentParams.skuId,\n before: (result) => result.skuUpdate.before,\n after: (result) => ({\n ...result.skuUpdate.after,\n ...(result.eans ? { Eans: result.eans } : {}),\n }),\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nconst skuStatusSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n});\n\nexport const activateSkuSchema = skuStatusSchema;\nexport const deactivateSkuSchema = skuStatusSchema;\n\nexport async function activateSkuHandler(params: z.infer<typeof activateSkuSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"activate_sku\",\n message: \"SKU activated successfully.\",\n fallbackError: `Failed to activate SKU ${params.skuId}`,\n riskLevel: \"medium\",\n execute: (resolvedProfileId, currentParams) =>\n applySkuBasicFields(resolvedProfileId, currentParams.skuId, { isActive: true }),\n resourceId: (_result, currentParams) => currentParams.skuId,\n before: (result) => result.before,\n after: (result) => result.after,\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nexport async function deactivateSkuHandler(params: z.infer<typeof deactivateSkuSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"deactivate_sku\",\n message: \"SKU deactivated successfully.\",\n fallbackError: `Failed to deactivate SKU ${params.skuId}`,\n riskLevel: \"medium\",\n execute: (resolvedProfileId, currentParams) =>\n applySkuBasicFields(resolvedProfileId, currentParams.skuId, { isActive: false }),\n resourceId: (_result, currentParams) => currentParams.skuId,\n before: (result) => result.before,\n after: (result) => result.after,\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nexport const addSkuEanSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n ean: z.string().trim().min(1).describe(\"EAN value to append.\"),\n});\n\nexport async function addSkuEanHandler(params: z.infer<typeof addSkuEanSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"add_sku_ean\",\n message: \"SKU EAN added successfully.\",\n fallbackError: `Failed to add EAN to SKU ${params.skuId}`,\n riskLevel: \"low\",\n execute: (resolvedProfileId, currentParams) =>\n addSkuEan(resolvedProfileId, currentParams.skuId, currentParams.ean),\n resourceId: (_result, currentParams) => currentParams.skuId,\n after: (result) => ({ Eans: result }),\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nexport const replaceSkuEansSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n eans: z.array(z.string().trim()).describe(\"Complete list of EANs to keep in VTEX.\"),\n});\n\nexport async function replaceSkuEansHandler(params: z.infer<typeof replaceSkuEansSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"replace_sku_eans\",\n message: \"SKU EANs replaced successfully.\",\n fallbackError: `Failed to replace EANs on SKU ${params.skuId}`,\n riskLevel: \"medium\",\n execute: (resolvedProfileId, currentParams) =>\n replaceSkuEans(resolvedProfileId, currentParams.skuId, currentParams.eans),\n resourceId: (_result, currentParams) => currentParams.skuId,\n after: (result) => ({ Eans: result }),\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nconst imagePayloadSchema = {\n name: z.string().trim().min(1).describe(\"Image name.\"),\n url: z.string().url().describe(\"Public image URL.\"),\n isMain: z.boolean().optional().describe(\"Whether the image is main.\"),\n label: z.string().optional().describe(\"Optional label.\"),\n text: z.string().optional().describe(\"Optional alt text.\"),\n position: z.number().int().nonnegative().optional().describe(\"Display position.\"),\n};\n\nexport const getSkuImagesSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n});\n\nexport async function getSkuImagesHandler(params: z.infer<typeof getSkuImagesSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"get_sku_images\",\n message: \"SKU images fetched successfully.\",\n fallbackError: `Failed to fetch images for SKU ${params.skuId}`,\n riskLevel: \"low\",\n execute: (resolvedProfileId, currentParams) => getSkuImages(resolvedProfileId, currentParams.skuId),\n resourceId: (_result, currentParams) => currentParams.skuId,\n after: (result) => ({ Images: result }),\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nexport const attachCatalogImageSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n ...imagePayloadSchema,\n});\n\nexport async function attachCatalogImageHandler(params: z.infer<typeof attachCatalogImageSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"attach_catalog_image\",\n message: \"Catalog image attached successfully.\",\n fallbackError: `Failed to attach image to SKU ${params.skuId}`,\n riskLevel: \"low\",\n execute: (resolvedProfileId, currentParams) =>\n attachSkuImage(resolvedProfileId, currentParams.skuId, {\n Name: currentParams.name,\n Url: currentParams.url,\n IsMain: currentParams.isMain,\n Label: currentParams.label,\n Text: currentParams.text,\n Position: currentParams.position,\n }),\n resourceId: (_result, currentParams) => currentParams.skuId,\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nexport const updateCatalogImageSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n imageId: z.string().min(1).describe(\"Image identifier to update.\"),\n ...imagePayloadSchema,\n});\n\nexport async function updateCatalogImageHandler(params: z.infer<typeof updateCatalogImageSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"update_catalog_image\",\n message: \"Catalog image updated successfully.\",\n fallbackError: `Failed to update image ${params.imageId} on SKU ${params.skuId}`,\n riskLevel: \"medium\",\n execute: (resolvedProfileId, currentParams) =>\n updateSkuImage(resolvedProfileId, currentParams.skuId, currentParams.imageId, {\n Name: currentParams.name,\n Url: currentParams.url,\n IsMain: currentParams.isMain,\n Label: currentParams.label,\n Text: currentParams.text,\n Position: currentParams.position,\n }),\n resourceId: (_result, currentParams) => currentParams.skuId,\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n image_id: currentParams.imageId,\n }),\n });\n}\n\nconst productInputSchema = z\n .object({\n name: z.string().min(1).describe(\"Product name.\"),\n categoryId: z.number().int().positive().optional().describe(\"Existing category ID.\"),\n categoryPath: z.string().min(1).optional().describe(\"Category path to create or reuse.\"),\n brandId: z.number().int().positive().optional().describe(\"Existing brand ID.\"),\n brandName: z.string().min(1).optional().describe(\"Brand name to create or reuse.\"),\n departmentId: z.number().int().positive().optional().describe(\"Department ID.\"),\n refId: z.string().optional().describe(\"Product reference code.\"),\n title: z.string().optional().describe(\"SEO title.\"),\n description: z.string().optional().describe(\"Product description.\"),\n descriptionShort: z.string().optional().describe(\"Short description.\"),\n linkId: z.string().optional().describe(\"Product slug.\"),\n })\n .refine((value) => value.categoryId !== undefined || value.categoryPath !== undefined, {\n message: \"Provide either categoryId or categoryPath for the product.\",\n path: [\"categoryId\"],\n })\n .refine((value) => value.brandId !== undefined || value.brandName !== undefined, {\n message: \"Provide either brandId or brandName for the product.\",\n path: [\"brandId\"],\n });\n\nconst skuInputSchema = z.object({\n name: z.string().min(1).describe(\"SKU name.\"),\n refId: z.string().min(1).describe(\"Internal SKU reference code.\"),\n ean: z.string().optional().describe(\"Optional EAN to attach after creation.\"),\n packagedHeight: z.number().nonnegative().describe(\"Packaged height.\"),\n packagedLength: z.number().nonnegative().describe(\"Packaged length.\"),\n packagedWidth: z.number().nonnegative().describe(\"Packaged width.\"),\n packagedWeightKg: z.number().nonnegative().describe(\"Packaged weight in kg.\"),\n height: z.number().nonnegative().optional().describe(\"Physical height.\"),\n length: z.number().nonnegative().optional().describe(\"Physical length.\"),\n width: z.number().nonnegative().optional().describe(\"Physical width.\"),\n weightKg: z.number().nonnegative().optional().describe(\"Physical weight in kg.\"),\n activateIfPossible: z.boolean().optional().describe(\"Whether VTEX should auto-activate the SKU.\"),\n measurementUnit: z.string().optional().describe(\"Measurement unit.\"),\n unitMultiplier: z.number().positive().optional().describe(\"Unit multiplier.\"),\n});\n\nconst imageInputSchema = z.object(imagePayloadSchema).optional();\n\nexport const createProductWithSkuSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n product: productInputSchema.describe(\"Product payload.\"),\n sku: skuInputSchema.describe(\"SKU payload.\"),\n image: imageInputSchema.describe(\"Optional SKU image attached after SKU creation.\"),\n});\n\nexport async function createProductWithSkuHandler({\n profileId,\n product,\n sku,\n image,\n}: z.infer<typeof createProductWithSkuSchema>) {\n return executeCatalogWrite({\n params: { profileId, product, sku, image },\n operation: \"create_product_with_sku\",\n message: \"Product and SKU created successfully.\",\n fallbackError: \"Failed to create product with SKU in VTEX\",\n riskLevel: \"low\",\n execute: async (resolvedProfileId, currentParams) => {\n const createdProduct = await createProduct(resolvedProfileId, {\n Name: currentParams.product.name,\n CategoryId: currentParams.product.categoryId,\n CategoryPath: currentParams.product.categoryPath,\n BrandId: currentParams.product.brandId,\n BrandName: currentParams.product.brandName,\n DepartmentId: currentParams.product.departmentId,\n RefId: currentParams.product.refId,\n Title: currentParams.product.title,\n Description: currentParams.product.description,\n DescriptionShort: currentParams.product.descriptionShort,\n LinkId: currentParams.product.linkId,\n });\n\n const productId = Number(createdProduct.Id);\n const createdSku = await createSku(resolvedProfileId, {\n ProductId: productId,\n Name: currentParams.sku.name,\n RefId: currentParams.sku.refId,\n PackagedHeight: currentParams.sku.packagedHeight,\n PackagedLength: currentParams.sku.packagedLength,\n PackagedWidth: currentParams.sku.packagedWidth,\n PackagedWeightKg: currentParams.sku.packagedWeightKg,\n Height: currentParams.sku.height,\n Length: currentParams.sku.length,\n Width: currentParams.sku.width,\n WeightKg: currentParams.sku.weightKg,\n ActivateIfPossible: currentParams.sku.activateIfPossible ?? true,\n IsActive: false,\n MeasurementUnit: currentParams.sku.measurementUnit,\n UnitMultiplier: currentParams.sku.unitMultiplier,\n });\n\n const skuId = createdSku.Id == null ? undefined : String(createdSku.Id);\n if (skuId && currentParams.sku.ean?.trim()) {\n await addSkuEan(resolvedProfileId, skuId, currentParams.sku.ean.trim());\n }\n\n if (skuId && currentParams.image) {\n await attachSkuImage(resolvedProfileId, skuId, {\n Name: currentParams.image.name,\n Url: currentParams.image.url,\n IsMain: currentParams.image.isMain,\n Label: currentParams.image.label,\n Text: currentParams.image.text,\n Position: currentParams.image.position,\n });\n }\n\n return {\n product: createdProduct,\n sku: createdSku,\n };\n },\n resourceId: (result) => String((result.product as Record<string, unknown>).Id ?? \"\"),\n before: () => null,\n after: (result) => ({\n product: result.product,\n sku: result.sku,\n }),\n details: (result) => ({\n product_id: (result.product as Record<string, unknown>).Id,\n sku_id: (result.sku as Record<string, unknown>).Id,\n }),\n });\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\n\nimport {\n addSkuEan,\n attachSkuImage,\n createProduct,\n createSku,\n getSkuImages,\n replaceSkuEans,\n updateProductBasicFields as applyProductBasicFields,\n updateSkuBasicFields as applySkuBasicFields,\n updateSkuImage,\n} from \"../../services/vtex/vtex-catalog-write.js\";\nimport {\n buildWriteSuccessResponse,\n handleVtexWriteError,\n resolveVtexWriteProfile,\n vtexProfileIdSchemaField,\n} from \"./write-helpers.js\";\n\ntype CatalogWriteExecutor<TParams extends { profileId?: string }, TResult> = {\n params: TParams;\n operation: string;\n message: string;\n fallbackError: string;\n riskLevel: \"low\" | \"medium\" | \"high\";\n execute: (resolvedProfileId: string, params: TParams) => Promise<TResult>;\n resourceId: (result: TResult, params: TParams) => string | undefined;\n before?: (result: TResult, params: TParams) => Record<string, unknown> | null;\n after?: (result: TResult, params: TParams) => Record<string, unknown> | null;\n details?: (result: TResult, params: TParams) => Record<string, unknown> | undefined;\n};\n\nasync function executeCatalogWrite<TParams extends { profileId?: string }, TResult>({\n params,\n operation,\n message,\n fallbackError,\n riskLevel,\n execute,\n resourceId,\n before,\n after,\n details,\n}: CatalogWriteExecutor<TParams, TResult>) {\n try {\n const profileResolution = await resolveVtexWriteProfile(params.profileId);\n if (!profileResolution.ok) {\n return profileResolution.response;\n }\n\n const resolvedProfileId = profileResolution.value.profileId;\n const result = await execute(resolvedProfileId, params);\n\n return buildWriteSuccessResponse({\n profileId: resolvedProfileId,\n operation,\n resourceId: resourceId(result, params),\n riskLevel,\n message,\n before: before?.(result, params),\n after: after?.(result, params) ?? (result as Record<string, unknown>),\n details: details?.(result, params),\n });\n } catch (err) {\n return handleVtexWriteError(err, fallbackError);\n }\n}\n\nexport const updateProductBasicFieldsSchema = z\n .object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().min(1).describe(\"VTEX product identifier.\"),\n name: z.string().min(1).optional().describe(\"New product name.\"),\n categoryId: z.number().int().positive().optional().describe(\"New category identifier.\"),\n brandId: z.number().int().positive().optional().describe(\"New brand identifier.\"),\n description: z.string().optional().describe(\"New product description.\"),\n descriptionShort: z.string().optional().describe(\"New short description.\"),\n title: z.string().optional().describe(\"New SEO title.\"),\n linkId: z.string().optional().describe(\"New product slug.\"),\n refId: z.string().optional().describe(\"New internal reference code.\"),\n isVisible: z.boolean().optional().describe(\"Whether the product should remain visible in listings.\"),\n isActive: z.boolean().optional().describe(\"Whether the product should remain active.\"),\n keyWords: z.string().optional().describe(\"New keywords string.\"),\n releaseDate: z.string().optional().describe(\"New release date in ISO format.\"),\n metaTagDescription: z.string().optional().describe(\"New meta description.\"),\n showWithoutStock: z\n .boolean()\n .optional()\n .describe(\"Whether the product can stay visible without stock.\"),\n })\n .refine(\n (value) =>\n value.name !== undefined ||\n value.categoryId !== undefined ||\n value.brandId !== undefined ||\n value.description !== undefined ||\n value.descriptionShort !== undefined ||\n value.title !== undefined ||\n value.linkId !== undefined ||\n value.refId !== undefined ||\n value.isVisible !== undefined ||\n value.isActive !== undefined ||\n value.keyWords !== undefined ||\n value.releaseDate !== undefined ||\n value.metaTagDescription !== undefined ||\n value.showWithoutStock !== undefined,\n {\n message: \"At least one product field must be provided.\",\n path: [\"name\"],\n }\n );\n\nexport async function updateProductBasicFieldsHandler({\n profileId,\n productId,\n ...updates\n}: z.infer<typeof updateProductBasicFieldsSchema>) {\n return executeCatalogWrite({\n params: { profileId, productId, ...updates },\n operation: \"update_product_basic_fields\",\n message: \"Product fields updated successfully.\",\n fallbackError: `Failed to update product ${productId}`,\n riskLevel: \"medium\",\n execute: (resolvedProfileId, currentParams) => {\n const { profileId: _ignoredProfileId, productId: _ignoredProductId, ...productUpdates } = currentParams;\n return applyProductBasicFields(resolvedProfileId, currentParams.productId, productUpdates);\n },\n resourceId: (_result, currentParams) => currentParams.productId,\n before: (result) => result.before,\n after: (result) => result.after,\n details: (_result, currentParams) => ({\n product_id: currentParams.productId,\n }),\n });\n}\n\nexport const updateProductBrandSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().min(1).describe(\"VTEX product identifier.\"),\n brandId: z.number().int().positive().describe(\"Brand identifier to set on the product.\"),\n});\n\nexport async function updateProductBrandHandler(params: z.infer<typeof updateProductBrandSchema>) {\n return updateProductBasicFieldsHandler({\n profileId: params.profileId,\n productId: params.productId,\n brandId: params.brandId,\n });\n}\n\nexport const updateSkuBasicFieldsSchema = z\n .object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n name: z.string().min(1).optional().describe(\"New SKU name.\"),\n refId: z.string().optional().describe(\"New SKU reference code.\"),\n ean: z\n .string()\n .optional()\n .describe(\"New EAN. When informed, existing EAN values are replaced with this one.\"),\n packagedHeight: z.number().nonnegative().optional().describe(\"Packaged height.\"),\n packagedLength: z.number().nonnegative().optional().describe(\"Packaged length.\"),\n packagedWidth: z.number().nonnegative().optional().describe(\"Packaged width.\"),\n packagedWeightKg: z.number().nonnegative().optional().describe(\"Packaged weight in kg.\"),\n height: z.number().nonnegative().optional().describe(\"Physical height.\"),\n length: z.number().nonnegative().optional().describe(\"Physical length.\"),\n width: z.number().nonnegative().optional().describe(\"Physical width.\"),\n weightKg: z.number().nonnegative().optional().describe(\"Physical weight in kg.\"),\n measurementUnit: z.string().optional().describe(\"Measurement unit.\"),\n unitMultiplier: z.number().positive().optional().describe(\"Unit multiplier.\"),\n manufacturerCode: z.string().optional().describe(\"Manufacturer code.\"),\n commercialConditionId: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\n \"Commercial condition ID. Use vtex_commercial_conditions to inspect available condition IDs and vtex_payment_rules to configure linked installment/payment behavior.\"\n ),\n isActive: z.boolean().optional().describe(\"Whether the SKU should remain active.\"),\n activateIfPossible: z\n .boolean()\n .optional()\n .describe(\"Whether VTEX should auto-activate the SKU when possible.\"),\n })\n .refine(\n (value) =>\n value.name !== undefined ||\n value.refId !== undefined ||\n value.ean !== undefined ||\n value.packagedHeight !== undefined ||\n value.packagedLength !== undefined ||\n value.packagedWidth !== undefined ||\n value.packagedWeightKg !== undefined ||\n value.height !== undefined ||\n value.length !== undefined ||\n value.width !== undefined ||\n value.weightKg !== undefined ||\n value.measurementUnit !== undefined ||\n value.unitMultiplier !== undefined ||\n value.manufacturerCode !== undefined ||\n value.commercialConditionId !== undefined ||\n value.isActive !== undefined ||\n value.activateIfPossible !== undefined,\n {\n message: \"At least one SKU field must be provided.\",\n path: [\"name\"],\n }\n );\n\nexport async function updateSkuBasicFieldsHandler({\n profileId,\n skuId,\n ean,\n ...updates\n}: z.infer<typeof updateSkuBasicFieldsSchema>) {\n return executeCatalogWrite({\n params: { profileId, skuId, ean, ...updates },\n operation: \"update_sku_basic_fields\",\n message: \"SKU fields updated successfully.\",\n fallbackError: `Failed to update SKU ${skuId}`,\n riskLevel: \"medium\",\n execute: async (resolvedProfileId, currentParams) => {\n const {\n profileId: _ignoredProfileId,\n skuId: _ignoredSkuId,\n ean: _ignoredEan,\n ...skuUpdates\n } = currentParams;\n const skuUpdate = await applySkuBasicFields(resolvedProfileId, currentParams.skuId, skuUpdates);\n\n const eans =\n currentParams.ean === undefined\n ? undefined\n : await replaceSkuEans(resolvedProfileId, currentParams.skuId, [currentParams.ean]);\n\n return {\n skuUpdate,\n eans,\n };\n },\n resourceId: (_result, currentParams) => currentParams.skuId,\n before: (result) => result.skuUpdate.before,\n after: (result) => ({\n ...result.skuUpdate.after,\n ...(result.eans ? { Eans: result.eans } : {}),\n }),\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nconst skuStatusSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n});\n\nexport const activateSkuSchema = skuStatusSchema;\nexport const deactivateSkuSchema = skuStatusSchema;\n\nexport async function activateSkuHandler(params: z.infer<typeof activateSkuSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"activate_sku\",\n message: \"SKU activated successfully.\",\n fallbackError: `Failed to activate SKU ${params.skuId}`,\n riskLevel: \"medium\",\n execute: (resolvedProfileId, currentParams) =>\n applySkuBasicFields(resolvedProfileId, currentParams.skuId, { isActive: true }),\n resourceId: (_result, currentParams) => currentParams.skuId,\n before: (result) => result.before,\n after: (result) => result.after,\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nexport async function deactivateSkuHandler(params: z.infer<typeof deactivateSkuSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"deactivate_sku\",\n message: \"SKU deactivated successfully.\",\n fallbackError: `Failed to deactivate SKU ${params.skuId}`,\n riskLevel: \"medium\",\n execute: (resolvedProfileId, currentParams) =>\n applySkuBasicFields(resolvedProfileId, currentParams.skuId, { isActive: false }),\n resourceId: (_result, currentParams) => currentParams.skuId,\n before: (result) => result.before,\n after: (result) => result.after,\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nexport const addSkuEanSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n ean: z.string().trim().min(1).describe(\"EAN value to append.\"),\n});\n\nexport async function addSkuEanHandler(params: z.infer<typeof addSkuEanSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"add_sku_ean\",\n message: \"SKU EAN added successfully.\",\n fallbackError: `Failed to add EAN to SKU ${params.skuId}`,\n riskLevel: \"low\",\n execute: (resolvedProfileId, currentParams) =>\n addSkuEan(resolvedProfileId, currentParams.skuId, currentParams.ean),\n resourceId: (_result, currentParams) => currentParams.skuId,\n after: (result) => ({ Eans: result }),\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nexport const replaceSkuEansSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n eans: z.array(z.string().trim()).describe(\"Complete list of EANs to keep in VTEX.\"),\n});\n\nexport async function replaceSkuEansHandler(params: z.infer<typeof replaceSkuEansSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"replace_sku_eans\",\n message: \"SKU EANs replaced successfully.\",\n fallbackError: `Failed to replace EANs on SKU ${params.skuId}`,\n riskLevel: \"medium\",\n execute: (resolvedProfileId, currentParams) =>\n replaceSkuEans(resolvedProfileId, currentParams.skuId, currentParams.eans),\n resourceId: (_result, currentParams) => currentParams.skuId,\n after: (result) => ({ Eans: result }),\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nconst imagePayloadSchema = {\n name: z.string().trim().min(1).describe(\"Image name.\"),\n url: z.string().url().describe(\"Public image URL.\"),\n isMain: z.boolean().optional().describe(\"Whether the image is main.\"),\n label: z.string().optional().describe(\"Optional label.\"),\n text: z.string().optional().describe(\"Optional alt text.\"),\n position: z.number().int().nonnegative().optional().describe(\"Display position.\"),\n};\n\nexport const getSkuImagesSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n});\n\nexport async function getSkuImagesHandler(params: z.infer<typeof getSkuImagesSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"get_sku_images\",\n message: \"SKU images fetched successfully.\",\n fallbackError: `Failed to fetch images for SKU ${params.skuId}`,\n riskLevel: \"low\",\n execute: (resolvedProfileId, currentParams) => getSkuImages(resolvedProfileId, currentParams.skuId),\n resourceId: (_result, currentParams) => currentParams.skuId,\n after: (result) => ({ Images: result }),\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nexport const attachCatalogImageSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n ...imagePayloadSchema,\n});\n\nexport async function attachCatalogImageHandler(params: z.infer<typeof attachCatalogImageSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"attach_catalog_image\",\n message: \"Catalog image attached successfully.\",\n fallbackError: `Failed to attach image to SKU ${params.skuId}`,\n riskLevel: \"low\",\n execute: (resolvedProfileId, currentParams) =>\n attachSkuImage(resolvedProfileId, currentParams.skuId, {\n Name: currentParams.name,\n Url: currentParams.url,\n IsMain: currentParams.isMain,\n Label: currentParams.label,\n Text: currentParams.text,\n Position: currentParams.position,\n }),\n resourceId: (_result, currentParams) => currentParams.skuId,\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n }),\n });\n}\n\nexport const updateCatalogImageSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().min(1).describe(\"VTEX SKU identifier.\"),\n imageId: z.string().min(1).describe(\"Image identifier to update.\"),\n ...imagePayloadSchema,\n});\n\nexport async function updateCatalogImageHandler(params: z.infer<typeof updateCatalogImageSchema>) {\n return executeCatalogWrite({\n params,\n operation: \"update_catalog_image\",\n message: \"Catalog image updated successfully.\",\n fallbackError: `Failed to update image ${params.imageId} on SKU ${params.skuId}`,\n riskLevel: \"medium\",\n execute: (resolvedProfileId, currentParams) =>\n updateSkuImage(resolvedProfileId, currentParams.skuId, currentParams.imageId, {\n Name: currentParams.name,\n Url: currentParams.url,\n IsMain: currentParams.isMain,\n Label: currentParams.label,\n Text: currentParams.text,\n Position: currentParams.position,\n }),\n resourceId: (_result, currentParams) => currentParams.skuId,\n details: (_result, currentParams) => ({\n sku_id: currentParams.skuId,\n image_id: currentParams.imageId,\n }),\n });\n}\n\nconst productInputSchema = z\n .object({\n name: z.string().min(1).describe(\"Product name.\"),\n categoryId: z.number().int().positive().optional().describe(\"Existing category ID.\"),\n categoryPath: z.string().min(1).optional().describe(\"Category path to create or reuse.\"),\n brandId: z.number().int().positive().optional().describe(\"Existing brand ID.\"),\n brandName: z.string().min(1).optional().describe(\"Brand name to create or reuse.\"),\n departmentId: z.number().int().positive().optional().describe(\"Department ID.\"),\n refId: z.string().optional().describe(\"Product reference code.\"),\n title: z.string().optional().describe(\"SEO title.\"),\n description: z.string().optional().describe(\"Product description.\"),\n descriptionShort: z.string().optional().describe(\"Short description.\"),\n linkId: z.string().optional().describe(\"Product slug.\"),\n })\n .refine((value) => value.categoryId !== undefined || value.categoryPath !== undefined, {\n message: \"Provide either categoryId or categoryPath for the product.\",\n path: [\"categoryId\"],\n })\n .refine((value) => value.brandId !== undefined || value.brandName !== undefined, {\n message: \"Provide either brandId or brandName for the product.\",\n path: [\"brandId\"],\n });\n\nconst skuInputSchema = z.object({\n name: z.string().min(1).describe(\"SKU name.\"),\n refId: z.string().min(1).describe(\"Internal SKU reference code.\"),\n ean: z.string().optional().describe(\"Optional EAN to attach after creation.\"),\n packagedHeight: z.number().nonnegative().describe(\"Packaged height.\"),\n packagedLength: z.number().nonnegative().describe(\"Packaged length.\"),\n packagedWidth: z.number().nonnegative().describe(\"Packaged width.\"),\n packagedWeightKg: z.number().nonnegative().describe(\"Packaged weight in kg.\"),\n height: z.number().nonnegative().optional().describe(\"Physical height.\"),\n length: z.number().nonnegative().optional().describe(\"Physical length.\"),\n width: z.number().nonnegative().optional().describe(\"Physical width.\"),\n weightKg: z.number().nonnegative().optional().describe(\"Physical weight in kg.\"),\n activateIfPossible: z.boolean().optional().describe(\"Whether VTEX should auto-activate the SKU.\"),\n measurementUnit: z.string().optional().describe(\"Measurement unit.\"),\n unitMultiplier: z.number().positive().optional().describe(\"Unit multiplier.\"),\n});\n\nconst imageInputSchema = z.object(imagePayloadSchema).optional();\n\nexport const createProductWithSkuSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n product: productInputSchema.describe(\"Product payload.\"),\n sku: skuInputSchema.describe(\"SKU payload.\"),\n image: imageInputSchema.describe(\"Optional SKU image attached after SKU creation.\"),\n});\n\nexport async function createProductWithSkuHandler({\n profileId,\n product,\n sku,\n image,\n}: z.infer<typeof createProductWithSkuSchema>) {\n return executeCatalogWrite({\n params: { profileId, product, sku, image },\n operation: \"create_product_with_sku\",\n message: \"Product and SKU created successfully.\",\n fallbackError: \"Failed to create product with SKU in VTEX\",\n riskLevel: \"low\",\n execute: async (resolvedProfileId, currentParams) => {\n const createdProduct = await createProduct(resolvedProfileId, {\n Name: currentParams.product.name,\n CategoryId: currentParams.product.categoryId,\n CategoryPath: currentParams.product.categoryPath,\n BrandId: currentParams.product.brandId,\n BrandName: currentParams.product.brandName,\n DepartmentId: currentParams.product.departmentId,\n RefId: currentParams.product.refId,\n Title: currentParams.product.title,\n Description: currentParams.product.description,\n DescriptionShort: currentParams.product.descriptionShort,\n LinkId: currentParams.product.linkId,\n });\n\n const productId = Number(createdProduct.Id);\n const createdSku = await createSku(resolvedProfileId, {\n ProductId: productId,\n Name: currentParams.sku.name,\n RefId: currentParams.sku.refId,\n PackagedHeight: currentParams.sku.packagedHeight,\n PackagedLength: currentParams.sku.packagedLength,\n PackagedWidth: currentParams.sku.packagedWidth,\n PackagedWeightKg: currentParams.sku.packagedWeightKg,\n Height: currentParams.sku.height,\n Length: currentParams.sku.length,\n Width: currentParams.sku.width,\n WeightKg: currentParams.sku.weightKg,\n ActivateIfPossible: currentParams.sku.activateIfPossible ?? true,\n IsActive: false,\n MeasurementUnit: currentParams.sku.measurementUnit,\n UnitMultiplier: currentParams.sku.unitMultiplier,\n });\n\n const skuId = createdSku.Id == null ? undefined : String(createdSku.Id);\n if (skuId && currentParams.sku.ean?.trim()) {\n await addSkuEan(resolvedProfileId, skuId, currentParams.sku.ean.trim());\n }\n\n if (skuId && currentParams.image) {\n await attachSkuImage(resolvedProfileId, skuId, {\n Name: currentParams.image.name,\n Url: currentParams.image.url,\n IsMain: currentParams.image.isMain,\n Label: currentParams.image.label,\n Text: currentParams.image.text,\n Position: currentParams.image.position,\n });\n }\n\n return {\n product: createdProduct,\n sku: createdSku,\n };\n },\n resourceId: (result) => String((result.product as Record<string, unknown>).Id ?? \"\"),\n before: () => null,\n after: (result) => ({\n product: result.product,\n sku: result.sku,\n }),\n details: (result) => ({\n product_id: (result.product as Record<string, unknown>).Id,\n sku_id: (result.sku as Record<string, unknown>).Id,\n }),\n });\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|