@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.
- 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-catalog.test.js +2 -5
- package/dist/src/services/vtex/__tests__/vtex-catalog.test.js.map +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-catalog.js +1 -1
- package/dist/src/services/vtex/vtex-catalog.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__/catalog-navigation-reads.test.js +21 -2
- package/dist/src/tools/vtex/__tests__/catalog-navigation-reads.test.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/catalog-navigation-reads.js +1 -1
- package/dist/src/tools/vtex/catalog-navigation-reads.js.map +2 -2
- 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
|
@@ -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
|
}
|
|
@@ -339,7 +339,7 @@ async function listProductsByCategoryHandler(params) {
|
|
|
339
339
|
readValue(item, "productName", "product_name", "name", "Name"),
|
|
340
340
|
readValue(item, "brand", "Brand"),
|
|
341
341
|
readValue(item, "brandId", "brand_id", "BrandId"),
|
|
342
|
-
readValue(item, "categoryId", "category_id", "CategoryId") ??
|
|
342
|
+
readValue(item, "categoryId", "category_id", "CategoryId") ?? null,
|
|
343
343
|
readValue(
|
|
344
344
|
item,
|
|
345
345
|
"productReference",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/tools/vtex/catalog-navigation-reads.ts"],
|
|
4
|
-
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport {\n getCategoryTree,\n listBrands,\n listCategories,\n listProducts,\n listProductsByCategory,\n listSpecificationGroupsByCategory,\n listSkusByProduct,\n type VtexCatalogRecord,\n} from \"../../services/vtex/vtex-catalog.js\";\nimport {\n getBrand,\n getCategory,\n getProduct,\n getProductSpecifications,\n getSku,\n} from \"../../services/vtex/vtex-catalog-write.js\";\nimport { toSnakeCaseKeys } from \"../../utils/case-conversion.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { resolveVtexProfileOrSelection } from \"./profile-resolution.js\";\n\nconst vtexProfileIdSchemaField = z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\n \"Explicit VTEX profile id to use. If omitted, the tool returns a guided selection payload with available active profiles.\"\n );\n\nconst pageSchemaField = z.number().int().min(1).optional().describe(\"Page number, starting at 1.\");\nconst pageSizeSchemaField = z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Items per page, from 1 to 100.\");\n\nconst categoryProductPageSizeSchemaField = z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\n \"Items per page, from 1 to 50. VTEX public product search rejects larger page sizes for category product listing.\"\n );\n\nasync function resolveReadProfile(profileId?: string) {\n return resolveVtexProfileOrSelection(profileId);\n}\n\nfunction readValue(record: VtexCatalogRecord, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n\n return undefined;\n}\n\nfunction buildPaginationMetadata(input: {\n toolName: string;\n total: number;\n page: number;\n pageSize: number;\n returned: number;\n}) {\n const hasMore = input.page * input.pageSize < input.total;\n const nextPage = hasMore ? input.page + 1 : undefined;\n\n return {\n total: input.total,\n page: input.page,\n pageSize: input.pageSize,\n returned: input.returned,\n has_more: hasMore,\n next_page: nextPage,\n continuation: nextPage\n ? `Call ${input.toolName} again with page=${nextPage} and pageSize=${input.pageSize} to continue.`\n : undefined,\n };\n}\n\nexport const getCategoryTreeSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n depth: z.number().int().min(1).max(5).optional().describe(\"Tree depth from 1 to 5. Defaults to 5.\"),\n});\n\nexport async function getCategoryTreeHandler(params: z.infer<typeof getCategoryTreeSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const depth = params.depth ?? 5;\n const categories = await getCategoryTree(resolved.value.profileId, depth);\n\n return object({\n profile_id: resolved.value.profileId,\n depth,\n categories: toSnakeCaseKeys(categories),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to fetch VTEX category tree\"));\n }\n}\n\nexport const listCategoriesSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n});\n\nconst categoryRowsSchema = [\"id\", \"name\", \"parent_id\", \"is_active\", \"show_in_storefront\"] as const;\n\nexport async function listCategoriesHandler(params: z.infer<typeof listCategoriesSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const result = await listCategories(resolved.value.profileId, page, pageSize);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_categories\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: categoryRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"FatherCategoryId\", \"fatherCategoryId\", \"parentId\"),\n readValue(item, \"IsActive\", \"isActive\"),\n readValue(item, \"ShowInStoreFront\", \"showInStoreFront\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX categories\"));\n }\n}\n\nexport const getCategorySchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID.\"),\n});\n\nexport async function getCategoryHandler(params: z.infer<typeof getCategorySchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const category = await getCategory(resolved.value.profileId, params.categoryId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n category: toSnakeCaseKeys(category),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX category ${params.categoryId}`));\n }\n}\n\nexport const listBrandsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n});\n\nconst brandRowsSchema = [\"id\", \"name\", \"is_active\", \"menu_home\"] as const;\n\nexport async function listBrandsHandler(params: z.infer<typeof listBrandsSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const result = await listBrands(resolved.value.profileId, page, pageSize);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_brands\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: brandRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"Active\", \"active\"),\n readValue(item, \"MenuHome\", \"menuHome\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX brands\"));\n }\n}\n\nexport const getBrandSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n brandId: z.string().trim().min(1).describe(\"VTEX brand ID.\"),\n});\n\nexport async function getBrandHandler(params: z.infer<typeof getBrandSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const brand = await getBrand(resolved.value.profileId, params.brandId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n brand_id: params.brandId,\n brand: toSnakeCaseKeys(brand),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX brand ${params.brandId}`));\n }\n}\n\nexport const listSpecificationGroupsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID used to discover specification groups.\"),\n nameContains: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\"Optional case-insensitive substring filter applied to specification group names.\"),\n});\n\nconst specificationGroupRowsSchema = [\"id\", \"name\", \"category_id\"] as const;\n\nexport async function listSpecificationGroupsHandler(\n params: z.infer<typeof listSpecificationGroupsSchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const groups = await listSpecificationGroupsByCategory(resolved.value.profileId, params.categoryId);\n const normalizedFilter = params.nameContains?.toLocaleLowerCase();\n const filteredGroups = normalizedFilter\n ? groups.filter((group) => {\n const name = readValue(group, \"Name\", \"name\");\n return typeof name === \"string\" && name.toLocaleLowerCase().includes(normalizedFilter);\n })\n : groups;\n\n return object({\n metadata: stripNulls({\n total: groups.length,\n returned: filteredGroups.length,\n has_more: false,\n name_contains: params.nameContains,\n }),\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n rows_schema: specificationGroupRowsSchema,\n rows: filteredGroups.map((group) => [\n readValue(group, \"Id\", \"id\", \"FieldGroupId\", \"fieldGroupId\"),\n readValue(group, \"Name\", \"name\"),\n readValue(group, \"CategoryId\", \"categoryId\") ?? params.categoryId,\n ]),\n });\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to list VTEX specification groups for category ${params.categoryId}`)\n );\n }\n}\n\nexport const getProductSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nexport async function getProductHandler(params: z.infer<typeof getProductSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const product = await getProduct(resolved.value.profileId, params.productId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n product: toSnakeCaseKeys(product),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX product ${params.productId}`));\n }\n}\n\nexport const getProductSpecificationsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nexport async function getProductSpecificationsHandler(\n params: z.infer<typeof getProductSpecificationsSchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const specifications = await getProductSpecifications(resolved.value.profileId, params.productId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n specifications: toSnakeCaseKeys(specifications),\n })\n );\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to fetch VTEX product specifications for product ${params.productId}`)\n );\n }\n}\n\nexport const listProductsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n keyword: z.string().trim().min(1).optional().describe(\"Optional VTEX catalog keyword filter.\"),\n});\n\nconst productRowsSchema = [\"product_id\"] as const;\n\nexport async function listProductsHandler(params: z.infer<typeof listProductsSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 100;\n const from = (page - 1) * pageSize + 1;\n const to = from + pageSize - 1;\n const result = await listProducts(resolved.value.profileId, from, to, params.keyword);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_products\",\n total: result.total,\n page,\n pageSize,\n returned: result.productIds.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: productRowsSchema,\n rows: result.productIds.map((productId) => [productId]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX products\"));\n }\n}\n\nexport const listProductsByCategorySchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID used to filter the product search.\"),\n page: pageSchemaField,\n pageSize: categoryProductPageSizeSchemaField,\n});\n\nconst productByCategoryRowsSchema = [\n \"product_id\",\n \"product_name\",\n \"brand\",\n \"brand_id\",\n \"category_id\",\n \"product_reference\",\n] as const;\n\nexport async function listProductsByCategoryHandler(\n params: z.infer<typeof listProductsByCategorySchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const from = (page - 1) * pageSize;\n const to = from + pageSize - 1;\n const result = await listProductsByCategory(resolved.value.profileId, params.categoryId, from, to);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_products_by_category\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n rows_schema: productByCategoryRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"productId\", \"product_id\", \"productid\", \"id\", \"Id\"),\n readValue(item, \"productName\", \"product_name\", \"name\", \"Name\"),\n readValue(item, \"brand\", \"Brand\"),\n readValue(item, \"brandId\", \"brand_id\", \"BrandId\"),\n readValue(item, \"categoryId\", \"category_id\", \"CategoryId\") ?? params.categoryId,\n readValue(\n item,\n \"productReference\",\n \"product_reference\",\n \"productReferenceCode\",\n \"product_reference_code\"\n ),\n ]),\n });\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to list VTEX products for category ${params.categoryId}`)\n );\n }\n}\n\nexport const getSkuSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().trim().min(1).describe(\"VTEX SKU ID.\"),\n});\n\nexport async function getSkuHandler(params: z.infer<typeof getSkuSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const sku = await getSku(resolved.value.profileId, params.skuId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n sku_id: params.skuId,\n sku: toSnakeCaseKeys(sku),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX SKU ${params.skuId}`));\n }\n}\n\nexport const listSkusByProductSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nconst skuRowsSchema = [\"id\", \"name\", \"is_active\", \"ref_id\"] as const;\n\nexport async function listSkusByProductHandler(params: z.infer<typeof listSkusByProductSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const skus = await listSkusByProduct(resolved.value.profileId, params.productId);\n\n return object({\n metadata: { total: skus.length, returned: skus.length, has_more: false },\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n rows_schema: skuRowsSchema,\n rows: skus.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"IsActive\", \"isActive\"),\n readValue(item, \"RefId\", \"refId\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, `Failed to list VTEX SKUs for product ${params.productId}`));\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,OAAO,cAAc;AAC9B,SAAS,SAAS;AAElB,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAC3B,SAAS,qCAAqC;AAE9C,MAAM,2BAA2B,EAC9B,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,SAAS,EACT;AAAA,EACC;AACF;AAEF,MAAM,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,6BAA6B;AACjG,MAAM,sBAAsB,EACzB,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,GAAG,EACP,SAAS,EACT,SAAS,gCAAgC;AAE5C,MAAM,qCAAqC,EACxC,OAAO,EACP,IAAI,EACJ,IAAI,CAAC,EACL,IAAI,EAAE,EACN,SAAS,EACT;AAAA,EACC;AACF;AAEF,eAAe,mBAAmB,WAAoB;AACpD,SAAO,8BAA8B,SAAS;AAChD;AAEA,SAAS,UAAU,WAA8B,MAAyB;AACxE,aAAW,OAAO,MAAM;AACtB,QAAI,OAAO,QAAQ;AACjB,aAAO,OAAO,GAAG;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAM9B;AACD,QAAM,UAAU,MAAM,OAAO,MAAM,WAAW,MAAM;AACpD,QAAM,WAAW,UAAU,MAAM,OAAO,IAAI;AAE5C,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,MAAM,MAAM;AAAA,IACZ,UAAU,MAAM;AAAA,IAChB,UAAU,MAAM;AAAA,IAChB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,cAAc,WACV,QAAQ,MAAM,QAAQ,oBAAoB,QAAQ,iBAAiB,MAAM,QAAQ,kBACjF;AAAA,EACN;AACF;AAEO,MAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,WAAW;AAAA,EACX,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,wCAAwC;AACpG,CAAC;AAED,eAAsB,uBAAuB,QAA+C;AAC1F,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,OAAO,SAAS;AAC1D,QAAI,CAAC,SAAS,GAAI,QAAO,SAAS;AAElC,UAAM,QAAQ,OAAO,SAAS;AAC9B,UAAM,aAAa,MAAM,gBAAgB,SAAS,MAAM,WAAW,KAAK;AAExE,WAAO,OAAO;AAAA,MACZ,YAAY,SAAS,MAAM;AAAA,MAC3B;AAAA,MACA,YAAY,gBAAgB,UAAU;AAAA,IACxC,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,KAAK,oCAAoC,CAAC;AAAA,EACzE;AACF;AAEO,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,WAAW;AAAA,EACX,MAAM;AAAA,EACN,UAAU;AACZ,CAAC;AAED,MAAM,qBAAqB,CAAC,MAAM,QAAQ,aAAa,aAAa,oBAAoB;AAExF,eAAsB,sBAAsB,QAA8C;AACxF,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,OAAO,SAAS;AAC1D,QAAI,CAAC,SAAS,GAAI,QAAO,SAAS;AAElC,UAAM,OAAO,OAAO,QAAQ;AAC5B,UAAM,WAAW,OAAO,YAAY;AACpC,UAAM,SAAS,MAAM,eAAe,SAAS,MAAM,WAAW,MAAM,QAAQ;AAE5E,WAAO,OAAO;AAAA,MACZ,UAAU;AAAA,QACR,wBAAwB;AAAA,UACtB,UAAU;AAAA,UACV,OAAO,OAAO;AAAA,UACd;AAAA,UACA;AAAA,UACA,UAAU,OAAO,MAAM;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,MACA,YAAY,SAAS,MAAM;AAAA,MAC3B,aAAa;AAAA,MACb,MAAM,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,QAC/B,UAAU,MAAM,MAAM,IAAI;AAAA,QAC1B,UAAU,MAAM,QAAQ,MAAM;AAAA,QAC9B,UAAU,MAAM,oBAAoB,oBAAoB,UAAU;AAAA,QAClE,UAAU,MAAM,YAAY,UAAU;AAAA,QACtC,UAAU,MAAM,oBAAoB,kBAAkB;AAAA,MACxD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,KAAK,gCAAgC,CAAC;AAAA,EACrE;AACF;AAEO,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,WAAW;AAAA,EACX,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,mBAAmB;AACnE,CAAC;AAED,eAAsB,mBAAmB,QAA2C;AAClF,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,OAAO,SAAS;AAC1D,QAAI,CAAC,SAAS,GAAI,QAAO,SAAS;AAElC,UAAM,WAAW,MAAM,YAAY,SAAS,MAAM,WAAW,OAAO,UAAU;AAC9E,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY,SAAS,MAAM;AAAA,QAC3B,aAAa,OAAO;AAAA,QACpB,UAAU,gBAAgB,QAAQ;AAAA,MACpC,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,KAAK,iCAAiC,OAAO,UAAU,EAAE,CAAC;AAAA,EACzF;AACF;AAEO,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,WAAW;AAAA,EACX,MAAM;AAAA,EACN,UAAU;AACZ,CAAC;AAED,MAAM,kBAAkB,CAAC,MAAM,QAAQ,aAAa,WAAW;AAE/D,eAAsB,kBAAkB,QAA0C;AAChF,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,OAAO,SAAS;AAC1D,QAAI,CAAC,SAAS,GAAI,QAAO,SAAS;AAElC,UAAM,OAAO,OAAO,QAAQ;AAC5B,UAAM,WAAW,OAAO,YAAY;AACpC,UAAM,SAAS,MAAM,WAAW,SAAS,MAAM,WAAW,MAAM,QAAQ;AAExE,WAAO,OAAO;AAAA,MACZ,UAAU;AAAA,QACR,wBAAwB;AAAA,UACtB,UAAU;AAAA,UACV,OAAO,OAAO;AAAA,UACd;AAAA,UACA;AAAA,UACA,UAAU,OAAO,MAAM;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,MACA,YAAY,SAAS,MAAM;AAAA,MAC3B,aAAa;AAAA,MACb,MAAM,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,QAC/B,UAAU,MAAM,MAAM,IAAI;AAAA,QAC1B,UAAU,MAAM,QAAQ,MAAM;AAAA,QAC9B,UAAU,MAAM,UAAU,QAAQ;AAAA,QAClC,UAAU,MAAM,YAAY,UAAU;AAAA,MACxC,CAAC;AAAA,IACH,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,KAAK,4BAA4B,CAAC;AAAA,EACjE;AACF;AAEO,MAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,WAAW;AAAA,EACX,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,gBAAgB;AAC7D,CAAC;AAED,eAAsB,gBAAgB,QAAwC;AAC5E,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,OAAO,SAAS;AAC1D,QAAI,CAAC,SAAS,GAAI,QAAO,SAAS;AAElC,UAAM,QAAQ,MAAM,SAAS,SAAS,MAAM,WAAW,OAAO,OAAO;AACrE,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY,SAAS,MAAM;AAAA,QAC3B,UAAU,OAAO;AAAA,QACjB,OAAO,gBAAgB,KAAK;AAAA,MAC9B,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,KAAK,8BAA8B,OAAO,OAAO,EAAE,CAAC;AAAA,EACnF;AACF;AAEO,MAAM,gCAAgC,EAAE,OAAO;AAAA,EACpD,WAAW;AAAA,EACX,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,yDAAyD;AAAA,EACvG,cAAc,EACX,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,SAAS,EACT,SAAS,kFAAkF;AAChG,CAAC;AAED,MAAM,+BAA+B,CAAC,MAAM,QAAQ,aAAa;AAEjE,eAAsB,+BACpB,QACA;AACA,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,OAAO,SAAS;AAC1D,QAAI,CAAC,SAAS,GAAI,QAAO,SAAS;AAElC,UAAM,SAAS,MAAM,kCAAkC,SAAS,MAAM,WAAW,OAAO,UAAU;AAClG,UAAM,mBAAmB,OAAO,cAAc,kBAAkB;AAChE,UAAM,iBAAiB,mBACnB,OAAO,OAAO,CAAC,UAAU;AACvB,YAAM,OAAO,UAAU,OAAO,QAAQ,MAAM;AAC5C,aAAO,OAAO,SAAS,YAAY,KAAK,kBAAkB,EAAE,SAAS,gBAAgB;AAAA,IACvF,CAAC,IACD;AAEJ,WAAO,OAAO;AAAA,MACZ,UAAU,WAAW;AAAA,QACnB,OAAO,OAAO;AAAA,QACd,UAAU,eAAe;AAAA,QACzB,UAAU;AAAA,QACV,eAAe,OAAO;AAAA,MACxB,CAAC;AAAA,MACD,YAAY,SAAS,MAAM;AAAA,MAC3B,aAAa,OAAO;AAAA,MACpB,aAAa;AAAA,MACb,MAAM,eAAe,IAAI,CAAC,UAAU;AAAA,QAClC,UAAU,OAAO,MAAM,MAAM,gBAAgB,cAAc;AAAA,QAC3D,UAAU,OAAO,QAAQ,MAAM;AAAA,QAC/B,UAAU,OAAO,cAAc,YAAY,KAAK,OAAO;AAAA,MACzD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,gBAAgB,KAAK,yDAAyD,OAAO,UAAU,EAAE;AAAA,IACnG;AAAA,EACF;AACF;AAEO,MAAM,mBAAmB,EAAE,OAAO;AAAA,EACvC,WAAW;AAAA,EACX,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,kBAAkB;AACjE,CAAC;AAED,eAAsB,kBAAkB,QAA0C;AAChF,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,OAAO,SAAS;AAC1D,QAAI,CAAC,SAAS,GAAI,QAAO,SAAS;AAElC,UAAM,UAAU,MAAM,WAAW,SAAS,MAAM,WAAW,OAAO,SAAS;AAC3E,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY,SAAS,MAAM;AAAA,QAC3B,YAAY,OAAO;AAAA,QACnB,SAAS,gBAAgB,OAAO;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,KAAK,gCAAgC,OAAO,SAAS,EAAE,CAAC;AAAA,EACvF;AACF;AAEO,MAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,WAAW;AAAA,EACX,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,kBAAkB;AACjE,CAAC;AAED,eAAsB,gCACpB,QACA;AACA,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,OAAO,SAAS;AAC1D,QAAI,CAAC,SAAS,GAAI,QAAO,SAAS;AAElC,UAAM,iBAAiB,MAAM,yBAAyB,SAAS,MAAM,WAAW,OAAO,SAAS;AAChG,WAAO;AAAA,MACL,WAAW;AAAA,QACT,YAAY,SAAS,MAAM;AAAA,QAC3B,YAAY,OAAO;AAAA,QACnB,gBAAgB,gBAAgB,cAAc;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,gBAAgB,KAAK,2DAA2D,OAAO,SAAS,EAAE;AAAA,IACpG;AAAA,EACF;AACF;AAEO,MAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,WAAW;AAAA,EACX,MAAM;AAAA,EACN,UAAU;AAAA,EACV,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,uCAAuC;AAC/F,CAAC;AAED,MAAM,oBAAoB,CAAC,YAAY;AAEvC,eAAsB,oBAAoB,QAA4C;AACpF,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,OAAO,SAAS;AAC1D,QAAI,CAAC,SAAS,GAAI,QAAO,SAAS;AAElC,UAAM,OAAO,OAAO,QAAQ;AAC5B,UAAM,WAAW,OAAO,YAAY;AACpC,UAAM,QAAQ,OAAO,KAAK,WAAW;AACrC,UAAM,KAAK,OAAO,WAAW;AAC7B,UAAM,SAAS,MAAM,aAAa,SAAS,MAAM,WAAW,MAAM,IAAI,OAAO,OAAO;AAEpF,WAAO,OAAO;AAAA,MACZ,UAAU;AAAA,QACR,wBAAwB;AAAA,UACtB,UAAU;AAAA,UACV,OAAO,OAAO;AAAA,UACd;AAAA,UACA;AAAA,UACA,UAAU,OAAO,WAAW;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,MACA,YAAY,SAAS,MAAM;AAAA,MAC3B,aAAa;AAAA,MACb,MAAM,OAAO,WAAW,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;AAAA,IACxD,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,MAAM,gBAAgB,KAAK,8BAA8B,CAAC;AAAA,EACnE;AACF;AAEO,MAAM,+BAA+B,EAAE,OAAO;AAAA,EACnD,WAAW;AAAA,EACX,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,SAAS,qDAAqD;AAAA,EACnG,MAAM;AAAA,EACN,UAAU;AACZ,CAAC;AAED,MAAM,8BAA8B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,8BACpB,QACA;AACA,MAAI;AACF,UAAM,WAAW,MAAM,mBAAmB,OAAO,SAAS;AAC1D,QAAI,CAAC,SAAS,GAAI,QAAO,SAAS;AAElC,UAAM,OAAO,OAAO,QAAQ;AAC5B,UAAM,WAAW,OAAO,YAAY;AACpC,UAAM,QAAQ,OAAO,KAAK;AAC1B,UAAM,KAAK,OAAO,WAAW;AAC7B,UAAM,SAAS,MAAM,uBAAuB,SAAS,MAAM,WAAW,OAAO,YAAY,MAAM,EAAE;AAEjG,WAAO,OAAO;AAAA,MACZ,UAAU;AAAA,QACR,wBAAwB;AAAA,UACtB,UAAU;AAAA,UACV,OAAO,OAAO;AAAA,UACd;AAAA,UACA;AAAA,UACA,UAAU,OAAO,MAAM;AAAA,QACzB,CAAC;AAAA,MACH;AAAA,MACA,YAAY,SAAS,MAAM;AAAA,MAC3B,aAAa,OAAO;AAAA,MACpB,aAAa;AAAA,MACb,MAAM,OAAO,MAAM,IAAI,CAAC,SAAS;AAAA,QAC/B,UAAU,MAAM,aAAa,cAAc,aAAa,MAAM,IAAI;AAAA,QAClE,UAAU,MAAM,eAAe,gBAAgB,QAAQ,MAAM;AAAA,QAC7D,UAAU,MAAM,SAAS,OAAO;AAAA,QAChC,UAAU,MAAM,WAAW,YAAY,SAAS;AAAA,QAChD,UAAU,MAAM,cAAc,eAAe,YAAY,KAAK
|
|
4
|
+
"sourcesContent": ["import { error, object } from \"mcp-use/server\";\nimport { z } from \"zod\";\n\nimport { formatVtexError } from \"../../services/vtex/vtex-api.js\";\nimport {\n getCategoryTree,\n listBrands,\n listCategories,\n listProducts,\n listProductsByCategory,\n listSpecificationGroupsByCategory,\n listSkusByProduct,\n type VtexCatalogRecord,\n} from \"../../services/vtex/vtex-catalog.js\";\nimport {\n getBrand,\n getCategory,\n getProduct,\n getProductSpecifications,\n getSku,\n} from \"../../services/vtex/vtex-catalog-write.js\";\nimport { toSnakeCaseKeys } from \"../../utils/case-conversion.js\";\nimport { stripNulls } from \"../../utils/strip-payload.js\";\nimport { resolveVtexProfileOrSelection } from \"./profile-resolution.js\";\n\nconst vtexProfileIdSchemaField = z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\n \"Explicit VTEX profile id to use. If omitted, the tool returns a guided selection payload with available active profiles.\"\n );\n\nconst pageSchemaField = z.number().int().min(1).optional().describe(\"Page number, starting at 1.\");\nconst pageSizeSchemaField = z\n .number()\n .int()\n .min(1)\n .max(100)\n .optional()\n .describe(\"Items per page, from 1 to 100.\");\n\nconst categoryProductPageSizeSchemaField = z\n .number()\n .int()\n .min(1)\n .max(50)\n .optional()\n .describe(\n \"Items per page, from 1 to 50. VTEX public product search rejects larger page sizes for category product listing.\"\n );\n\nasync function resolveReadProfile(profileId?: string) {\n return resolveVtexProfileOrSelection(profileId);\n}\n\nfunction readValue(record: VtexCatalogRecord, ...keys: string[]): unknown {\n for (const key of keys) {\n if (key in record) {\n return record[key];\n }\n }\n\n return undefined;\n}\n\nfunction buildPaginationMetadata(input: {\n toolName: string;\n total: number;\n page: number;\n pageSize: number;\n returned: number;\n}) {\n const hasMore = input.page * input.pageSize < input.total;\n const nextPage = hasMore ? input.page + 1 : undefined;\n\n return {\n total: input.total,\n page: input.page,\n pageSize: input.pageSize,\n returned: input.returned,\n has_more: hasMore,\n next_page: nextPage,\n continuation: nextPage\n ? `Call ${input.toolName} again with page=${nextPage} and pageSize=${input.pageSize} to continue.`\n : undefined,\n };\n}\n\nexport const getCategoryTreeSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n depth: z.number().int().min(1).max(5).optional().describe(\"Tree depth from 1 to 5. Defaults to 5.\"),\n});\n\nexport async function getCategoryTreeHandler(params: z.infer<typeof getCategoryTreeSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const depth = params.depth ?? 5;\n const categories = await getCategoryTree(resolved.value.profileId, depth);\n\n return object({\n profile_id: resolved.value.profileId,\n depth,\n categories: toSnakeCaseKeys(categories),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to fetch VTEX category tree\"));\n }\n}\n\nexport const listCategoriesSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n});\n\nconst categoryRowsSchema = [\"id\", \"name\", \"parent_id\", \"is_active\", \"show_in_storefront\"] as const;\n\nexport async function listCategoriesHandler(params: z.infer<typeof listCategoriesSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const result = await listCategories(resolved.value.profileId, page, pageSize);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_categories\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: categoryRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"FatherCategoryId\", \"fatherCategoryId\", \"parentId\"),\n readValue(item, \"IsActive\", \"isActive\"),\n readValue(item, \"ShowInStoreFront\", \"showInStoreFront\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX categories\"));\n }\n}\n\nexport const getCategorySchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID.\"),\n});\n\nexport async function getCategoryHandler(params: z.infer<typeof getCategorySchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const category = await getCategory(resolved.value.profileId, params.categoryId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n category: toSnakeCaseKeys(category),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX category ${params.categoryId}`));\n }\n}\n\nexport const listBrandsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n});\n\nconst brandRowsSchema = [\"id\", \"name\", \"is_active\", \"menu_home\"] as const;\n\nexport async function listBrandsHandler(params: z.infer<typeof listBrandsSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const result = await listBrands(resolved.value.profileId, page, pageSize);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_brands\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: brandRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"Active\", \"active\"),\n readValue(item, \"MenuHome\", \"menuHome\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX brands\"));\n }\n}\n\nexport const getBrandSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n brandId: z.string().trim().min(1).describe(\"VTEX brand ID.\"),\n});\n\nexport async function getBrandHandler(params: z.infer<typeof getBrandSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const brand = await getBrand(resolved.value.profileId, params.brandId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n brand_id: params.brandId,\n brand: toSnakeCaseKeys(brand),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX brand ${params.brandId}`));\n }\n}\n\nexport const listSpecificationGroupsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID used to discover specification groups.\"),\n nameContains: z\n .string()\n .trim()\n .min(1)\n .optional()\n .describe(\"Optional case-insensitive substring filter applied to specification group names.\"),\n});\n\nconst specificationGroupRowsSchema = [\"id\", \"name\", \"category_id\"] as const;\n\nexport async function listSpecificationGroupsHandler(\n params: z.infer<typeof listSpecificationGroupsSchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const groups = await listSpecificationGroupsByCategory(resolved.value.profileId, params.categoryId);\n const normalizedFilter = params.nameContains?.toLocaleLowerCase();\n const filteredGroups = normalizedFilter\n ? groups.filter((group) => {\n const name = readValue(group, \"Name\", \"name\");\n return typeof name === \"string\" && name.toLocaleLowerCase().includes(normalizedFilter);\n })\n : groups;\n\n return object({\n metadata: stripNulls({\n total: groups.length,\n returned: filteredGroups.length,\n has_more: false,\n name_contains: params.nameContains,\n }),\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n rows_schema: specificationGroupRowsSchema,\n rows: filteredGroups.map((group) => [\n readValue(group, \"Id\", \"id\", \"FieldGroupId\", \"fieldGroupId\"),\n readValue(group, \"Name\", \"name\"),\n readValue(group, \"CategoryId\", \"categoryId\") ?? params.categoryId,\n ]),\n });\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to list VTEX specification groups for category ${params.categoryId}`)\n );\n }\n}\n\nexport const getProductSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nexport async function getProductHandler(params: z.infer<typeof getProductSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const product = await getProduct(resolved.value.profileId, params.productId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n product: toSnakeCaseKeys(product),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX product ${params.productId}`));\n }\n}\n\nexport const getProductSpecificationsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nexport async function getProductSpecificationsHandler(\n params: z.infer<typeof getProductSpecificationsSchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const specifications = await getProductSpecifications(resolved.value.profileId, params.productId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n specifications: toSnakeCaseKeys(specifications),\n })\n );\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to fetch VTEX product specifications for product ${params.productId}`)\n );\n }\n}\n\nexport const listProductsSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n page: pageSchemaField,\n pageSize: pageSizeSchemaField,\n keyword: z.string().trim().min(1).optional().describe(\"Optional VTEX catalog keyword filter.\"),\n});\n\nconst productRowsSchema = [\"product_id\"] as const;\n\nexport async function listProductsHandler(params: z.infer<typeof listProductsSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 100;\n const from = (page - 1) * pageSize + 1;\n const to = from + pageSize - 1;\n const result = await listProducts(resolved.value.profileId, from, to, params.keyword);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_products\",\n total: result.total,\n page,\n pageSize,\n returned: result.productIds.length,\n })\n ),\n profile_id: resolved.value.profileId,\n rows_schema: productRowsSchema,\n rows: result.productIds.map((productId) => [productId]),\n });\n } catch (err) {\n return error(formatVtexError(err, \"Failed to list VTEX products\"));\n }\n}\n\nexport const listProductsByCategorySchema = z.object({\n profileId: vtexProfileIdSchemaField,\n categoryId: z.string().trim().min(1).describe(\"VTEX category ID used to filter the product search.\"),\n page: pageSchemaField,\n pageSize: categoryProductPageSizeSchemaField,\n});\n\nconst productByCategoryRowsSchema = [\n \"product_id\",\n \"product_name\",\n \"brand\",\n \"brand_id\",\n \"category_id\",\n \"product_reference\",\n] as const;\n\nexport async function listProductsByCategoryHandler(\n params: z.infer<typeof listProductsByCategorySchema>\n) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const page = params.page ?? 1;\n const pageSize = params.pageSize ?? 25;\n const from = (page - 1) * pageSize;\n const to = from + pageSize - 1;\n const result = await listProductsByCategory(resolved.value.profileId, params.categoryId, from, to);\n\n return object({\n metadata: stripNulls(\n buildPaginationMetadata({\n toolName: \"vtex_list_products_by_category\",\n total: result.total,\n page,\n pageSize,\n returned: result.items.length,\n })\n ),\n profile_id: resolved.value.profileId,\n category_id: params.categoryId,\n rows_schema: productByCategoryRowsSchema,\n rows: result.items.map((item) => [\n readValue(item, \"productId\", \"product_id\", \"productid\", \"id\", \"Id\"),\n readValue(item, \"productName\", \"product_name\", \"name\", \"Name\"),\n readValue(item, \"brand\", \"Brand\"),\n readValue(item, \"brandId\", \"brand_id\", \"BrandId\"),\n readValue(item, \"categoryId\", \"category_id\", \"CategoryId\") ?? null,\n readValue(\n item,\n \"productReference\",\n \"product_reference\",\n \"productReferenceCode\",\n \"product_reference_code\"\n ),\n ]),\n });\n } catch (err) {\n return error(\n formatVtexError(err, `Failed to list VTEX products for category ${params.categoryId}`)\n );\n }\n}\n\nexport const getSkuSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n skuId: z.string().trim().min(1).describe(\"VTEX SKU ID.\"),\n});\n\nexport async function getSkuHandler(params: z.infer<typeof getSkuSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const sku = await getSku(resolved.value.profileId, params.skuId);\n return object(\n stripNulls({\n profile_id: resolved.value.profileId,\n sku_id: params.skuId,\n sku: toSnakeCaseKeys(sku),\n })\n );\n } catch (err) {\n return error(formatVtexError(err, `Failed to fetch VTEX SKU ${params.skuId}`));\n }\n}\n\nexport const listSkusByProductSchema = z.object({\n profileId: vtexProfileIdSchemaField,\n productId: z.string().trim().min(1).describe(\"VTEX product ID.\"),\n});\n\nconst skuRowsSchema = [\"id\", \"name\", \"is_active\", \"ref_id\"] as const;\n\nexport async function listSkusByProductHandler(params: z.infer<typeof listSkusByProductSchema>) {\n try {\n const resolved = await resolveReadProfile(params.profileId);\n if (!resolved.ok) return resolved.response;\n\n const skus = await listSkusByProduct(resolved.value.profileId, params.productId);\n\n return object({\n metadata: { total: skus.length, returned: skus.length, has_more: false },\n profile_id: resolved.value.profileId,\n product_id: params.productId,\n rows_schema: skuRowsSchema,\n rows: skus.map((item) => [\n readValue(item, \"Id\", \"id\"),\n readValue(item, \"Name\", \"name\"),\n readValue(item, \"IsActive\", \"isActive\"),\n readValue(item, \"RefId\", \"refId\"),\n ]),\n });\n } catch (err) {\n return error(formatVtexError(err, `Failed to list VTEX SKUs for product ${params.productId}`));\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -5,24 +5,11 @@ import {
|
|
|
5
5
|
getCommercialCondition,
|
|
6
6
|
listCommercialConditions
|
|
7
7
|
} from "../../services/vtex/vtex-payments.js";
|
|
8
|
-
import {
|
|
9
|
-
createCommercialCondition,
|
|
10
|
-
deleteCommercialCondition,
|
|
11
|
-
updateCommercialCondition
|
|
12
|
-
} from "../../services/vtex/vtex-payments-write.js";
|
|
13
8
|
import { toSnakeCaseKeys } from "../../utils/case-conversion.js";
|
|
14
9
|
import { stripNulls } from "../../utils/strip-payload.js";
|
|
15
|
-
import {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
handleVtexWriteError,
|
|
19
|
-
requireExplicitConfirmation,
|
|
20
|
-
resolveVtexWriteProfile
|
|
21
|
-
} from "./write-helpers.js";
|
|
22
|
-
const commercialConditionWarnings = {
|
|
23
|
-
delete: "Deleting a commercial condition can break linked payment rules and installment visibility until dependent rules are updated."
|
|
24
|
-
};
|
|
25
|
-
const requiredProfileIdSchemaField = z.string().trim().min(1).describe("Explicit VTEX profile id to use for this operation.");
|
|
10
|
+
import { vtexProfileIdSchemaField } from "./write-helpers.js";
|
|
11
|
+
const requiredProfileIdSchemaField = vtexProfileIdSchemaField.unwrap().describe("Explicit VTEX profile id to use for this operation.");
|
|
12
|
+
const commercialConditionActionSchema = z.enum(["list", "get"]).describe("Action to perform for VTEX commercial conditions.");
|
|
26
13
|
const commercialConditionIdSchemaField = z.number().int().positive().describe("Positive VTEX commercial condition identifier.");
|
|
27
14
|
const conditionRowsSchema = ["id", "name", "is_active"];
|
|
28
15
|
function readValue(record, ...keys) {
|
|
@@ -43,47 +30,39 @@ const getActionSchema = z.object({
|
|
|
43
30
|
profileId: requiredProfileIdSchemaField,
|
|
44
31
|
commercialConditionId: commercialConditionIdSchemaField
|
|
45
32
|
});
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
commercialConditionId: commercialConditionIdSchemaField,
|
|
57
|
-
name: z.string().trim().min(1).optional().describe("Updated commercial condition name."),
|
|
58
|
-
description: z.string().trim().min(1).optional().describe("Updated internal description."),
|
|
59
|
-
isActive: z.boolean().optional().describe("Updated condition active flag.")
|
|
60
|
-
}).refine((value) => value.name !== void 0 || value.description !== void 0 || value.isActive !== void 0, {
|
|
61
|
-
message: "At least one commercial condition field must be provided.",
|
|
62
|
-
path: ["name"]
|
|
63
|
-
});
|
|
64
|
-
const deleteActionSchema = z.object({
|
|
65
|
-
action: z.literal("delete"),
|
|
33
|
+
function getCommercialConditionsActionSchema(action) {
|
|
34
|
+
switch (action) {
|
|
35
|
+
case "list":
|
|
36
|
+
return listActionSchema;
|
|
37
|
+
case "get":
|
|
38
|
+
return getActionSchema;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const commercialConditionsSchema = z.object({
|
|
42
|
+
action: commercialConditionActionSchema,
|
|
66
43
|
profileId: requiredProfileIdSchemaField,
|
|
67
|
-
|
|
68
|
-
|
|
44
|
+
search: z.string().trim().min(1).optional().describe("Optional text filter for condition name lookup."),
|
|
45
|
+
commercialConditionId: commercialConditionIdSchemaField.optional()
|
|
46
|
+
}).superRefine((value, ctx) => {
|
|
47
|
+
const validation = getCommercialConditionsActionSchema(value.action).safeParse(value);
|
|
48
|
+
if (validation.success) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
for (const issue of validation.error.issues) {
|
|
52
|
+
ctx.addIssue(issue);
|
|
53
|
+
}
|
|
69
54
|
});
|
|
70
|
-
const commercialConditionsSchema = z.discriminatedUnion("action", [
|
|
71
|
-
listActionSchema,
|
|
72
|
-
getActionSchema,
|
|
73
|
-
createActionSchema,
|
|
74
|
-
updateActionSchema,
|
|
75
|
-
deleteActionSchema
|
|
76
|
-
]);
|
|
77
55
|
async function commercialConditionsHandler(params) {
|
|
78
56
|
switch (params.action) {
|
|
79
57
|
case "list": {
|
|
58
|
+
const validatedParams = listActionSchema.parse(params);
|
|
80
59
|
try {
|
|
81
|
-
const conditions = await listCommercialConditions(
|
|
60
|
+
const conditions = await listCommercialConditions(validatedParams.profileId, validatedParams.search);
|
|
82
61
|
return object({
|
|
83
62
|
metadata: stripNulls({
|
|
84
63
|
total: conditions.length,
|
|
85
|
-
profile_id:
|
|
86
|
-
search:
|
|
64
|
+
profile_id: validatedParams.profileId,
|
|
65
|
+
search: validatedParams.search
|
|
87
66
|
}),
|
|
88
67
|
conditions_schema: conditionRowsSchema,
|
|
89
68
|
conditions: conditions.map((condition) => [
|
|
@@ -97,120 +76,26 @@ async function commercialConditionsHandler(params) {
|
|
|
97
76
|
}
|
|
98
77
|
}
|
|
99
78
|
case "get": {
|
|
79
|
+
const validatedParams = getActionSchema.parse(params);
|
|
100
80
|
try {
|
|
101
|
-
const condition = await getCommercialCondition(
|
|
81
|
+
const condition = await getCommercialCondition(
|
|
82
|
+
validatedParams.profileId,
|
|
83
|
+
validatedParams.commercialConditionId
|
|
84
|
+
);
|
|
102
85
|
return object({
|
|
103
|
-
profile_id:
|
|
104
|
-
commercial_condition_id:
|
|
86
|
+
profile_id: validatedParams.profileId,
|
|
87
|
+
commercial_condition_id: validatedParams.commercialConditionId,
|
|
105
88
|
condition: toSnakeCaseKeys(condition)
|
|
106
89
|
});
|
|
107
90
|
} catch (err) {
|
|
108
91
|
return error(
|
|
109
92
|
formatVtexError(
|
|
110
93
|
err,
|
|
111
|
-
`Failed to fetch VTEX commercial condition ${
|
|
94
|
+
`Failed to fetch VTEX commercial condition ${validatedParams.commercialConditionId}`
|
|
112
95
|
)
|
|
113
96
|
);
|
|
114
97
|
}
|
|
115
98
|
}
|
|
116
|
-
case "create": {
|
|
117
|
-
try {
|
|
118
|
-
const profileResolution = await resolveVtexWriteProfile(params.profileId);
|
|
119
|
-
if (!profileResolution.ok) {
|
|
120
|
-
return profileResolution.response;
|
|
121
|
-
}
|
|
122
|
-
const created = await createCommercialCondition(profileResolution.value.profileId, {
|
|
123
|
-
Name: params.name,
|
|
124
|
-
...params.description !== void 0 ? { Description: params.description } : {},
|
|
125
|
-
...params.isActive !== void 0 ? { IsActive: params.isActive } : {}
|
|
126
|
-
});
|
|
127
|
-
return buildWriteSuccessResponse({
|
|
128
|
-
profileId: profileResolution.value.profileId,
|
|
129
|
-
operation: "commercial_conditions_create",
|
|
130
|
-
resourceId: created.id == null ? void 0 : String(created.id),
|
|
131
|
-
riskLevel: "low",
|
|
132
|
-
message: "Commercial condition created. You can now link it to payment rules or SKU assignments as needed.",
|
|
133
|
-
before: null,
|
|
134
|
-
after: created
|
|
135
|
-
});
|
|
136
|
-
} catch (err) {
|
|
137
|
-
return handleVtexWriteError(err, "Failed to create VTEX commercial condition");
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
case "update": {
|
|
141
|
-
try {
|
|
142
|
-
const profileResolution = await resolveVtexWriteProfile(params.profileId);
|
|
143
|
-
if (!profileResolution.ok) {
|
|
144
|
-
return profileResolution.response;
|
|
145
|
-
}
|
|
146
|
-
const before = await getCommercialCondition(
|
|
147
|
-
profileResolution.value.profileId,
|
|
148
|
-
params.commercialConditionId
|
|
149
|
-
);
|
|
150
|
-
const updated = await updateCommercialCondition(
|
|
151
|
-
profileResolution.value.profileId,
|
|
152
|
-
params.commercialConditionId,
|
|
153
|
-
{
|
|
154
|
-
...params.name !== void 0 ? { Name: params.name } : {},
|
|
155
|
-
...params.description !== void 0 ? { Description: params.description } : {},
|
|
156
|
-
...params.isActive !== void 0 ? { IsActive: params.isActive } : {}
|
|
157
|
-
}
|
|
158
|
-
);
|
|
159
|
-
return buildWriteSuccessResponse({
|
|
160
|
-
profileId: profileResolution.value.profileId,
|
|
161
|
-
operation: "commercial_conditions_update",
|
|
162
|
-
resourceId: String(params.commercialConditionId),
|
|
163
|
-
riskLevel: "medium",
|
|
164
|
-
message: "Commercial condition updated. Review linked payment rules and checkout behavior to confirm the intended installment strategy.",
|
|
165
|
-
before,
|
|
166
|
-
after: updated
|
|
167
|
-
});
|
|
168
|
-
} catch (err) {
|
|
169
|
-
return handleVtexWriteError(
|
|
170
|
-
err,
|
|
171
|
-
`Failed to update VTEX commercial condition ${params.commercialConditionId}`
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
case "delete": {
|
|
176
|
-
const confirmationResponse = requireExplicitConfirmation(
|
|
177
|
-
params.confirmed,
|
|
178
|
-
"commercial_conditions_delete",
|
|
179
|
-
{
|
|
180
|
-
commercial_condition_id: params.commercialConditionId,
|
|
181
|
-
warnings: [commercialConditionWarnings.delete]
|
|
182
|
-
}
|
|
183
|
-
);
|
|
184
|
-
if (confirmationResponse) {
|
|
185
|
-
return confirmationResponse;
|
|
186
|
-
}
|
|
187
|
-
try {
|
|
188
|
-
const profileResolution = await resolveVtexWriteProfile(params.profileId);
|
|
189
|
-
if (!profileResolution.ok) {
|
|
190
|
-
return profileResolution.response;
|
|
191
|
-
}
|
|
192
|
-
await deleteCommercialCondition(
|
|
193
|
-
profileResolution.value.profileId,
|
|
194
|
-
params.commercialConditionId
|
|
195
|
-
);
|
|
196
|
-
return buildWriteSuccessResponse({
|
|
197
|
-
profileId: profileResolution.value.profileId,
|
|
198
|
-
operation: "commercial_conditions_delete",
|
|
199
|
-
resourceId: String(params.commercialConditionId),
|
|
200
|
-
riskLevel: "high",
|
|
201
|
-
confirmed: true,
|
|
202
|
-
message: "Commercial condition deleted. Confirm linked payment rules and SKU assignments still reflect the intended installment strategy.",
|
|
203
|
-
warnings: [commercialConditionWarnings.delete],
|
|
204
|
-
before: null,
|
|
205
|
-
after: null
|
|
206
|
-
});
|
|
207
|
-
} catch (err) {
|
|
208
|
-
return handleVtexWriteError(
|
|
209
|
-
err,
|
|
210
|
-
`Failed to delete VTEX commercial condition ${params.commercialConditionId}`
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
99
|
}
|
|
215
100
|
}
|
|
216
101
|
export {
|